summaryrefslogtreecommitdiff
path: root/lib/workqueue.h
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2018-02-05 10:40:09 -0500
committerDonald Sharp <sharpd@cumulusnetworks.com>2018-03-09 11:07:41 -0500
commite208c8f94392286aaf77c6d8f2a8b4d22fa3f1d7 (patch)
tree1b21d5dfb0acb565aba34b27849fe5bc8c1e28c5 /lib/workqueue.h
parentc67667e74cfbb4e4f2edd3b70609cf9716d5c432 (diff)
bgpd, lib, zebra: Switch to work_queue_free_and_null
The work_queue_free function free'd up the wq pointer but did not set it too NULL. This of course causes situations where we may use the work_queue after it is freed. Let's modify the work_queue to set the pointer for you. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Diffstat (limited to 'lib/workqueue.h')
-rw-r--r--lib/workqueue.h18
1 files changed, 16 insertions, 2 deletions
diff --git a/lib/workqueue.h b/lib/workqueue.h
index de49cb87fb..c9785de09a 100644
--- a/lib/workqueue.h
+++ b/lib/workqueue.h
@@ -28,7 +28,7 @@
DECLARE_MTYPE(WORK_QUEUE)
/* Hold time for the initial schedule of a queue run, in millisec */
-#define WORK_QUEUE_DEFAULT_HOLD 50
+#define WORK_QUEUE_DEFAULT_HOLD 50
/* action value, for use by item processor and item error handlers */
typedef enum {
@@ -148,8 +148,22 @@ static inline void work_queue_item_dequeue(struct work_queue *wq,
* anything to it
*/
extern struct work_queue *work_queue_new(struct thread_master *, const char *);
+
/* destroy work queue */
-extern void work_queue_free(struct work_queue *);
+/*
+ * The usage of work_queue_free is being transitioned to pass
+ * in the double pointer to remove use after free's.
+ */
+#if CONFDATE > 20190205
+CPP_NOTICE("work_queue_free without double pointer is deprecated, please fixup")
+#endif
+extern void work_queue_free_and_null(struct work_queue **);
+extern void work_queue_free_original(struct work_queue *);
+#define work_queue_free(X) \
+ do { \
+ work_queue_free_original((X)); \
+ CPP_WARN("Please use work_queue_free_and_null"); \
+ } while (0)
/* Add the supplied data as an item onto the workqueue */
extern void work_queue_add(struct work_queue *, void *);