s3: Fix handling of processes that died in g_lock
authorVolker Lendecke <vl@samba.org>
Mon, 15 Feb 2010 15:49:46 +0000 (16:49 +0100)
committerKarolin Seeger <kseeger@samba.org>
Thu, 1 Apr 2010 07:39:17 +0000 (09:39 +0200)
g_lock_parse might have thrown away entries from the locks array because the
processes were not around anymore. Don't store the orphaned entries.
(cherry picked from commit f3bdb163f461175c50b4930fa3464beaee30f4a8)
(cherry picked from commit b2677d82dc5c6bc76b0343d90ec75972b5b2a8bf)

source3/lib/g_lock.c

index 26b079d3bc0658018639feb49b2911238e907ad4..42c0397189d707154376f2db6995a379cf565523 100644 (file)
@@ -127,11 +127,12 @@ static bool g_lock_parse(TALLOC_CTX *mem_ctx, TDB_DATA data,
 
 static struct g_lock_rec *g_lock_addrec(TALLOC_CTX *mem_ctx,
                                        struct g_lock_rec *locks,
-                                       int num_locks,
+                                       int *pnum_locks,
                                        const struct server_id pid,
                                        enum g_lock_type lock_type)
 {
        struct g_lock_rec *result;
+       int num_locks = *pnum_locks;
 
        result = talloc_realloc(mem_ctx, locks, struct g_lock_rec,
                                num_locks+1);
@@ -141,6 +142,7 @@ static struct g_lock_rec *g_lock_addrec(TALLOC_CTX *mem_ctx,
 
        result[num_locks].pid = pid;
        result[num_locks].lock_type = lock_type;
+       *pnum_locks += 1;
        return result;
 }
 
@@ -221,7 +223,7 @@ again:
        if (our_index == -1) {
                /* First round, add ourself */
 
-               locks = g_lock_addrec(talloc_tos(), locks, num_locks,
+               locks = g_lock_addrec(talloc_tos(), locks, &num_locks,
                                      self, lock_type);
                if (locks == NULL) {
                        DEBUG(10, ("g_lock_addrec failed\n"));
@@ -237,7 +239,7 @@ again:
                locks[our_index].lock_type = lock_type;
        }
 
-       data = make_tdb_data((uint8_t *)locks, talloc_get_size(locks));
+       data = make_tdb_data((uint8_t *)locks, num_locks * sizeof(*locks));
        store_status = rec->store(rec, data, 0);
        if (!NT_STATUS_IS_OK(store_status)) {
                DEBUG(1, ("rec->store failed: %s\n",