Fix bug #5783 FindFirst fails where search pattern == mangled filename.
authorJeremy Allison <jra@samba.org>
Tue, 23 Sep 2008 22:04:14 +0000 (15:04 -0700)
committerKarolin Seeger <kseeger@samba.org>
Mon, 29 Sep 2008 11:42:19 +0000 (04:42 -0700)
That was an old and subtle bug.
Jeremy.
(cherry picked from commit 86a0c271ef467810810d1adda982bbb0dc8b928e)

source/smbd/filename.c
source/smbd/trans2.c

index 41a0b9296a56340ebcdb5a6eeb5a5b238c9556b2..562f1e8d943fe9bbb57a632838e5715bc061d7e3 100644 (file)
@@ -101,8 +101,7 @@ get any fatal errors that should immediately terminate the calling
 SMB processing whilst resolving.
 
 If the saved_last_component != 0, then the unmodified last component
-of the pathname is returned there. This is used in an exceptional
-case in reply_mv (so far). If saved_last_component == 0 then nothing
+of the pathname is returned there. If saved_last_component == 0 then nothing
 is returned there.
 
 If last_component_wcard is true then a MS wildcard was detected and
index 2e2da5cc71ff52bbb74156a74a26b6654ce25a10..1e2095a3ea3550ad575029425371a1d2fbd6e9ba 100644 (file)
@@ -1892,7 +1892,7 @@ static void call_trans2findfirst(connection_struct *conn,
        bool requires_resume_key;
        int info_level;
        char *directory = NULL;
-       const char *mask = NULL;
+       char *mask = NULL;
        char *p;
        int last_entry_off=0;
        int dptr_num = -1;
@@ -1980,7 +1980,7 @@ close_if_end = %d requires_resume_key = %d level = 0x%x, max_data_bytes = %d\n",
                return;
        }
 
-       ntstatus = unix_convert(ctx, conn, directory, True, &directory, NULL, &sbuf);
+       ntstatus = unix_convert(ctx, conn, directory, True, &directory, &mask, &sbuf);
        if (!NT_STATUS_IS_OK(ntstatus)) {
                reply_nterror(req, ntstatus);
                return;
@@ -1996,10 +1996,12 @@ close_if_end = %d requires_resume_key = %d level = 0x%x, max_data_bytes = %d\n",
        if(p == NULL) {
                /* Windows and OS/2 systems treat search on the root '\' as if it were '\*' */
                if((directory[0] == '.') && (directory[1] == '\0')) {
-                       mask = "*";
+                       mask = talloc_strdup(ctx,"*");
+                       if (!mask) {
+                               reply_nterror(req, NT_STATUS_NO_MEMORY);
+                               return;
+                       }
                        mask_contains_wcard = True;
-               } else {
-                       mask = directory;
                }
                directory = talloc_strdup(talloc_tos(), "./");
                if (!directory) {
@@ -2007,7 +2009,6 @@ close_if_end = %d requires_resume_key = %d level = 0x%x, max_data_bytes = %d\n",
                        return;
                }
        } else {
-               mask = p+1;
                *p = 0;
        }