1*ed775ee7SAntonio Huete Jimenez /*
2*ed775ee7SAntonio Huete Jimenez * Copyright (c) 2018 The TCPDUMP project
3*ed775ee7SAntonio Huete Jimenez * All rights reserved.
4*ed775ee7SAntonio Huete Jimenez *
5*ed775ee7SAntonio Huete Jimenez * Redistribution and use in source and binary forms, with or without
6*ed775ee7SAntonio Huete Jimenez * modification, are permitted provided that: (1) source code
7*ed775ee7SAntonio Huete Jimenez * distributions retain the above copyright notice and this paragraph
8*ed775ee7SAntonio Huete Jimenez * in its entirety, and (2) distributions including binary code include
9*ed775ee7SAntonio Huete Jimenez * the above copyright notice and this paragraph in its entirety in
10*ed775ee7SAntonio Huete Jimenez * the documentation or other materials provided with the distribution.
11*ed775ee7SAntonio Huete Jimenez * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
12*ed775ee7SAntonio Huete Jimenez * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
13*ed775ee7SAntonio Huete Jimenez * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14*ed775ee7SAntonio Huete Jimenez * FOR A PARTICULAR PURPOSE.
15*ed775ee7SAntonio Huete Jimenez */
16*ed775ee7SAntonio Huete Jimenez
17*ed775ee7SAntonio Huete Jimenez #ifdef HAVE_CONFIG_H
18*ed775ee7SAntonio Huete Jimenez #include <config.h>
19*ed775ee7SAntonio Huete Jimenez #endif
20*ed775ee7SAntonio Huete Jimenez
21*ed775ee7SAntonio Huete Jimenez #include <stdlib.h>
22*ed775ee7SAntonio Huete Jimenez #include "netdissect-alloc.h"
23*ed775ee7SAntonio Huete Jimenez
24*ed775ee7SAntonio Huete Jimenez /*
25*ed775ee7SAntonio Huete Jimenez * nd_free_all() is intended to be used after a packet printing
26*ed775ee7SAntonio Huete Jimenez */
27*ed775ee7SAntonio Huete Jimenez
28*ed775ee7SAntonio Huete Jimenez /* Add a memory chunk in allocation linked list */
29*ed775ee7SAntonio Huete Jimenez void
nd_add_alloc_list(netdissect_options * ndo,nd_mem_chunk_t * chunkp)30*ed775ee7SAntonio Huete Jimenez nd_add_alloc_list(netdissect_options *ndo, nd_mem_chunk_t *chunkp)
31*ed775ee7SAntonio Huete Jimenez {
32*ed775ee7SAntonio Huete Jimenez if (ndo->ndo_last_mem_p == NULL) /* first memory allocation */
33*ed775ee7SAntonio Huete Jimenez chunkp->prev_mem_p = NULL;
34*ed775ee7SAntonio Huete Jimenez else /* previous memory allocation */
35*ed775ee7SAntonio Huete Jimenez chunkp->prev_mem_p = ndo->ndo_last_mem_p;
36*ed775ee7SAntonio Huete Jimenez ndo->ndo_last_mem_p = chunkp;
37*ed775ee7SAntonio Huete Jimenez }
38*ed775ee7SAntonio Huete Jimenez
39*ed775ee7SAntonio Huete Jimenez /* malloc replacement, with tracking in a linked list */
40*ed775ee7SAntonio Huete Jimenez void *
nd_malloc(netdissect_options * ndo,size_t size)41*ed775ee7SAntonio Huete Jimenez nd_malloc(netdissect_options *ndo, size_t size)
42*ed775ee7SAntonio Huete Jimenez {
43*ed775ee7SAntonio Huete Jimenez nd_mem_chunk_t *chunkp = malloc(sizeof(nd_mem_chunk_t) + size);
44*ed775ee7SAntonio Huete Jimenez if (chunkp == NULL)
45*ed775ee7SAntonio Huete Jimenez return NULL;
46*ed775ee7SAntonio Huete Jimenez nd_add_alloc_list(ndo, chunkp);
47*ed775ee7SAntonio Huete Jimenez return chunkp + 1;
48*ed775ee7SAntonio Huete Jimenez }
49*ed775ee7SAntonio Huete Jimenez
50*ed775ee7SAntonio Huete Jimenez /* Free chunks in allocation linked list from last to first */
51*ed775ee7SAntonio Huete Jimenez void
nd_free_all(netdissect_options * ndo)52*ed775ee7SAntonio Huete Jimenez nd_free_all(netdissect_options *ndo)
53*ed775ee7SAntonio Huete Jimenez {
54*ed775ee7SAntonio Huete Jimenez nd_mem_chunk_t *current, *previous;
55*ed775ee7SAntonio Huete Jimenez current = ndo->ndo_last_mem_p;
56*ed775ee7SAntonio Huete Jimenez while (current != NULL) {
57*ed775ee7SAntonio Huete Jimenez previous = current->prev_mem_p;
58*ed775ee7SAntonio Huete Jimenez free(current);
59*ed775ee7SAntonio Huete Jimenez current = previous;
60*ed775ee7SAntonio Huete Jimenez }
61*ed775ee7SAntonio Huete Jimenez ndo->ndo_last_mem_p = NULL;
62*ed775ee7SAntonio Huete Jimenez }
63