summaryrefslogtreecommitdiff
path: root/source3/smbd
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2004-06-09 00:43:43 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 10:51:54 -0500
commitb28d08cc14bd37c6263ed029a57f390687746bb9 (patch)
treeebe3a15914524ee56bdb5ef76c01d46f3500436c /source3/smbd
parenteffd4a33856bf315122df9e4fbbb241a161caa62 (diff)
downloadsamba-b28d08cc14bd37c6263ed029a57f390687746bb9.tar.gz
samba-b28d08cc14bd37c6263ed029a57f390687746bb9.tar.bz2
samba-b28d08cc14bd37c6263ed029a57f390687746bb9.zip
r1093: Ensure we clear any cached errors on a deferred open call so
we don't return the wrong error code on the next packet. Jeremy. (This used to be commit c1b06deb574d7b8e746bdf0d6f0eab16848a6cc1)
Diffstat (limited to 'source3/smbd')
-rw-r--r--source3/smbd/error.c11
-rw-r--r--source3/smbd/nttrans.c2
-rw-r--r--source3/smbd/reply.c6
-rw-r--r--source3/smbd/trans2.c1
4 files changed, 20 insertions, 0 deletions
diff --git a/source3/smbd/error.c b/source3/smbd/error.c
index 9c81d465e7..d611e0ef87 100644
--- a/source3/smbd/error.c
+++ b/source3/smbd/error.c
@@ -29,6 +29,17 @@ NTSTATUS unix_ERR_ntstatus = NT_STATUS_OK;
extern struct unix_error_map unix_dos_nt_errmap[];
/****************************************************************************
+ Ensure we don't have any errors cached.
+****************************************************************************/
+
+void clear_cached_errors(void)
+{
+ unix_ERR_class = SMB_SUCCESS;
+ unix_ERR_code = 0;
+ unix_ERR_ntstatus = NT_STATUS_OK;
+}
+
+/****************************************************************************
Create an error packet from a cached error.
****************************************************************************/
diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c
index e540db234a..25ed08650a 100644
--- a/source3/smbd/nttrans.c
+++ b/source3/smbd/nttrans.c
@@ -865,6 +865,7 @@ create_options = 0x%x root_dir_fid = 0x%x\n", flags, desired_access, file_attrib
END_PROFILE(SMBntcreateX);
if (open_was_deferred(SVAL(inbuf,smb_mid))) {
/* We have re-scheduled this call. */
+ clear_cached_errors();
return -1;
}
return set_bad_path_error(errno, bad_path, outbuf, ERRDOS,ERRnoaccess);
@@ -1353,6 +1354,7 @@ static int call_nt_transact_create(connection_struct *conn, char *inbuf, char *o
restore_case_semantics(conn, file_attributes);
if (open_was_deferred(SVAL(inbuf,smb_mid))) {
/* We have re-scheduled this call. */
+ clear_cached_errors();
return -1;
}
return set_bad_path_error(errno, bad_path, outbuf, ERRDOS,ERRnoaccess);
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index bf208b0fa4..5b30fe5b75 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -1045,6 +1045,7 @@ int reply_open(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
END_PROFILE(SMBopen);
if (open_was_deferred(SVAL(inbuf,smb_mid))) {
/* We have re-scheduled this call. */
+ clear_cached_errors();
return -1;
}
return set_bad_path_error(errno, bad_path, outbuf, ERRDOS, ERRnoaccess);
@@ -1138,6 +1139,7 @@ int reply_open_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt
END_PROFILE(SMBopenX);
if (open_was_deferred(SVAL(inbuf,smb_mid))) {
/* We have re-scheduled this call. */
+ clear_cached_errors();
return -1;
}
return set_bad_path_error(errno, bad_path, outbuf, ERRDOS, ERRnoaccess);
@@ -1267,6 +1269,7 @@ int reply_mknew(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
END_PROFILE(SMBcreate);
if (open_was_deferred(SVAL(inbuf,smb_mid))) {
/* We have re-scheduled this call. */
+ clear_cached_errors();
return -1;
}
return set_bad_path_error(errno, bad_path, outbuf, ERRDOS, ERRnoaccess);
@@ -1346,6 +1349,7 @@ int reply_ctemp(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
END_PROFILE(SMBctemp);
if (open_was_deferred(SVAL(inbuf,smb_mid))) {
/* We have re-scheduled this call. */
+ clear_cached_errors();
return -1;
}
return set_bad_path_error(errno, bad_path, outbuf, ERRDOS, ERRnoaccess);
@@ -1642,6 +1646,7 @@ int reply_unlink(connection_struct *conn, char *inbuf,char *outbuf, int dum_size
if (!NT_STATUS_IS_OK(status)) {
if (open_was_deferred(SVAL(inbuf,smb_mid))) {
/* We have re-scheduled this call. */
+ clear_cached_errors();
return -1;
}
return ERROR_NT(status);
@@ -3967,6 +3972,7 @@ int reply_mv(connection_struct *conn, char *inbuf,char *outbuf, int dum_size,
END_PROFILE(SMBmv);
if (open_was_deferred(SVAL(inbuf,smb_mid))) {
/* We have re-scheduled this call. */
+ clear_cached_errors();
return -1;
}
return ERROR_NT(status);
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index 0ba26a9147..a399a12a66 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -629,6 +629,7 @@ static int call_trans2open(connection_struct *conn, char *inbuf, char *outbuf, i
if (!fsp) {
if (open_was_deferred(SVAL(inbuf,smb_mid))) {
/* We have re-scheduled this call. */
+ clear_cached_errors();
return -1;
}
return set_bad_path_error(errno, bad_path, outbuf, ERRDOS,ERRnoaccess);