s3: smbd: Ensure brl_get_locks_readonly() always returns a valid struct byte_range_lo...
authorJeremy Allison <jra@samba.org>
Thu, 27 Feb 2014 00:30:25 +0000 (16:30 -0800)
committerJeremy Allison <jra@samba.org>
Thu, 27 Feb 2014 18:42:36 +0000 (10:42 -0800)
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>
source3/locking/brlock.c

index a516b6004b822c7938dc5008526f0ce272c387a6..e6c89490ae3d06a4858530e64a1b9bae5a73ec3c 100644 (file)
@@ -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;