summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2010-02-15 16:49:46 +0100
committerVolker Lendecke <vl@samba.org>2010-02-16 13:21:10 +0100
commitf3bdb163f461175c50b4930fa3464beaee30f4a8 (patch)
tree8f194ea5b71cbb0c42df16edf97bad2cba1d07dd
parenteda16f2410d7a6d79505b102aca8f111de4871d9 (diff)
downloadsamba-f3bdb163f461175c50b4930fa3464beaee30f4a8.tar.gz
samba-f3bdb163f461175c50b4930fa3464beaee30f4a8.tar.bz2
samba-f3bdb163f461175c50b4930fa3464beaee30f4a8.zip
s3: Fix handling of processes that died in g_lock
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.
-rw-r--r--source3/lib/g_lock.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/source3/lib/g_lock.c b/source3/lib/g_lock.c
index 26b079d3bc..42c0397189 100644
--- a/source3/lib/g_lock.c
+++ b/source3/lib/g_lock.c
@@ -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",