diff options
author | Jeremy Allison <jra@samba.org> | 2014-02-26 16:30:25 -0800 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2014-02-27 10:42:36 -0800 |
commit | abf08ed544ce05ea5a6e6ea2e531b6a2d97e15cc (patch) | |
tree | 2647eff012c741e84833ef5f9106f7d8b495a495 /source3/locking/brlock.c | |
parent | f0030c619bcf22dbe9eed54b2c0dc9c61f564838 (diff) | |
download | samba-abf08ed544ce05ea5a6e6ea2e531b6a2d97e15cc.tar.gz samba-abf08ed544ce05ea5a6e6ea2e531b6a2d97e15cc.tar.xz samba-abf08ed544ce05ea5a6e6ea2e531b6a2d97e15cc.zip |
s3: smbd: Ensure brl_get_locks_readonly() always returns a valid struct byte_range_lock even if there are no locks.
brl_get_locks_readonly() currently returns NULL when it can't
find any byte range locks on the file. This is an error - it
should return a valid struct byte_range_lock containing num_locks == 0
so it can be cached.
Returning NULL when there are no locks causes POSIX lock
tests to fail returning NT_STATUS_NO_MEMORY (as it thinks
it can't allocate the struct) instead of NT_STATUS_OK.
Fixes bug:
Bug 10431 - STATUS_NO_MEMORY response from Query File Posix Lock request
https://bugzilla.samba.org/show_bug.cgi?id=10431
Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Volker Lendecke <Volker.Lendecke@SerNet.DE>
Diffstat (limited to 'source3/locking/brlock.c')
-rw-r--r-- | source3/locking/brlock.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/source3/locking/brlock.c b/source3/locking/brlock.c index a516b6004b8..e6c89490ae3 100644 --- a/source3/locking/brlock.c +++ b/source3/locking/brlock.c @@ -2154,7 +2154,21 @@ struct byte_range_lock *brl_get_locks_readonly(files_struct *fsp) make_tdb_data((uint8_t *)&fsp->file_id, sizeof(fsp->file_id)), brl_get_locks_readonly_parser, &state); - if (!NT_STATUS_IS_OK(status)) { + + if (NT_STATUS_EQUAL(status,NT_STATUS_NOT_FOUND)) { + /* + * No locks on this file. Return an empty br_lock. + */ + br_lock = talloc(fsp, struct byte_range_lock); + if (br_lock == NULL) { + goto fail; + } + + br_lock->have_read_oplocks = false; + br_lock->num_locks = 0; + br_lock->lock_data = NULL; + + } else if (!NT_STATUS_IS_OK(status)) { DEBUG(3, ("Could not parse byte range lock record: " "%s\n", nt_errstr(status))); goto fail; |