diff options
-rw-r--r-- | source3/include/trans2.h | 12 | ||||
-rw-r--r-- | source3/smbd/trans2.c | 12 |
2 files changed, 22 insertions, 2 deletions
diff --git a/source3/include/trans2.h b/source3/include/trans2.h index fb8e7716ab..89227c39d9 100644 --- a/source3/include/trans2.h +++ b/source3/include/trans2.h @@ -604,7 +604,7 @@ number of entries sent will be zero. #define SMB_POSIX_IGNORE_ACE_ENTRIES 0xFFFF -/* Definition of parameter block of SMB_SET_POSIX_LOCK */ +/* Definition of data block of SMB_SET_POSIX_LOCK */ /* [2 bytes] lock_type - 0 = Read, 1 = Write, 2 = Unlock [2 bytes] lock_flags - 1 = Wait (only valid for setlock) @@ -643,7 +643,7 @@ number of entries sent will be zero. #define SMB_O_NOFOLLOW 0x400 #define SMB_O_DIRECT 0x800 -/* Definition of request parameter block for SMB_POSIX_PATH_OPEN */ +/* Definition of request data block for SMB_POSIX_PATH_OPEN */ /* [4 bytes] flags (as smb_ntcreate_Flags). [4 bytes] open_mode @@ -660,4 +660,12 @@ number of entries sent will be zero. [n bytes] - info level reply - if available. */ +/* Definition of request data block for SMB_POSIX_UNLINK */ +/* + [2 bytes] flags (defined below). +*/ + +#define SMB_POSIX_UNLINK_FILE_TARGET 0 +#define SMB_POSIX_UNLINK_DIRECTORY_TARGET 1 + #endif diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 5bbd618231..2952c9b1dc 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -5132,12 +5132,24 @@ static NTSTATUS smb_posix_unlink(connection_struct *conn, { NTSTATUS status = NT_STATUS_OK; files_struct *fsp = NULL; + uint16 flags = 0; int info = 0; + if (total_data < 2) { + return NT_STATUS_INVALID_PARAMETER; + } + + flags = SVAL(pdata,0); + if (!VALID_STAT(*psbuf)) { return NT_STATUS_OBJECT_NAME_NOT_FOUND; } + if ((flags == SMB_POSIX_UNLINK_DIRECTORY_TARGET) && + !VALID_STAT_OF_DIR(*psbuf)) { + return NT_STATUS_NOT_A_DIRECTORY; + } + if (VALID_STAT_OF_DIR(*psbuf)) { status = open_directory(conn, fname, |