Fix bug 6494 - Incorrect FileStatus returned in NT_CREATE_ANDX.
authorJeremy Allison <jra@samba.org>
Mon, 14 Sep 2009 22:30:05 +0000 (15:30 -0700)
committerJeremy Allison <jra@samba.org>
Mon, 14 Sep 2009 22:30:05 +0000 (15:30 -0700)
Lookup the EA and Stream status on CreateX.
Jeremy.

source3/include/smb.h
source3/smbd/nttrans.c
source3/smbd/trans2.c

index f8816b6bc5653dd6dc806553897747d737d2e565..3c3ced6baf713785d495132487134844df912b57 100644 (file)
@@ -1511,6 +1511,15 @@ char *strdup(char *s);
 /* TCONX Flag (smb_vwv2). */
 #define TCONX_FLAG_EXTENDED_RESPONSE   0x8
 
+/* File Status Flags. See:
+
+http://msdn.microsoft.com/en-us/library/cc246334(PROT.13).aspx
+*/
+
+#define NO_EAS                 0x1
+#define NO_SUBSTREAMS          0x2
+#define NO_REPARSETAG          0x4
+
 /* Capabilities.  see ftp.microsoft.com/developr/drg/cifs/cifs/cifs4.txt */
 
 #define CAP_RAW_MODE         0x0001
index 434bf34e40770171bb6bb532cd3aeadba0c3a345..1b981578e321e563752e19118ce0dee619c7d795 100644 (file)
@@ -623,7 +623,25 @@ void reply_ntcreate_and_X(struct smb_request *req)
        SOFF_T(p,0,file_len);
        p += 8;
        if (flags & EXTENDED_RESPONSE_REQUIRED) {
-               SSVAL(p,2,0x7);
+               uint16_t file_status = (NO_EAS|NO_SUBSTREAMS|NO_REPARSETAG);
+               size_t num_names = 0;
+               unsigned int num_streams;
+               struct stream_struct *streams = NULL;
+
+               /* Do we have any EA's ? */
+               status = get_ea_names_from_file(ctx, conn, fsp,
+                               smb_fname->base_name, NULL, &num_names);
+               if (NT_STATUS_IS_OK(status) && num_names) {
+                       file_status &= ~NO_EAS;
+               }
+               status = SMB_VFS_STREAMINFO(conn, NULL, smb_fname->base_name, ctx,
+                       &num_streams, &streams);
+               /* There is always one stream, ::$DATA. */
+               if (NT_STATUS_IS_OK(status) && num_streams > 1) {
+                       file_status &= ~NO_SUBSTREAMS;
+               }
+               TALLOC_FREE(streams);
+               SSVAL(p,2,file_status);
        }
        p += 4;
        SCVAL(p,0,fsp->is_directory ? 1 : 0);
index 73873e09a3cb3ac97d022f430fbc153f299e836b..f2c025b6c103e168027f3c41cbac898be1814a32 100644 (file)
@@ -207,7 +207,9 @@ NTSTATUS get_ea_names_from_file(TALLOC_CTX *mem_ctx, connection_struct *conn,
 
        if (sizeret == 0) {
                TALLOC_FREE(names);
-               *pnames = NULL;
+               if (pnames) {
+                       *pnames = NULL;
+               }
                *pnum_names = 0;
                return NT_STATUS_OK;
        }
@@ -244,7 +246,11 @@ NTSTATUS get_ea_names_from_file(TALLOC_CTX *mem_ctx, connection_struct *conn,
                names[num_names++] = p;
        }
 
-       *pnames = names;
+       if (pnames) {
+               *pnames = names;
+       } else {
+               TALLOC_FREE(names);
+       }
        *pnum_names = num_names;
        return NT_STATUS_OK;
 }