diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/smbd/lanman.c | 320 |
1 files changed, 237 insertions, 83 deletions
diff --git a/source3/smbd/lanman.c b/source3/smbd/lanman.c index 3045d392ce..491808ad57 100644 --- a/source3/smbd/lanman.c +++ b/source3/smbd/lanman.c @@ -27,7 +27,7 @@ #include "includes.h" #include "smbd/globals.h" -#include "../librpc/gen_ndr/cli_samr.h" +#include "../librpc/gen_ndr/ndr_samr_c.h" #include "../librpc/gen_ndr/ndr_spoolss_c.h" #include "rpc_client/cli_spoolss.h" #include "rpc_client/init_spoolss.h" @@ -2341,7 +2341,8 @@ static bool api_RNetGroupEnum(struct smbd_server_connection *sconn, uint32_t resume_handle; struct rpc_pipe_client *samr_pipe; struct policy_handle samr_handle, domain_handle; - NTSTATUS status; + NTSTATUS status, result; + struct dcerpc_binding_handle *b; if (!str1 || !str2 || !p) { return False; @@ -2373,21 +2374,36 @@ static bool api_RNetGroupEnum(struct smbd_server_connection *sconn, return false; } - status = rpccli_samr_Connect2(samr_pipe, talloc_tos(), global_myname(), - SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle); + b = samr_pipe->binding_handle; + + status = dcerpc_samr_Connect2(b, talloc_tos(), global_myname(), + SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle, + &result); if (!NT_STATUS_IS_OK(status)) { DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n", nt_errstr(status))); return false; } + if (!NT_STATUS_IS_OK(result)) { + DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n", + nt_errstr(result))); + return false; + } - status = rpccli_samr_OpenDomain(samr_pipe, talloc_tos(), &samr_handle, + status = dcerpc_samr_OpenDomain(b, talloc_tos(), &samr_handle, SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS, - get_global_sam_sid(), &domain_handle); + get_global_sam_sid(), &domain_handle, + &result); if (!NT_STATUS_IS_OK(status)) { DEBUG(0, ("api_RNetUserEnum: samr_OpenDomain failed: %s\n", nt_errstr(status))); - rpccli_samr_Close(samr_pipe, talloc_tos(), &samr_handle); + dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result); + return false; + } + if (!NT_STATUS_IS_OK(result)) { + DEBUG(0, ("api_RNetUserEnum: samr_OpenDomain failed: %s\n", + nt_errstr(result))); + dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result); return false; } @@ -2412,19 +2428,26 @@ static bool api_RNetGroupEnum(struct smbd_server_connection *sconn, struct samr_SamArray *sam_entries; uint32_t num_entries; - status = rpccli_samr_EnumDomainGroups(samr_pipe, talloc_tos(), + status = dcerpc_samr_EnumDomainGroups(b, talloc_tos(), &domain_handle, &resume_handle, &sam_entries, 1, - &num_entries); + &num_entries, + &result); if (!NT_STATUS_IS_OK(status)) { - DEBUG(10, ("rpccli_samr_EnumDomainGroups returned " + DEBUG(10, ("dcerpc_samr_EnumDomainGroups returned " "%s\n", nt_errstr(status))); break; } + if (!NT_STATUS_IS_OK(result)) { + status = result; + DEBUG(10, ("dcerpc_samr_EnumDomainGroups returned " + "%s\n", nt_errstr(result))); + break; + } if (num_entries == 0) { - DEBUG(10, ("rpccli_samr_EnumDomainGroups returned " + DEBUG(10, ("dcerpc_samr_EnumDomainGroups returned " "no entries -- done\n")); break; } @@ -2459,8 +2482,8 @@ static bool api_RNetGroupEnum(struct smbd_server_connection *sconn, TALLOC_FREE(sam_entries); } - rpccli_samr_Close(samr_pipe, talloc_tos(), &domain_handle); - rpccli_samr_Close(samr_pipe, talloc_tos(), &samr_handle); + dcerpc_samr_Close(b, talloc_tos(), &domain_handle, &result); + dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result); *rdata_len = PTR_DIFF(p,*rdata); @@ -2506,7 +2529,8 @@ static bool api_NetUserGetGroups(struct smbd_server_connection *sconn, struct lsa_Strings names; struct samr_Ids type, rid; struct samr_RidWithAttributeArray *rids; - NTSTATUS status; + NTSTATUS status, result; + struct dcerpc_binding_handle *b; if (!str1 || !str2 || !UserName || !p) { return False; @@ -2556,33 +2580,53 @@ static bool api_NetUserGetGroups(struct smbd_server_connection *sconn, return false; } - status = rpccli_samr_Connect2(samr_pipe, talloc_tos(), global_myname(), - SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle); + b = samr_pipe->binding_handle; + + status = dcerpc_samr_Connect2(b, talloc_tos(), global_myname(), + SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle, + &result); if (!NT_STATUS_IS_OK(status)) { DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n", nt_errstr(status))); return false; } + if (!NT_STATUS_IS_OK(result)) { + DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n", + nt_errstr(result))); + return false; + } - status = rpccli_samr_OpenDomain(samr_pipe, talloc_tos(), &samr_handle, + status = dcerpc_samr_OpenDomain(b, talloc_tos(), &samr_handle, SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT, - get_global_sam_sid(), &domain_handle); + get_global_sam_sid(), &domain_handle, + &result); if (!NT_STATUS_IS_OK(status)) { DEBUG(0, ("api_RNetUserEnum: samr_OpenDomain failed: %s\n", nt_errstr(status))); goto close_sam; } + if (!NT_STATUS_IS_OK(result)) { + DEBUG(0, ("api_RNetUserEnum: samr_OpenDomain failed: %s\n", + nt_errstr(result))); + goto close_sam; + } name.string = UserName; - status = rpccli_samr_LookupNames(samr_pipe, talloc_tos(), + status = dcerpc_samr_LookupNames(b, talloc_tos(), &domain_handle, 1, &name, - &rid, &type); + &rid, &type, + &result); if (!NT_STATUS_IS_OK(status)) { DEBUG(0, ("api_RNetUserEnum: samr_LookupNames failed: %s\n", nt_errstr(status))); goto close_domain; } + if (!NT_STATUS_IS_OK(result)) { + DEBUG(0, ("api_RNetUserEnum: samr_LookupNames failed: %s\n", + nt_errstr(result))); + goto close_domain; + } if (type.ids[0] != SID_NAME_USER) { DEBUG(10, ("%s is a %s, not a user\n", UserName, @@ -2590,31 +2634,44 @@ static bool api_NetUserGetGroups(struct smbd_server_connection *sconn, goto close_domain; } - status = rpccli_samr_OpenUser(samr_pipe, talloc_tos(), + status = dcerpc_samr_OpenUser(b, talloc_tos(), &domain_handle, SAMR_USER_ACCESS_GET_GROUPS, - rid.ids[0], &user_handle); + rid.ids[0], &user_handle, + &result); if (!NT_STATUS_IS_OK(status)) { DEBUG(0, ("api_RNetUserEnum: samr_LookupNames failed: %s\n", nt_errstr(status))); goto close_domain; } + if (!NT_STATUS_IS_OK(result)) { + DEBUG(0, ("api_RNetUserEnum: samr_LookupNames failed: %s\n", + nt_errstr(result))); + goto close_domain; + } - status = rpccli_samr_GetGroupsForUser(samr_pipe, talloc_tos(), - &user_handle, &rids); + status = dcerpc_samr_GetGroupsForUser(b, talloc_tos(), + &user_handle, &rids, + &result); if (!NT_STATUS_IS_OK(status)) { DEBUG(0, ("api_RNetUserEnum: samr_LookupNames failed: %s\n", nt_errstr(status))); goto close_user; } + if (!NT_STATUS_IS_OK(result)) { + DEBUG(0, ("api_RNetUserEnum: samr_LookupNames failed: %s\n", + nt_errstr(result))); + goto close_user; + } for (i=0; i<rids->count; i++) { - status = rpccli_samr_LookupRids(samr_pipe, talloc_tos(), + status = dcerpc_samr_LookupRids(b, talloc_tos(), &domain_handle, 1, &rids->rids[i].rid, - &names, &type); - if (NT_STATUS_IS_OK(status) && (names.count == 1)) { + &names, &type, + &result); + if (NT_STATUS_IS_OK(status) && NT_STATUS_IS_OK(result) && (names.count == 1)) { strlcpy(p, names.names[0].string, PTR_DIFF(endp,p)); p += 21; count++; @@ -2629,11 +2686,11 @@ static bool api_NetUserGetGroups(struct smbd_server_connection *sconn, ret = True; close_user: - rpccli_samr_Close(samr_pipe, talloc_tos(), &user_handle); + dcerpc_samr_Close(b, talloc_tos(), &user_handle, &result); close_domain: - rpccli_samr_Close(samr_pipe, talloc_tos(), &domain_handle); + dcerpc_samr_Close(b, talloc_tos(), &domain_handle, &result); close_sam: - rpccli_samr_Close(samr_pipe, talloc_tos(), &samr_handle); + dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result); return ret; } @@ -2658,13 +2715,15 @@ static bool api_RNetUserEnum(struct smbd_server_connection *sconn, struct rpc_pipe_client *samr_pipe; struct policy_handle samr_handle, domain_handle; - NTSTATUS status; + NTSTATUS status, result; char *str1 = get_safe_str_ptr(param,tpscnt,param,2); char *str2 = skip_string(param,tpscnt,str1); char *p = skip_string(param,tpscnt,str2); char *endp = NULL; + struct dcerpc_binding_handle *b; + if (!str1 || !str2 || !p) { return False; } @@ -2713,21 +2772,36 @@ static bool api_RNetUserEnum(struct smbd_server_connection *sconn, return false; } - status = rpccli_samr_Connect2(samr_pipe, talloc_tos(), global_myname(), - SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle); + b = samr_pipe->binding_handle; + + status = dcerpc_samr_Connect2(b, talloc_tos(), global_myname(), + SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle, + &result); if (!NT_STATUS_IS_OK(status)) { DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n", nt_errstr(status))); return false; } + if (!NT_STATUS_IS_OK(result)) { + DEBUG(0, ("api_RNetUserEnum: samr_Connect2 failed: %s\n", + nt_errstr(result))); + return false; + } - status = rpccli_samr_OpenDomain(samr_pipe, talloc_tos(), &samr_handle, + status = dcerpc_samr_OpenDomain(b, talloc_tos(), &samr_handle, SAMR_DOMAIN_ACCESS_ENUM_ACCOUNTS, - get_global_sam_sid(), &domain_handle); + get_global_sam_sid(), &domain_handle, + &result); if (!NT_STATUS_IS_OK(status)) { DEBUG(0, ("api_RNetUserEnum: samr_OpenDomain failed: %s\n", nt_errstr(status))); - rpccli_samr_Close(samr_pipe, talloc_tos(), &samr_handle); + dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result); + return false; + } + if (!NT_STATUS_IS_OK(result)) { + DEBUG(0, ("api_RNetUserEnum: samr_OpenDomain failed: %s\n", + nt_errstr(result))); + dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result); return false; } @@ -2739,20 +2813,26 @@ static bool api_RNetUserEnum(struct smbd_server_connection *sconn, struct samr_SamArray *sam_entries; uint32_t num_entries; - status = rpccli_samr_EnumDomainUsers(samr_pipe, talloc_tos(), + status = dcerpc_samr_EnumDomainUsers(b, talloc_tos(), &domain_handle, &resume_handle, 0, &sam_entries, 1, - &num_entries); + &num_entries, + &result); if (!NT_STATUS_IS_OK(status)) { - DEBUG(10, ("rpccli_samr_EnumDomainUsers returned " + DEBUG(10, ("dcerpc_samr_EnumDomainUsers returned " "%s\n", nt_errstr(status))); break; } + if (!NT_STATUS_IS_OK(result)) { + DEBUG(10, ("dcerpc_samr_EnumDomainUsers returned " + "%s\n", nt_errstr(result))); + break; + } if (num_entries == 0) { - DEBUG(10, ("rpccli_samr_EnumDomainUsers returned " + DEBUG(10, ("dcerpc_samr_EnumDomainUsers returned " "no entries -- done\n")); break; } @@ -2785,8 +2865,8 @@ static bool api_RNetUserEnum(struct smbd_server_connection *sconn, TALLOC_FREE(sam_entries); } - rpccli_samr_Close(samr_pipe, talloc_tos(), &domain_handle); - rpccli_samr_Close(samr_pipe, talloc_tos(), &samr_handle); + dcerpc_samr_Close(b, talloc_tos(), &domain_handle, &result); + dcerpc_samr_Close(b, talloc_tos(), &samr_handle, &result); *rdata_len = PTR_DIFF(p,*rdata); @@ -2874,7 +2954,7 @@ static bool api_SetUserPassword(struct smbd_server_connection *sconn, fstring user; fstring pass1,pass2; TALLOC_CTX *mem_ctx = talloc_tos(); - NTSTATUS status; + NTSTATUS status, result; struct rpc_pipe_client *cli = NULL; struct policy_handle connect_handle, domain_handle, user_handle; struct lsa_String domain_name; @@ -2888,6 +2968,7 @@ static bool api_SetUserPassword(struct smbd_server_connection *sconn, uint32_t rid; int encrypted; int min_pwd_length; + struct dcerpc_binding_handle *b = NULL; /* Skip 2 strings. */ p = skip_string(param,tpscnt,np); @@ -2959,50 +3040,72 @@ static bool api_SetUserPassword(struct smbd_server_connection *sconn, goto out; } - status = rpccli_samr_Connect2(cli, mem_ctx, + b = cli->binding_handle; + + status = dcerpc_samr_Connect2(b, mem_ctx, global_myname(), SAMR_ACCESS_CONNECT_TO_SERVER | SAMR_ACCESS_ENUM_DOMAINS | SAMR_ACCESS_LOOKUP_DOMAIN, - &connect_handle); + &connect_handle, + &result); if (!NT_STATUS_IS_OK(status)) { errcode = W_ERROR_V(ntstatus_to_werror(status)); goto out; } + if (!NT_STATUS_IS_OK(result)) { + errcode = W_ERROR_V(ntstatus_to_werror(result)); + goto out; + } init_lsa_String(&domain_name, get_global_sam_name()); - status = rpccli_samr_LookupDomain(cli, mem_ctx, + status = dcerpc_samr_LookupDomain(b, mem_ctx, &connect_handle, &domain_name, - &domain_sid); + &domain_sid, + &result); if (!NT_STATUS_IS_OK(status)) { errcode = W_ERROR_V(ntstatus_to_werror(status)); goto out; } + if (!NT_STATUS_IS_OK(result)) { + errcode = W_ERROR_V(ntstatus_to_werror(result)); + goto out; + } - status = rpccli_samr_OpenDomain(cli, mem_ctx, + status = dcerpc_samr_OpenDomain(b, mem_ctx, &connect_handle, SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT, domain_sid, - &domain_handle); + &domain_handle, + &result); if (!NT_STATUS_IS_OK(status)) { errcode = W_ERROR_V(ntstatus_to_werror(status)); goto out; } + if (!NT_STATUS_IS_OK(result)) { + errcode = W_ERROR_V(ntstatus_to_werror(result)); + goto out; + } init_lsa_String(&names, user); - status = rpccli_samr_LookupNames(cli, mem_ctx, + status = dcerpc_samr_LookupNames(b, mem_ctx, &domain_handle, 1, &names, &rids, - &types); + &types, + &result); if (!NT_STATUS_IS_OK(status)) { errcode = W_ERROR_V(ntstatus_to_werror(status)); goto out; } + if (!NT_STATUS_IS_OK(result)) { + errcode = W_ERROR_V(ntstatus_to_werror(result)); + goto out; + } if (rids.count != 1) { errcode = W_ERROR_V(WERR_NO_SUCH_USER); @@ -3019,15 +3122,20 @@ static bool api_SetUserPassword(struct smbd_server_connection *sconn, rid = rids.ids[0]; - status = rpccli_samr_OpenUser(cli, mem_ctx, + status = dcerpc_samr_OpenUser(b, mem_ctx, &domain_handle, SAMR_USER_ACCESS_CHANGE_PASSWORD, rid, - &user_handle); + &user_handle, + &result); if (!NT_STATUS_IS_OK(status)) { errcode = W_ERROR_V(ntstatus_to_werror(status)); goto out; } + if (!NT_STATUS_IS_OK(result)) { + errcode = W_ERROR_V(ntstatus_to_werror(result)); + goto out; + } if (encrypted == 0) { E_deshash(pass1, old_lm_hash.hash); @@ -3039,7 +3147,7 @@ static bool api_SetUserPassword(struct smbd_server_connection *sconn, memcpy(new_lm_hash.hash, pass1, MIN(strlen(pass2), 16)); } - status = rpccli_samr_ChangePasswordUser(cli, mem_ctx, + status = dcerpc_samr_ChangePasswordUser(b, mem_ctx, &user_handle, true, /* lm_present */ &old_lm_hash, @@ -3050,23 +3158,28 @@ static bool api_SetUserPassword(struct smbd_server_connection *sconn, false, /* cross1_present */ NULL, /* nt_cross */ false, /* cross2_present */ - NULL); /* lm_cross */ + NULL, /* lm_cross */ + &result); if (!NT_STATUS_IS_OK(status)) { errcode = W_ERROR_V(ntstatus_to_werror(status)); goto out; } + if (!NT_STATUS_IS_OK(result)) { + errcode = W_ERROR_V(ntstatus_to_werror(result)); + goto out; + } errcode = NERR_Success; out: - if (cli && is_valid_policy_hnd(&user_handle)) { - rpccli_samr_Close(cli, mem_ctx, &user_handle); + if (b && is_valid_policy_hnd(&user_handle)) { + dcerpc_samr_Close(b, mem_ctx, &user_handle, &result); } - if (cli && is_valid_policy_hnd(&domain_handle)) { - rpccli_samr_Close(cli, mem_ctx, &domain_handle); + if (b && is_valid_policy_hnd(&domain_handle)) { + dcerpc_samr_Close(b, mem_ctx, &domain_handle, &result); } - if (cli && is_valid_policy_hnd(&connect_handle)) { - rpccli_samr_Close(cli, mem_ctx, &connect_handle); + if (b && is_valid_policy_hnd(&connect_handle)) { + dcerpc_samr_Close(b, mem_ctx, &connect_handle, &result); } memset((char *)pass1,'\0',sizeof(fstring)); @@ -3093,13 +3206,14 @@ static bool api_SamOEMChangePassword(struct smbd_server_connection *sconn, char *p = get_safe_str_ptr(param,tpscnt,param,2); TALLOC_CTX *mem_ctx = talloc_tos(); - NTSTATUS status; + NTSTATUS status, result; struct rpc_pipe_client *cli = NULL; struct lsa_AsciiString server, account; struct samr_CryptPassword password; struct samr_Password hash; int errcode = NERR_badpass; int bufsize; + struct dcerpc_binding_handle *b; *rparam_len = 4; *rparam = smb_realloc_limit(*rparam,*rparam_len); @@ -3177,18 +3291,25 @@ static bool api_SamOEMChangePassword(struct smbd_server_connection *sconn, goto out; } + b = cli->binding_handle; + init_lsa_AsciiString(&server, global_myname()); init_lsa_AsciiString(&account, user); - status = rpccli_samr_OemChangePasswordUser2(cli, mem_ctx, + status = dcerpc_samr_OemChangePasswordUser2(b, mem_ctx, &server, &account, &password, - &hash); + &hash, + &result); if (!NT_STATUS_IS_OK(status)) { errcode = W_ERROR_V(ntstatus_to_werror(status)); goto out; } + if (!NT_STATUS_IS_OK(result)) { + errcode = W_ERROR_V(ntstatus_to_werror(result)); + goto out; + } errcode = NERR_Success; out: @@ -4110,7 +4231,7 @@ static bool api_RNetUserGetInfo(struct smbd_server_connection *sconn, const char *level_string; TALLOC_CTX *mem_ctx = talloc_tos(); - NTSTATUS status; + NTSTATUS status, result; struct rpc_pipe_client *cli = NULL; struct policy_handle connect_handle, domain_handle, user_handle; struct lsa_String domain_name; @@ -4121,6 +4242,7 @@ static bool api_RNetUserGetInfo(struct smbd_server_connection *sconn, int errcode = W_ERROR_V(WERR_USER_NOT_FOUND); uint32_t rid; union samr_UserInfo *info; + struct dcerpc_binding_handle *b = NULL; if (!str1 || !str2 || !UserName || !p) { return False; @@ -4180,50 +4302,72 @@ static bool api_RNetUserGetInfo(struct smbd_server_connection *sconn, goto out; } - status = rpccli_samr_Connect2(cli, mem_ctx, + b = cli->binding_handle; + + status = dcerpc_samr_Connect2(b, mem_ctx, global_myname(), SAMR_ACCESS_CONNECT_TO_SERVER | SAMR_ACCESS_ENUM_DOMAINS | SAMR_ACCESS_LOOKUP_DOMAIN, - &connect_handle); + &connect_handle, + &result); if (!NT_STATUS_IS_OK(status)) { errcode = W_ERROR_V(ntstatus_to_werror(status)); goto out; } + if (!NT_STATUS_IS_OK(result)) { + errcode = W_ERROR_V(ntstatus_to_werror(result)); + goto out; + } init_lsa_String(&domain_name, get_global_sam_name()); - status = rpccli_samr_LookupDomain(cli, mem_ctx, + status = dcerpc_samr_LookupDomain(b, mem_ctx, &connect_handle, &domain_name, - &domain_sid); + &domain_sid, + &result); if (!NT_STATUS_IS_OK(status)) { errcode = W_ERROR_V(ntstatus_to_werror(status)); goto out; } + if (!NT_STATUS_IS_OK(result)) { + errcode = W_ERROR_V(ntstatus_to_werror(result)); + goto out; + } - status = rpccli_samr_OpenDomain(cli, mem_ctx, + status = dcerpc_samr_OpenDomain(b, mem_ctx, &connect_handle, SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT, domain_sid, - &domain_handle); + &domain_handle, + &result); if (!NT_STATUS_IS_OK(status)) { errcode = W_ERROR_V(ntstatus_to_werror(status)); goto out; } + if (!NT_STATUS_IS_OK(result)) { + errcode = W_ERROR_V(ntstatus_to_werror(result)); + goto out; + } init_lsa_String(&names, UserName); - status = rpccli_samr_LookupNames(cli, mem_ctx, + status = dcerpc_samr_LookupNames(b, mem_ctx, &domain_handle, 1, &names, &rids, - &types); + &types, + &result); if (!NT_STATUS_IS_OK(status)) { errcode = W_ERROR_V(ntstatus_to_werror(status)); goto out; } + if (!NT_STATUS_IS_OK(result)) { + errcode = W_ERROR_V(ntstatus_to_werror(result)); + goto out; + } if (rids.count != 1) { errcode = W_ERROR_V(WERR_NO_SUCH_USER); @@ -4240,7 +4384,7 @@ static bool api_RNetUserGetInfo(struct smbd_server_connection *sconn, rid = rids.ids[0]; - status = rpccli_samr_OpenUser(cli, mem_ctx, + status = dcerpc_samr_OpenUser(b, mem_ctx, &domain_handle, SAMR_USER_ACCESS_GET_LOCALE | SAMR_USER_ACCESS_GET_LOGONINFO | @@ -4249,20 +4393,30 @@ static bool api_RNetUserGetInfo(struct smbd_server_connection *sconn, SAMR_USER_ACCESS_GET_GROUP_MEMBERSHIP | SEC_STD_READ_CONTROL, rid, - &user_handle); + &user_handle, + &result); if (!NT_STATUS_IS_OK(status)) { errcode = W_ERROR_V(ntstatus_to_werror(status)); goto out; } + if (!NT_STATUS_IS_OK(result)) { + errcode = W_ERROR_V(ntstatus_to_werror(result)); + goto out; + } - status = rpccli_samr_QueryUserInfo2(cli, mem_ctx, + status = dcerpc_samr_QueryUserInfo2(b, mem_ctx, &user_handle, UserAllInformation, - &info); + &info, + &result); if (!NT_STATUS_IS_OK(status)) { errcode = W_ERROR_V(ntstatus_to_werror(status)); goto out; } + if (!NT_STATUS_IS_OK(result)) { + errcode = W_ERROR_V(ntstatus_to_werror(result)); + goto out; + } memset(p,0,21); fstrcpy(p+usri11_name,UserName); /* 21 bytes - user name */ @@ -4439,14 +4593,14 @@ static bool api_RNetUserGetInfo(struct smbd_server_connection *sconn, out: *rdata_len = PTR_DIFF(p2,*rdata); - if (cli && is_valid_policy_hnd(&user_handle)) { - rpccli_samr_Close(cli, mem_ctx, &user_handle); + if (b && is_valid_policy_hnd(&user_handle)) { + dcerpc_samr_Close(b, mem_ctx, &user_handle, &result); } - if (cli && is_valid_policy_hnd(&domain_handle)) { - rpccli_samr_Close(cli, mem_ctx, &domain_handle); + if (b && is_valid_policy_hnd(&domain_handle)) { + dcerpc_samr_Close(b, mem_ctx, &domain_handle, &result); } - if (cli && is_valid_policy_hnd(&connect_handle)) { - rpccli_samr_Close(cli, mem_ctx, &connect_handle); + if (b && is_valid_policy_hnd(&connect_handle)) { + dcerpc_samr_Close(b, mem_ctx, &connect_handle, &result); } SSVAL(*rparam,0,errcode); |