summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/include/nt_status.h8
-rw-r--r--source4/smb_server/request.c11
-rw-r--r--source4/smb_server/smb_server.c8
3 files changed, 25 insertions, 2 deletions
diff --git a/source4/include/nt_status.h b/source4/include/nt_status.h
index 9747f73eb1..d2cf1ceae4 100644
--- a/source4/include/nt_status.h
+++ b/source4/include/nt_status.h
@@ -60,4 +60,12 @@ typedef uint32 WERROR;
#define W_ERROR_IS_OK(x) (W_ERROR_V(x) == 0)
#define W_ERROR_EQUAL(x,y) (W_ERROR_V(x) == W_ERROR_V(y))
+/* this defines special NTSTATUS codes to represent DOS errors. I
+ have chosen this macro to produce status codes in the invalid
+ NTSTATUS range */
+#define NT_STATUS_DOS(class, code) NT_STATUS(0xF1000000 | ((class)<<16) | code)
+#define NT_STATUS_IS_DOS(status) ((NT_STATUS_V(status) & 0xFF000000) == 0xF1000000)
+#define NT_STATUS_DOS_CLASS(status) ((NT_STATUS_V(status) >> 16) & 0xFF)
+#define NT_STATUS_DOS_CODE(status) (NT_STATUS_V(status) & 0xFFFF)
+
#endif
diff --git a/source4/smb_server/request.c b/source4/smb_server/request.c
index 065e63a8d2..964f4a2d70 100644
--- a/source4/smb_server/request.c
+++ b/source4/smb_server/request.c
@@ -310,8 +310,15 @@ void req_reply_error(struct request_context *req, NTSTATUS status)
return;
}
- SIVAL(req->out.hdr, HDR_RCLS, NT_STATUS_V(status));
- SSVAL(req->out.hdr, HDR_FLG2, SVAL(req->out.hdr, HDR_FLG2) | FLAGS2_32_BIT_ERROR_CODES);
+ if (NT_STATUS_IS_DOS(status)) {
+ /* its a encoded DOS error, using the reserved range */
+ SSVAL(req->out.hdr, HDR_RCLS, NT_STATUS_DOS_CLASS(status));
+ SSVAL(req->out.hdr, HDR_ERR, NT_STATUS_DOS_CODE(status));
+ SSVAL(req->out.hdr, HDR_FLG2, SVAL(req->out.hdr, HDR_FLG2) & ~FLAGS2_32_BIT_ERROR_CODES);
+ } else {
+ SIVAL(req->out.hdr, HDR_RCLS, NT_STATUS_V(status));
+ SSVAL(req->out.hdr, HDR_FLG2, SVAL(req->out.hdr, HDR_FLG2) | FLAGS2_32_BIT_ERROR_CODES);
+ }
req_send_reply(req);
}
diff --git a/source4/smb_server/smb_server.c b/source4/smb_server/smb_server.c
index 84209d8670..aceae08ad8 100644
--- a/source4/smb_server/smb_server.c
+++ b/source4/smb_server/smb_server.c
@@ -480,6 +480,14 @@ static void switch_message(int type, struct request_context *req)
return;
}
+ /* see if the vuid is valid */
+ if ((flags & AS_USER) && !req->user_ctx->vuser) {
+ if (!(flags & AS_GUEST)) {
+ req_reply_error(req, NT_STATUS_DOS(ERRSRV, ERRbaduid));
+ return;
+ }
+ }
+
/* does this protocol need to be run as the connected user? */
#if HACK_REWRITE
if ((flags & AS_USER) && !change_to_user(req->conn,session_tag)) {