summaryrefslogtreecommitdiff
path: root/netdissect-alloc.c
diff options
context:
space:
mode:
authorFrancois-Xavier Le Bail <devel.fx.lebail@orange.fr>2018-03-14 13:41:33 +0100
committerFrancois-Xavier Le Bail <devel.fx.lebail@orange.fr>2018-03-14 13:59:26 +0100
commita53605c61b1615362347cebf0db7bb54a2ee6ac6 (patch)
treebb21d8165d5925ab284066c07b603772e28e4526 /netdissect-alloc.c
parentfa196ecfbe6c715ab37e86ade670d8a552540b7a (diff)
downloadtcpdump-a53605c61b1615362347cebf0db7bb54a2ee6ac6.tar.gz
Add a malloc/free process with garbage collector
Use it in the PPP printer.
Diffstat (limited to 'netdissect-alloc.c')
-rw-r--r--netdissect-alloc.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/netdissect-alloc.c b/netdissect-alloc.c
new file mode 100644
index 00000000..1a40b09c
--- /dev/null
+++ b/netdissect-alloc.c
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2018 The TCPDUMP project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that: (1) source code
+ * distributions retain the above copyright notice and this paragraph
+ * in its entirety, and (2) distributions including binary code include
+ * the above copyright notice and this paragraph in its entirety in
+ * the documentation or other materials provided with the distribution.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
+ * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
+ * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE.
+ */
+
+#include <stdlib.h>
+#include "netdissect-alloc.h"
+
+/*
+ * nd_free_all() is intended to be used after a packet printing
+ */
+
+/* Add a memory chunk in allocation linked list */
+void
+nd_add_alloc_list(netdissect_options *ndo, nd_mem_chunk_t *chunkp)
+{
+ if (ndo->ndo_last_mem_p == NULL) /* first memory allocation */
+ chunkp->prev_mem_p = NULL;
+ else /* previous memory allocation */
+ chunkp->prev_mem_p = ndo->ndo_last_mem_p;
+ ndo->ndo_last_mem_p = chunkp;
+}
+
+/* malloc replacement, with tracking in a linked list */
+void *
+nd_malloc(netdissect_options *ndo, size_t size)
+{
+ nd_mem_chunk_t *chunkp = malloc(sizeof(nd_mem_chunk_t) + size);
+ if (chunkp == NULL)
+ return NULL;
+ nd_add_alloc_list(ndo, chunkp);
+ return chunkp + 1;
+}
+
+/* Free chunks in allocation linked list from last to first */
+void
+nd_free_all(netdissect_options *ndo)
+{
+ nd_mem_chunk_t *current, *previous;
+ current = ndo->ndo_last_mem_p;
+ while (current != NULL) {
+ previous = current->prev_mem_p;
+ free(current);
+ current = previous;
+ }
+ ndo->ndo_last_mem_p = NULL;
+}