]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/alock.c
Plug mutex/rwlock leaks (destroy them)
[openldap] / servers / slapd / alock.c
index 1a50a399f159cc2176cdf1e433ca1c93528bacd8..5fa0704105661bdf46b00516b5aa8d2cacb16f44 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2005-2008 The OpenLDAP Foundation.
+ * Copyright 2005-2010 The OpenLDAP Foundation.
  * Portions Copyright 2004-2005 Symas Corporation.
  * All rights reserved.
  *
@@ -23,6 +23,7 @@
 
 #if SLAPD_BDB || SLAPD_HDB
 
+#include <lber.h>
 #include "alock.h"
 #include "lutil.h"
 
@@ -238,8 +239,8 @@ alock_read_slot ( alock_info_t * info,
        slot_data->al_stamp = alock_read_iattr (slotbuf+16);
        slot_data->al_pid   = alock_read_iattr (slotbuf+24);
 
-       if (slot_data->al_appname) free (slot_data->al_appname);
-       slot_data->al_appname = calloc (1, ALOCK_MAX_APPNAME);
+       if (slot_data->al_appname) ber_memfree (slot_data->al_appname);
+       slot_data->al_appname = ber_memcalloc (1, ALOCK_MAX_APPNAME);
        if (slot_data->al_appname == NULL) {
                return -1;
        }
@@ -306,7 +307,7 @@ alock_query_slot ( alock_info_t * info )
        (void) memset ((void *) &slot_data, 0, sizeof (alock_slot_t));
        alock_read_slot (info, &slot_data);
 
-       if (slot_data.al_appname != NULL) free (slot_data.al_appname);
+       if (slot_data.al_appname != NULL) ber_memfree (slot_data.al_appname);
        slot_data.al_appname = NULL;
 
        nosave = slot_data.al_lock & ALOCK_NOSAVE;
@@ -349,24 +350,24 @@ alock_open ( alock_info_t * info,
        slot_data.al_lock = locktype;
        slot_data.al_stamp = time(NULL);
        slot_data.al_pid = getpid();
-       slot_data.al_appname = calloc (1, ALOCK_MAX_APPNAME);
+       slot_data.al_appname = ber_memcalloc (1, ALOCK_MAX_APPNAME);
        if (slot_data.al_appname == NULL) {
                return ALOCK_UNSTABLE;
        }
        strncpy (slot_data.al_appname, appname, ALOCK_MAX_APPNAME-1);
        slot_data.al_appname [ALOCK_MAX_APPNAME-1] = '\0';
 
-       filename = calloc (1, strlen (envdir) + strlen ("/alock") + 1);
+       filename = ber_memcalloc (1, strlen (envdir) + strlen ("/alock") + 1);
        if (filename == NULL ) {
-               free (slot_data.al_appname);
+               ber_memfree (slot_data.al_appname);
                return ALOCK_UNSTABLE;
        }
        ptr = lutil_strcopy(filename, envdir);
        lutil_strcopy(ptr, "/alock");
        info->al_fd = open (filename, O_CREAT|O_RDWR, 0666);
-       free (filename);
+       ber_memfree (filename);
        if (info->al_fd < 0) {
-               free (slot_data.al_appname);
+               ber_memfree (slot_data.al_appname);
                return ALOCK_UNSTABLE;
        }
        info->al_slot = 0;
@@ -374,14 +375,14 @@ alock_open ( alock_info_t * info,
        res = alock_grab_lock (info->al_fd, 0);
        if (res == -1) { 
                close (info->al_fd);
-               free (slot_data.al_appname);
+               ber_memfree (slot_data.al_appname);
                return ALOCK_UNSTABLE;
        }
 
        res = fstat (info->al_fd, &statbuf);
        if (res == -1) { 
                close (info->al_fd);
-               free (slot_data.al_appname);
+               ber_memfree (slot_data.al_appname);
                return ALOCK_UNSTABLE;
        }
 
@@ -408,9 +409,10 @@ alock_open ( alock_info_t * info,
                                ++live_count;
 
                        } else if (res == ALOCK_UNIQUE
-                               && locktype == ALOCK_UNIQUE) {
+                               && (( locktype & ALOCK_SMASK ) == ALOCK_UNIQUE
+                               || nosave )) {
                                close (info->al_fd);
-                               free (slot_data.al_appname);
+                               ber_memfree (slot_data.al_appname);
                                return ALOCK_BUSY;
 
                        } else if (res == ALOCK_DIRTY) {
@@ -418,7 +420,7 @@ alock_open ( alock_info_t * info,
 
                        } else if (res == -1) {
                                close (info->al_fd);
-                               free (slot_data.al_appname);
+                               ber_memfree (slot_data.al_appname);
                                return ALOCK_UNSTABLE;
 
                        }
@@ -427,7 +429,7 @@ alock_open ( alock_info_t * info,
 
        if (dirty_count && live_count) {
                close (info->al_fd);
-               free (slot_data.al_appname);
+               ber_memfree (slot_data.al_appname);
                return ALOCK_UNSTABLE;
        }
        
@@ -436,11 +438,11 @@ alock_open ( alock_info_t * info,
                               info->al_slot);
        if (res == -1) { 
                close (info->al_fd);
-               free (slot_data.al_appname);
+               ber_memfree (slot_data.al_appname);
                return ALOCK_UNSTABLE;
        }
        res = alock_write_slot (info, &slot_data);
-       free (slot_data.al_appname);
+       ber_memfree (slot_data.al_appname);
        if (res == -1) { 
                close (info->al_fd);
                return ALOCK_UNSTABLE;
@@ -549,7 +551,7 @@ alock_close ( alock_info_t * info, int nosave )
        if (res == -1) {
                close (info->al_fd);
                if (slot_data.al_appname != NULL) 
-                       free (slot_data.al_appname);
+                       ber_memfree (slot_data.al_appname);
                return ALOCK_UNSTABLE;
        }
        slot_data.al_lock = ALOCK_UNLOCKED;
@@ -559,11 +561,11 @@ alock_close ( alock_info_t * info, int nosave )
        if (res == -1) {
                close (info->al_fd);
                if (slot_data.al_appname != NULL) 
-                       free (slot_data.al_appname);
+                       ber_memfree (slot_data.al_appname);
                return ALOCK_UNSTABLE;
        }
        if (slot_data.al_appname != NULL) {
-               free (slot_data.al_appname);
+               ber_memfree (slot_data.al_appname);
                slot_data.al_appname = NULL;
        }
 
@@ -635,11 +637,11 @@ alock_recover ( alock_info_t * info )
                                if (res == -1) {
                                        close (info->al_fd);
                                        if (slot_data.al_appname != NULL) 
-                                               free (slot_data.al_appname);
+                                               ber_memfree (slot_data.al_appname);
                                        return ALOCK_UNSTABLE;
                                }
                                if (slot_data.al_appname != NULL) {
-                                       free (slot_data.al_appname);
+                                       ber_memfree (slot_data.al_appname);
                                        slot_data.al_appname = NULL;
                                }