From 71d38b3113f9e7617ec72c712c706242a6f244b2 Mon Sep 17 00:00:00 2001 From: William Brown Date: Wed, 19 Apr 2017 08:22:12 +1000 Subject: [PATCH 3/4] Ticket 49223 - Fix sds queue locking Bug Description: In some cases nspr locks may have allowed a corruption in the queue to occur. Fix Description: Change to pthread mutex, and fix the naming of the struct members. https://pagure.io/389-ds-base/issue/49223 Author: wibrown Review by: ??? --- src/libsds/include/sds.h | 2 +- src/libsds/sds/queue/queue.c | 18 ++++++++++-------- src/libsds/sds/queue/tqueue.c | 16 ++++++++-------- src/libsds/sds/sds_internal.h | 2 -- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/libsds/include/sds.h b/src/libsds/include/sds.h index d8d51d1..d8d3089 100644 --- a/src/libsds/include/sds.h +++ b/src/libsds/include/sds.h @@ -808,7 +808,7 @@ typedef struct _sds_tqueue { /** * Lock that protects queue operations. */ - PRLock *trust_e_threadz; + pthread_mutex_t lock; } sds_tqueue; /* Thread safe queue operations. */ diff --git a/src/libsds/sds/queue/queue.c b/src/libsds/sds/queue/queue.c index 3aba012..e8ed2c9 100644 --- a/src/libsds/sds/queue/queue.c +++ b/src/libsds/sds/queue/queue.c @@ -39,10 +39,10 @@ sds_queue_enqueue(sds_queue *q, void *elem) { sds_log("sds_queue_enqueue", "Queue %p - Queueing ptr %p to %p", q, elem, node); #endif node->element = elem; - node->prev = NULL; - node->next = q->tail; + node->next = NULL; + node->prev = q->tail; if (q->tail != NULL) { - q->tail->prev = node; + q->tail->next = node; } else { /* If tail is null, head must ALSO be null. */ #ifdef DEBUG @@ -78,11 +78,13 @@ sds_queue_dequeue(sds_queue *q, void **elem) { } sds_queue_node *node = q->head; *elem = node->element; - q->head = node->prev; + q->head = node->next; sds_free(node); if (q->head == NULL) { - // If we have no head node, we also have no tail. + /* If we have no head node, we also have no tail. */ q->tail = NULL; + } else { + q->head->prev = NULL; } #ifdef DEBUG sds_log("sds_queue_dequeue", "Queue %p - complete head: %p tail: %p", q, q->head, q->tail); @@ -102,9 +104,9 @@ sds_queue_destroy(sds_queue *q) { #endif /* Map over the queue and free the elements. */ sds_queue_node *node = q->head; - sds_queue_node *prev = NULL; + sds_queue_node *next = NULL; while (node != NULL) { - prev = node->prev; + next = node->next; if (q->value_free_fn != NULL) { #ifdef DEBUG sds_log("sds_queue_destroy", "Queue %p - implicitly freeing %p", q, node->element); @@ -112,7 +114,7 @@ sds_queue_destroy(sds_queue *q) { q->value_free_fn(node->element); } sds_free(node); - node = prev; + node = next; } sds_free(q); return SDS_SUCCESS; diff --git a/src/libsds/sds/queue/tqueue.c b/src/libsds/sds/queue/tqueue.c index 0e75d22..bbbed92 100644 --- a/src/libsds/sds/queue/tqueue.c +++ b/src/libsds/sds/queue/tqueue.c @@ -30,32 +30,32 @@ sds_tqueue_init(sds_tqueue **q_ptr, void (*value_free_fn)(void *value)) { sds_free(*q_ptr); return result; } - (*q_ptr)->trust_e_threadz = PR_NewLock(); + pthread_mutex_init(&(*q_ptr)->lock, NULL); return SDS_SUCCESS; } sds_result sds_tqueue_enqueue(sds_tqueue *q, void *elem) { - PR_Lock(q->trust_e_threadz); + pthread_mutex_lock(&(q->lock)); sds_result result = sds_queue_enqueue(q->uq, elem); - PR_Unlock(q->trust_e_threadz); + pthread_mutex_unlock(&(q->lock)); return result; } sds_result sds_tqueue_dequeue(sds_tqueue *q, void **elem) { - PR_Lock(q->trust_e_threadz); + pthread_mutex_lock(&(q->lock)); sds_result result = sds_queue_dequeue(q->uq, elem); - PR_Unlock(q->trust_e_threadz); + pthread_mutex_unlock(&(q->lock)); return result; } sds_result sds_tqueue_destroy(sds_tqueue *q) { - PR_Lock(q->trust_e_threadz); + pthread_mutex_lock(&(q->lock)); sds_result result = sds_queue_destroy(q->uq); - PR_Unlock(q->trust_e_threadz); - PR_DestroyLock(q->trust_e_threadz); + pthread_mutex_unlock(&(q->lock)); + pthread_mutex_destroy(&(q->lock)); sds_free(q); return result; } diff --git a/src/libsds/sds/sds_internal.h b/src/libsds/sds/sds_internal.h index aee25d2..e05f408 100644 --- a/src/libsds/sds/sds_internal.h +++ b/src/libsds/sds/sds_internal.h @@ -16,8 +16,6 @@ #include // For va_start / va_end #include // For PRI* #include // for memset -// From NSPR -#include // For locking in structs // #include // For atomic increments. // We use gcc atomic operations instead. #include // For pr_assert -- 1.8.3.1