diff options
-rw-r--r-- | source4/include/nt_status.h | 8 | ||||
-rw-r--r-- | source4/smb_server/request.c | 11 | ||||
-rw-r--r-- | source4/smb_server/smb_server.c | 8 |
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)) { |