diff options
| -rw-r--r-- | source3/include/smb.h | 9 | ||||
| -rw-r--r-- | source3/smbd/nttrans.c | 20 | ||||
| -rw-r--r-- | source3/smbd/trans2.c | 10 | 
3 files changed, 36 insertions, 3 deletions
diff --git a/source3/include/smb.h b/source3/include/smb.h index f8816b6bc5..3c3ced6baf 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -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 diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c index 434bf34e40..1b981578e3 100644 --- a/source3/smbd/nttrans.c +++ b/source3/smbd/nttrans.c @@ -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); diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 73873e09a3..f2c025b6c1 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -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;  }  | 
