This is an automated email from the git hooks/post-receive script.
firstyear pushed a commit to branch master
in repository 389-ds-base.
commit f56a927c9ec6678ad693ed9bae279a689233b6dc
Author: William Brown <firstyear(a)redhat.com>
Date: Wed Apr 19 08:22:12 2017 +1000
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: mreynolds (Thanks!)
---
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 <stdarg.h> // For va_start / va_end
#include <inttypes.h> // For PRI*
#include <string.h> // for memset
-// From NSPR
-#include <prlock.h> // For locking in structs
// #include <pratom.h> // For atomic increments.
// We use gcc atomic operations instead.
#include <prlog.h> // For pr_assert
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.