diff options
author | Volker Lendecke <vl@samba.org> | 2010-02-15 16:49:46 +0100 |
---|---|---|
committer | Volker Lendecke <vl@samba.org> | 2010-02-16 13:21:10 +0100 |
commit | f3bdb163f461175c50b4930fa3464beaee30f4a8 (patch) | |
tree | 8f194ea5b71cbb0c42df16edf97bad2cba1d07dd /source3/lib | |
parent | eda16f2410d7a6d79505b102aca8f111de4871d9 (diff) | |
download | samba-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.
Diffstat (limited to 'source3/lib')
-rw-r--r-- | source3/lib/g_lock.c | 8 |
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", |