mirror of
https://github.com/samba-team/samba.git
synced 2025-01-12 09:18:10 +03:00
r549: added support for DOS error codes in NTSTATUS returns. This uses a
range of NTSTATUS codes that are normally invalid to prevent conflicts with real error codes. use the new DOS facility to fix the ERRbaduid return that volker found
This commit is contained in:
parent
b1cd98188d
commit
10fdfb5239
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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)) {
|
||||
|
Loading…
Reference in New Issue
Block a user