summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/smbd/error.c17
-rw-r--r--source3/smbd/nttrans.c163
-rw-r--r--source3/smbd/reply.c43
-rw-r--r--source3/smbd/trans2.c28
4 files changed, 96 insertions, 155 deletions
diff --git a/source3/smbd/error.c b/source3/smbd/error.c
index 74029a2b05..143417dce3 100644
--- a/source3/smbd/error.c
+++ b/source3/smbd/error.c
@@ -179,3 +179,20 @@ void reply_unix_error(struct smb_request *req, uint8 defclass, uint32 defcode,
error_packet_set((char *)req->outbuf, eclass, ecode, ntstatus,
line, file);
}
+
+void reply_openerror(struct smb_request *req, NTSTATUS status)
+{
+ if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_COLLISION)) {
+ /*
+ * We hit an existing file, and if we're returning DOS
+ * error codes OBJECT_NAME_COLLISION would map to
+ * ERRDOS/183, we need to return ERRDOS/80, see bug
+ * 4852.
+ */
+ reply_botherror(req, NT_STATUS_OBJECT_NAME_COLLISION,
+ ERRDOS, ERRfilexists);
+ } else {
+ reply_nterror(req, status);
+ }
+}
+
diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c
index 23905181cd..907176c161 100644
--- a/source3/smbd/nttrans.c
+++ b/source3/smbd/nttrans.c
@@ -816,51 +816,50 @@ void reply_ntcreate_and_X(connection_struct *conn,
oplock_request,
&info, &fsp);
- if (!NT_STATUS_IS_OK(status)) {
- /* We cheat here. There are two cases we
- * care about. One is a directory rename,
- * where the NT client will attempt to
- * open the source directory for
- * DELETE access. Note that when the
- * NT client does this it does *not*
- * set the directory bit in the
- * request packet. This is translated
- * into a read/write open
- * request. POSIX states that any open
- * for write request on a directory
- * will generate an EISDIR error, so
- * we can catch this here and open a
- * pseudo handle that is flagged as a
- * directory. The second is an open
- * for a permissions read only, which
- * we handle in the open_file_stat case. JRA.
- */
+ /* We cheat here. There are two cases we
+ * care about. One is a directory rename,
+ * where the NT client will attempt to
+ * open the source directory for
+ * DELETE access. Note that when the
+ * NT client does this it does *not*
+ * set the directory bit in the
+ * request packet. This is translated
+ * into a read/write open
+ * request. POSIX states that any open
+ * for write request on a directory
+ * will generate an EISDIR error, so
+ * we can catch this here and open a
+ * pseudo handle that is flagged as a
+ * directory. The second is an open
+ * for a permissions read only, which
+ * we handle in the open_file_stat case. JRA.
+ */
- if (NT_STATUS_EQUAL(status,
- NT_STATUS_FILE_IS_A_DIRECTORY)) {
+ if (NT_STATUS_EQUAL(status, NT_STATUS_FILE_IS_A_DIRECTORY)) {
- /*
- * Fail the open if it was explicitly a non-directory file.
- */
+ /*
+ * Fail the open if it was explicitly a non-directory
+ * file.
+ */
- if (create_options & FILE_NON_DIRECTORY_FILE) {
- TALLOC_FREE(case_state);
- reply_force_nterror(req, NT_STATUS_FILE_IS_A_DIRECTORY);
- END_PROFILE(SMBntcreateX);
- return;
- }
+ if (create_options & FILE_NON_DIRECTORY_FILE) {
+ TALLOC_FREE(case_state);
+ reply_force_nterror(req,
+ NT_STATUS_FILE_IS_A_DIRECTORY);
+ END_PROFILE(SMBntcreateX);
+ return;
+ }
- oplock_request = 0;
- status = open_directory(conn, req, fname,
- &sbuf,
- access_mask,
- share_access,
- create_disposition,
- create_options,
- file_attributes,
- &info, &fsp);
+ oplock_request = 0;
+ status = open_directory(conn, req, fname,
+ &sbuf,
+ access_mask,
+ share_access,
+ create_disposition,
+ create_options,
+ file_attributes,
+ &info, &fsp);
- }
}
}
@@ -872,18 +871,7 @@ void reply_ntcreate_and_X(connection_struct *conn,
/* We have re-scheduled this call. */
return;
}
- if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_COLLISION)) {
- /*
- * We hit an existing file, and if we're returning DOS
- * error codes OBJECT_NAME_COLLISION would map to
- * ERRDOS/183, we need to return ERRDOS/80, see bug
- * 4852.
- */
- reply_botherror(req, NT_STATUS_OBJECT_NAME_COLLISION,
- ERRDOS, ERRfilexists);
- return;
- }
- reply_nterror(req, status);
+ reply_openerror(req, status);
return;
}
@@ -1532,12 +1520,6 @@ static void call_nt_transact_create(connection_struct *conn,
create_options,
file_attributes,
&info, &fsp);
- if(!NT_STATUS_IS_OK(status)) {
- TALLOC_FREE(case_state);
- reply_nterror(req, status);
- return;
- }
-
} else {
/*
@@ -1553,46 +1535,41 @@ static void call_nt_transact_create(connection_struct *conn,
oplock_request,
&info, &fsp);
- if (!NT_STATUS_IS_OK(status)) {
- if (NT_STATUS_EQUAL(status,
- NT_STATUS_FILE_IS_A_DIRECTORY)) {
+ if (NT_STATUS_EQUAL(status, NT_STATUS_FILE_IS_A_DIRECTORY)) {
- /*
- * Fail the open if it was explicitly a non-directory file.
- */
+ /*
+ * Fail the open if it was explicitly a non-directory file.
+ */
- if (create_options & FILE_NON_DIRECTORY_FILE) {
- TALLOC_FREE(case_state);
- reply_force_nterror(
- req,
- NT_STATUS_FILE_IS_A_DIRECTORY);
- return;
- }
-
- oplock_request = 0;
- status = open_directory(conn, req, fname,
- &sbuf,
- access_mask,
- share_access,
- create_disposition,
- create_options,
- file_attributes,
- &info, &fsp);
- if(!NT_STATUS_IS_OK(status)) {
- TALLOC_FREE(case_state);
- reply_nterror(req, status);
- return;
- }
- } else {
+ if (create_options & FILE_NON_DIRECTORY_FILE) {
TALLOC_FREE(case_state);
- if (open_was_deferred(req->mid)) {
- /* We have re-scheduled this call. */
- return;
- }
- reply_nterror(req, status);
+ reply_force_nterror(
+ req,
+ NT_STATUS_FILE_IS_A_DIRECTORY);
return;
}
- }
+
+ oplock_request = 0;
+ status = open_directory(conn, req, fname,
+ &sbuf,
+ access_mask,
+ share_access,
+ create_disposition,
+ create_options,
+ file_attributes,
+ &info, &fsp);
+ }
+ }
+
+ TALLOC_FREE(case_state);
+
+ if(!NT_STATUS_IS_OK(status)) {
+ if (open_was_deferred(req->mid)) {
+ /* We have re-scheduled this call. */
+ return;
+ }
+ reply_openerror(req, status);
+ return;
}
/*
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index 1b0785285d..a2ea35b115 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -1556,18 +1556,7 @@ void reply_open(connection_struct *conn, struct smb_request *req)
/* We have re-scheduled this call. */
return;
}
- if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_COLLISION)) {
- /*
- * We hit an existing file, and if we're returning DOS
- * error codes OBJECT_NAME_COLLISION would map to
- * ERRDOS/183, we need to return ERRDOS/80, see bug
- * 4852.
- */
- reply_botherror(req, NT_STATUS_OBJECT_NAME_COLLISION,
- ERRDOS, ERRfilexists);
- return;
- }
- reply_nterror(req, status);
+ reply_openerror(req, status);
return;
}
@@ -1723,25 +1712,14 @@ void reply_open_and_X(connection_struct *conn, struct smb_request *req)
smb_attr,
oplock_request,
&smb_action, &fsp);
-
+
if (!NT_STATUS_IS_OK(status)) {
END_PROFILE(SMBopenX);
if (open_was_deferred(req->mid)) {
/* We have re-scheduled this call. */
return;
}
- if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_COLLISION)) {
- /*
- * We hit an existing file, and if we're returning DOS
- * error codes OBJECT_NAME_COLLISION would map to
- * ERRDOS/183, we need to return ERRDOS/80, see bug
- * 4852.
- */
- reply_botherror(req, NT_STATUS_OBJECT_NAME_COLLISION,
- ERRDOS, ERRfilexists);
- return;
- }
- reply_nterror(req, status);
+ reply_openerror(req, status);
return;
}
@@ -2087,18 +2065,7 @@ void reply_ctemp(connection_struct *conn, struct smb_request *req)
/* We have re-scheduled this call. */
return;
}
- if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_COLLISION)) {
- /*
- * We hit an existing file, and if we're returning DOS
- * error codes OBJECT_NAME_COLLISION would map to
- * ERRDOS/183, we need to return ERRDOS/80, see bug
- * 4852.
- */
- reply_botherror(req, NT_STATUS_OBJECT_NAME_COLLISION,
- ERRDOS, ERRfilexists);
- return;
- }
- reply_nterror(req, status);
+ reply_openerror(req, status);
return;
}
@@ -4678,7 +4645,7 @@ void reply_mkdir(connection_struct *conn, struct smb_request *req)
END_PROFILE(SMBmkdir);
return;
}
-
+
status = create_directory(conn, directory);
DEBUG(5, ("create_directory returned %s\n", nt_errstr(status)));
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index dbbb2faba9..36fb2eee76 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -913,18 +913,7 @@ static void call_trans2open(connection_struct *conn,
/* We have re-scheduled this call. */
return;
}
- if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_COLLISION)) {
- /*
- * We hit an existing file, and if we're returning DOS
- * error codes OBJECT_NAME_COLLISION would map to
- * ERRDOS/183, we need to return ERRDOS/80, see bug
- * 4852.
- */
- reply_botherror(req, NT_STATUS_OBJECT_NAME_COLLISION,
- ERRDOS, ERRfilexists);
- return;
- }
- reply_nterror(req, status);
+ reply_openerror(req, status);
return;
}
@@ -6515,18 +6504,9 @@ static void call_trans2setfilepathinfo(connection_struct *conn,
ERRSRV, ERRbadpath);
return;
}
- if (info_level == SMB_POSIX_PATH_OPEN &&
- NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_COLLISION)) {
- /*
- * We hit an existing file, and if we're returning DOS
- * error codes OBJECT_NAME_COLLISION would map to
- * ERRDOS/183, we need to return ERRDOS/80, see bug
- * 4852.
- */
- reply_botherror(req,
- NT_STATUS_OBJECT_NAME_COLLISION,
- ERRDOS, ERRfilexists);
- return;
+ if (info_level == SMB_POSIX_PATH_OPEN) {
+ reply_openerror(req, status);
+ return;
}
reply_nterror(req, status);