summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/trans2.h12
-rw-r--r--source3/smbd/trans2.c12
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,