From 060cff80da2f11d7dd3818e9e2710be630ca318d Mon Sep 17 00:00:00 2001 From: Daniel Roethlisberger Date: Mon, 4 Mar 2024 17:53:15 +0100 Subject: [PATCH] Generalise zqueue to non-string data pointers, fix memory leaks (#806) Make zqueue store a void * instead of a char *. Remove internal strdup of data ptr in push_back; instead, take ownership of the pointer and move the strdup to the callsite in ztee. This also fixes a one-off memory leak in ztee where first_line was never freed after getting pushed onto the queue. While here, fix memory leaks in the unused get_front and get_back functions. --- lib/queue.c | 10 ++++------ lib/queue.h | 4 ++-- src/ztee.c | 8 ++++---- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/lib/queue.c b/lib/queue.c index 874e286ac..625ceebf5 100644 --- a/lib/queue.c +++ b/lib/queue.c @@ -34,12 +34,12 @@ zqueue_t *queue_init(void) int is_empty(zqueue_t *queue) { return queue->size == 0; } -void push_back(char *data, zqueue_t *queue) +void push_back(void *data, zqueue_t *queue) { znode_t *new_node = xmalloc(sizeof(znode_t)); new_node->prev = NULL; new_node->next = NULL; - new_node->data = strdup(data); + new_node->data = data; pthread_mutex_lock(&queue->lock); if (is_empty(queue)) { @@ -86,8 +86,7 @@ znode_t *get_front(zqueue_t *queue) pthread_cond_wait(&queue->empty, &queue->lock); } - znode_t *temp = xmalloc(sizeof(znode_t)); - temp = queue->front; + znode_t *temp = queue->front; pthread_mutex_unlock(&queue->lock); return temp; } @@ -100,8 +99,7 @@ znode_t *get_back(zqueue_t *queue) pthread_cond_wait(&queue->empty, &queue->lock); } - znode_t *temp = xmalloc(sizeof(znode_t)); - temp = queue->back; + znode_t *temp = queue->back; pthread_mutex_unlock(&queue->lock); return temp; } diff --git a/lib/queue.h b/lib/queue.h index 7a375c9b5..077281b00 100644 --- a/lib/queue.h +++ b/lib/queue.h @@ -23,7 +23,7 @@ #include typedef struct zqueue_node { - char *data; + void *data; struct zqueue_node *prev; struct zqueue_node *next; } znode_t; @@ -39,7 +39,7 @@ typedef struct zqueue { zqueue_t *queue_init(void); int is_empty(zqueue_t *queue); -void push_back(char *data, zqueue_t *queue); +void push_back(void *data, zqueue_t *queue); znode_t *pop_front(zqueue_t *queue); znode_t *pop_front_unsafe(zqueue_t *queue); znode_t *get_front(zqueue_t *queue); diff --git a/src/ztee.c b/src/ztee.c index 29b610c59..4a3a9e267 100644 --- a/src/ztee.c +++ b/src/ztee.c @@ -334,7 +334,7 @@ void *process_queue(void *arg) pthread_mutex_unlock(&queue->lock); // Write raw data to output file - fprintf(output_file, "%s", node->data); + fprintf(output_file, "%s", (char *)node->data); fflush(output_file); if (ferror(output_file)) { log_fatal("ztee", "Error writing to output file"); @@ -346,11 +346,11 @@ void *process_queue(void *arg) log_fatal("ztee", "JSON input format unimplemented"); break; case FORMAT_CSV: - print_from_csv(node->data); + print_from_csv((char *)node->data); break; default: // Handle raw - fprintf(stdout, "%s", node->data); + fprintf(stdout, "%s", (char *)node->data); break; } @@ -383,7 +383,7 @@ void *read_in(void *arg) // Read in from stdin and add to back of linked list while (getline(&input, &length, stdin) > 0) { - push_back(input, queue); + push_back((void *)strdup(input), queue); total_read_in++; read_in_last_sec++;