s3/utils: smbcacls failed to detect DIRECTORIES using SMB2 (windows only)
authorNoel Power <noel.power@suse.com>
Thu, 20 Jul 2017 12:01:50 +0000 (13:01 +0100)
committerDavid Disseldorp <ddiss@samba.org>
Thu, 20 Jul 2017 16:49:27 +0000 (18:49 +0200)
uint16_t get_fileinfo(...) returns file attributes, this function
called

     cli_qfileinfo_basic(cli, fnum, &mode, NULL, NULL, NULL,
                     NULL, NULL, NULL);

which was failing with NT_STATUS_ACCESS_DENIED errors when fnum above
was obtained via (when using protocol > SMB). Note: This only seems to be
an issue when run against a windows server, with smbd SMB1 & SMB2 work fine.

    status = cli_ntcreate(cli, filename, 0, CREATE_ACCESS_READ,
                  0, FILE_SHARE_READ|FILE_SHARE_WRITE,
                  FILE_OPEN, 0x0, 0x0, &fnum, NULL);

The failing cli_qfileinfo_basic call above is unnecessary as we can already
obtain the required information from the cli_ntcreate call

Signed-off-by: Noel Power <noel.power@suse.com>
Reviewed-by: Jeremy Allison <jra@samba.org>
Reviewed-by: David Disseldorp <ddiss@samba.org>
source3/utils/smbcacls.c

index 86b4591d3650900ec7fb1d1e7529dee2858eaffd..6bf32e51ddaf7b249d2de5acfc6f60bc8e93ab28 100644 (file)
@@ -229,30 +229,22 @@ get fileinfo for filename
 static uint16_t get_fileinfo(struct cli_state *cli, const char *filename)
 {
        uint16_t fnum = (uint16_t)-1;
-       uint16_t mode = 0;
        NTSTATUS status;
+       struct smb_create_returns cr = {0};
 
        /* The desired access below is the only one I could find that works
           with NT4, W2KP and Samba */
 
        status = cli_ntcreate(cli, filename, 0, CREATE_ACCESS_READ,
                              0, FILE_SHARE_READ|FILE_SHARE_WRITE,
-                             FILE_OPEN, 0x0, 0x0, &fnum, NULL);
+                             FILE_OPEN, 0x0, 0x0, &fnum, &cr);
        if (!NT_STATUS_IS_OK(status)) {
                printf("Failed to open %s: %s\n", filename, nt_errstr(status));
                return 0;
        }
 
-       status = cli_qfileinfo_basic(cli, fnum, &mode, NULL, NULL, NULL,
-                                    NULL, NULL, NULL);
-       if (!NT_STATUS_IS_OK(status)) {
-               printf("Failed to file info %s: %s\n", filename,
-                      nt_errstr(status));
-        }
-
        cli_close(cli, fnum);
-
-        return mode;
+       return cr.file_attributes;
 }
 
 /*****************************************************