summaryrefslogtreecommitdiffstats
path: root/netdissect-alloc.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-05 17:41:34 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-05 17:41:34 +0000
commitf7b5fc832288fae3f5a0f3d24b96782252aabbaf (patch)
tree711bd849ca1348d3c97dc9bbbd157b80e9c410aa /netdissect-alloc.c
parentInitial commit. (diff)
downloadtcpdump-f7b5fc832288fae3f5a0f3d24b96782252aabbaf.tar.xz
tcpdump-f7b5fc832288fae3f5a0f3d24b96782252aabbaf.zip
Adding upstream version 4.99.3.upstream/4.99.3upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'netdissect-alloc.c')
-rw-r--r--netdissect-alloc.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/netdissect-alloc.c b/netdissect-alloc.c
new file mode 100644
index 0000000..c625d34
--- /dev/null
+++ b/netdissect-alloc.c
@@ -0,0 +1,64 @@
+/*
+ * 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include "netdissect-alloc.h"
+
+static void nd_add_alloc_list(netdissect_options *, nd_mem_chunk_t *);
+
+/*
+ * nd_free_all() is intended to be used after a packet printing
+ */
+
+/* Add a memory chunk in allocation linked list */
+static 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;
+}