pkgsrc-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

pkg/34964: dmalloc mutex handling error



>Number:         34964
>Category:       pkg
>Synopsis:       dmalloc mutex handling error
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    pkg-manager
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Wed Nov 01 23:10:00 +0000 2006
>Originator:     john heasley
>Release:        NetBSD 3.99.17
>Organization:
        
>Environment:
        
        
System: NetBSD guelah 3.99.17 NetBSD 3.99.17 (guelah) #1: Tue Apr 18 01:51:21 
UTC 2006 root@oak:/sys/arch/sparc64/compile/guelah sparc64
Architecture: sparc64
Machine: sparc64
>Description:
dmalloc 5.4.2 tries to unlock an uninitialized and unlocked mutex.
>How-To-Repeat:
Run a program linked with libdmallocth.  It breaks at start-up.
>Fix:
I'm not sure if this works for every pkgsrc platform, but it does work for
NetBSD.

$NetBSD$

--- malloc.c.orig       2004-10-19 14:51:21.000000000 +0000
+++ malloc.c
@@ -118,6 +118,7 @@ static      int             in_alloc_b = 0;         /* 
can't be
 static int             do_shutdown_b = 0;      /* execute shutdown soon */
 static int             memalign_warn_b = 0;    /* memalign warning printed?*/
 static dmalloc_track_t tracking_func = NULL;   /* memory trxn tracking func */
+static int             thread_lock_init = 0;   /* mutex init toggle */
 
 /* debug variables */
 static char            *start_file = NULL;     /* file to start at */
@@ -188,22 +189,9 @@ static THREAD_MUTEX_T dmalloc_mutex;
  */
 static void    lock_thread(void)
 {
-  /* we only lock if the lock-on counter has reached 0 */
-  if (thread_lock_c == 0) {
-#if HAVE_PTHREAD_MUTEX_LOCK
-    pthread_mutex_lock(&dmalloc_mutex);
-#endif
-  }
-}
-
-/*
- * mutex unlock the malloc library
- */
-static void    unlock_thread(void)
-{
   /* if the lock-on counter has not reached 0 then count it down */
-  if (thread_lock_c > 0) {
-    thread_lock_c--;
+  if (thread_lock_init == 0) {
+    thread_lock_init++;
     /*
      * As we approach the time when we start mutex locking the
      * library, we need to init the mutex variable.  This sets how
@@ -211,7 +199,6 @@ static      void    unlock_thread(void)
      * taking in account that the init itself might generate a call
      * into the library.  Ugh.
      */
-    if (thread_lock_c == THREAD_INIT_LOCK) {
 #if HAVE_PTHREAD_MUTEX_INIT
       /*
        * NOTE: we do not use the PTHREAD_MUTEX_INITIALIZER since this
@@ -224,7 +211,22 @@ static     void    unlock_thread(void)
        */
       pthread_mutex_init(&dmalloc_mutex, THREAD_LOCK_INIT_VAL);
 #endif
-    }
+  }
+  /* we only lock if the lock-on counter has reached 0 */
+  if (thread_lock_c == 0) {
+#if HAVE_PTHREAD_MUTEX_LOCK
+    pthread_mutex_lock(&dmalloc_mutex);
+#endif
+  }
+}
+
+/*
+ * mutex unlock the malloc library
+ */
+static void    unlock_thread(void)
+{
+  if (thread_lock_c > 0) {
+    thread_lock_c--;
   }
   else if (thread_lock_c == 0) {
 #if HAVE_PTHREAD_MUTEX_UNLOCK

>Unformatted:
        
        



Home | Main Index | Thread Index | Old Index