diff options
Diffstat (limited to 'source/rpc_server')
-rw-r--r-- | source/rpc_server/srv_dfs_nt.c | 45 | ||||
-rw-r--r-- | source/rpc_server/srv_lsa_nt.c | 24 | ||||
-rw-r--r-- | source/rpc_server/srv_netlog_nt.c | 280 | ||||
-rw-r--r-- | source/rpc_server/srv_pipe.c | 51 | ||||
-rw-r--r-- | source/rpc_server/srv_pipe_hnd.c | 11 | ||||
-rw-r--r-- | source/rpc_server/srv_reg_nt.c | 8 | ||||
-rw-r--r-- | source/rpc_server/srv_samr_nt.c | 1109 | ||||
-rwxr-xr-x | source/rpc_server/srv_spoolss.c | 2 | ||||
-rw-r--r-- | source/rpc_server/srv_spoolss_nt.c | 701 | ||||
-rw-r--r-- | source/rpc_server/srv_srvsvc_nt.c | 177 | ||||
-rw-r--r-- | source/rpc_server/srv_util.c | 33 | ||||
-rw-r--r-- | source/rpc_server/srv_wkssvc_nt.c | 2 |
12 files changed, 1329 insertions, 1114 deletions
diff --git a/source/rpc_server/srv_dfs_nt.c b/source/rpc_server/srv_dfs_nt.c index 54c3fbf324c..9bc12e2a965 100644 --- a/source/rpc_server/srv_dfs_nt.c +++ b/source/rpc_server/srv_dfs_nt.c @@ -56,7 +56,11 @@ uint32 _dfs_add(pipes_struct *p, DFS_Q_DFS_ADD* q_u, DFS_R_DFS_ADD *r_u) if (user.uid != 0) { DEBUG(10,("_dfs_add: uid != 0. Access denied.\n")); - return ERROR_ACCESS_DENIED; + + /* RPC calls return Windows errors. NT_STATUS_ACCESS_DENIED + doesn't work as a return code for RPC calls + */ + return ERRnoaccess; } unistr2_to_ascii(dfspath, &q_u->DfsEntryPath, sizeof(dfspath)-1); @@ -70,10 +74,7 @@ uint32 _dfs_add(pipes_struct *p, DFS_Q_DFS_ADD* q_u, DFS_R_DFS_ADD *r_u) pstrcat(altpath, "\\"); pstrcat(altpath, sharename); - if(!create_junction(dfspath, &jn)) - return NERR_DfsNoSuchServer; - - if(get_referred_path(&jn)) + if(get_referred_path(dfspath, &jn, NULL, NULL)) { exists = True; jn.referral_count += 1; @@ -106,7 +107,7 @@ uint32 _dfs_add(pipes_struct *p, DFS_Q_DFS_ADD* q_u, DFS_R_DFS_ADD *r_u) if(!create_msdfs_link(&jn, exists)) return NERR_DfsCantCreateJunctionPoint; - return NT_STATUS_NOPROBLEMO; + return ERRsuccess; } uint32 _dfs_remove(pipes_struct *p, DFS_Q_DFS_REMOVE *q_u, DFS_R_DFS_REMOVE *r_u) @@ -122,7 +123,10 @@ uint32 _dfs_remove(pipes_struct *p, DFS_Q_DFS_REMOVE *q_u, DFS_R_DFS_REMOVE *r_u if (user.uid != 0) { DEBUG(10,("_dfs_remove: uid != 0. Access denied.\n")); - return ERROR_ACCESS_DENIED; + /* NT_STATUS_ACCESS_DENIED will not work as a status code + for RPC calls + */ + return ERRnoaccess; } unistr2_to_ascii(dfspath, &q_u->DfsEntryPath, sizeof(dfspath)-1); @@ -137,16 +141,14 @@ uint32 _dfs_remove(pipes_struct *p, DFS_Q_DFS_REMOVE *q_u, DFS_R_DFS_REMOVE *r_u pstrcpy(altpath, servername); pstrcat(altpath, "\\"); pstrcat(altpath, sharename); + strlower(altpath); } DEBUG(5,("init_reply_dfs_remove: Request to remove %s -> %s\\%s.\n", dfspath, servername, sharename)); - if(!create_junction(dfspath, &jn)) - return NERR_DfsNoSuchServer; - - if(!get_referred_path(&jn)) - return NERR_DfsNoSuchVolume; + if(!get_referred_path(dfspath, &jn, NULL, NULL)) + return NERR_DfsNoSuchVolume; /* if no server-share pair given, remove the msdfs link completely */ if(!q_u->ptr_ServerName && !q_u->ptr_ShareName) @@ -158,14 +160,18 @@ uint32 _dfs_remove(pipes_struct *p, DFS_Q_DFS_REMOVE *q_u, DFS_R_DFS_REMOVE *r_u { int i=0; /* compare each referral in the list with the one to remove */ + DEBUG(10,("altpath: .%s. refcnt: %d\n", altpath, jn.referral_count)); for(i=0;i<jn.referral_count;i++) { pstring refpath; pstrcpy(refpath,jn.referral_list[i].alternate_path); trim_string(refpath, "\\", "\\"); + DEBUG(10,("_dfs_remove: refpath: .%s.\n", refpath)); if(strequal(refpath, altpath)) { *(jn.referral_list[i].alternate_path)='\0'; + DEBUG(10,("_dfs_remove: Removal request matches referral %s\n", + refpath)); found = True; } } @@ -185,7 +191,7 @@ uint32 _dfs_remove(pipes_struct *p, DFS_Q_DFS_REMOVE *q_u, DFS_R_DFS_REMOVE *r_u } } - return NT_STATUS_NOPROBLEMO; + return ERRsuccess; } static BOOL init_reply_dfs_info_1(struct junction_map* j, DFS_INFO_1* dfs1, int num_j) @@ -227,8 +233,13 @@ static BOOL init_reply_dfs_info_3(TALLOC_CTX *ctx, struct junction_map* j, DFS_I { pstring str; dfs3[i].ptr_entrypath = 1; - slprintf(str, sizeof(pstring)-1, "\\\\%s\\%s\\%s", global_myname, - j[i].service_name, j[i].volume_name); + if (j[i].volume_name[0] == '\0') + slprintf(str, sizeof(pstring)-1, "\\\\%s\\%s", + global_myname, j[i].service_name); + else + slprintf(str, sizeof(pstring)-1, "\\\\%s\\%s\\%s", global_myname, + j[i].service_name, j[i].volume_name); + init_unistr2(&dfs3[i].entrypath, str, strlen(str)+1); dfs3[i].ptr_comment = 1; init_unistr2(&dfs3[i].comment, "", 1); @@ -309,7 +320,7 @@ static uint32 init_reply_dfs_ctr(TALLOC_CTX *ctx, uint32 level, DFS_INFO_CTR* ct default: return NT_STATUS_INVALID_LEVEL; } - return NT_STATUS_NOPROBLEMO; + return NT_STATUS_OK; } uint32 _dfs_enum(pipes_struct *p, DFS_Q_DFS_ENUM *q_u, DFS_R_DFS_ENUM *r_u) @@ -353,7 +364,7 @@ uint32 _dfs_get_info(pipes_struct *p, DFS_Q_DFS_GET_INFO *q_u, DFS_R_DFS_GET_INF if(!create_junction(path, &jn)) return NERR_DfsNoSuchServer; - if(!get_referred_path(&jn)) + if(!get_referred_path(path, &jn, NULL, NULL)) return NERR_DfsNoSuchVolume; r_u->level = level; diff --git a/source/rpc_server/srv_lsa_nt.c b/source/rpc_server/srv_lsa_nt.c index afcace3f9c8..a14a479984b 100644 --- a/source/rpc_server/srv_lsa_nt.c +++ b/source/rpc_server/srv_lsa_nt.c @@ -176,7 +176,7 @@ static void init_reply_lookup_names(LSA_R_LOOKUP_NAMES *r_l, if (mapped_count == 0) r_l->status = NT_STATUS_NONE_MAPPED; else - r_l->status = NT_STATUS_NO_PROBLEMO; + r_l->status = NT_STATUS_OK; } /*************************************************************************** @@ -276,7 +276,7 @@ static void init_reply_lookup_sids(LSA_R_LOOKUP_SIDS *r_l, if (mapped_count == 0) r_l->status = NT_STATUS_NONE_MAPPED; else - r_l->status = NT_STATUS_NO_PROBLEMO; + r_l->status = NT_STATUS_OK; } /*************************************************************************** @@ -291,7 +291,7 @@ uint32 _lsa_open_policy2(pipes_struct *p, LSA_Q_OPEN_POL2 *q_u, LSA_R_OPEN_POL2 if (!create_policy_hnd(p, &r_u->pol, NULL, NULL)) return NT_STATUS_OBJECT_NAME_NOT_FOUND; - return NT_STATUS_NOPROBLEMO; + return NT_STATUS_OK; } /*************************************************************************** @@ -306,7 +306,7 @@ uint32 _lsa_open_policy(pipes_struct *p, LSA_Q_OPEN_POL *q_u, LSA_R_OPEN_POL *r_ if (!create_policy_hnd(p, &r_u->pol, NULL, NULL)) return NT_STATUS_OBJECT_NAME_NOT_FOUND; - return NT_STATUS_NOPROBLEMO; + return NT_STATUS_OK; } /*************************************************************************** @@ -323,8 +323,8 @@ uint32 _lsa_enum_trust_dom(pipes_struct *p, LSA_Q_ENUM_TRUST_DOM *q_u, LSA_R_ENU return NT_STATUS_INVALID_HANDLE; /* set up the LSA QUERY INFO response */ - init_r_enum_trust_dom(r_u, enum_context, dom_name, dom_sid, - dom_name != NULL ? NT_STATUS_NO_PROBLEMO : NT_STATUS_UNABLE_TO_FREE_VM); + init_r_enum_trust_dom(p->mem_ctx, r_u, enum_context, dom_name, dom_sid, + dom_name != NULL ? NT_STATUS_OK : NT_STATUS_UNABLE_TO_FREE_VM); return r_u->status; } @@ -341,7 +341,7 @@ uint32 _lsa_query_info(pipes_struct *p, LSA_Q_QUERY_INFO *q_u, LSA_R_QUERY_INFO char *name = NULL; DOM_SID *sid = NULL; - r_u->status = NT_STATUS_NO_PROBLEMO; + r_u->status = NT_STATUS_OK; if (!find_policy_by_hnd(p, &q_u->pol, NULL)) return NT_STATUS_INVALID_HANDLE; @@ -434,7 +434,7 @@ uint32 _lsa_query_info(pipes_struct *p, LSA_Q_QUERY_INFO *q_u, LSA_R_QUERY_INFO break; } - if(r_u->status == NT_STATUS_NO_PROBLEMO) { + if(r_u->status == NT_STATUS_OK) { r_u->undoc_buffer = 0x22000000; /* bizarre */ r_u->info_class = q_u->info_class; } @@ -508,7 +508,7 @@ uint32 _lsa_close(pipes_struct *p, LSA_Q_CLOSE *q_u, LSA_R_CLOSE *r_u) return NT_STATUS_INVALID_HANDLE; close_policy_hnd(p, &q_u->pol); - return NT_STATUS_NO_PROBLEMO; + return NT_STATUS_OK; } /*************************************************************************** @@ -532,8 +532,8 @@ uint32 _lsa_unk_get_connuser(pipes_struct *p, LSA_Q_UNK_GET_CONNUSER *q_u, LSA_R fstrcpy(username, vuser->user.smb_name); fstrcpy(domname, vuser->user.domain); - ulen = strlen(username); - dlen = strlen(domname); + ulen = strlen(username) + 1; + dlen = strlen(domname) + 1; init_uni_hdr(&r_u->hdr_user_name, ulen); r_u->ptr_user_name = 1; @@ -545,7 +545,7 @@ uint32 _lsa_unk_get_connuser(pipes_struct *p, LSA_Q_UNK_GET_CONNUSER *q_u, LSA_R r_u->ptr_dom_name = 1; init_unistr2(&r_u->uni2_dom_name, domname, dlen); - r_u->status = NT_STATUS_NO_PROBLEMO; + r_u->status = NT_STATUS_OK; return r_u->status; } diff --git a/source/rpc_server/srv_netlog_nt.c b/source/rpc_server/srv_netlog_nt.c index 5a7505869c5..62c49f5b89a 100644 --- a/source/rpc_server/srv_netlog_nt.c +++ b/source/rpc_server/srv_netlog_nt.c @@ -117,7 +117,9 @@ static void init_net_r_srv_pwset(NET_R_SRV_PWSET *r_s, static BOOL get_md4pw(char *md4pw, char *mach_acct) { - struct smb_passwd *smb_pass; + SAM_ACCOUNT *sampass = NULL; + uint8 *pass; + BOOL ret; #if 0 /* @@ -136,22 +138,29 @@ static BOOL get_md4pw(char *md4pw, char *mach_acct) return False; } #endif /* 0 */ + if(!pdb_init_sam(&sampass)) + return False; /* JRA. This is ok as it is only used for generating the challenge. */ - become_root(); - smb_pass = getsmbpwnam(mach_acct); + ret=pdb_getsampwnam(sampass, mach_acct); unbecome_root(); - if ((smb_pass) != NULL && !(smb_pass->acct_ctrl & ACB_DISABLED) && - (smb_pass->smb_nt_passwd != NULL)) - { - memcpy(md4pw, smb_pass->smb_nt_passwd, 16); - dump_data(5, md4pw, 16); + if (ret==False) { + DEBUG(0,("get_md4pw: Workstation %s: no account in domain\n", mach_acct)); + pdb_free_sam(sampass); + return False; + } + if (!(pdb_get_acct_ctrl(sampass) & ACB_DISABLED) && ((pass=pdb_get_nt_passwd(sampass)) != NULL)) { + memcpy(md4pw, pass, 16); + dump_data(5, md4pw, 16); + pdb_free_sam(sampass); return True; } + DEBUG(0,("get_md4pw: Workstation %s: no account in domain\n", mach_acct)); + pdb_free_sam(sampass); return False; } @@ -161,7 +170,7 @@ static BOOL get_md4pw(char *md4pw, char *mach_acct) uint32 _net_req_chal(pipes_struct *p, NET_Q_REQ_CHAL *q_u, NET_R_REQ_CHAL *r_u) { - uint32 status = NT_STATUS_NOPROBLEMO; + uint32 status = NT_STATUS_OK; fstring mach_acct; if (!get_valid_user_struct(p->vuid)) @@ -220,7 +229,7 @@ static void init_net_r_auth(NET_R_AUTH *r_a, DOM_CHAL *resp_cred, int status) uint32 _net_auth(pipes_struct *p, NET_Q_AUTH *q_u, NET_R_AUTH *r_u) { - uint32 status = NT_STATUS_NOPROBLEMO; + uint32 status = NT_STATUS_OK; DOM_CHAL srv_cred; UTIME srv_time; @@ -266,7 +275,7 @@ static void init_net_r_auth_2(NET_R_AUTH_2 *r_a, uint32 _net_auth_2(pipes_struct *p, NET_Q_AUTH_2 *q_u, NET_R_AUTH_2 *r_u) { - uint32 status = NT_STATUS_NOPROBLEMO; + uint32 status = NT_STATUS_OK; DOM_CHAL srv_cred; UTIME srv_time; NEG_FLAGS srv_flgs; @@ -303,11 +312,11 @@ uint32 _net_auth_2(pipes_struct *p, NET_Q_AUTH_2 *q_u, NET_R_AUTH_2 *r_u) uint32 _net_srv_pwset(pipes_struct *p, NET_Q_SRV_PWSET *q_u, NET_R_SRV_PWSET *r_u) { - uint32 status = NT_STATUS_NOPROBLEMO; + uint32 status = NT_STATUS_OK; DOM_CRED srv_cred; pstring mach_acct; - struct smb_passwd *smb_pass; - BOOL ret; + SAM_ACCOUNT *sampass=NULL; + BOOL ret=False; unsigned char pwd[16]; int i; @@ -325,24 +334,33 @@ uint32 _net_srv_pwset(pipes_struct *p, NET_Q_SRV_PWSET *q_u, NET_R_SRV_PWSET *r_ pstrcpy(mach_acct, dos_unistrn2(q_u->clnt_id.login.uni_acct_name.buffer, q_u->clnt_id.login.uni_acct_name.uni_str_len)); + DEBUG(3,("Server Password Set Wksta:[%s]\n", mach_acct)); + + pdb_init_sam(&sampass); + + become_root(); + ret=pdb_getsampwnam(sampass, mach_acct); + unbecome_root(); + + /* Ensure the account exists and is a machine account. */ + + if (ret==False || !(pdb_get_acct_ctrl(sampass) & ACB_WSTRUST)) { + pdb_free_sam(sampass); + return NT_STATUS_NO_SUCH_USER; + } + + /* * Check the machine account name we're changing is the same * as the one we've authenticated from. This prevents arbitrary * machines changing other machine account passwords. */ - if (!strequal(mach_acct, p->dc.mach_acct)) + if (!strequal(mach_acct, p->dc.mach_acct)) { + pdb_free_sam(sampass); return NT_STATUS_ACCESS_DENIED; + } - DEBUG(3,("Server Password Set Wksta:[%s]\n", mach_acct)); - - become_root(); - smb_pass = getsmbpwnam(mach_acct); - unbecome_root(); - - /* Ensure the account exists and is a machine account. */ - if (smb_pass == NULL || !(smb_pass->acct_ctrl & ACB_WSTRUST)) - return NT_STATUS_NO_SUCH_USER; DEBUG(100,("Server password set : new given value was :\n")); for(i = 0; i < 16; i++) @@ -352,20 +370,27 @@ uint32 _net_srv_pwset(pipes_struct *p, NET_Q_SRV_PWSET *q_u, NET_R_SRV_PWSET *r_ cred_hash3( pwd, q_u->pwd, p->dc.sess_key, 0); /* lies! nt and lm passwords are _not_ the same: don't care */ - smb_pass->smb_passwd = pwd; - smb_pass->smb_nt_passwd = pwd; - smb_pass->acct_ctrl = ACB_WSTRUST; - + if (!pdb_set_lanman_passwd (sampass, pwd)) { + pdb_free_sam(sampass); + return NT_STATUS_NO_MEMORY; + } + if (!pdb_set_nt_passwd(sampass, pwd)) { + pdb_free_sam(sampass); + return NT_STATUS_NO_MEMORY; + } + pdb_set_acct_ctrl (sampass, ACB_WSTRUST); + become_root(); - ret = mod_smbpwd_entry(smb_pass,False); + ret = pdb_update_sam_account (sampass,False); unbecome_root(); - if (!ret) - status = NT_STATUS_WRONG_PASSWORD; + if (ret) + status = NT_STATUS_OK; /* set up the LSA Server Password Set response */ init_net_r_srv_pwset(r_u, &srv_cred, status); + pdb_free_sam(sampass); return r_u->status; } @@ -392,7 +417,7 @@ uint32 _net_sam_logoff(pipes_struct *p, NET_Q_SAM_LOGOFF *q_u, NET_R_SAM_LOGOFF r_u->buffer_creds = 1; /* yes, we have valid server credentials */ memcpy(&r_u->srv_creds, &srv_cred, sizeof(r_u->srv_creds)); - r_u->status = NT_STATUS_NOPROBLEMO; + r_u->status = NT_STATUS_OK; return r_u->status; } @@ -401,10 +426,9 @@ uint32 _net_sam_logoff(pipes_struct *p, NET_Q_SAM_LOGOFF *q_u, NET_R_SAM_LOGOFF net_login_interactive: *************************************************************************/ -static uint32 net_login_interactive(NET_ID_INFO_1 *id1, struct smb_passwd *smb_pass, pipes_struct *p) +static uint32 net_login_interactive(NET_ID_INFO_1 *id1, SAM_ACCOUNT *sampass, pipes_struct *p) { - uint32 status = 0x0; - + uint8 *stored_nt_pwd, *stored_lanman_pwd; char nt_pwd[16]; char lm_pwd[16]; unsigned char key[16]; @@ -437,21 +461,42 @@ static uint32 net_login_interactive(NET_ID_INFO_1 *id1, struct smb_passwd *smb_p dump_data(100, nt_pwd, 16); #endif - if (memcmp(smb_pass->smb_passwd , lm_pwd, 16) != 0 || - memcmp(smb_pass->smb_nt_passwd, nt_pwd, 16) != 0) - { - status = NT_STATUS_WRONG_PASSWORD; + /* JRA. Check the NT password first if it exists - this is a higher quality + password, if it exists and it doesn't match - fail. */ + + stored_nt_pwd = pdb_get_nt_passwd(sampass); + + if (stored_nt_pwd) { + if (memcmp(stored_nt_pwd, nt_pwd, 16) != 0) { + DEBUG(10,("net_login_interactive: NT password for user %s doesn't match.\n", + sampass->username)); + return NT_STATUS_WRONG_PASSWORD; + } else + return NT_STATUS_OK; } - return status; + stored_lanman_pwd = pdb_get_lanman_passwd(sampass); + + if (stored_lanman_pwd && lp_lanman_auth()) { + if (memcmp(stored_lanman_pwd, lm_pwd, 16) != 0) { + DEBUG(10,("net_login_interactive: lanman password for user %s doesn't match.\n", + sampass->username)); + return NT_STATUS_WRONG_PASSWORD; + } else + return NT_STATUS_OK; + } + + return NT_STATUS_WRONG_PASSWORD; } /************************************************************************* _net_login_network: *************************************************************************/ -static uint32 net_login_network(NET_ID_INFO_2 *id2, struct smb_passwd *smb_pass) +static uint32 net_login_network(NET_ID_INFO_2 *id2, SAM_ACCOUNT *sampass) { + uint8 *nt_pwd, *lanman_pwd; + DEBUG(5,("net_login_network: lm_len: %d nt_len: %d\n", id2->hdr_lm_chal_resp.str_str_len, id2->hdr_nt_chal_resp.str_str_len)); @@ -459,13 +504,12 @@ static uint32 net_login_network(NET_ID_INFO_2 *id2, struct smb_passwd *smb_pass) /* JRA. Check the NT password first if it exists - this is a higher quality password, if it exists and it doesn't match - fail. */ - if (id2->hdr_nt_chal_resp.str_str_len == 24 && - smb_pass->smb_nt_passwd != NULL) - { - if(smb_password_check((char *)id2->nt_chal_resp.buffer, - smb_pass->smb_nt_passwd, - id2->lm_chal)) - return NT_STATUS_NO_PROBLEMO; + nt_pwd = pdb_get_nt_passwd(sampass); + lanman_pwd = pdb_get_lanman_passwd(sampass); + + if (id2->hdr_nt_chal_resp.str_str_len == 24 && nt_pwd != NULL) { + if(smb_password_check((char *)id2->nt_chal_resp.buffer, nt_pwd, id2->lm_chal)) + return NT_STATUS_OK; else return NT_STATUS_WRONG_PASSWORD; } @@ -478,13 +522,11 @@ static uint32 net_login_network(NET_ID_INFO_2 *id2, struct smb_passwd *smb_pass) not do, for various security-hole reasons). */ - if (lp_lanman_auth() && - id2->hdr_lm_chal_resp.str_str_len == 24 && + if (lp_lanman_auth() && id2->hdr_lm_chal_resp.str_str_len == 24 && smb_password_check((char *)id2->lm_chal_resp.buffer, - smb_pass->smb_passwd, - id2->lm_chal)) + lanman_pwd, id2->lm_chal)) { - return NT_STATUS_NO_PROBLEMO; + return NT_STATUS_OK; } @@ -499,13 +541,14 @@ static uint32 net_login_network(NET_ID_INFO_2 *id2, struct smb_passwd *smb_pass) uint32 _net_sam_logon(pipes_struct *p, NET_Q_SAM_LOGON *q_u, NET_R_SAM_LOGON *r_u) { - uint32 status = NT_STATUS_NOPROBLEMO; + uint32 status = NT_STATUS_OK; NET_USER_INFO_3 *usr_info = NULL; DOM_CRED srv_cred; - struct smb_passwd *smb_pass = NULL; - struct sam_passwd *sam_pass = NULL; + SAM_ACCOUNT *sampass = NULL; UNISTR2 *uni_samlogon_user = NULL; fstring nt_username; + BOOL ret; + uint16 acct_ctrl; usr_info = (NET_USER_INFO_3 *)talloc(p->mem_ctx, sizeof(NET_USER_INFO_3)); if (!usr_info) @@ -560,92 +603,62 @@ uint32 _net_sam_logon(pipes_struct *p, NET_Q_SAM_LOGON *q_u, NET_R_SAM_LOGON *r_ map_username(nt_username); - /* - * We previously called Get_Pwnam(ntusername, True) here which could - * have modified the case of the username. Beaware of this - * is the username case in smbpasswd does not match that in /etc/passwd - * and domain logons begin to fail. -- jerry - */ - - /* XXXX hack to get standard_sub_basic() to use sam logon username */ - /* possibly a better way would be to do a become_user() call */ - sam_logon_in_ssb = True; - pstrcpy(samlogon_user, nt_username); - + /* get the account information */ + pdb_init_sam(&sampass); become_root(); - sam_pass = getsam21pwnam(nt_username); + ret = pdb_getsampwnam(sampass, nt_username); unbecome_root(); - smb_pass = pdb_sam_to_smb(sam_pass); - sam_logon_in_ssb = False; - - if ((smb_pass=pdb_sam_to_smb(sam_pass)) == NULL) + if (!ret) return NT_STATUS_NO_SUCH_USER; - else if (smb_pass->acct_ctrl & ACB_DISABLED) - return NT_STATUS_ACCOUNT_DISABLED; - - /* Validate password - if required. */ - - if (smb_pass->acct_ctrl & ACB_PWNOTREQ) { - if (!lp_null_passwords()) { - DEBUG(3,("Account for user %s has a null password and null passwords are NOT allowed",nt_username)); - return NT_STATUS_ACCOUNT_DISABLED; - } - } -#ifdef WITH_PAM - become_root(); -#if 0 /* JERRY */ - status = smb_pam_accountcheck(nt_username); -#else - status = smb_pam_accountcheck(sam_pass->smb_name); -#endif - unbecome_root(); - if (status != NT_STATUS_NOPROBLEMO) - return status; -#endif + acct_ctrl = pdb_get_acct_ctrl(sampass); - if (!(smb_pass->acct_ctrl & ACB_PWNOTREQ)) { + /* Validate password - if required. */ + + if (!(acct_ctrl & ACB_PWNOTREQ)) { switch (q_u->sam_id.logon_level) { case INTERACTIVE_LOGON_TYPE: /* interactive login. */ - status = net_login_interactive(&q_u->sam_id.ctr->auth.id1, smb_pass, p); + status = net_login_interactive(&q_u->sam_id.ctr->auth.id1, sampass, p); break; case NET_LOGON_TYPE: /* network login. lm challenge and 24 byte responses */ - status = net_login_network(&q_u->sam_id.ctr->auth.id2, smb_pass); + status = net_login_network(&q_u->sam_id.ctr->auth.id2, sampass); break; } } - - if (status != NT_STATUS_NOPROBLEMO) + + if (status != NT_STATUS_OK) return status; +#ifdef WITH_PAM + become_root(); + status = smb_pam_accountcheck(pdb_get_username(sampass)); + unbecome_root(); + if (status != NT_STATUS_OK) + return status; +#endif + + if (acct_ctrl & ACB_DISABLED) + return NT_STATUS_ACCOUNT_DISABLED; + /* lkclXXXX this is the point at which, if the login was successful, that the SAM Local Security Authority should record that the user is logged in to the domain. */ - /* return the profile plus other bits :-) */ - { DOM_GID *gids = NULL; int num_gids = 0; - NTTIME dummy_time; pstring my_name; pstring my_workgroup; pstring domain_groups; - uint32 r_uid; - uint32 r_gid; /* set up pointer indicating user/password failed to be found */ usr_info->ptr_user_info = 0; - dummy_time.low = 0xffffffff; - dummy_time.high = 0x7fffffff; - pstrcpy(my_workgroup, lp_workgroup()); - pstrcpy(my_name, global_myname); strupper(my_name); @@ -665,44 +678,17 @@ uint32 _net_sam_logon(pipes_struct *p, NET_Q_SAM_LOGON *q_u, NET_R_SAM_LOGON *r_ gids = NULL; num_gids = make_dom_gids(p->mem_ctx, domain_groups, &gids); - if (pdb_name_to_rid(nt_username, &r_uid, &r_gid)) - { - init_net_user_info3(p->mem_ctx, usr_info, - &dummy_time, /* logon_time */ - &dummy_time, /* logoff_time */ - &dummy_time, /* kickoff_time */ - &dummy_time, /* pass_last_set_time */ - &dummy_time, /* pass_can_change_time */ - &dummy_time, /* pass_must_change_time */ - - nt_username , /* user_name */ - sam_pass->full_name, /* full_name */ - sam_pass->logon_script , /* logon_script */ - sam_pass->profile_path , /* profile_path */ - sam_pass->home_dir , /* home_dir */ - sam_pass->dir_drive , /* dir_drive */ - - 0, /* logon_count */ - 0, /* bad_pw_count */ - - r_uid , /* RID user_id */ - r_gid , /* RID group_id */ - num_gids, /* uint32 num_groups */ - gids , /* DOM_GID *gids */ - 0x20 , /* uint32 user_flgs (?) */ - - NULL, /* char sess_key[16] */ - - my_name , /* char *logon_srv */ - my_workgroup, /* char *logon_dom */ - - &global_sam_sid, /* DOM_SID *dom_sid */ - NULL); /* char *other_sids */ - } - else - { - return NT_STATUS_NO_SUCH_USER; - } + init_net_user_info3(p->mem_ctx, usr_info, sampass, + 0, /* logon_count */ + 0, /* bad_pw_count */ + num_gids, /* uint32 num_groups */ + gids , /* DOM_GID *gids */ + 0x20 , /* uint32 user_flgs (?) */ + NULL, /* char sess_key[16] */ + my_name , /* char *logon_srv */ + my_workgroup, /* char *logon_dom */ + &global_sam_sid, /* DOM_SID *dom_sid */ + NULL); /* char *other_sids */ } diff --git a/source/rpc_server/srv_pipe.c b/source/rpc_server/srv_pipe.c index d16290985ec..174a21a4c50 100644 --- a/source/rpc_server/srv_pipe.c +++ b/source/rpc_server/srv_pipe.c @@ -269,8 +269,7 @@ static BOOL api_pipe_ntlmssp_verify(pipes_struct *p, RPC_AUTH_NTLMSSP_RESP *ntlm fstring domain; fstring wks; BOOL guest_user = False; - struct smb_passwd *smb_pass = NULL; - struct passwd *pass = NULL; + SAM_ACCOUNT *sampass = NULL; uchar null_smb_passwd[16]; uchar *smb_passwd_ptr = NULL; @@ -359,15 +358,6 @@ static BOOL api_pipe_ntlmssp_verify(pipes_struct *p, RPC_AUTH_NTLMSSP_RESP *ntlm } - /* - * Find the user in the unix password db. - */ - - if(!(pass = Get_Pwnam(pipe_user_name,True))) { - DEBUG(1,("Couldn't find user '%s' in UNIX password database.\n",pipe_user_name)); - return(False); - } - if(!guest_user) { become_root(); @@ -380,33 +370,32 @@ failed authentication on named pipe %s.\n", domain, pipe_user_name, wks, p->name return False; } - if(!(smb_pass = getsmbpwnam(pipe_user_name))) { + pdb_init_sam(&sampass); + + if(!pdb_getsampwnam(sampass, pipe_user_name)) { DEBUG(1,("api_pipe_ntlmssp_verify: Cannot find user %s in smb passwd database.\n", pipe_user_name)); + pdb_free_sam(sampass); unbecome_root(); return False; } - + unbecome_root(); - if (smb_pass == NULL) { - DEBUG(1,("api_pipe_ntlmssp_verify: Couldn't find user '%s' in smb_passwd file.\n", - pipe_user_name)); - return(False); - } - - /* Quit if the account was disabled. */ - if((smb_pass->acct_ctrl & ACB_DISABLED) || !smb_pass->smb_passwd) { + /* Quit if the account was disabled. */ + if((pdb_get_acct_ctrl(sampass) & ACB_DISABLED) || !pdb_get_lanman_passwd(sampass)) { DEBUG(1,("Account for user '%s' was disabled.\n", pipe_user_name)); - return(False); - } - - if(!smb_pass->smb_nt_passwd) { + pdb_free_sam(sampass); + return False; + } + + if(!pdb_get_nt_passwd(sampass)) { DEBUG(1,("Account for user '%s' has no NT password hash.\n", pipe_user_name)); - return(False); - } - - smb_passwd_ptr = smb_pass->smb_passwd; + pdb_free_sam(sampass); + return False; + } + + smb_passwd_ptr = pdb_get_lanman_passwd(sampass); } /* @@ -457,8 +446,8 @@ failed authentication on named pipe %s.\n", domain, pipe_user_name, wks, p->name * Store the UNIX credential data (uid/gid pair) in the pipe structure. */ - p->pipe_user.uid = pass->pw_uid; - p->pipe_user.gid = pass->pw_gid; + p->pipe_user.uid = pdb_get_uid(sampass); + p->pipe_user.gid = pdb_get_gid(sampass); /* Set up pipe user group membership. */ initialise_groups(pipe_user_name, p->pipe_user.uid, p->pipe_user.gid); diff --git a/source/rpc_server/srv_pipe_hnd.c b/source/rpc_server/srv_pipe_hnd.c index f91df7c4ef4..c9fb06da4db 100644 --- a/source/rpc_server/srv_pipe_hnd.c +++ b/source/rpc_server/srv_pipe_hnd.c @@ -775,10 +775,15 @@ ssize_t read_from_pipe(pipes_struct *p, char *data, size_t n) * read request. */ + /* + * This condition should result in the connection being closed. + * Netapp filers seem to set it to 0xffff which results in domain + * authentications failing. Just ignore it so things work. + */ + if(n > MAX_PDU_FRAG_LEN) { - DEBUG(0,("read_from_pipe: loo large read (%u) requested on pipe %s. We can \ -only service %d sized reads.\n", (unsigned int)n, p->name, MAX_PDU_FRAG_LEN )); - return -1; + DEBUG(5,("read_from_pipe: too large read (%u) requested on \ +pipe %s. We can only service %d sized reads.\n", (unsigned int)n, p->name, MAX_PDU_FRAG_LEN )); } /* diff --git a/source/rpc_server/srv_reg_nt.c b/source/rpc_server/srv_reg_nt.c index 502d5514378..c3b4a1a7a5d 100644 --- a/source/rpc_server/srv_reg_nt.c +++ b/source/rpc_server/srv_reg_nt.c @@ -55,7 +55,7 @@ uint32 _reg_close(pipes_struct *p, REG_Q_CLOSE *q_u, REG_R_CLOSE *r_u) if (!close_policy_hnd(p, &q_u->pol)) return NT_STATUS_OBJECT_NAME_INVALID; - return NT_STATUS_NOPROBLEMO; + return NT_STATUS_OK; } /******************************************************************* @@ -67,7 +67,7 @@ uint32 _reg_open(pipes_struct *p, REG_Q_OPEN_HKLM *q_u, REG_R_OPEN_HKLM *r_u) if (!create_policy_hnd(p, &r_u->pol, free_reg_info, NULL)) return NT_STATUS_OBJECT_NAME_NOT_FOUND; - return NT_STATUS_NOPROBLEMO; + return NT_STATUS_OK; } /******************************************************************* @@ -103,7 +103,7 @@ uint32 _reg_open_entry(pipes_struct *p, REG_Q_OPEN_ENTRY *q_u, REG_R_OPEN_ENTRY if (!create_policy_hnd(p, &pol, free_reg_info, (void *)info)) return NT_STATUS_TOO_MANY_SECRETS; /* ha ha very droll */ - init_reg_r_open_entry(r_u, &pol, NT_STATUS_NOPROBLEMO); + init_reg_r_open_entry(r_u, &pol, NT_STATUS_OK); DEBUG(5,("reg_open_entry: %d\n", __LINE__)); @@ -116,7 +116,7 @@ uint32 _reg_open_entry(pipes_struct *p, REG_Q_OPEN_ENTRY *q_u, REG_R_OPEN_ENTRY uint32 _reg_info(pipes_struct *p, REG_Q_INFO *q_u, REG_R_INFO *r_u) { - uint32 status = NT_STATUS_NOPROBLEMO; + uint32 status = NT_STATUS_OK; char *key = NULL; uint32 type=0x1; /* key type: REG_SZ */ diff --git a/source/rpc_server/srv_samr_nt.c b/source/rpc_server/srv_samr_nt.c index e0d80a3f9a1..9c2f37d4ce0 100644 --- a/source/rpc_server/srv_samr_nt.c +++ b/source/rpc_server/srv_samr_nt.c @@ -65,134 +65,156 @@ static uint32 get_sampwd_entries(SAM_USER_INFO_21 *pw_buf, int start_idx, int *total_entries, int *num_entries, int max_num_entries, uint16 acb_mask) { - void *vp = NULL; - struct sam_passwd *pwd = NULL; + SAM_ACCOUNT *pwd = NULL; + BOOL not_finished = True; - (*num_entries) = 0; - (*total_entries) = 0; + (*num_entries) = 0; + (*total_entries) = 0; - if (pw_buf == NULL) - return NT_STATUS_NO_MEMORY; + if (pw_buf == NULL) + return NT_STATUS_NO_MEMORY; - vp = startsmbpwent(False); - if (!vp) { - DEBUG(0, ("get_sampwd_entries: Unable to open SMB password database.\n")); - return NT_STATUS_ACCESS_DENIED; - } + pdb_init_sam(&pwd); - while (((pwd = getsam21pwent(vp)) != NULL) && (*num_entries) < max_num_entries) { - int user_name_len; + if (!pdb_setsampwent(False)) { + DEBUG(0, ("get_sampwd_entries: Unable to open passdb.\n")); + pdb_free_sam(pwd); + return NT_STATUS_ACCESS_DENIED; + } + + while (((not_finished = pdb_getsampwent(pwd)) != False) + && (*num_entries) < max_num_entries) + { + int user_name_len; - if (start_idx > 0) { - /* skip the requested number of entries. - not very efficient, but hey... - */ - start_idx--; - continue; + if (start_idx > 0) { + /* skip the requested number of entries. + not very efficient, but hey... */ + pdb_reset_sam(pwd); + start_idx--; + continue; } - user_name_len = strlen(pwd->smb_name)+1; - init_unistr2(&pw_buf[(*num_entries)].uni_user_name, pwd->smb_name, user_name_len); - init_uni_hdr(&pw_buf[(*num_entries)].hdr_user_name, user_name_len); - pw_buf[(*num_entries)].user_rid = pwd->user_rid; - memset((char *)pw_buf[(*num_entries)].nt_pwd, '\0', 16); + user_name_len = strlen(pdb_get_username(pwd))+1; + init_unistr2(&pw_buf[(*num_entries)].uni_user_name, pdb_get_username(pwd), user_name_len); + init_uni_hdr(&pw_buf[(*num_entries)].hdr_user_name, user_name_len); + pw_buf[(*num_entries)].user_rid = pwd->user_rid; + memset((char *)pw_buf[(*num_entries)].nt_pwd, '\0', 16); - /* Now check if the NT compatible password is available. */ - if (pwd->smb_nt_passwd != NULL) { - memcpy( pw_buf[(*num_entries)].nt_pwd , pwd->smb_nt_passwd, 16); - } + /* Now check if the NT compatible password is available. */ + if (pdb_get_nt_passwd(pwd)) + memcpy( pw_buf[(*num_entries)].nt_pwd , pdb_get_nt_passwd(pwd), 16); - pw_buf[(*num_entries)].acb_info = (uint16)pwd->acct_ctrl; + pw_buf[(*num_entries)].acb_info = pdb_get_acct_ctrl(pwd); - DEBUG(5, ("entry idx: %d user %s, rid 0x%x, acb %x", - (*num_entries), pwd->smb_name, pwd->user_rid, pwd->acct_ctrl)); + DEBUG(5, ("entry idx: %d user %s, rid 0x%x, acb %x", + (*num_entries), pdb_get_username(pwd), pdb_get_user_rid(pwd), pdb_get_acct_ctrl(pwd) )); - if (acb_mask == 0 || (pwd->acct_ctrl & acb_mask)) { - DEBUG(5,(" acb_mask %x accepts\n", acb_mask)); - (*num_entries)++; - } - else - DEBUG(5,(" acb_mask %x rejects\n", acb_mask)); + if (acb_mask == 0 || (pwd->acct_ctrl & acb_mask)) { + DEBUG(5,(" acb_mask %x accepts\n", acb_mask)); + (*num_entries)++; + } else + DEBUG(5,(" acb_mask %x rejects\n", acb_mask)); - (*total_entries)++; - } + (*total_entries)++; + pdb_reset_sam(pwd); + } - endsmbpwent(vp); + pdb_endsampwent(); + pdb_free_sam(pwd); - if (pwd!=NULL) + if (not_finished) return STATUS_MORE_ENTRIES; else - return NT_STATUS_NO_PROBLEMO; + return NT_STATUS_OK; } static uint32 jf_get_sampwd_entries(SAM_USER_INFO_21 *pw_buf, int start_idx, int *total_entries, uint32 *num_entries, int max_num_entries, uint16 acb_mask) { - void *vp = NULL; - struct sam_passwd *pwd = NULL; + SAM_ACCOUNT *pwd = NULL; + BOOL not_finished = True; *num_entries = 0; *total_entries = 0; if (pw_buf == NULL) return NT_STATUS_NO_MEMORY; + + DEBUG(10,("jf_get_sampwd_entries: start index:%d, max entries:%d, mask:%d\n", + start_idx, max_num_entries, acb_mask)); - vp = startsmbpwent(False); - if (!vp) { - DEBUG(0, ("get_sampwd_entries: Unable to open SMB password database.\n")); + if (!pdb_setsampwent(False)) { + DEBUG(0, ("jf_get_sampwd_entries: Unable to open passdb.\n")); return NT_STATUS_ACCESS_DENIED; } - while (((pwd = getsam21pwent(vp)) != NULL) && (*num_entries) < max_num_entries) { + pdb_init_sam(&pwd); + + while (((not_finished = pdb_getsampwent(pwd)) != False) && (*num_entries) < max_num_entries) { int user_name_len; int full_name_len; - if (acb_mask != 0 && !(pwd->acct_ctrl & acb_mask)) + if (acb_mask != 0 && !(pdb_get_acct_ctrl(pwd) & acb_mask)) { + pdb_reset_sam(pwd); continue; + } if (start_idx > 0) { /* skip the requested number of entries. not very efficient, but hey... */ start_idx--; + pdb_reset_sam(pwd); continue; } ZERO_STRUCTP(&pw_buf[(*num_entries)]); - user_name_len = strlen(pwd->smb_name); - init_unistr2(&pw_buf[(*num_entries)].uni_user_name, pwd->smb_name, user_name_len); + user_name_len = strlen(pdb_get_username(pwd)); + init_unistr2(&pw_buf[(*num_entries)].uni_user_name, pdb_get_username(pwd), user_name_len); init_uni_hdr(&pw_buf[(*num_entries)].hdr_user_name, user_name_len); - full_name_len = strlen(pwd->full_name); - init_unistr2(&pw_buf[(*num_entries)].uni_full_name, pwd->full_name, full_name_len); + full_name_len = strlen(pdb_get_fullname(pwd)); + init_unistr2(&pw_buf[(*num_entries)].uni_full_name, pdb_get_fullname(pwd), full_name_len); init_uni_hdr(&pw_buf[(*num_entries)].hdr_full_name, full_name_len); - pw_buf[(*num_entries)].user_rid = pwd->user_rid; + pw_buf[(*num_entries)].user_rid = pdb_get_user_rid(pwd); memset((char *)pw_buf[(*num_entries)].nt_pwd, '\0', 16); /* Now check if the NT compatible password is available. */ - if (pwd->smb_nt_passwd != NULL) { - memcpy( pw_buf[(*num_entries)].nt_pwd , pwd->smb_nt_passwd, 16); - } + if (pdb_get_nt_passwd(pwd)) + memcpy( pw_buf[(*num_entries)].nt_pwd , pdb_get_nt_passwd(pwd), 16); + + pw_buf[(*num_entries)].acb_info = pdb_get_acct_ctrl(pwd); - pw_buf[(*num_entries)].acb_info = (uint16)pwd->acct_ctrl; + DEBUG(5, ("entry idx: %d user %s, rid 0x%x, acb %x\n", (*num_entries), + pdb_get_username(pwd), pdb_get_user_rid(pwd), pdb_get_acct_ctrl(pwd) )); - DEBUG(5, ("entry idx: %d user %s, rid 0x%x, acb %x\n", (*num_entries), pwd->smb_name, pwd->user_rid, pwd->acct_ctrl)); (*num_entries)++; + + pdb_reset_sam(pwd); } - endsmbpwent(vp); + pdb_endsampwent(); *total_entries = *num_entries; + + pdb_free_sam(pwd); - if (pwd!=NULL) + if (not_finished) return STATUS_MORE_ENTRIES; else - return NT_STATUS_NO_PROBLEMO; + return NT_STATUS_OK; } +/* + * These next two functions are not used. Tagged + * for deletion + */ + +#if 0 /******************************************************************* This function uses the username map file and tries to map a UNIX user name to an DOS name. (Sort of the reverse of the @@ -439,6 +461,7 @@ static BOOL get_passwd_entries(SAM_USER_INFO_21 *pw_buf, done: return (*num_entries) > 0; } +#endif /******************************************************************* _samr_close_hnd @@ -446,7 +469,7 @@ done: uint32 _samr_close_hnd(pipes_struct *p, SAMR_Q_CLOSE_HND *q_u, SAMR_R_CLOSE_HND *r_u) { - r_u->status = NT_STATUS_NOPROBLEMO; + r_u->status = NT_STATUS_OK; /* close the policy handle */ if (!close_policy_hnd(p, &q_u->pol)) @@ -465,7 +488,7 @@ uint32 _samr_open_domain(pipes_struct *p, SAMR_Q_OPEN_DOMAIN *q_u, SAMR_R_OPEN_D { struct samr_info *info; - r_u->status = NT_STATUS_NOPROBLEMO; + r_u->status = NT_STATUS_OK; /* find the connection policy handle. */ if (!find_policy_by_hnd(p, &q_u->pol, NULL)) @@ -505,7 +528,7 @@ uint32 _samr_get_usrdom_pwinfo(pipes_struct *p, SAMR_Q_GET_USRDOM_PWINFO *q_u, S { struct samr_info *info = NULL; - r_u->status = NT_STATUS_NOPROBLEMO; + r_u->status = NT_STATUS_OK; /* find the policy handle. open a policy on it. */ if (!find_policy_by_hnd(p, &q_u->user_pol, (void **)&info)) { @@ -517,7 +540,7 @@ uint32 _samr_get_usrdom_pwinfo(pipes_struct *p, SAMR_Q_GET_USRDOM_PWINFO *q_u, S return NT_STATUS_OBJECT_TYPE_MISMATCH; } - init_samr_r_get_usrdom_pwinfo(r_u, NT_STATUS_NOPROBLEMO); + init_samr_r_get_usrdom_pwinfo(r_u, NT_STATUS_OK); DEBUG(5,("_samr_get_usrdom_pwinfo: %d\n", __LINE__)); @@ -567,7 +590,7 @@ static uint32 samr_make_usr_obj_sd(TALLOC_CTX *ctx, SEC_DESC_BUF **buf, DOM_SID if((*buf = make_sec_desc_buf(ctx, sd_size, psd)) == NULL) return NT_STATUS_NO_MEMORY; - return NT_STATUS_NOPROBLEMO; + return NT_STATUS_OK; } static BOOL get_lsa_policy_samr_sid(pipes_struct *p, POLICY_HND *pol, DOM_SID *sid) @@ -593,7 +616,7 @@ uint32 _samr_query_sec_obj(pipes_struct *p, SAMR_Q_QUERY_SEC_OBJ *q_u, SAMR_R_QU { DOM_SID pol_sid; - r_u->status = NT_STATUS_NOPROBLEMO; + r_u->status = NT_STATUS_OK; /* Get the SID. */ @@ -602,7 +625,7 @@ uint32 _samr_query_sec_obj(pipes_struct *p, SAMR_Q_QUERY_SEC_OBJ *q_u, SAMR_R_QU r_u->status = samr_make_usr_obj_sd(p->mem_ctx, &r_u->buf, &pol_sid); - if (r_u->status == NT_STATUS_NOPROBLEMO) + if (r_u->status == NT_STATUS_OK) r_u->ptr = 1; return r_u->status; @@ -625,9 +648,9 @@ static void make_user_sam_entry_list(TALLOC_CTX *ctx, SAM_ENTRY **sam_pp, UNISTR if (num_sam_entries == 0) return; - sam = (SAM_ENTRY *)talloc(ctx, sizeof(SAM_ENTRY)*num_sam_entries); + sam = (SAM_ENTRY *)talloc_zero(ctx, sizeof(SAM_ENTRY)*num_sam_entries); - uni_name = (UNISTR2 *)talloc(ctx, sizeof(UNISTR2)*num_sam_entries); + uni_name = (UNISTR2 *)talloc_zero(ctx, sizeof(UNISTR2)*num_sam_entries); if (sam == NULL || uni_name == NULL) { DEBUG(0, ("NULL pointers in SAMR_R_QUERY_DISPINFO\n")); @@ -662,15 +685,13 @@ static void samr_clear_passwd_fields( SAM_USER_INFO_21 *pass, int num_entries) } } -static void samr_clear_sam_passwd( struct sam_passwd *sam_pass) +static void samr_clear_sam_passwd(SAM_ACCOUNT *sam_pass) { if (!sam_pass) return; - if (sam_pass->smb_passwd) - memset(sam_pass->smb_passwd, '\0', 16); - if (sam_pass->smb_nt_passwd) - memset(sam_pass->smb_nt_passwd, '\0', 16); + if (sam_pass->lm_pw) memset(sam_pass->lm_pw, '\0', 16); + if (sam_pass->nt_pw) memset(sam_pass->nt_pw, '\0', 16); } /******************************************************************* @@ -683,7 +704,7 @@ uint32 _samr_enum_dom_users(pipes_struct *p, SAMR_Q_ENUM_DOM_USERS *q_u, SAMR_R_ int num_entries = 0; int total_entries = 0; - r_u->status = NT_STATUS_NOPROBLEMO; + r_u->status = NT_STATUS_OK; /* find the policy handle. open a policy on it. */ if (!find_policy_by_hnd(p, &q_u->pol, NULL)) @@ -696,7 +717,7 @@ uint32 _samr_enum_dom_users(pipes_struct *p, SAMR_Q_ENUM_DOM_USERS *q_u, SAMR_R_ MAX_SAM_ENTRIES, q_u->acb_mask); unbecome_root(); - if (r_u->status != NT_STATUS_NOPROBLEMO && r_u->status != STATUS_MORE_ENTRIES) + if (r_u->status != NT_STATUS_OK && r_u->status != STATUS_MORE_ENTRIES) return r_u->status; samr_clear_passwd_fields(pass, num_entries); @@ -740,9 +761,9 @@ static void make_group_sam_entry_list(TALLOC_CTX *ctx, SAM_ENTRY **sam_pp, UNIST if (num_sam_entries == 0) return; - sam = (SAM_ENTRY *)talloc(ctx, sizeof(SAM_ENTRY)*num_sam_entries); + sam = (SAM_ENTRY *)talloc_zero(ctx, sizeof(SAM_ENTRY)*num_sam_entries); - uni_name = (UNISTR2 *)talloc(ctx, sizeof(UNISTR2)*num_sam_entries); + uni_name = (UNISTR2 *)talloc_zero(ctx, sizeof(UNISTR2)*num_sam_entries); if (sam == NULL || uni_name == NULL) { DEBUG(0, ("NULL pointers in SAMR_R_QUERY_DISPINFO\n")); @@ -767,7 +788,7 @@ static void make_group_sam_entry_list(TALLOC_CTX *ctx, SAM_ENTRY **sam_pp, UNIST Get the group entries - similar to get_sampwd_entries(). ********************************************************************/ -static BOOL get_group_alias_entries(DOMAIN_GRP *d_grp, DOM_SID *sid, uint32 start_idx, +static uint32 get_group_alias_entries(DOMAIN_GRP *d_grp, DOM_SID *sid, uint32 start_idx, uint32 *p_num_entries, uint32 max_entries) { fstring sid_str; @@ -809,7 +830,7 @@ static BOOL get_group_alias_entries(DOMAIN_GRP *d_grp, DOM_SID *sid, uint32 star * libc grent structures overwrites by called functions */ grp = glist = getgrent_list(); if (grp == NULL) - return False; + return NT_STATUS_NO_MEMORY; for (;(num_entries < max_entries) && (grp != NULL); grp = grp->next) { int i; @@ -859,7 +880,9 @@ static BOOL get_group_alias_entries(DOMAIN_GRP *d_grp, DOM_SID *sid, uint32 star *p_num_entries = num_entries; - return True; + if (num_entries >= max_entries) + return STATUS_MORE_ENTRIES; + return NT_STATUS_OK; } /******************************************************************* @@ -894,7 +917,7 @@ static uint32 get_group_domain_entries(DOMAIN_GRP *d_grp, DOM_SID *sid, uint32 s *p_num_entries = num_entries; - return NT_STATUS_NO_PROBLEMO; + return NT_STATUS_OK; } /******************************************************************* @@ -909,7 +932,7 @@ uint32 _samr_enum_dom_groups(pipes_struct *p, SAMR_Q_ENUM_DOM_GROUPS *q_u, SAMR_ uint32 num_entries; DOM_SID sid; - r_u->status = NT_STATUS_NOPROBLEMO; + r_u->status = NT_STATUS_OK; if (!get_lsa_policy_samr_sid(p, &q_u->pol, &sid)) return NT_STATUS_INVALID_HANDLE; @@ -939,7 +962,7 @@ uint32 _samr_enum_dom_aliases(pipes_struct *p, SAMR_Q_ENUM_DOM_ALIASES *q_u, SAM fstring sid_str; DOM_SID sid; - r_u->status = NT_STATUS_NOPROBLEMO; + r_u->status = NT_STATUS_OK; if (!get_lsa_policy_samr_sid(p, &q_u->pol, &sid)) return NT_STATUS_INVALID_HANDLE; @@ -947,12 +970,15 @@ uint32 _samr_enum_dom_aliases(pipes_struct *p, SAMR_Q_ENUM_DOM_ALIASES *q_u, SAM sid_to_string(sid_str, &sid); DEBUG(5,("samr_reply_enum_dom_aliases: sid %s\n", sid_str)); - if (!get_group_alias_entries(grp, &sid, q_u->start_idx, &num_entries, MAX_SAM_ENTRIES)) - return NT_STATUS_ACCESS_DENIED; + r_u->status = get_group_alias_entries(grp, &sid, q_u->start_idx, + &num_entries, MAX_SAM_ENTRIES); + + if (r_u->status != NT_STATUS_OK && r_u->status != STATUS_MORE_ENTRIES) + return r_u->status; make_group_sam_entry_list(p->mem_ctx, &r_u->sam, &r_u->uni_grp_name, num_entries, grp); - init_samr_r_enum_dom_aliases(r_u, q_u->start_idx, num_entries); + init_samr_r_enum_dom_aliases(r_u, q_u->start_idx + num_entries, num_entries); DEBUG(5,("samr_enum_dom_aliases: %d\n", __LINE__)); @@ -978,7 +1004,7 @@ uint32 _samr_query_dispinfo(pipes_struct *p, SAMR_Q_QUERY_DISPINFO *q_u, SAMR_R_ DEBUG(5, ("samr_reply_query_dispinfo: %d\n", __LINE__)); - r_u->status = NT_STATUS_NOPROBLEMO; + r_u->status = NT_STATUS_OK; if (!get_lsa_policy_samr_sid(p, &q_u->domain_pol, &sid)) return NT_STATUS_INVALID_HANDLE; @@ -1013,7 +1039,7 @@ uint32 _samr_query_dispinfo(pipes_struct *p, SAMR_Q_QUERY_DISPINFO *q_u, SAMR_R_ MAX_SAM_ENTRIES, acb_mask); #endif unbecome_root(); - if (r_u->status!=STATUS_MORE_ENTRIES && r_u->status!=NT_STATUS_NO_PROBLEMO) { + if (r_u->status!=STATUS_MORE_ENTRIES && r_u->status!=NT_STATUS_OK) { DEBUG(5, ("get_sampwd_entries: failed\n")); return r_u->status; } @@ -1021,7 +1047,7 @@ uint32 _samr_query_dispinfo(pipes_struct *p, SAMR_Q_QUERY_DISPINFO *q_u, SAMR_R_ case 0x3: case 0x5: r_u->status = get_group_domain_entries(grps, &sid, q_u->start_idx, &num_entries, MAX_SAM_ENTRIES); - if (r_u->status!=NT_STATUS_NO_PROBLEMO) + if (r_u->status!=NT_STATUS_OK) return NT_STATUS_ACCESS_DENIED; break; default: @@ -1044,45 +1070,57 @@ uint32 _samr_query_dispinfo(pipes_struct *p, SAMR_Q_QUERY_DISPINFO *q_u, SAMR_R_ data_size = q_u->max_size; - ctr = (SAM_DISPINFO_CTR *)talloc(p->mem_ctx,sizeof(SAM_DISPINFO_CTR)); + ctr = (SAM_DISPINFO_CTR *)talloc_zero(p->mem_ctx,sizeof(SAM_DISPINFO_CTR)); if (!ctr) return NT_STATUS_NO_MEMORY; + ZERO_STRUCTP(ctr); + /* Now create reply structure */ switch (q_u->switch_level) { case 0x1: - if (!(ctr->sam.info1 = (SAM_DISPINFO_1 *)talloc(p->mem_ctx,num_entries*sizeof(SAM_DISPINFO_1)))) - return NT_STATUS_NO_MEMORY; + if (num_entries) { + if (!(ctr->sam.info1 = (SAM_DISPINFO_1 *)talloc_zero(p->mem_ctx,num_entries*sizeof(SAM_DISPINFO_1)))) + return NT_STATUS_NO_MEMORY; + } disp_ret = init_sam_dispinfo_1(p->mem_ctx,ctr->sam.info1, &num_entries, &data_size, q_u->start_idx, pass); - if (disp_ret != NT_STATUS_NO_PROBLEMO) + if (disp_ret != NT_STATUS_OK) return disp_ret; break; case 0x2: - if (!(ctr->sam.info2 = (SAM_DISPINFO_2 *)talloc(p->mem_ctx,num_entries*sizeof(SAM_DISPINFO_2)))) - return NT_STATUS_NO_MEMORY; + if (num_entries) { + if (!(ctr->sam.info2 = (SAM_DISPINFO_2 *)talloc_zero(p->mem_ctx,num_entries*sizeof(SAM_DISPINFO_2)))) + return NT_STATUS_NO_MEMORY; + } disp_ret = init_sam_dispinfo_2(p->mem_ctx,ctr->sam.info2, &num_entries, &data_size, q_u->start_idx, pass); - if (disp_ret != NT_STATUS_NO_PROBLEMO) + if (disp_ret != NT_STATUS_OK) return disp_ret; break; case 0x3: - if (!(ctr->sam.info3 = (SAM_DISPINFO_3 *)talloc(p->mem_ctx,num_entries*sizeof(SAM_DISPINFO_3)))) - return NT_STATUS_NO_MEMORY; + if (num_entries) { + if (!(ctr->sam.info3 = (SAM_DISPINFO_3 *)talloc_zero(p->mem_ctx,num_entries*sizeof(SAM_DISPINFO_3)))) + return NT_STATUS_NO_MEMORY; + } disp_ret = init_sam_dispinfo_3(p->mem_ctx,ctr->sam.info3, &num_entries, &data_size, q_u->start_idx, grps); - if (disp_ret != NT_STATUS_NO_PROBLEMO) + if (disp_ret != NT_STATUS_OK) return disp_ret; break; case 0x4: - if (!(ctr->sam.info4 = (SAM_DISPINFO_4 *)talloc(p->mem_ctx,num_entries*sizeof(SAM_DISPINFO_4)))) - return NT_STATUS_NO_MEMORY; + if (num_entries) { + if (!(ctr->sam.info4 = (SAM_DISPINFO_4 *)talloc_zero(p->mem_ctx,num_entries*sizeof(SAM_DISPINFO_4)))) + return NT_STATUS_NO_MEMORY; + } disp_ret = init_sam_dispinfo_4(p->mem_ctx,ctr->sam.info4, &num_entries, &data_size, q_u->start_idx, pass); - if (disp_ret != NT_STATUS_NO_PROBLEMO) + if (disp_ret != NT_STATUS_OK) return disp_ret; break; case 0x5: - if (!(ctr->sam.info5 = (SAM_DISPINFO_5 *)talloc(p->mem_ctx,num_entries*sizeof(SAM_DISPINFO_5)))) - return NT_STATUS_NO_MEMORY; + if (num_entries) { + if (!(ctr->sam.info5 = (SAM_DISPINFO_5 *)talloc_zero(p->mem_ctx,num_entries*sizeof(SAM_DISPINFO_5)))) + return NT_STATUS_NO_MEMORY; + } disp_ret = init_sam_dispinfo_5(p->mem_ctx,ctr->sam.info5, &num_entries, &data_size, q_u->start_idx, grps); - if (disp_ret != NT_STATUS_NO_PROBLEMO) + if (disp_ret != NT_STATUS_OK) return disp_ret; break; default: @@ -1112,7 +1150,7 @@ uint32 _samr_query_aliasinfo(pipes_struct *p, SAMR_Q_QUERY_ALIASINFO *q_u, SAMR_ uint32 alias_rid; struct samr_info *info = NULL; - r_u->status = NT_STATUS_NOPROBLEMO; + r_u->status = NT_STATUS_OK; DEBUG(5,("_samr_query_aliasinfo: %d\n", __LINE__)); @@ -1152,7 +1190,7 @@ uint32 _samr_query_aliasinfo(pipes_struct *p, SAMR_Q_QUERY_ALIASINFO *q_u, SAMR_ uint32 rid[MAX_SAM_ENTRIES]; int num_rids = q_u->num_sids1; - r_u->status = NT_STATUS_NOPROBLEMO; + r_u->status = NT_STATUS_OK; DEBUG(5,("_samr_lookup_ids: %d\n", __LINE__)); @@ -1194,7 +1232,7 @@ uint32 _samr_query_aliasinfo(pipes_struct *p, SAMR_Q_QUERY_ALIASINFO *q_u, SAMR_ num_rids = 1; rid[0] = BUILTIN_ALIAS_RID_USERS; - init_samr_r_lookup_ids(&r_u, num_rids, rid, NT_STATUS_NOPROBLEMO); + init_samr_r_lookup_ids(&r_u, num_rids, rid, NT_STATUS_OK); DEBUG(5,("_samr_lookup_ids: %d\n", __LINE__)); @@ -1214,7 +1252,7 @@ uint32 _samr_lookup_names(pipes_struct *p, SAMR_Q_LOOKUP_NAMES *q_u, SAMR_R_LOOK int num_rids = q_u->num_names2; DOM_SID pol_sid; - r_u->status = NT_STATUS_NOPROBLEMO; + r_u->status = NT_STATUS_OK; DEBUG(5,("_samr_lookup_names: %d\n", __LINE__)); @@ -1245,7 +1283,7 @@ uint32 _samr_lookup_names(pipes_struct *p, SAMR_Q_LOOKUP_NAMES *q_u, SAMR_R_LOOK DOM_SID sid; if(local_lookup_name(global_myname, name, &sid, &type[i])) { sid_split_rid( &sid, &rid[i]); - r_u->status = NT_STATUS_NOPROBLEMO; + r_u->status = NT_STATUS_OK; } } } @@ -1268,7 +1306,7 @@ uint32 _samr_chgpasswd_user(pipes_struct *p, SAMR_Q_CHGPASSWD_USER *q_u, SAMR_R_ DEBUG(5,("_samr_chgpasswd_user: %d\n", __LINE__)); - r_u->status = NT_STATUS_NOPROBLEMO; + r_u->status = NT_STATUS_OK; fstrcpy(user_name, dos_unistrn2(q_u->uni_user_name.buffer, q_u->uni_user_name.uni_str_len)); fstrcpy(wks , dos_unistrn2(q_u->uni_dest_host.buffer, q_u->uni_dest_host.uni_str_len)); @@ -1313,11 +1351,11 @@ static BOOL make_samr_lookup_rids(TALLOC_CTX *ctx, uint32 num_names, fstring nam *pp_hdr_name = NULL; if (num_names != 0) { - hdr_name = (UNIHDR *)talloc(ctx, sizeof(UNIHDR)*num_names); + hdr_name = (UNIHDR *)talloc_zero(ctx, sizeof(UNIHDR)*num_names); if (hdr_name == NULL) return False; - uni_name = (UNISTR2 *)talloc(ctx,sizeof(UNISTR2)*num_names); + uni_name = (UNISTR2 *)talloc_zero(ctx,sizeof(UNISTR2)*num_names); if (uni_name == NULL) return False; } @@ -1349,7 +1387,7 @@ uint32 _samr_lookup_rids(pipes_struct *p, SAMR_Q_LOOKUP_RIDS *q_u, SAMR_R_LOOKUP int num_rids = q_u->num_rids1; int i; - r_u->status = NT_STATUS_NOPROBLEMO; + r_u->status = NT_STATUS_OK; DEBUG(5,("_samr_lookup_rids: %d\n", __LINE__)); @@ -1363,7 +1401,7 @@ uint32 _samr_lookup_rids(pipes_struct *p, SAMR_Q_LOOKUP_RIDS *q_u, SAMR_R_LOOKUP } if (num_rids) { - if ((group_attrs = (uint32 *)talloc(p->mem_ctx, num_rids * sizeof(uint32))) == NULL) + if ((group_attrs = (uint32 *)talloc_zero(p->mem_ctx, num_rids * sizeof(uint32))) == NULL) return NT_STATUS_NO_MEMORY; } @@ -1383,7 +1421,7 @@ uint32 _samr_lookup_rids(pipes_struct *p, SAMR_Q_LOOKUP_RIDS *q_u, SAMR_R_LOOKUP sid_append_rid(&sid, q_u->rid[i]); if (lookup_sid(&sid, domname, tmpname, &type)) { - r_u->status = NT_STATUS_NOPROBLEMO; + r_u->status = NT_STATUS_OK; group_attrs[i] = (uint32)type; fstrcpy(group_names[i],tmpname); } @@ -1406,49 +1444,55 @@ uint32 _samr_lookup_rids(pipes_struct *p, SAMR_Q_LOOKUP_RIDS *q_u, SAMR_R_LOOKUP uint32 _api_samr_open_user(pipes_struct *p, SAMR_Q_OPEN_USER *q_u, SAMR_R_OPEN_USER *r_u) { - struct sam_passwd *sam_pass; - DOM_SID sid; - POLICY_HND domain_pol = q_u->domain_pol; - uint32 user_rid = q_u->user_rid; - POLICY_HND *user_pol = &r_u->user_pol; + SAM_ACCOUNT *sampass=NULL; + DOM_SID sid; + POLICY_HND domain_pol = q_u->domain_pol; + uint32 user_rid = q_u->user_rid; + POLICY_HND *user_pol = &r_u->user_pol; struct samr_info *info = NULL; + BOOL ret; - r_u->status = NT_STATUS_NO_PROBLEMO; + r_u->status = NT_STATUS_OK; - /* find the domain policy handle. */ - if (!find_policy_by_hnd(p, &domain_pol, NULL)) - return NT_STATUS_INVALID_HANDLE; + /* find the domain policy handle. */ + if (!find_policy_by_hnd(p, &domain_pol, NULL)) + return NT_STATUS_INVALID_HANDLE; - become_root(); - sam_pass = getsam21pwrid(user_rid); - unbecome_root(); + pdb_init_sam(&sampass); - /* check that the RID exists in our domain. */ - if (sam_pass == NULL) - return NT_STATUS_NO_SUCH_USER; + become_root(); + ret=pdb_getsampwrid(sampass, user_rid); + unbecome_root(); - samr_clear_sam_passwd(sam_pass); + /* check that the RID exists in our domain. */ + if (ret == False) { + pdb_free_sam(sampass); + return NT_STATUS_NO_SUCH_USER; + } - /* Get the domain SID stored in the domain policy */ - if(!get_lsa_policy_samr_sid(p, &domain_pol, &sid)) - return NT_STATUS_INVALID_HANDLE; + samr_clear_sam_passwd(sampass); + pdb_free_sam(sampass); - /* append the user's RID to it */ - if(!sid_append_rid(&sid, user_rid)) - return NT_STATUS_NO_SUCH_USER; + /* Get the domain SID stored in the domain policy */ + if(!get_lsa_policy_samr_sid(p, &domain_pol, &sid)) + return NT_STATUS_INVALID_HANDLE; - /* associate the user's SID with the new handle. */ - if ((info = (struct samr_info *)malloc(sizeof(struct samr_info))) == NULL) - return NT_STATUS_NO_MEMORY; + /* append the user's RID to it */ + if(!sid_append_rid(&sid, user_rid)) + return NT_STATUS_NO_SUCH_USER; - ZERO_STRUCTP(info); - info->sid = sid; + /* associate the user's SID with the new handle. */ + if ((info = (struct samr_info *)malloc(sizeof(struct samr_info))) == NULL) + return NT_STATUS_NO_MEMORY; - /* get a (unique) handle. open a policy on it. */ - if (!create_policy_hnd(p, user_pol, free_samr_info, (void *)info)) - return NT_STATUS_OBJECT_NAME_NOT_FOUND; + ZERO_STRUCTP(info); + info->sid = sid; - return r_u->status; + /* get a (unique) handle. open a policy on it. */ + if (!create_policy_hnd(p, user_pol, free_samr_info, (void *)info)) + return NT_STATUS_OBJECT_NAME_NOT_FOUND; + + return r_u->status; } /************************************************************************* @@ -1457,28 +1501,35 @@ uint32 _api_samr_open_user(pipes_struct *p, SAMR_Q_OPEN_USER *q_u, SAMR_R_OPEN_U static BOOL get_user_info_10(SAM_USER_INFO_10 *id10, uint32 user_rid) { - struct smb_passwd *smb_pass; + SAM_ACCOUNT *smbpass=NULL; + BOOL ret; - if (!pdb_rid_is_user(user_rid)) { - DEBUG(4,("RID 0x%x is not a user RID\n", user_rid)); - return False; - } + if (!pdb_rid_is_user(user_rid)) { + DEBUG(4,("RID 0x%x is not a user RID\n", user_rid)); + return False; + } - become_root(); - smb_pass = getsmbpwrid(user_rid); - unbecome_root(); + pdb_init_sam(&smbpass); - if (smb_pass == NULL) - { - DEBUG(4,("User 0x%x not found\n", user_rid)); - return False; - } + become_root(); + ret = pdb_getsampwrid(smbpass, user_rid); + unbecome_root(); - DEBUG(3,("User:[%s]\n", smb_pass->smb_name)); + if (ret==False) { + DEBUG(4,("User 0x%x not found\n", user_rid)); + pdb_free_sam(smbpass); + return False; + } + + DEBUG(3,("User:[%s]\n", pdb_get_username(smbpass) )); - init_sam_user_info10(id10, smb_pass->acct_ctrl); + ZERO_STRUCTP(id10); + init_sam_user_info10(id10, pdb_get_acct_ctrl(smbpass) ); - return True; + samr_clear_sam_passwd(smbpass); + pdb_free_sam(smbpass); + + return True; } /************************************************************************* @@ -1489,7 +1540,8 @@ static BOOL get_user_info_10(SAM_USER_INFO_10 *id10, uint32 user_rid) static BOOL get_user_info_12(pipes_struct *p, SAM_USER_INFO_12 * id12, uint32 user_rid) { - struct smb_passwd *smb_pass; + SAM_ACCOUNT *smbpass=NULL; + BOOL ret; if (!p->ntlmssp_auth_validated) return NT_STATUS_ACCESS_DENIED; @@ -1500,95 +1552,106 @@ static BOOL get_user_info_12(pipes_struct *p, SAM_USER_INFO_12 * id12, uint32 us /* * Do *NOT* do become_root()/unbecome_root() here ! JRA. */ + pdb_init_sam(&smbpass); - smb_pass = getsmbpwrid(user_rid); + ret = pdb_getsampwrid(smbpass, user_rid); - if (smb_pass == NULL) { + if (ret == False) { DEBUG(4, ("User 0x%x not found\n", user_rid)); + pdb_free_sam(smbpass); return (geteuid() == (uid_t)0) ? NT_STATUS_NO_SUCH_USER : NT_STATUS_ACCESS_DENIED; } - DEBUG(3,("User:[%s] 0x%x\n", smb_pass->smb_name, smb_pass->acct_ctrl)); + DEBUG(3,("User:[%s] 0x%x\n", pdb_get_username(smbpass), pdb_get_acct_ctrl(smbpass) )); - if (smb_pass->acct_ctrl & ACB_DISABLED) - return NT_STATUS_ACCOUNT_DISABLED; + if ( pdb_get_acct_ctrl(smbpass) & ACB_DISABLED) { + pdb_free_sam(smbpass); + return NT_STATUS_ACCOUNT_DISABLED; + } - init_sam_user_info12(id12, smb_pass->smb_passwd, smb_pass->smb_nt_passwd); + ZERO_STRUCTP(id12); + init_sam_user_info12(id12, pdb_get_lanman_passwd(smbpass), pdb_get_nt_passwd(smbpass)); + + pdb_free_sam(smbpass); - return NT_STATUS_NOPROBLEMO; + return NT_STATUS_OK; } +#if 0 /* JERRY */ /************************************************************************* - get_user_info_21 + get_user_info_20 *************************************************************************/ -static BOOL get_user_info_21(SAM_USER_INFO_21 *id21, uint32 user_rid) +static BOOL get_user_info_20(SAM_USER_INFO_20 *id20, uint32 user_rid) { - NTTIME dummy_time; - struct sam_passwd *sam_pass; - LOGON_HRS hrs; - int i; + SAM_ACCOUNT *sampass=NULL; + BOOL ret; - if (!pdb_rid_is_user(user_rid)) { - DEBUG(4,("RID 0x%x is not a user RID\n", user_rid)); - return False; - } + if (!pdb_rid_is_user(user_rid)) { + DEBUG(4,("RID 0x%x is not a user RID\n", user_rid)); + return False; + } - become_root(); - sam_pass = getsam21pwrid(user_rid); - unbecome_root(); + pdb_init_sam(&sampass); - if (sam_pass == NULL) { - DEBUG(4,("User 0x%x not found\n", user_rid)); - return False; - } + become_root(); + ret = pdb_getsampwrid(sampass, user_rid); + unbecome_root(); - samr_clear_sam_passwd(sam_pass); + if (ret == False) { + DEBUG(4,("User 0x%x not found\n", user_rid)); + pdb_free_sam(sampass); + return False; + } + + samr_clear_sam_passwd(sampass); - DEBUG(3,("User:[%s]\n", sam_pass->smb_name)); + DEBUG(3,("User:[%s]\n", pdb_get_username(sampass) )); + + ZERO_STRUCTP(id20); + init_sam_user_info20A(id20, sampass); + + pdb_free_sam(sampass); + + return True; +} +#endif +/************************************************************************* + get_user_info_21 + *************************************************************************/ - dummy_time.low = 0xffffffff; - dummy_time.high = 0x7fffffff; +static BOOL get_user_info_21(SAM_USER_INFO_21 *id21, uint32 user_rid) +{ + SAM_ACCOUNT *sampass=NULL; + BOOL ret; - DEBUG(5,("get_user_info_21 - TODO: convert unix times to NTTIMEs\n")); + if (!pdb_rid_is_user(user_rid)) { + DEBUG(4,("RID 0x%x is not a user RID\n", user_rid)); + return False; + } - /* create a LOGON_HRS structure */ - hrs.len = sam_pass->hours_len; - SMB_ASSERT_ARRAY(hrs.hours, hrs.len); - for (i = 0; i < hrs.len; i++) - hrs.hours[i] = sam_pass->hours[i]; + pdb_init_sam(&sampass); - init_sam_user_info21A(id21, + become_root(); + ret = pdb_getsampwrid(sampass, user_rid); + unbecome_root(); - &dummy_time, /* logon_time */ - &dummy_time, /* logoff_time */ - &dummy_time, /* kickoff_time */ - &dummy_time, /* pass_last_set_time */ - &dummy_time, /* pass_can_change_time */ - &dummy_time, /* pass_must_change_time */ + if (ret == False) { + DEBUG(4,("User 0x%x not found\n", user_rid)); + pdb_free_sam(sampass); + return False; + } - sam_pass->smb_name, /* user_name */ - sam_pass->full_name, /* full_name */ - sam_pass->home_dir, /* home_dir */ - sam_pass->dir_drive, /* dir_drive */ - sam_pass->logon_script, /* logon_script */ - sam_pass->profile_path, /* profile_path */ - sam_pass->acct_desc, /* description */ - sam_pass->workstations, /* workstations user can log in from */ - sam_pass->unknown_str, /* don't know, yet */ - sam_pass->munged_dial, /* dialin info. contains dialin path and tel no */ + samr_clear_sam_passwd(sampass); - sam_pass->user_rid, /* RID user_id */ - sam_pass->group_rid, /* RID group_id */ - sam_pass->acct_ctrl, + DEBUG(3,("User:[%s]\n", pdb_get_username(sampass) )); - sam_pass->unknown_3, /* unknown_3 */ - sam_pass->logon_divs, /* divisions per week */ - &hrs, /* logon hours */ - sam_pass->unknown_5, - sam_pass->unknown_6); + ZERO_STRUCTP(id21); + init_sam_user_info21A(id21, sampass); + + pdb_free_sam(sampass); - return True; + return True; } /******************************************************************* @@ -1601,7 +1664,7 @@ uint32 _samr_query_userinfo(pipes_struct *p, SAMR_Q_QUERY_USERINFO *q_u, SAMR_R_ uint32 rid = 0; struct samr_info *info = NULL; - r_u->status=NT_STATUS_NO_PROBLEMO; + r_u->status=NT_STATUS_OK; /* search for the handle */ if (!find_policy_by_hnd(p, &q_u->pol, (void **)&info)) @@ -1613,7 +1676,7 @@ uint32 _samr_query_userinfo(pipes_struct *p, SAMR_Q_QUERY_USERINFO *q_u, SAMR_R_ DEBUG(5,("_samr_query_userinfo: rid:0x%x\n", rid)); - ctr = (SAM_USERINFO_CTR *)talloc(p->mem_ctx, sizeof(SAM_USERINFO_CTR)); + ctr = (SAM_USERINFO_CTR *)talloc_zero(p->mem_ctx, sizeof(SAM_USERINFO_CTR)); if (!ctr) return NT_STATUS_NO_MEMORY; @@ -1624,7 +1687,7 @@ uint32 _samr_query_userinfo(pipes_struct *p, SAMR_Q_QUERY_USERINFO *q_u, SAMR_R_ switch (q_u->switch_value) { case 0x10: - ctr->info.id10 = (SAM_USER_INFO_10 *)talloc(p->mem_ctx, sizeof(SAM_USER_INFO_10)); + ctr->info.id10 = (SAM_USER_INFO_10 *)talloc_zero(p->mem_ctx, sizeof(SAM_USER_INFO_10)); if (ctr->info.id10 == NULL) return NT_STATUS_NO_MEMORY; @@ -1642,7 +1705,7 @@ uint32 _samr_query_userinfo(pipes_struct *p, SAMR_Q_QUERY_USERINFO *q_u, SAMR_R_ expire.low = 0xffffffff; expire.high = 0x7fffffff; - ctr->info.id = (SAM_USER_INFO_11 *)talloc(p->mem_ctx, + ctr->info.id = (SAM_USER_INFO_11 *)talloc_zero(p->mem_ctx, sizeof (*ctr-> info. @@ -1658,16 +1721,16 @@ uint32 _samr_query_userinfo(pipes_struct *p, SAMR_Q_QUERY_USERINFO *q_u, SAMR_R_ #endif case 0x12: - ctr->info.id12 = (SAM_USER_INFO_12 *)talloc(p->mem_ctx, sizeof(SAM_USER_INFO_12)); + ctr->info.id12 = (SAM_USER_INFO_12 *)talloc_zero(p->mem_ctx, sizeof(SAM_USER_INFO_12)); if (ctr->info.id12 == NULL) return NT_STATUS_NO_MEMORY; - if ((r_u->status = get_user_info_12(p, ctr->info.id12, rid))!=NT_STATUS_NOPROBLEMO) + if ((r_u->status = get_user_info_12(p, ctr->info.id12, rid))!=NT_STATUS_OK) return r_u->status; break; case 21: - ctr->info.id21 = (SAM_USER_INFO_21 *)talloc(p->mem_ctx,sizeof(SAM_USER_INFO_21)); + ctr->info.id21 = (SAM_USER_INFO_21 *)talloc_zero(p->mem_ctx,sizeof(SAM_USER_INFO_21)); if (ctr->info.id21 == NULL) return NT_STATUS_NO_MEMORY; if (!get_user_info_21(ctr->info.id21, rid)) @@ -1691,44 +1754,49 @@ uint32 _samr_query_userinfo(pipes_struct *p, SAMR_Q_QUERY_USERINFO *q_u, SAMR_R_ uint32 _samr_query_usergroups(pipes_struct *p, SAMR_Q_QUERY_USERGROUPS *q_u, SAMR_R_QUERY_USERGROUPS *r_u) { - struct sam_passwd *sam_pass; - DOM_GID *gids = NULL; - int num_groups = 0; - pstring groups; - uint32 rid; + SAM_ACCOUNT *sam_pass=NULL; + DOM_GID *gids = NULL; + int num_groups = 0; + pstring groups; + uint32 rid; struct samr_info *info = NULL; + BOOL ret; - r_u->status = NT_STATUS_NO_PROBLEMO; + r_u->status = NT_STATUS_OK; - DEBUG(5,("_samr_query_usergroups: %d\n", __LINE__)); + DEBUG(5,("_samr_query_usergroups: %d\n", __LINE__)); - /* find the policy handle. open a policy on it. */ - if (!find_policy_by_hnd(p, &q_u->pol, (void **)&info)) - return NT_STATUS_INVALID_HANDLE; + /* find the policy handle. open a policy on it. */ + if (!find_policy_by_hnd(p, &q_u->pol, (void **)&info)) + return NT_STATUS_INVALID_HANDLE; - /* find the user's rid */ - if ((rid = get_lsa_policy_samr_rid(info)) == 0xffffffff) - return NT_STATUS_OBJECT_TYPE_MISMATCH; + /* find the user's rid */ + if ((rid = get_lsa_policy_samr_rid(info)) == 0xffffffff) + return NT_STATUS_OBJECT_TYPE_MISMATCH; - become_root(); - sam_pass = getsam21pwrid(rid); - unbecome_root(); + pdb_init_sam(&sam_pass); - if (sam_pass == NULL) - return NT_STATUS_NO_SUCH_USER; + become_root(); + ret = pdb_getsampwrid(sam_pass, rid); + unbecome_root(); - samr_clear_sam_passwd(sam_pass); + if (ret == False) { + samr_clear_sam_passwd(sam_pass); + return NT_STATUS_NO_SUCH_USER; + } - get_domain_user_groups(groups, sam_pass->smb_name); - gids = NULL; - num_groups = make_dom_gids(p->mem_ctx, groups, &gids); + get_domain_user_groups(groups, pdb_get_username(sam_pass)); + gids = NULL; + num_groups = make_dom_gids(p->mem_ctx, groups, &gids); - /* construct the response. lkclXXXX: gids are not copied! */ - init_samr_r_query_usergroups(r_u, num_groups, gids, r_u->status); + /* construct the response. lkclXXXX: gids are not copied! */ + init_samr_r_query_usergroups(r_u, num_groups, gids, r_u->status); - DEBUG(5,("_samr_query_usergroups: %d\n", __LINE__)); + DEBUG(5,("_samr_query_usergroups: %d\n", __LINE__)); + + samr_clear_sam_passwd(sam_pass); - return r_u->status; + return r_u->status; } /******************************************************************* @@ -1739,12 +1807,12 @@ uint32 _samr_query_dom_info(pipes_struct *p, SAMR_Q_QUERY_DOMAIN_INFO *q_u, SAMR { SAM_UNK_CTR *ctr; - if ((ctr = (SAM_UNK_CTR *)talloc(p->mem_ctx, sizeof(SAM_UNK_CTR))) == NULL) + if ((ctr = (SAM_UNK_CTR *)talloc_zero(p->mem_ctx, sizeof(SAM_UNK_CTR))) == NULL) return NT_STATUS_NO_MEMORY; ZERO_STRUCTP(ctr); - r_u->status = NT_STATUS_NO_PROBLEMO; + r_u->status = NT_STATUS_OK; DEBUG(5,("_samr_query_dom_info: %d\n", __LINE__)); @@ -1776,7 +1844,7 @@ uint32 _samr_query_dom_info(pipes_struct *p, SAMR_Q_QUERY_DOMAIN_INFO *q_u, SAMR return NT_STATUS_INVALID_INFO_CLASS; } - init_samr_r_query_dom_info(r_u, q_u->switch_value, ctr, NT_STATUS_NOPROBLEMO); + init_samr_r_query_dom_info(r_u, q_u->switch_value, ctr, NT_STATUS_OK); DEBUG(5,("_samr_query_dom_info: %d\n", __LINE__)); @@ -1789,107 +1857,119 @@ uint32 _samr_query_dom_info(pipes_struct *p, SAMR_Q_QUERY_DOMAIN_INFO *q_u, SAMR uint32 _api_samr_create_user(pipes_struct *p, SAMR_Q_CREATE_USER *q_u, SAMR_R_CREATE_USER *r_u) { - struct sam_passwd *sam_pass = NULL; - fstring mach_acct; - pstring err_str; - pstring msg_str; - int local_flags=0; - DOM_SID sid; - pstring add_script; - POLICY_HND dom_pol = q_u->domain_pol; - UNISTR2 user_account = q_u->uni_name; - uint16 acb_info = q_u->acb_info; - POLICY_HND *user_pol = &r_u->user_pol; + SAM_ACCOUNT *sam_pass=NULL; + fstring mach_acct; + pstring err_str; + pstring msg_str; + int local_flags=0; + DOM_SID sid; + pstring add_script; + POLICY_HND dom_pol = q_u->domain_pol; + UNISTR2 user_account = q_u->uni_name; + uint16 acb_info = q_u->acb_info; + POLICY_HND *user_pol = &r_u->user_pol; struct samr_info *info = NULL; + BOOL ret; - /* find the policy handle. open a policy on it. */ - if (!find_policy_by_hnd(p, &dom_pol, NULL)) - return NT_STATUS_INVALID_HANDLE; + /* find the policy handle. open a policy on it. */ + if (!find_policy_by_hnd(p, &dom_pol, NULL)) + return NT_STATUS_INVALID_HANDLE; - /* find the machine account: tell the caller if it exists. - lkclXXXX i have *no* idea if this is a problem or not - or even if you are supposed to construct a different - reply if the account already exists... - */ - - fstrcpy(mach_acct, dos_unistrn2(user_account.buffer, user_account.uni_str_len)); - strlower(mach_acct); - - become_root(); - sam_pass = getsam21pwnam(mach_acct); - unbecome_root(); - if (sam_pass != NULL) { - /* machine account exists: say so */ - return NT_STATUS_USER_EXISTS; - } + /* find the machine account: tell the caller if it exists. + lkclXXXX i have *no* idea if this is a problem or not + or even if you are supposed to construct a different + reply if the account already exists... + */ - local_flags=LOCAL_ADD_USER|LOCAL_DISABLE_USER|LOCAL_SET_NO_PASSWORD; - local_flags|= (acb_info & ACB_WSTRUST) ? LOCAL_TRUST_ACCOUNT:0; - - /* - * NB. VERY IMPORTANT ! This call must be done as the current pipe user, - * *NOT* surrounded by a become_root()/unbecome_root() call. This ensures - * that only people with write access to the smbpasswd file will be able - * to create a user. JRA. - */ - - /* - * add the user in the /etc/passwd file or the unix authority system. - * We don't check if the smb_create_user() function succed or not for 2 reasons: - * a) local_password_change() checks for us if the /etc/passwd account really exists - * b) smb_create_user() would return an error if the account already exists - * and as it could return an error also if it can't create the account, it would be tricky. - * - * So we go the easy way, only check after if the account exists. - * JFM (2/3/2001), to clear any possible bad understanding (-: - */ - - pstrcpy(add_script, lp_adduser_script()); - - if(*add_script) - smb_create_user(mach_acct, NULL); - - /* add the user in the smbpasswd file or the Samba authority database */ - if (!local_password_change(mach_acct, local_flags, NULL, err_str, - sizeof(err_str), msg_str, sizeof(msg_str))) - { - DEBUG(0, ("%s\n", err_str)); - return NT_STATUS_ACCESS_DENIED; - } + fstrcpy(mach_acct, dos_unistrn2(user_account.buffer, user_account.uni_str_len)); + strlower(mach_acct); - become_root(); - sam_pass = getsam21pwnam(mach_acct); - unbecome_root(); - if (sam_pass == NULL) { - /* account doesn't exist: say so */ - return NT_STATUS_ACCESS_DENIED; - } + pdb_init_sam(&sam_pass); - /* Get the domain SID stored in the domain policy */ - if(!get_lsa_policy_samr_sid(p, &dom_pol, &sid)) { - return NT_STATUS_INVALID_HANDLE; - } + become_root(); + ret = pdb_getsampwnam(sam_pass, mach_acct); + unbecome_root(); + if (ret == True) { + /* machine account exists: say so */ + pdb_free_sam(sam_pass); + return NT_STATUS_USER_EXISTS; + } - /* append the user's RID to it */ - if(!sid_append_rid(&sid, sam_pass->user_rid)) { - return NT_STATUS_NO_SUCH_USER; - } + local_flags=LOCAL_ADD_USER|LOCAL_DISABLE_USER|LOCAL_SET_NO_PASSWORD; + local_flags|= (acb_info & ACB_WSTRUST) ? LOCAL_TRUST_ACCOUNT:0; - /* associate the user's SID with the new handle. */ - if ((info = (struct samr_info *)malloc(sizeof(struct samr_info))) == NULL) - return NT_STATUS_NO_MEMORY; + /* + * NB. VERY IMPORTANT ! This call must be done as the current pipe user, + * *NOT* surrounded by a become_root()/unbecome_root() call. This ensures + * that only people with write access to the smbpasswd file will be able + * to create a user. JRA. + */ - ZERO_STRUCTP(info); - info->sid = sid; + /* + * add the user in the /etc/passwd file or the unix authority system. + * We don't check if the smb_create_user() function succed or not for 2 reasons: + * a) local_password_change() checks for us if the /etc/passwd account really exists + * b) smb_create_user() would return an error if the account already exists + * and as it could return an error also if it can't create the account, it would be tricky. + * + * So we go the easy way, only check after if the account exists. + * JFM (2/3/2001), to clear any possible bad understanding (-: + */ - /* get a (unique) handle. open a policy on it. */ - if (!create_policy_hnd(p, user_pol, free_samr_info, (void *)info)) - return NT_STATUS_OBJECT_NAME_NOT_FOUND; + pstrcpy(add_script, lp_adduser_script()); + + if(*add_script) + smb_create_user(mach_acct, NULL); + /* add the user in the smbpasswd file or the Samba authority database */ + if (!local_password_change(mach_acct, local_flags, NULL, err_str, + sizeof(err_str), msg_str, sizeof(msg_str))) { + DEBUG(0, ("%s\n", err_str)); + pdb_free_sam(sam_pass); + return NT_STATUS_ACCESS_DENIED; + } - r_u->user_rid=sam_pass->user_rid; - r_u->unknown_0 = 0x000703ff; + become_root(); + ret = pdb_getsampwnam(sam_pass, mach_acct); + unbecome_root(); + if (ret == False) { + /* account doesn't exist: say so */ + pdb_free_sam(sam_pass); + return NT_STATUS_ACCESS_DENIED; + } - return NT_STATUS_NO_PROBLEMO; + /* Get the domain SID stored in the domain policy */ + if(!get_lsa_policy_samr_sid(p, &dom_pol, &sid)) { + pdb_free_sam(sam_pass); + return NT_STATUS_INVALID_HANDLE; + } + + /* append the user's RID to it */ + if(!sid_append_rid(&sid, pdb_get_user_rid(sam_pass) )) { + pdb_free_sam(sam_pass); + return NT_STATUS_NO_SUCH_USER; + } + + /* associate the user's SID with the new handle. */ + if ((info = (struct samr_info *)malloc(sizeof(struct samr_info))) == NULL) { + pdb_free_sam(sam_pass); + return NT_STATUS_NO_MEMORY; + } + + ZERO_STRUCTP(info); + info->sid = sid; + + /* get a (unique) handle. open a policy on it. */ + if (!create_policy_hnd(p, user_pol, free_samr_info, (void *)info)) { + pdb_free_sam(sam_pass); + return NT_STATUS_OBJECT_NAME_NOT_FOUND; + } + + r_u->user_rid=sam_pass->user_rid; + r_u->unknown_0 = 0x000703ff; + + pdb_free_sam(sam_pass); + + return NT_STATUS_OK; } /******************************************************************* @@ -1902,7 +1982,7 @@ uint32 _samr_connect_anon(pipes_struct *p, SAMR_Q_CONNECT_ANON *q_u, SAMR_R_CONN /* set up the SAMR connect_anon response */ - r_u->status = NT_STATUS_NO_PROBLEMO; + r_u->status = NT_STATUS_OK; /* associate the user's SID with the new handle. */ if ((info = (struct samr_info *)malloc(sizeof(struct samr_info))) == NULL) @@ -1928,7 +2008,7 @@ uint32 _samr_connect(pipes_struct *p, SAMR_Q_CONNECT *q_u, SAMR_R_CONNECT *r_u) DEBUG(5,("_samr_connect: %d\n", __LINE__)); - r_u->status = NT_STATUS_NO_PROBLEMO; + r_u->status = NT_STATUS_OK; /* associate the user's SID with the new handle. */ if ((info = (struct samr_info *)malloc(sizeof(struct samr_info))) == NULL) @@ -1952,7 +2032,7 @@ uint32 _samr_connect(pipes_struct *p, SAMR_Q_CONNECT *q_u, SAMR_R_CONNECT *r_u) uint32 _samr_lookup_domain(pipes_struct *p, SAMR_Q_LOOKUP_DOMAIN *q_u, SAMR_R_LOOKUP_DOMAIN *r_u) { - r_u->status = NT_STATUS_NO_PROBLEMO; + r_u->status = NT_STATUS_OK; if (!find_policy_by_hnd(p, &q_u->connect_pol, NULL)) return NT_STATUS_INVALID_HANDLE; @@ -1983,8 +2063,8 @@ static BOOL make_enum_domains(TALLOC_CTX *ctx, SAM_ENTRY **pp_sam, if (num_sam_entries == 0) return True; - sam = (SAM_ENTRY *)talloc(ctx, sizeof(SAM_ENTRY)*num_sam_entries); - uni_name = (UNISTR2 *)talloc(ctx, sizeof(UNISTR2)*num_sam_entries); + sam = (SAM_ENTRY *)talloc_zero(ctx, sizeof(SAM_ENTRY)*num_sam_entries); + uni_name = (UNISTR2 *)talloc_zero(ctx, sizeof(UNISTR2)*num_sam_entries); if (sam == NULL || uni_name == NULL) return False; @@ -2011,7 +2091,7 @@ uint32 _samr_enum_domains(pipes_struct *p, SAMR_Q_ENUM_DOMAINS *q_u, SAMR_R_ENUM uint32 num_entries = 2; fstring dom[2]; - r_u->status = NT_STATUS_NO_PROBLEMO; + r_u->status = NT_STATUS_OK; fstrcpy(dom[0],global_myworkgroup); fstrcpy(dom[1],"Builtin"); @@ -2036,7 +2116,7 @@ uint32 _api_samr_open_alias(pipes_struct *p, SAMR_Q_OPEN_ALIAS *q_u, SAMR_R_OPEN POLICY_HND *alias_pol = &r_u->pol; struct samr_info *info = NULL; - r_u->status = NT_STATUS_NO_PROBLEMO; + r_u->status = NT_STATUS_OK; /* get the domain policy. */ if (!find_policy_by_hnd(p, &domain_pol, NULL)) @@ -2075,23 +2155,32 @@ uint32 _api_samr_open_alias(pipes_struct *p, SAMR_Q_OPEN_ALIAS *q_u, SAMR_R_OPEN static BOOL set_user_info_10(const SAM_USER_INFO_10 *id10, uint32 rid) { - struct sam_passwd *pwd = getsam21pwrid(rid); - struct sam_passwd new_pwd; + SAM_ACCOUNT *pwd =NULL; + BOOL ret; + + pdb_init_sam(&pwd); + + ret = pdb_getsampwrid(pwd, rid); + + if(ret==False) { + pdb_free_sam(pwd); + return False; + } if (id10 == NULL) { DEBUG(5, ("set_user_info_10: NULL id10\n")); + pdb_free_sam(pwd); return False; } - if (pwd == NULL) - return False; - - copy_sam_passwd(&new_pwd, pwd); - - new_pwd.acct_ctrl = id10->acb_info; + pdb_set_acct_ctrl(pwd, id10->acb_info); - if(!mod_sam21pwd_entry(&new_pwd, True)) + if(!pdb_update_sam_account(pwd, True)) { + pdb_free_sam(pwd); return False; + } + + pdb_free_sam(pwd); return True; } @@ -2102,31 +2191,36 @@ static BOOL set_user_info_10(const SAM_USER_INFO_10 *id10, uint32 rid) static BOOL set_user_info_12(SAM_USER_INFO_12 *id12, uint32 rid) { - struct sam_passwd *pwd = getsam21pwrid(rid); - struct sam_passwd new_pwd; - static uchar nt_hash[16]; - static uchar lm_hash[16]; + SAM_ACCOUNT *pwd = NULL; - if (pwd == NULL) + pdb_init_sam(&pwd); + + if(!pdb_getsampwrid(pwd, rid)) { + pdb_free_sam(pwd); return False; + } if (id12 == NULL) { DEBUG(2, ("set_user_info_12: id12 is NULL\n")); + pdb_free_sam(pwd); return False; } - - pdb_init_sam(&new_pwd); - copy_sam_passwd(&new_pwd, pwd); - - memcpy(nt_hash, id12->nt_pwd, sizeof(nt_hash)); - memcpy(lm_hash, id12->lm_pwd, sizeof(lm_hash)); - - new_pwd.smb_passwd = lm_hash; - new_pwd.smb_nt_passwd = nt_hash; - - if(!mod_sam21pwd_entry(&new_pwd, True)) + + if (!pdb_set_lanman_passwd (pwd, id12->lm_pwd)) { + pdb_free_sam(pwd); + return False; + } + if (!pdb_set_nt_passwd(pwd, id12->nt_pwd)) { + pdb_free_sam(pwd); return False; + } + + if(!pdb_update_sam_account(pwd, True)) { + pdb_free_sam(pwd); + return False; + } + pdb_free_sam(pwd); return True; } @@ -2136,39 +2230,44 @@ static BOOL set_user_info_12(SAM_USER_INFO_12 *id12, uint32 rid) static BOOL set_user_info_21(SAM_USER_INFO_21 *id21, uint32 rid) { - struct sam_passwd *pwd = getsam21pwrid(rid); - struct sam_passwd new_pwd; - static uchar nt_hash[16]; - static uchar lm_hash[16]; - + SAM_ACCOUNT *pwd = NULL; + SAM_ACCOUNT *new_pwd = NULL; + if (id21 == NULL) { DEBUG(5, ("set_user_info_21: NULL id21\n")); return False; } - - if (pwd == NULL) - return False; - + + pdb_init_sam(&pwd); pdb_init_sam(&new_pwd); - /* we make a copy so that we can modify stuff */ - copy_sam_passwd(&new_pwd, pwd); - copy_id21_to_sam_passwd(&new_pwd, id21); - - if (pwd->smb_nt_passwd != NULL) { - memcpy(nt_hash, pwd->smb_nt_passwd, 16); - new_pwd.smb_nt_passwd = nt_hash; - } else - new_pwd.smb_nt_passwd = NULL; - - if (pwd->smb_nt_passwd != NULL) { - memcpy(lm_hash, pwd->smb_passwd, 16); - new_pwd.smb_passwd = lm_hash; - } else - new_pwd.smb_passwd = NULL; - - if(!mod_sam21pwd_entry(&new_pwd, True)) + + if (!pdb_getsampwrid(pwd, rid)) { + pdb_free_sam(pwd); + pdb_free_sam(new_pwd); return False; - + } + + /* we make a copy so that we can modify stuff */ + copy_sam_passwd(new_pwd, pwd); + copy_id21_to_sam_passwd(new_pwd, id21); + + /* + * The funny part about the previous two calls is + * that pwd still has the password hashes from the + * passdb entry. These have not been updated from + * id21. I don't know if they need to be set. --jerry + */ + + /* write the change out */ + if(!pdb_update_sam_account(new_pwd, True)) { + pdb_free_sam(pwd); + pdb_free_sam(new_pwd); + return False; + } + + pdb_free_sam(pwd); + pdb_free_sam(new_pwd); + return True; } @@ -2178,51 +2277,72 @@ static BOOL set_user_info_21(SAM_USER_INFO_21 *id21, uint32 rid) static BOOL set_user_info_23(SAM_USER_INFO_23 *id23, uint32 rid) { - struct sam_passwd *pwd = getsam21pwrid(rid); - struct sam_passwd new_pwd; - static uchar nt_hash[16]; - static uchar lm_hash[16]; + SAM_ACCOUNT *pwd = NULL; + SAM_ACCOUNT *new_pwd = NULL; + uint8 nt_hash[16]; + uint8 lm_hash[16]; pstring buf; uint32 len; - + uint16 acct_ctrl; + if (id23 == NULL) { DEBUG(5, ("set_user_info_23: NULL id23\n")); return False; } - - if (pwd == NULL) - return False; - + + pdb_init_sam(&pwd); pdb_init_sam(&new_pwd); - copy_sam_passwd(&new_pwd, pwd); - copy_id23_to_sam_passwd(&new_pwd, id23); - - memset(buf, 0, sizeof(pstring)); - - if (!decode_pw_buffer((char*)id23->pass, buf, 256, &len, nt_hash, lm_hash)) + + if (!pdb_getsampwrid(pwd, rid)) { + pdb_free_sam(pwd); + pdb_free_sam(new_pwd); return False; + } - new_pwd.smb_passwd = lm_hash; - new_pwd.smb_nt_passwd = nt_hash; + acct_ctrl = pdb_get_acct_ctrl(pwd); + copy_sam_passwd(new_pwd, pwd); + pdb_free_sam(pwd); + + copy_id23_to_sam_passwd(new_pwd, id23); + + if (!decode_pw_buffer((char*)id23->pass, buf, 256, &len, nt_hash, lm_hash)) { + pdb_free_sam(new_pwd); + return False; + } + + if (!pdb_set_lanman_passwd (new_pwd, lm_hash)) { + pdb_free_sam(new_pwd); + return False; + } + if (!pdb_set_nt_passwd(new_pwd, nt_hash)) { + pdb_free_sam(new_pwd); + return False; + } + /* if it's a trust account, don't update /etc/passwd */ - if ( ( (new_pwd.acct_ctrl & ACB_DOMTRUST) == ACB_DOMTRUST ) || - ( (new_pwd.acct_ctrl & ACB_WSTRUST) == ACB_WSTRUST) || - ( (new_pwd.acct_ctrl & ACB_SVRTRUST) == ACB_SVRTRUST) ) { + if ( ( (acct_ctrl & ACB_DOMTRUST) == ACB_DOMTRUST ) || + ( (acct_ctrl & ACB_WSTRUST) == ACB_WSTRUST) || + ( (acct_ctrl & ACB_SVRTRUST) == ACB_SVRTRUST) ) { DEBUG(5, ("Changing trust account password, not updating /etc/passwd\n")); - } else { - + } else { /* update the UNIX password */ if (lp_unix_password_sync() ) - if(!chgpasswd(new_pwd.smb_name, "", buf, True)) + if(!chgpasswd(pdb_get_username(new_pwd), "", buf, True)) { + pdb_free_sam(new_pwd); return False; + } } - + memset(buf, 0, sizeof(buf)); - - if(!mod_sam21pwd_entry(&new_pwd, True)) + + if(!pdb_update_sam_account(new_pwd, True)) { + pdb_free_sam(new_pwd); return False; - + } + + pdb_free_sam(new_pwd); + return True; } @@ -2232,47 +2352,63 @@ static BOOL set_user_info_23(SAM_USER_INFO_23 *id23, uint32 rid) static BOOL set_user_info_pw(char *pass, uint32 rid) { - struct sam_passwd *pwd = getsam21pwrid(rid); - struct sam_passwd new_pwd; - static uchar nt_hash[16]; - static uchar lm_hash[16]; + SAM_ACCOUNT *pwd = NULL; + uchar nt_hash[16]; + uchar lm_hash[16]; uint32 len; pstring buf; - - if (pwd == NULL) + uint16 acct_ctrl; + + pdb_init_sam(&pwd); + + if (!pdb_getsampwrid(pwd, rid)) { + pdb_free_sam(pwd); return False; + } + + acct_ctrl = pdb_get_acct_ctrl(pwd); - pdb_init_sam(&new_pwd); - copy_sam_passwd(&new_pwd, pwd); - - memset(buf, 0, sizeof(pstring)); - - if (!decode_pw_buffer(pass, buf, 256, &len, nt_hash, lm_hash)) + memset(buf, 0, sizeof(buf)); + + if (!decode_pw_buffer(pass, buf, 256, &len, nt_hash, lm_hash)) { + pdb_free_sam(pwd); return False; + } - new_pwd.smb_passwd = lm_hash; - new_pwd.smb_nt_passwd = nt_hash; - + if (!pdb_set_lanman_passwd (pwd, lm_hash)) { + pdb_free_sam(pwd); + return False; + } + if (!pdb_set_nt_passwd(pwd, nt_hash)) { + pdb_free_sam(pwd); + return False; + } + /* if it's a trust account, don't update /etc/passwd */ - if ( ( (new_pwd.acct_ctrl & ACB_DOMTRUST) == ACB_DOMTRUST ) || - ( (new_pwd.acct_ctrl & ACB_WSTRUST) == ACB_WSTRUST) || - ( (new_pwd.acct_ctrl & ACB_SVRTRUST) == ACB_SVRTRUST) ) { + if ( ( (acct_ctrl & ACB_DOMTRUST) == ACB_DOMTRUST ) || + ( (acct_ctrl & ACB_WSTRUST) == ACB_WSTRUST) || + ( (acct_ctrl & ACB_SVRTRUST) == ACB_SVRTRUST) ) { DEBUG(5, ("Changing trust account password, not updating /etc/passwd\n")); } else { - /* update the UNIX password */ - if (lp_unix_password_sync() ) - if(!chgpasswd(new_pwd.smb_name, "", buf, True)) + if (lp_unix_password_sync()) + if(!chgpasswd(pdb_get_username(pwd), "", buf, True)) { + pdb_free_sam(pwd); return False; + } } - + memset(buf, 0, sizeof(buf)); - + DEBUG(5,("set_user_info_pw: pdb_update_sam_account()\n")); - + /* update the SAMBA password */ - if(!mod_sam21pwd_entry(&new_pwd, True)) + if(!pdb_update_sam_account(pwd, True)) { + pdb_free_sam(pwd); return False; + } + + pdb_free_sam(pwd); return True; } @@ -2286,15 +2422,16 @@ uint32 _samr_set_userinfo(pipes_struct *p, SAMR_Q_SET_USERINFO *q_u, SAMR_R_SET_ uint32 rid = 0x0; DOM_SID sid; struct current_user user; - struct smb_passwd *smb_pass; + SAM_ACCOUNT *sam_pass=NULL; unsigned char sess_key[16]; POLICY_HND *pol = &q_u->pol; uint16 switch_value = q_u->switch_value; SAM_USERINFO_CTR *ctr = q_u->ctr; + BOOL ret; DEBUG(5, ("_samr_set_userinfo: %d\n", __LINE__)); - r_u->status = NT_STATUS_NOPROBLEMO; + r_u->status = NT_STATUS_OK; if (p->ntlmssp_auth_validated) { memcpy(&user, &p->pipe_user, sizeof(user)); @@ -2317,6 +2454,8 @@ uint32 _samr_set_userinfo(pipes_struct *p, SAMR_Q_SET_USERINFO *q_u, SAMR_R_SET_ } + pdb_init_sam(&sam_pass); + /* * We need the NT hash of the user who is changing the user's password. * This NT hash is used to generate a "user session key" @@ -2324,21 +2463,18 @@ uint32 _samr_set_userinfo(pipes_struct *p, SAMR_Q_SET_USERINFO *q_u, SAMR_R_SET_ */ become_root(); - smb_pass = getsmbpwuid(user.uid); + ret = pdb_getsampwuid(sam_pass, user.uid); unbecome_root(); - if(smb_pass == NULL) { + if(ret == False) { DEBUG(0,("_samr_set_userinfo: Unable to get smbpasswd entry for uid %u\n", (unsigned int)user.uid )); + pdb_free_sam(sam_pass); return NT_STATUS_ACCESS_DENIED; } - - if (smb_pass->smb_nt_passwd == NULL) { - DEBUG(0,("_samr_set_userinfo: Unable to get smbpasswd NT password entry entry for uid %u\n", - (unsigned int)user.uid )); - return NT_STATUS_ACCESS_DENIED; - } - + memset(sess_key, '\0', 16); - mdfour(sess_key, smb_pass->smb_nt_passwd, 16); + mdfour(sess_key, pdb_get_nt_passwd(sam_pass), 16); + + pdb_free_sam(sam_pass); /* ok! user info levels (lots: see MSDEV help), off we go... */ switch (switch_value) { @@ -2352,7 +2488,7 @@ uint32 _samr_set_userinfo(pipes_struct *p, SAMR_Q_SET_USERINFO *q_u, SAMR_R_SET_ dump_data(100, (char *)ctr->info.id24->pass, 516); - if (!set_user_info_pw((char *)(ctr->info.id24->pass), rid)) + if (!set_user_info_pw((char *)ctr->info.id24->pass, rid)) return NT_STATUS_ACCESS_DENIED; break; @@ -2406,7 +2542,7 @@ uint32 _samr_set_userinfo2(pipes_struct *p, SAMR_Q_SET_USERINFO2 *q_u, SAMR_R_SE DEBUG(5, ("samr_reply_set_userinfo2: %d\n", __LINE__)); - r_u->status = NT_STATUS_NOPROBLEMO; + r_u->status = NT_STATUS_OK; /* find the policy handle. open a policy on it. */ if (!get_lsa_policy_samr_sid(p, pol, &sid)) @@ -2451,8 +2587,21 @@ uint32 _samr_set_userinfo2(pipes_struct *p, SAMR_Q_SET_USERINFO2 *q_u, SAMR_R_SE uint32 _samr_query_useraliases(pipes_struct *p, SAMR_Q_QUERY_USERALIASES *q_u, SAMR_R_QUERY_USERALIASES *r_u) { - DEBUG(0,("_samr_query_useraliases: Not yet implemented.\n")); - return False; + uint32 *rid=NULL; + int num_rids; + + num_rids = 1; + rid=(uint32 *)talloc_zero(p->mem_ctx, num_rids*sizeof(uint32)); + if (rid == NULL) + return NT_STATUS_NO_MEMORY; + + /* until i see a real useraliases query, we fack one up */ + + rid[0] = BUILTIN_ALIAS_RID_USERS; + + init_samr_r_query_useraliases(r_u, num_rids, rid, NT_STATUS_OK); + + return r_u->status; } /********************************************************************* @@ -2592,7 +2741,7 @@ uint32 _samr_set_groupinfo(pipes_struct *p, SAMR_Q_SET_GROUPINFO *q_u, SAMR_R_SE uint32 _samr_get_dom_pwinfo(pipes_struct *p, SAMR_Q_GET_DOM_PWINFO *q_u, SAMR_R_GET_DOM_PWINFO *r_u) { /* Actually, returning zeros here works quite well :-). */ - return NT_STATUS_NOPROBLEMO; + return NT_STATUS_OK; } /********************************************************************* diff --git a/source/rpc_server/srv_spoolss.c b/source/rpc_server/srv_spoolss.c index 63bbc5f87b7..011efb1bace 100755 --- a/source/rpc_server/srv_spoolss.c +++ b/source/rpc_server/srv_spoolss.c @@ -1110,7 +1110,7 @@ static BOOL api_spoolss_addprintprocessor(pipes_struct *p) automatically set the winprint processor for printer entries later. Used to debug the LexMark Optra S 1855 PCL driver --jerry */ - r_u.status = NT_STATUS_NO_PROBLEMO; + r_u.status = NT_STATUS_OK; if(!spoolss_io_r_addprintprocessor("", &r_u, rdata, 0)) { DEBUG(0,("spoolss_io_r_addprintprocessor: unable to marshall SPOOL_R_ADDPRINTPROCESSOR.\n")); diff --git a/source/rpc_server/srv_spoolss_nt.c b/source/rpc_server/srv_spoolss_nt.c index 3fcb08891df..86f4fe77ac3 100644 --- a/source/rpc_server/srv_spoolss_nt.c +++ b/source/rpc_server/srv_spoolss_nt.c @@ -22,6 +22,9 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +/* Since the SPOOLSS rpc routines are basically DOS 16-bit calls wrapped + up, all the errors returned are DOS errors, not NT status codes. */ + #include "includes.h" extern int DEBUGLEVEL; @@ -31,6 +34,7 @@ extern pstring global_myname; #define MAX_OPEN_PRINTER_EXS 50 #endif +#define PHANTOM_DEVMODE_KEY "_p_f_a_n_t_0_m_" #define PRINTER_HANDLE_IS_PRINTER 0 #define PRINTER_HANDLE_IS_PRINTSERVER 1 @@ -272,12 +276,12 @@ static uint32 delete_printer_handle(pipes_struct *p, POLICY_HND *hnd) if (!Printer) { DEBUG(0,("delete_printer_handle: Invalid handle (%s)\n", OUR_HANDLE(hnd))); - return ERROR_INVALID_HANDLE; + return ERRbadfid; } if (del_a_printer(Printer->dev.handlename) != 0) { DEBUG(3,("Error deleting printer %s\n", Printer->dev.handlename)); - return ERROR_INVALID_HANDLE; + return ERRbadfid; } /* Check calling user has permission to delete printer. Note that @@ -287,7 +291,7 @@ static uint32 delete_printer_handle(pipes_struct *p, POLICY_HND *hnd) if (!print_access_check(NULL, -1, PRINTER_ACCESS_ADMINISTER)) { DEBUG(3, ("printer delete denied by security descriptor\n")); - return ERROR_ACCESS_DENIED; + return ERRnoaccess; } if (*lp_deleteprinter_cmd()) { @@ -305,7 +309,7 @@ static uint32 delete_printer_handle(pipes_struct *p, POLICY_HND *hnd) DEBUG(10,("Running [%s]\n", command)); ret = smbrun(command, NULL); if (ret != 0) { - return ERROR_INVALID_HANDLE; /* What to return here? */ + return ERRbadfid; /* What to return here? */ } DEBUGADD(10,("returned [%d]\n", ret)); @@ -314,12 +318,12 @@ static uint32 delete_printer_handle(pipes_struct *p, POLICY_HND *hnd) if ( ( i = lp_servicenumber( Printer->dev.handlename ) ) >= 0 ) { lp_killservice( i ); - return ERROR_SUCCESS; + return ERRsuccess; } else - return ERROR_ACCESS_DENIED; + return ERRnoaccess; } - return ERROR_SUCCESS; + return ERRsuccess; } /**************************************************************************** @@ -706,7 +710,7 @@ static BOOL srv_spoolss_sendnotify(pipes_struct *p, POLICY_HND *handle) uint32 _spoolss_open_printer_ex( pipes_struct *p, SPOOL_Q_OPEN_PRINTER_EX *q_u, SPOOL_R_OPEN_PRINTER_EX *r_u) { #if 0 - uint32 result = NT_STATUS_NO_PROBLEMO; + uint32 result = ERRsuccess; #endif UNISTR2 *printername = NULL; @@ -723,7 +727,7 @@ uint32 _spoolss_open_printer_ex( pipes_struct *p, SPOOL_Q_OPEN_PRINTER_EX *q_u, printername = &q_u->printername; if (printername == NULL) - return ERROR_INVALID_PRINTER_NAME; + return ERRinvalidprintername; /* some sanity check because you can open a printer or a print server */ /* aka: \\server\printer or \\server */ @@ -732,7 +736,7 @@ uint32 _spoolss_open_printer_ex( pipes_struct *p, SPOOL_Q_OPEN_PRINTER_EX *q_u, DEBUGADD(3,("checking name: %s\n",name)); if (!open_printer_hnd(p, handle, name)) - return ERROR_INVALID_PRINTER_NAME; + return ERRinvalidprintername; /* if (printer_default->datatype_ptr != NULL) @@ -746,7 +750,7 @@ uint32 _spoolss_open_printer_ex( pipes_struct *p, SPOOL_Q_OPEN_PRINTER_EX *q_u, if (!set_printer_hnd_accesstype(p, handle, printer_default->access_required)) { close_printer_handle(p, handle); - return ERROR_ACCESS_DENIED; + return ERRnoaccess; } /* @@ -776,7 +780,7 @@ uint32 _spoolss_open_printer_ex( pipes_struct *p, SPOOL_Q_OPEN_PRINTER_EX *q_u, if (handle_is_printserver(p, handle)) { if (printer_default->access_required == 0) { - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } else if ((printer_default->access_required & SERVER_ACCESS_ADMINISTER ) == SERVER_ACCESS_ADMINISTER) { @@ -785,14 +789,14 @@ uint32 _spoolss_open_printer_ex( pipes_struct *p, SPOOL_Q_OPEN_PRINTER_EX *q_u, if (!lp_ms_add_printer_wizard()) { close_printer_handle(p, handle); - return ERROR_ACCESS_DENIED; + return ERRnoaccess; } else if (user.uid == 0 || user_in_list(uidtoname(user.uid), lp_printer_admin(snum))) { - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } else { close_printer_handle(p, handle); - return ERROR_ACCESS_DENIED; + return ERRnoaccess; } } } @@ -802,16 +806,29 @@ uint32 _spoolss_open_printer_ex( pipes_struct *p, SPOOL_Q_OPEN_PRINTER_EX *q_u, doesn't have print permission. */ if (!get_printer_snum(p, handle, &snum)) - return ERROR_INVALID_HANDLE; + return ERRbadfid; /* map an empty access mask to the minimum access mask */ if (printer_default->access_required == 0x0) printer_default->access_required = PRINTER_ACCESS_USE; + + + /* + * If we are not serving the printer driver for this printer, + * map PRINTER_ACCESS_ADMINISTER to PRINTER_ACCESS_USE. This + * will keep NT clients happy --jerry + */ + + if (lp_use_client_driver(snum) + && (printer_default->access_required & PRINTER_ACCESS_ADMINISTER)) + { + printer_default->access_required = PRINTER_ACCESS_USE; + } if (!print_access_check(&user, snum, printer_default->access_required)) { DEBUG(3, ("access DENIED for printer open\n")); close_printer_handle(p, handle); - return ERROR_ACCESS_DENIED; + return ERRnoaccess; } /* @@ -890,7 +907,7 @@ uint32 _spoolss_open_printer_ex( pipes_struct *p, SPOOL_Q_OPEN_PRINTER_EX *q_u, #endif } - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -1008,7 +1025,7 @@ static uint32 _spoolss_enddocprinter_internal(pipes_struct *p, POLICY_HND *handl if (!Printer) { DEBUG(0,("_spoolss_enddocprinter_internal: Invalid handle (%s)\n", OUR_HANDLE(handle))); - return ERROR_INVALID_HANDLE; + return ERRbadfid; } Printer->document_started=False; @@ -1034,9 +1051,9 @@ uint32 _spoolss_closeprinter(pipes_struct *p, SPOOL_Q_CLOSEPRINTER *q_u, SPOOL_R memcpy(&r_u->handle, &q_u->handle, sizeof(r_u->handle)); if (!close_printer_handle(p, handle)) - return ERROR_INVALID_HANDLE; + return ERRbadfid; - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /******************************************************************** @@ -1058,7 +1075,7 @@ uint32 _spoolss_deleteprinter(pipes_struct *p, SPOOL_Q_DELETEPRINTER *q_u, SPOOL result = delete_printer_handle(p, handle); - if (result == ERROR_SUCCESS) { + if (result == ERRsuccess) { srv_spoolss_sendnotify(p, handle); } @@ -1120,20 +1137,20 @@ uint32 _spoolss_deleteprinterdriver(pipes_struct *p, SPOOL_Q_DELETEPRINTERDRIVER /* check that we have a valid driver name first */ if ((version=get_version_id(arch)) == -1) { /* this is what NT returns */ - return ERROR_INVALID_ENVIRONMENT; + return ERRinvalidenvironment; } ZERO_STRUCT(info); if (get_a_printer_driver (&info, 3, driver, arch, version) != 0) { /* this is what NT returns */ - return ERROR_UNKNOWN_PRINTER_DRIVER; + return ERRunknownprinterdriver; } if (printer_driver_in_use(arch, driver)) { /* this is what NT returns */ - return ERROR_PRINTER_DRIVER_IN_USE; + return ERRprinterdriverinuse; } return delete_printer_driver(info.info_3); @@ -1309,9 +1326,9 @@ uint32 _spoolss_getprinterdata(pipes_struct *p, SPOOL_Q_GETPRINTERDATA *q_u, SPO if (!Printer) { if((*data=(uint8 *)malloc(4*sizeof(uint8))) == NULL) - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; DEBUG(0,("_spoolss_getprinterdata: Invalid handle (%s).\n", OUR_HANDLE(handle))); - return ERROR_INVALID_HANDLE; + return ERRbadfid; } unistr2_to_ascii(value, valuename, sizeof(value)-1); @@ -1326,18 +1343,18 @@ uint32 _spoolss_getprinterdata(pipes_struct *p, SPOOL_Q_GETPRINTERDATA *q_u, SPO /* reply this param doesn't exist */ if (*out_size) { if((*data=(uint8 *)talloc_zero(p->mem_ctx, *out_size*sizeof(uint8))) == NULL) - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; } else { *data = NULL; } - return ERROR_INVALID_PARAMETER; + return ERRinvalidparam; } if (*needed > *out_size) - return ERROR_MORE_DATA; + return ERRmoredata; else { - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } } @@ -1399,7 +1416,7 @@ uint32 _spoolss_rffpcnex(pipes_struct *p, SPOOL_Q_RFFPCNEX *q_u, SPOOL_R_RFFPCNE if (!Printer) { DEBUG(0,("_spoolss_rffpcnex: Invalid handle (%s).\n", OUR_HANDLE(handle))); - return ERROR_INVALID_HANDLE; + return ERRbadfid; } Printer->notify.flags=flags; @@ -1419,7 +1436,7 @@ uint32 _spoolss_rffpcnex(pipes_struct *p, SPOOL_Q_RFFPCNEX *q_u, SPOOL_R_RFFPCNE &Printer->notify.client_hnd)) Printer->notify.client_connected=True; - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /******************************************************************* @@ -2209,7 +2226,7 @@ static BOOL construct_notify_printer_info(SPOOL_NOTIFY_INFO *info, int uint16 type; uint16 field; - SPOOL_NOTIFY_INFO_DATA *current_data; + SPOOL_NOTIFY_INFO_DATA *current_data, *tid; NT_PRINTER_INFO_LEVEL *printer = NULL; print_queue_struct *queue=NULL; @@ -2228,10 +2245,13 @@ static BOOL construct_notify_printer_info(SPOOL_NOTIFY_INFO *info, int if (!search_notify(type, field, &j) ) continue; - - if((info->data=(SPOOL_NOTIFY_INFO_DATA *)Realloc(info->data, (info->count+1)*sizeof(SPOOL_NOTIFY_INFO_DATA))) == NULL) { + + if((tid=(SPOOL_NOTIFY_INFO_DATA *)Realloc(info->data, (info->count+1)*sizeof(SPOOL_NOTIFY_INFO_DATA))) == NULL) { + DEBUG(0,("construct_notify_printer_info: failed to enlarge buffer info->data!\n")); return False; } + else info->data = tid; + current_data=&info->data[info->count]; construct_info_data(current_data, type, field, id); @@ -2265,7 +2285,7 @@ static BOOL construct_notify_jobs_info(print_queue_struct *queue, uint16 type; uint16 field; - SPOOL_NOTIFY_INFO_DATA *current_data; + SPOOL_NOTIFY_INFO_DATA *current_data, *tid; DEBUG(4,("construct_notify_jobs_info\n")); @@ -2281,9 +2301,11 @@ static BOOL construct_notify_jobs_info(print_queue_struct *queue, if (!search_notify(type, field, &j) ) continue; - if((info->data=Realloc(info->data, (info->count+1)*sizeof(SPOOL_NOTIFY_INFO_DATA))) == NULL) { + if((tid=Realloc(info->data, (info->count+1)*sizeof(SPOOL_NOTIFY_INFO_DATA))) == NULL) { + DEBUG(0,("construct_notify_jobs_info: failed to enlarg buffer info->data!\n")); return False; - } + } else + info->data = tid; current_data=&(info->data[info->count]); @@ -2374,7 +2396,7 @@ static uint32 printserver_notify_info(pipes_struct *p, POLICY_HND *hnd, } */ - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /******************************************************************* @@ -2457,7 +2479,7 @@ static uint32 printer_notify_info(pipes_struct *p, POLICY_HND *hnd, SPOOL_NOTIFY info->data[i].id, info->data[i].size, info->data[i].enc_type)); } */ - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /******************************************************************** @@ -2472,7 +2494,7 @@ uint32 _spoolss_rfnpcnex( pipes_struct *p, SPOOL_Q_RFNPCNEX *q_u, SPOOL_R_RFNPCN SPOOL_NOTIFY_INFO *info = &r_u->info; Printer_entry *Printer=find_printer_index_by_hnd(p, handle); - uint32 result = ERROR_INVALID_HANDLE; + uint32 result = ERRbadfid; /* we always have a NOTIFY_INFO struct */ r_u->info_ptr=0x1; @@ -2886,7 +2908,7 @@ static BOOL enum_all_printers_info_1(uint32 flags, NEW_BUFFER *buffer, uint32 of int snum; int i; int n_services=lp_numservices(); - PRINTER_INFO_1 *printers=NULL; + PRINTER_INFO_1 *tp, *printers=NULL; PRINTER_INFO_1 current_prt; DEBUG(4,("enum_all_printers_info_1\n")); @@ -2896,10 +2918,13 @@ static BOOL enum_all_printers_info_1(uint32 flags, NEW_BUFFER *buffer, uint32 of DEBUG(4,("Found a printer in smb.conf: %s[%x]\n", lp_servicename(snum), snum)); if (construct_printer_info_1(flags, ¤t_prt, snum)) { - if((printers=Realloc(printers, (*returned +1)*sizeof(PRINTER_INFO_1))) == NULL) { + if((tp=Realloc(printers, (*returned +1)*sizeof(PRINTER_INFO_1))) == NULL) { + DEBUG(0,("enum_all_printers_info_1: failed to enlarge printers buffer!\n")); + safe_free(printers); *returned=0; - return ERROR_NOT_ENOUGH_MEMORY; - } + return ERRnomem; + } else + printers = tp; DEBUG(4,("ReAlloced memory for [%d] PRINTER_INFO_1\n", *returned)); memcpy(&printers[*returned], ¤t_prt, sizeof(PRINTER_INFO_1)); (*returned)++; @@ -2912,7 +2937,7 @@ static BOOL enum_all_printers_info_1(uint32 flags, NEW_BUFFER *buffer, uint32 of (*needed) += spoolss_size_printer_info_1(&printers[i]); if (!alloc_buffer_size(buffer, *needed)) - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; /* fill the buffer with the structures */ for (i=0; i<*returned; i++) @@ -2923,10 +2948,10 @@ static BOOL enum_all_printers_info_1(uint32 flags, NEW_BUFFER *buffer, uint32 of if (*needed > offered) { *returned=0; - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /******************************************************************** @@ -2954,7 +2979,7 @@ static BOOL enum_all_printers_info_1_name(fstring name, NEW_BUFFER *buffer, uint return enum_all_printers_info_1(PRINTER_ENUM_ICON8, buffer, offered, needed, returned); } else - return ERROR_INVALID_NAME; + return ERRinvalidname; } /******************************************************************** @@ -2976,7 +3001,7 @@ static BOOL enum_all_printers_info_1_remote(fstring name, NEW_BUFFER *buffer, ui */ if((printer=(PRINTER_INFO_1 *)malloc(sizeof(PRINTER_INFO_1))) == NULL) - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; *returned=1; @@ -2994,7 +3019,7 @@ static BOOL enum_all_printers_info_1_remote(fstring name, NEW_BUFFER *buffer, ui if (!alloc_buffer_size(buffer, *needed)) { safe_free(printer); - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } /* fill the buffer with the structures */ @@ -3005,10 +3030,10 @@ static BOOL enum_all_printers_info_1_remote(fstring name, NEW_BUFFER *buffer, ui if (*needed > offered) { *returned=0; - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /******************************************************************** @@ -3033,7 +3058,7 @@ static BOOL enum_all_printers_info_2(NEW_BUFFER *buffer, uint32 offered, uint32 int snum; int i; int n_services=lp_numservices(); - PRINTER_INFO_2 *printers=NULL; + PRINTER_INFO_2 *tp, *printers=NULL; PRINTER_INFO_2 current_prt; for (snum=0; snum<n_services; snum++) { @@ -3041,8 +3066,13 @@ static BOOL enum_all_printers_info_2(NEW_BUFFER *buffer, uint32 offered, uint32 DEBUG(4,("Found a printer in smb.conf: %s[%x]\n", lp_servicename(snum), snum)); if (construct_printer_info_2(¤t_prt, snum)) { - if((printers=Realloc(printers, (*returned +1)*sizeof(PRINTER_INFO_2))) == NULL) - return ERROR_NOT_ENOUGH_MEMORY; + if((tp=Realloc(printers, (*returned +1)*sizeof(PRINTER_INFO_2))) == NULL) { + DEBUG(0,("enum_all_printers_info_2: failed to enlarge printers buffer!\n")); + safe_free(printers); + *returned = 0; + return ERRnomem; + } else + printers = tp; DEBUG(4,("ReAlloced memory for [%d] PRINTER_INFO_2\n", *returned)); memcpy(&printers[*returned], ¤t_prt, sizeof(PRINTER_INFO_2)); (*returned)++; @@ -3059,7 +3089,7 @@ static BOOL enum_all_printers_info_2(NEW_BUFFER *buffer, uint32 offered, uint32 free_devmode(printers[i].devmode); } safe_free(printers); - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } /* fill the buffer with the structures */ @@ -3074,10 +3104,10 @@ static BOOL enum_all_printers_info_2(NEW_BUFFER *buffer, uint32 offered, uint32 if (*needed > offered) { *returned=0; - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /******************************************************************** @@ -3101,7 +3131,7 @@ static uint32 enumprinters_level1( uint32 flags, fstring name, if (flags & PRINTER_ENUM_NETWORK) return enum_all_printers_info_1_network(buffer, offered, needed, returned); - return NT_STATUS_NO_PROBLEMO; /* NT4sp5 does that */ + return ERRsuccess; /* NT4sp5 does that */ } /******************************************************************** @@ -3127,13 +3157,13 @@ static uint32 enumprinters_level2( uint32 flags, fstring servername, if (strequal(servername, temp)) return enum_all_printers_info_2(buffer, offered, needed, returned); else - return ERROR_INVALID_NAME; + return ERRinvalidname; } if (flags & PRINTER_ENUM_REMOTE) - return ERROR_INVALID_LEVEL; + return ERRunknownlevel; - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /******************************************************************** @@ -3144,7 +3174,7 @@ static uint32 enumprinters_level5( uint32 flags, fstring servername, uint32 *needed, uint32 *returned) { /* return enum_all_printers_info_5(buffer, offered, needed, returned);*/ - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /******************************************************************** @@ -3200,7 +3230,7 @@ uint32 _spoolss_enumprinters( pipes_struct *p, SPOOL_Q_ENUMPRINTERS *q_u, SPOOL_ case 3: case 4: default: - return ERROR_INVALID_LEVEL; + return ERRunknownlevel; } } @@ -3211,7 +3241,7 @@ static uint32 getprinter_level_0(int snum, NEW_BUFFER *buffer, uint32 offered, u PRINTER_INFO_0 *printer=NULL; if((printer=(PRINTER_INFO_0*)malloc(sizeof(PRINTER_INFO_0))) == NULL) - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; construct_printer_info_0(printer, snum); @@ -3220,7 +3250,7 @@ static uint32 getprinter_level_0(int snum, NEW_BUFFER *buffer, uint32 offered, u if (!alloc_buffer_size(buffer, *needed)) { safe_free(printer); - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } /* fill the buffer with the structures */ @@ -3230,10 +3260,10 @@ static uint32 getprinter_level_0(int snum, NEW_BUFFER *buffer, uint32 offered, u safe_free(printer); if (*needed > offered) { - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -3243,7 +3273,7 @@ static uint32 getprinter_level_1(int snum, NEW_BUFFER *buffer, uint32 offered, u PRINTER_INFO_1 *printer=NULL; if((printer=(PRINTER_INFO_1*)malloc(sizeof(PRINTER_INFO_1))) == NULL) - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; construct_printer_info_1(PRINTER_ENUM_ICON8, printer, snum); @@ -3252,7 +3282,7 @@ static uint32 getprinter_level_1(int snum, NEW_BUFFER *buffer, uint32 offered, u if (!alloc_buffer_size(buffer, *needed)) { safe_free(printer); - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } /* fill the buffer with the structures */ @@ -3262,10 +3292,10 @@ static uint32 getprinter_level_1(int snum, NEW_BUFFER *buffer, uint32 offered, u safe_free(printer); if (*needed > offered) { - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -3275,7 +3305,7 @@ static uint32 getprinter_level_2(int snum, NEW_BUFFER *buffer, uint32 offered, u PRINTER_INFO_2 *printer=NULL; if((printer=(PRINTER_INFO_2*)malloc(sizeof(PRINTER_INFO_2)))==NULL) - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; construct_printer_info_2(printer, snum); @@ -3284,23 +3314,23 @@ static uint32 getprinter_level_2(int snum, NEW_BUFFER *buffer, uint32 offered, u if (!alloc_buffer_size(buffer, *needed)) { free_printer_info_2(printer); - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } /* fill the buffer with the structures */ if (!smb_io_printer_info_2("", buffer, printer, 0)) { free_printer_info_2(printer); - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; } /* clear memory */ free_printer_info_2(printer); if (*needed > offered) { - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -3310,14 +3340,14 @@ static uint32 getprinter_level_3(int snum, NEW_BUFFER *buffer, uint32 offered, u PRINTER_INFO_3 *printer=NULL; if (!construct_printer_info_3(&printer, snum)) - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; /* check the required size. */ *needed += spoolss_size_printer_info_3(printer); if (!alloc_buffer_size(buffer, *needed)) { free_printer_info_3(printer); - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } /* fill the buffer with the structures */ @@ -3327,10 +3357,10 @@ static uint32 getprinter_level_3(int snum, NEW_BUFFER *buffer, uint32 offered, u free_printer_info_3(printer); if (*needed > offered) { - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -3353,7 +3383,7 @@ uint32 _spoolss_getprinter(pipes_struct *p, SPOOL_Q_GETPRINTER *q_u, SPOOL_R_GET *needed=0; if (!get_printer_snum(p, handle, &snum)) - return ERROR_INVALID_HANDLE; + return ERRbadfid; switch (level) { case 0: @@ -3365,7 +3395,7 @@ uint32 _spoolss_getprinter(pipes_struct *p, SPOOL_Q_GETPRINTER *q_u, SPOOL_R_GET case 3: return getprinter_level_3(snum, buffer, offered, needed); default: - return ERROR_INVALID_LEVEL; + return ERRunknownlevel; } } @@ -3388,16 +3418,16 @@ static uint32 construct_printer_driver_info_1(DRIVER_INFO_1 *info, int snum, fst ZERO_STRUCT(driver); if (get_a_printer(&printer, 2, lp_servicename(snum)) != 0) - return ERROR_INVALID_PRINTER_NAME; + return ERRinvalidprintername; if (get_a_printer_driver(&driver, 3, printer->info_2->drivername, architecture, version) != 0) - return ERROR_UNKNOWN_PRINTER_DRIVER; + return ERRunknownprinterdriver; fill_printer_driver_info_1(info, driver, servername, architecture); free_a_printer(&printer,2); - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /******************************************************************** @@ -3446,16 +3476,16 @@ static uint32 construct_printer_driver_info_2(DRIVER_INFO_2 *info, int snum, fst ZERO_STRUCT(driver); if (!get_a_printer(&printer, 2, lp_servicename(snum)) != 0) - return ERROR_INVALID_PRINTER_NAME; + return ERRinvalidprintername; if (!get_a_printer_driver(&driver, 3, printer->info_2->drivername, architecture, version) != 0) - return ERROR_UNKNOWN_PRINTER_DRIVER; + return ERRunknownprinterdriver; fill_printer_driver_info_2(info, driver, servername); free_a_printer(&printer,2); - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /******************************************************************** @@ -3469,6 +3499,7 @@ static void init_unistr_array(uint16 **uni_array, fstring *char_array, char *ser int j=0; char *v; pstring line; + uint16 *tuary; DEBUG(6,("init_unistr_array\n")); *uni_array=NULL; @@ -3483,10 +3514,11 @@ static void init_unistr_array(uint16 **uni_array, fstring *char_array, char *ser if (strlen(v) == 0) break; slprintf(line, sizeof(line)-1, "\\\\%s%s", servername, v); DEBUGADD(6,("%d:%s:%d\n", i, line, strlen(line))); - if((*uni_array=Realloc(*uni_array, (j+strlen(line)+2)*sizeof(uint16))) == NULL) { + if((tuary=Realloc(*uni_array, (j+strlen(line)+2)*sizeof(uint16))) == NULL) { DEBUG(0,("init_unistr_array: Realloc error\n" )); return; - } + } else + *uni_array = tuary; j += (dos_PutUniCode((char *)(*uni_array+j), line , sizeof(uint16)*strlen(line), True) / sizeof(uint16) ); i++; } @@ -3558,20 +3590,20 @@ static uint32 construct_printer_driver_info_3(DRIVER_INFO_3 *info, int snum, fst status=get_a_printer(&printer, 2, lp_servicename(snum) ); DEBUG(8,("construct_printer_driver_info_3: status: %d\n", status)); if (status != 0) - return ERROR_INVALID_PRINTER_NAME; + return ERRinvalidprintername; status=get_a_printer_driver(&driver, 3, printer->info_2->drivername, architecture, version); DEBUG(8,("construct_printer_driver_info_3: status: %d\n", status)); if (status != 0) { free_a_printer(&printer,2); - return ERROR_UNKNOWN_PRINTER_DRIVER; + return ERRunknownprinterdriver; } fill_printer_driver_info_3(info, driver, servername); free_a_printer(&printer,2); - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /******************************************************************** @@ -3652,7 +3684,7 @@ static uint32 construct_printer_driver_info_6(DRIVER_INFO_6 *info, int snum, fst status=get_a_printer(&printer, 2, lp_servicename(snum) ); DEBUG(8,("construct_printer_driver_info_6: status: %d\n", status)); if (status != 0) - return ERROR_INVALID_PRINTER_NAME; + return ERRinvalidprintername; status=get_a_printer_driver(&driver, 3, printer->info_2->drivername, architecture, version); DEBUG(8,("construct_printer_driver_info_6: status: %d\n", status)); @@ -3663,7 +3695,7 @@ static uint32 construct_printer_driver_info_6(DRIVER_INFO_6 *info, int snum, fst if (version < 3) { free_a_printer(&printer,2); - return ERROR_UNKNOWN_PRINTER_DRIVER; + return ERRunknownprinterdriver; } /* Yes - try again with a WinNT driver. */ @@ -3672,7 +3704,7 @@ static uint32 construct_printer_driver_info_6(DRIVER_INFO_6 *info, int snum, fst DEBUG(8,("construct_printer_driver_info_6: status: %d\n", status)); if (status != 0) { free_a_printer(&printer,2); - return ERROR_UNKNOWN_PRINTER_DRIVER; + return ERRunknownprinterdriver; } } @@ -3680,7 +3712,7 @@ static uint32 construct_printer_driver_info_6(DRIVER_INFO_6 *info, int snum, fst free_a_printer(&printer,2); - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -3708,10 +3740,10 @@ static uint32 getprinterdriver2_level1(fstring servername, fstring architecture, uint32 status; if((info=(DRIVER_INFO_1 *)malloc(sizeof(DRIVER_INFO_1))) == NULL) - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; status=construct_printer_driver_info_1(info, snum, servername, architecture, version); - if (status != NT_STATUS_NO_PROBLEMO) { + if (status != ERRsuccess) { safe_free(info); return status; } @@ -3721,7 +3753,7 @@ static uint32 getprinterdriver2_level1(fstring servername, fstring architecture, if (!alloc_buffer_size(buffer, *needed)) { safe_free(info); - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } /* fill the buffer with the structures */ @@ -3731,9 +3763,9 @@ static uint32 getprinterdriver2_level1(fstring servername, fstring architecture, safe_free(info); if (*needed > offered) - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -3744,10 +3776,10 @@ static uint32 getprinterdriver2_level2(fstring servername, fstring architecture, uint32 status; if((info=(DRIVER_INFO_2 *)malloc(sizeof(DRIVER_INFO_2))) == NULL) - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; status=construct_printer_driver_info_2(info, snum, servername, architecture, version); - if (status != NT_STATUS_NO_PROBLEMO) { + if (status != ERRsuccess) { safe_free(info); return status; } @@ -3757,7 +3789,7 @@ static uint32 getprinterdriver2_level2(fstring servername, fstring architecture, if (!alloc_buffer_size(buffer, *needed)) { safe_free(info); - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } /* fill the buffer with the structures */ @@ -3767,9 +3799,9 @@ static uint32 getprinterdriver2_level2(fstring servername, fstring architecture, safe_free(info); if (*needed > offered) - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -3782,7 +3814,7 @@ static uint32 getprinterdriver2_level3(fstring servername, fstring architecture, ZERO_STRUCT(info); status=construct_printer_driver_info_3(&info, snum, servername, architecture, version); - if (status != NT_STATUS_NO_PROBLEMO) { + if (status != ERRsuccess) { return status; } @@ -3791,7 +3823,7 @@ static uint32 getprinterdriver2_level3(fstring servername, fstring architecture, if (!alloc_buffer_size(buffer, *needed)) { free_printer_driver_info_3(&info); - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } /* fill the buffer with the structures */ @@ -3800,9 +3832,9 @@ static uint32 getprinterdriver2_level3(fstring servername, fstring architecture, free_printer_driver_info_3(&info); if (*needed > offered) - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -3815,7 +3847,7 @@ static uint32 getprinterdriver2_level6(fstring servername, fstring architecture, ZERO_STRUCT(info); status=construct_printer_driver_info_6(&info, snum, servername, architecture, version); - if (status != NT_STATUS_NO_PROBLEMO) { + if (status != ERRsuccess) { return status; } @@ -3824,7 +3856,7 @@ static uint32 getprinterdriver2_level6(fstring servername, fstring architecture, if (!alloc_buffer_size(buffer, *needed)) { free_printer_driver_info_6(&info); - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } /* fill the buffer with the structures */ @@ -3833,9 +3865,9 @@ static uint32 getprinterdriver2_level6(fstring servername, fstring architecture, free_printer_driver_info_6(&info); if (*needed > offered) - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -3872,7 +3904,7 @@ uint32 _spoolss_getprinterdriver2(pipes_struct *p, SPOOL_Q_GETPRINTERDRIVER2 *q_ unistr2_to_ascii(architecture, uni_arch, sizeof(architecture)-1); if (!get_printer_snum(p, handle, &snum)) - return ERROR_INVALID_HANDLE; + return ERRbadfid; switch (level) { case 1: @@ -3884,7 +3916,7 @@ uint32 _spoolss_getprinterdriver2(pipes_struct *p, SPOOL_Q_GETPRINTERDRIVER2 *q_ case 6: return getprinterdriver2_level6(servername, architecture, clientmajorversion, snum, buffer, offered, needed); default: - return ERROR_INVALID_LEVEL; + return ERRunknownlevel; } } @@ -3903,7 +3935,7 @@ uint32 _spoolss_startpageprinter(pipes_struct *p, SPOOL_Q_STARTPAGEPRINTER *q_u, } DEBUG(3,("Error in startpageprinter printer handle\n")); - return ERROR_INVALID_HANDLE; + return ERRbadfid; } /**************************************************************************** @@ -3917,12 +3949,12 @@ uint32 _spoolss_endpageprinter(pipes_struct *p, SPOOL_Q_ENDPAGEPRINTER *q_u, SPO if (!Printer) { DEBUG(0,("_spoolss_endpageprinter: Invalid handle (%s).\n",OUR_HANDLE(handle))); - return ERROR_INVALID_HANDLE; + return ERRbadfid; } Printer->page_started=False; - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /******************************************************************** @@ -3947,7 +3979,7 @@ uint32 _spoolss_startdocprinter(pipes_struct *p, SPOOL_Q_STARTDOCPRINTER *q_u, S if (!Printer) { DEBUG(0,("_spoolss_startdocprinter: Invalid handle (%s)\n", OUR_HANDLE(handle))); - return ERROR_INVALID_HANDLE; + return ERRbadfid; } get_current_user(&user, p); @@ -3968,13 +4000,13 @@ uint32 _spoolss_startdocprinter(pipes_struct *p, SPOOL_Q_STARTDOCPRINTER *q_u, S unistr2_to_ascii(datatype, &info_1->datatype, sizeof(datatype)); if (strcmp(datatype, "RAW") != 0) { (*jobid)=0; - return ERROR_INVALID_DATATYPE; + return ERRinvaliddatatype; } } /* get the share number of the printer */ if (!get_printer_snum(p, handle, &snum)) { - return ERROR_INVALID_HANDLE; + return ERRbadfid; } unistr2_to_ascii(jobname, &info_1->docname, sizeof(jobname)); @@ -4022,7 +4054,7 @@ uint32 _spoolss_writeprinter(pipes_struct *p, SPOOL_Q_WRITEPRINTER *q_u, SPOOL_R if (!Printer) { DEBUG(0,("_spoolss_writeprinter: Invalid handle (%s)\n",OUR_HANDLE(handle))); r_u->buffer_written = q_u->buffer_size2; - return ERROR_INVALID_HANDLE; + return ERRbadfid; } (*buffer_written) = print_job_write(Printer->jobid, (char *)buffer, buffer_size); @@ -4042,18 +4074,18 @@ static uint32 control_printer(POLICY_HND *handle, uint32 command, pipes_struct *p) { struct current_user user; - int snum, errcode = ERROR_INVALID_FUNCTION; + int snum, errcode = ERRbadfunc; Printer_entry *Printer = find_printer_index_by_hnd(p, handle); get_current_user(&user, p); if (!Printer) { DEBUG(0,("control_printer: Invalid handle (%s)\n", OUR_HANDLE(handle))); - return ERROR_INVALID_HANDLE; + return ERRbadfid; } if (!get_printer_snum(p, handle, &snum)) - return ERROR_INVALID_HANDLE; + return ERRbadfid; switch (command) { case PRINTER_CONTROL_PAUSE: @@ -4073,7 +4105,7 @@ static uint32 control_printer(POLICY_HND *handle, uint32 command, } break; default: - return ERROR_INVALID_LEVEL; + return ERRunknownlevel; } return errcode; @@ -4109,7 +4141,7 @@ static uint32 update_printer_sec(POLICY_HND *handle, uint32 level, DEBUG(0,("update_printer_sec: Invalid handle (%s)\n", OUR_HANDLE(handle))); - result = ERROR_INVALID_HANDLE; + result = ERRbadfid; goto done; } @@ -4159,7 +4191,7 @@ static uint32 update_printer_sec(POLICY_HND *handle, uint32 level, new_secdesc_ctr = sec_desc_merge(p->mem_ctx, secdesc_ctr, old_secdesc_ctr); if (sec_desc_equal(new_secdesc_ctr->sec, old_secdesc_ctr->sec)) { - result = NT_STATUS_NO_PROBLEMO; + result = ERRsuccess; goto done; } @@ -4173,7 +4205,7 @@ static uint32 update_printer_sec(POLICY_HND *handle, uint32 level, information. */ if (!print_access_check(&user, snum, PRINTER_ACCESS_ADMINISTER)) { - result = ERROR_ACCESS_DENIED; + result = ERRnoaccess; goto done; } @@ -4519,28 +4551,28 @@ static uint32 update_printer(pipes_struct *p, POLICY_HND *handle, uint32 level, DEBUG(8,("update_printer\n")); - result = NT_STATUS_NO_PROBLEMO; + result = ERRsuccess; if (level!=2) { DEBUG(0,("Send a mail to samba@samba.org\n")); DEBUGADD(0,("with the following message: update_printer: level!=2\n")); - result = ERROR_INVALID_LEVEL; + result = ERRunknownlevel; goto done; } if (!Printer) { - result = ERROR_INVALID_HANDLE; + result = ERRbadfid; goto done; } if (!get_printer_snum(p, handle, &snum)) { - result = ERROR_INVALID_HANDLE; + result = ERRbadfid; goto done; } if((get_a_printer(&printer, 2, lp_servicename(snum)) != 0) || (get_a_printer(&old_printer, 2, lp_servicename(snum)) != 0)) { - result = ERROR_INVALID_HANDLE; + result = ERRbadfid; goto done; } @@ -4561,7 +4593,7 @@ static uint32 update_printer(pipes_struct *p, POLICY_HND *handle, uint32 level, DEBUGADD(8,("Converting the devicemode struct\n")); if (!convert_devicemode(printer->info_2->printername, devmode, &printer->info_2->devmode)) { - result = ERROR_NOT_ENOUGH_MEMORY; + result = ERRnomem; goto done; } } @@ -4569,7 +4601,7 @@ static uint32 update_printer(pipes_struct *p, POLICY_HND *handle, uint32 level, /* Do sanity check on the requested changes for Samba */ if (!check_printer_ok(printer->info_2, snum)) { - result = ERROR_INVALID_PARAMETER; + result = ERRinvalidparam; goto done; } @@ -4579,7 +4611,7 @@ static uint32 update_printer(pipes_struct *p, POLICY_HND *handle, uint32 level, if (nt_printer_info_level_equal(printer, old_printer)) { DEBUG(3, ("printer info has not changed\n")); - result = NT_STATUS_NO_PROBLEMO; + result = ERRsuccess; goto done; } @@ -4588,7 +4620,7 @@ static uint32 update_printer(pipes_struct *p, POLICY_HND *handle, uint32 level, if (!print_access_check(NULL, snum, PRINTER_ACCESS_ADMINISTER)) { DEBUG(3, ("printer property change denied by security " "descriptor\n")); - result = ERROR_ACCESS_DENIED; + result = ERRnoaccess; goto done; } @@ -4596,7 +4628,7 @@ static uint32 update_printer(pipes_struct *p, POLICY_HND *handle, uint32 level, if (*lp_addprinter_cmd() ) if ( !add_printer_hook(printer) ) { - result = ERROR_ACCESS_DENIED; + result = ERRnoaccess; goto done; } @@ -4604,7 +4636,7 @@ static uint32 update_printer(pipes_struct *p, POLICY_HND *handle, uint32 level, if (add_a_printer(*printer, 2)!=0) { /* I don't really know what to return here !!! */ - result = ERROR_ACCESS_DENIED; + result = ERRnoaccess; goto done; } @@ -4633,7 +4665,7 @@ uint32 _spoolss_setprinter(pipes_struct *p, SPOOL_Q_SETPRINTER *q_u, SPOOL_R_SET if (!Printer) { DEBUG(0,("_spoolss_setprinter: Invalid handle (%s)\n", OUR_HANDLE(handle))); - return ERROR_INVALID_HANDLE; + return ERRbadfid; } /* check the level */ @@ -4646,7 +4678,7 @@ uint32 _spoolss_setprinter(pipes_struct *p, SPOOL_Q_SETPRINTER *q_u, SPOOL_R_SET return update_printer_sec(handle, level, info, p, secdesc_ctr); default: - return ERROR_INVALID_LEVEL; + return ERRunknownlevel; } } @@ -4661,7 +4693,7 @@ uint32 _spoolss_fcpn(pipes_struct *p, SPOOL_Q_FCPN *q_u, SPOOL_R_FCPN *r_u) if (!Printer) { DEBUG(0,("_spoolss_fcpn: Invalid handle (%s)\n", OUR_HANDLE(handle))); - return ERROR_INVALID_HANDLE; + return ERRbadfid; } if (Printer->notify.client_connected==True) @@ -4675,7 +4707,7 @@ uint32 _spoolss_fcpn(pipes_struct *p, SPOOL_Q_FCPN *q_u, SPOOL_R_FCPN *r_u) free_spool_notify_option(&Printer->notify.option); Printer->notify.client_connected=False; - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -4687,7 +4719,7 @@ uint32 _spoolss_addjob(pipes_struct *p, SPOOL_Q_ADDJOB *q_u, SPOOL_R_ADDJOB *r_u spoolss_move_buffer(q_u->buffer, &r_u->buffer); r_u->needed = 0; - return ERROR_INVALID_PARAMETER; /* this is what a NT server + return ERRinvalidparam; /* this is what a NT server returns for AddJob. AddJob must fail on non-local printers */ @@ -4784,7 +4816,7 @@ static uint32 enumjobs_level1(print_queue_struct *queue, int snum, if (info==NULL) { safe_free(queue); *returned=0; - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; } for (i=0; i<*returned; i++) @@ -4798,7 +4830,7 @@ static uint32 enumjobs_level1(print_queue_struct *queue, int snum, if (!alloc_buffer_size(buffer, *needed)) { safe_free(info); - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } /* fill the buffer with the structures */ @@ -4810,10 +4842,10 @@ static uint32 enumjobs_level1(print_queue_struct *queue, int snum, if (*needed > offered) { *returned=0; - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -4830,12 +4862,12 @@ static uint32 enumjobs_level2(print_queue_struct *queue, int snum, info=(JOB_INFO_2 *)malloc(*returned*sizeof(JOB_INFO_2)); if (info==NULL) { *returned=0; - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; } if (get_a_printer(&ntprinter, 2, lp_servicename(snum)) !=0) { *returned = 0; - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; } for (i=0; i<*returned; i++) @@ -4850,7 +4882,7 @@ static uint32 enumjobs_level2(print_queue_struct *queue, int snum, if (!alloc_buffer_size(buffer, *needed)) { safe_free(info); - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } /* fill the buffer with the structures */ @@ -4865,10 +4897,10 @@ static uint32 enumjobs_level2(print_queue_struct *queue, int snum, if (*needed > offered) { *returned=0; - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -4902,14 +4934,14 @@ uint32 _spoolss_enumjobs( pipes_struct *p, SPOOL_Q_ENUMJOBS *q_u, SPOOL_R_ENUMJO *returned=0; if (!get_printer_snum(p, handle, &snum)) - return ERROR_INVALID_HANDLE; + return ERRbadfid; *returned = print_queue_status(snum, &queue, &prt_status); DEBUGADD(4,("count:[%d], status:[%d], [%s]\n", *returned, prt_status.status, prt_status.message)); if (*returned == 0) { safe_free(queue); - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } switch (level) { @@ -4920,7 +4952,7 @@ uint32 _spoolss_enumjobs( pipes_struct *p, SPOOL_Q_ENUMJOBS *q_u, SPOOL_R_ENUMJO default: safe_free(queue); *returned=0; - return ERROR_INVALID_LEVEL; + return ERRunknownlevel; } } @@ -4945,16 +4977,16 @@ uint32 _spoolss_setjob(pipes_struct *p, SPOOL_Q_SETJOB *q_u, SPOOL_R_SETJOB *r_u struct current_user user; print_status_struct prt_status; - int snum, errcode = ERROR_INVALID_FUNCTION; + int snum, errcode = ERRbadfunc; memset(&prt_status, 0, sizeof(prt_status)); if (!get_printer_snum(p, handle, &snum)) { - return ERROR_INVALID_HANDLE; + return ERRbadfid; } if (!print_job_exists(jobid)) { - return ERROR_INVALID_PRINTER_NAME; + return ERRinvalidprintername; } get_current_user(&user, p); @@ -4978,7 +5010,7 @@ uint32 _spoolss_setjob(pipes_struct *p, SPOOL_Q_SETJOB *q_u, SPOOL_R_SETJOB *r_u } break; default: - return ERROR_INVALID_LEVEL; + return ERRunknownlevel; } return errcode; @@ -4995,7 +5027,7 @@ static uint32 enumprinterdrivers_level1(fstring servername, fstring architecture fstring *list = NULL; NT_PRINTER_DRIVER_INFO_LEVEL driver; - DRIVER_INFO_1 *driver_info_1=NULL; + DRIVER_INFO_1 *tdi1, *driver_info_1=NULL; *returned=0; @@ -5007,13 +5039,16 @@ static uint32 enumprinterdrivers_level1(fstring servername, fstring architecture DEBUGADD(4,("we have:[%d] drivers in environment [%s] and version [%d]\n", ndrivers, architecture, version)); if(ndrivers == -1) - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; if(ndrivers != 0) { - if((driver_info_1=(DRIVER_INFO_1 *)Realloc(driver_info_1, (*returned+ndrivers) * sizeof(DRIVER_INFO_1))) == NULL) { + if((tdi1=(DRIVER_INFO_1 *)Realloc(driver_info_1, (*returned+ndrivers) * sizeof(DRIVER_INFO_1))) == NULL) { + DEBUG(0,("enumprinterdrivers_level1: failed to enlarge driver info buffer!\n")); + safe_free(driver_info_1); safe_free(list); - return ERROR_NOT_ENOUGH_MEMORY; - } + return ERRnomem; + } else + driver_info_1 = tdi1; } for (i=0; i<ndrivers; i++) { @@ -5040,7 +5075,7 @@ static uint32 enumprinterdrivers_level1(fstring servername, fstring architecture if (!alloc_buffer_size(buffer, *needed)) { safe_free(driver_info_1); - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } /* fill the buffer with the driver structures */ @@ -5053,10 +5088,10 @@ static uint32 enumprinterdrivers_level1(fstring servername, fstring architecture if (*needed > offered) { *returned=0; - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -5070,7 +5105,7 @@ static uint32 enumprinterdrivers_level2(fstring servername, fstring architecture fstring *list = NULL; NT_PRINTER_DRIVER_INFO_LEVEL driver; - DRIVER_INFO_2 *driver_info_2=NULL; + DRIVER_INFO_2 *tdi2, *driver_info_2=NULL; *returned=0; @@ -5082,13 +5117,16 @@ static uint32 enumprinterdrivers_level2(fstring servername, fstring architecture DEBUGADD(4,("we have:[%d] drivers in environment [%s] and version [%d]\n", ndrivers, architecture, version)); if(ndrivers == -1) - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; if(ndrivers != 0) { - if((driver_info_2=(DRIVER_INFO_2 *)Realloc(driver_info_2, (*returned+ndrivers) * sizeof(DRIVER_INFO_2))) == NULL) { + if((tdi2=(DRIVER_INFO_2 *)Realloc(driver_info_2, (*returned+ndrivers) * sizeof(DRIVER_INFO_2))) == NULL) { + DEBUG(0,("enumprinterdrivers_level2: failed to enlarge driver info buffer!\n")); + safe_free(driver_info_2); safe_free(list); - return ERROR_NOT_ENOUGH_MEMORY; - } + return ERRnomem; + } else + driver_info_2 = tdi2; } for (i=0; i<ndrivers; i++) { @@ -5116,7 +5154,7 @@ static uint32 enumprinterdrivers_level2(fstring servername, fstring architecture if (!alloc_buffer_size(buffer, *needed)) { safe_free(driver_info_2); - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } /* fill the buffer with the form structures */ @@ -5129,10 +5167,10 @@ static uint32 enumprinterdrivers_level2(fstring servername, fstring architecture if (*needed > offered) { *returned=0; - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -5146,7 +5184,7 @@ static uint32 enumprinterdrivers_level3(fstring servername, fstring architecture fstring *list = NULL; NT_PRINTER_DRIVER_INFO_LEVEL driver; - DRIVER_INFO_3 *driver_info_3=NULL; + DRIVER_INFO_3 *tdi3, *driver_info_3=NULL; *returned=0; @@ -5158,13 +5196,16 @@ static uint32 enumprinterdrivers_level3(fstring servername, fstring architecture DEBUGADD(4,("we have:[%d] drivers in environment [%s] and version [%d]\n", ndrivers, architecture, version)); if(ndrivers == -1) - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; if(ndrivers != 0) { - if((driver_info_3=(DRIVER_INFO_3 *)Realloc(driver_info_3, (*returned+ndrivers) * sizeof(DRIVER_INFO_3))) == NULL) { + if((tdi3=(DRIVER_INFO_3 *)Realloc(driver_info_3, (*returned+ndrivers) * sizeof(DRIVER_INFO_3))) == NULL) { + DEBUG(0,("enumprinterdrivers_level3: failed to enlarge driver info buffer!\n")); + safe_free(driver_info_3); safe_free(list); - return ERROR_NOT_ENOUGH_MEMORY; - } + return ERRnomem; + } else + driver_info_3 = tdi3; } for (i=0; i<ndrivers; i++) { @@ -5192,7 +5233,7 @@ static uint32 enumprinterdrivers_level3(fstring servername, fstring architecture if (!alloc_buffer_size(buffer, *needed)) { safe_free(driver_info_3); - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } /* fill the buffer with the driver structures */ @@ -5208,10 +5249,10 @@ static uint32 enumprinterdrivers_level3(fstring servername, fstring architecture if (*needed > offered) { *returned=0; - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -5253,7 +5294,7 @@ uint32 _spoolss_enumprinterdrivers( pipes_struct *p, SPOOL_Q_ENUMPRINTERDRIVERS default: *returned=0; safe_free(list); - return ERROR_INVALID_LEVEL; + return ERRunknownlevel; } } @@ -5305,13 +5346,13 @@ uint32 _spoolss_enumforms(pipes_struct *p, SPOOL_Q_ENUMFORMS *q_u, SPOOL_R_ENUMF DEBUGADD(5,("Number of user forms [%d]\n", *numofforms)); *numofforms += numbuiltinforms; - if (*numofforms == 0) return ERROR_NO_MORE_ITEMS; + if (*numofforms == 0) return ERRnomoreitems; switch (level) { case 1: if ((forms_1=(FORM_1 *)malloc(*numofforms * sizeof(FORM_1))) == NULL) { *numofforms=0; - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; } /* construct the list of form structures */ @@ -5343,7 +5384,7 @@ uint32 _spoolss_enumforms(pipes_struct *p, SPOOL_Q_ENUMFORMS *q_u, SPOOL_R_ENUMF if (!alloc_buffer_size(buffer, buffer_size)){ safe_free(forms_1); - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } /* fill the buffer with the form structures */ @@ -5360,15 +5401,15 @@ uint32 _spoolss_enumforms(pipes_struct *p, SPOOL_Q_ENUMFORMS *q_u, SPOOL_R_ENUMF if (*needed > offered) { *numofforms=0; - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; default: safe_free(list); safe_free(builtinlist); - return ERROR_INVALID_LEVEL; + return ERRunknownlevel; } } @@ -5409,7 +5450,7 @@ uint32 _spoolss_getform(pipes_struct *p, SPOOL_Q_GETFORM *q_u, SPOOL_R_GETFORM * DEBUGADD(5,("Number of forms [%d]\n", numofforms)); if (numofforms == 0) - return ERROR_INVALID_HANDLE; + return ERRbadfid; } switch (level) { @@ -5432,7 +5473,7 @@ uint32 _spoolss_getform(pipes_struct *p, SPOOL_Q_GETFORM *q_u, SPOOL_R_GETFORM * safe_free(list); if (i == numofforms) { - return ERROR_INVALID_HANDLE; + return ERRbadfid; } } /* check the required size. */ @@ -5440,22 +5481,22 @@ uint32 _spoolss_getform(pipes_struct *p, SPOOL_Q_GETFORM *q_u, SPOOL_R_GETFORM * *needed=spoolss_size_form_1(&form_1); if (!alloc_buffer_size(buffer, buffer_size)){ - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } if (*needed > offered) { - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } /* fill the buffer with the form structures */ DEBUGADD(6,("adding form %s [%d] to buffer\n", form_name, i)); smb_io_form_1("", buffer, &form_1, 0); - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; default: safe_free(list); - return ERROR_INVALID_LEVEL; + return ERRunknownlevel; } } @@ -5503,7 +5544,7 @@ static uint32 enumports_level_1(NEW_BUFFER *buffer, uint32 offered, uint32 *need if (fd != -1) close(fd); /* Is this the best error to return here? */ - return ERROR_ACCESS_DENIED; + return ERRnoaccess; } numlines = 0; @@ -5513,9 +5554,9 @@ static uint32 enumports_level_1(NEW_BUFFER *buffer, uint32 offered, uint32 *need if(numlines) { if((ports=(PORT_INFO_1 *)malloc( numlines * sizeof(PORT_INFO_1) )) == NULL) { - DEBUG(10,("Returning ERROR_NOT_ENOUGH_MEMORY [%x]\n", ERROR_NOT_ENOUGH_MEMORY)); + DEBUG(10,("Returning ERRnomem [%x]\n", ERRnomem)); file_lines_free(qlines); - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; } for (i=0; i<numlines; i++) { @@ -5532,7 +5573,7 @@ static uint32 enumports_level_1(NEW_BUFFER *buffer, uint32 offered, uint32 *need *returned = 1; /* Sole Samba port returned. */ if((ports=(PORT_INFO_1 *)malloc( sizeof(PORT_INFO_1) )) == NULL) - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; DEBUG(10,("enumports_level_1: port name %s\n", SAMBA_PRINTER_PORT_NAME)); @@ -5547,7 +5588,7 @@ static uint32 enumports_level_1(NEW_BUFFER *buffer, uint32 offered, uint32 *need if (!alloc_buffer_size(buffer, *needed)) { safe_free(ports); - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } /* fill the buffer with the ports structures */ @@ -5560,10 +5601,10 @@ static uint32 enumports_level_1(NEW_BUFFER *buffer, uint32 offered, uint32 *need if (*needed > offered) { *returned=0; - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -5601,7 +5642,7 @@ static uint32 enumports_level_2(NEW_BUFFER *buffer, uint32 offered, uint32 *need if (fd != -1) close(fd); /* Is this the best error to return here? */ - return ERROR_ACCESS_DENIED; + return ERRnoaccess; } numlines = 0; @@ -5611,9 +5652,9 @@ static uint32 enumports_level_2(NEW_BUFFER *buffer, uint32 offered, uint32 *need if(numlines) { if((ports=(PORT_INFO_2 *)malloc( numlines * sizeof(PORT_INFO_2) )) == NULL) { - DEBUG(10,("Returning ERROR_NOT_ENOUGH_MEMORY [%x]\n", ERROR_NOT_ENOUGH_MEMORY)); + DEBUG(10,("Returning ERRnomem [%x]\n", ERRnomem)); file_lines_free(qlines); - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; } for (i=0; i<numlines; i++) { @@ -5631,7 +5672,7 @@ static uint32 enumports_level_2(NEW_BUFFER *buffer, uint32 offered, uint32 *need *returned = 1; if((ports=(PORT_INFO_2 *)malloc( sizeof(PORT_INFO_2) )) == NULL) - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; DEBUG(10,("enumports_level_2: port name %s\n", SAMBA_PRINTER_PORT_NAME)); @@ -5646,7 +5687,7 @@ static uint32 enumports_level_2(NEW_BUFFER *buffer, uint32 offered, uint32 *need if (!alloc_buffer_size(buffer, *needed)) { safe_free(ports); - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } /* fill the buffer with the ports structures */ @@ -5659,10 +5700,10 @@ static uint32 enumports_level_2(NEW_BUFFER *buffer, uint32 offered, uint32 *need if (*needed > offered) { *returned=0; - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -5693,7 +5734,7 @@ uint32 _spoolss_enumports( pipes_struct *p, SPOOL_Q_ENUMPORTS *q_u, SPOOL_R_ENUM case 2: return enumports_level_2(buffer, offered, needed, returned); default: - return ERROR_INVALID_LEVEL; + return ERRunknownlevel; } } @@ -5711,7 +5752,7 @@ static uint32 spoolss_addprinterex_level_2( pipes_struct *p, const UNISTR2 *uni_ if ((printer = (NT_PRINTER_INFO_LEVEL *)malloc(sizeof(NT_PRINTER_INFO_LEVEL))) == NULL) { DEBUG(0,("spoolss_addprinterex_level_2: malloc fail.\n")); - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; } ZERO_STRUCTP(printer); @@ -5722,7 +5763,7 @@ static uint32 spoolss_addprinterex_level_2( pipes_struct *p, const UNISTR2 *uni_ if (*lp_addprinter_cmd() ) if ( !add_printer_hook(printer) ) { free_a_printer(&printer,2); - return ERROR_ACCESS_DENIED; + return ERRnoaccess; } slprintf(name, sizeof(name)-1, "\\\\%s\\%s", global_myname, @@ -5730,13 +5771,13 @@ static uint32 spoolss_addprinterex_level_2( pipes_struct *p, const UNISTR2 *uni_ if ((snum = print_queue_snum(printer->info_2->sharename)) == -1) { free_a_printer(&printer,2); - return ERROR_ACCESS_DENIED; + return ERRnoaccess; } /* you must be a printer admin to add a new printer */ if (!print_access_check(NULL, snum, PRINTER_ACCESS_ADMINISTER)) { free_a_printer(&printer,2); - return ERROR_ACCESS_DENIED; + return ERRnoaccess; } /* @@ -5745,27 +5786,34 @@ static uint32 spoolss_addprinterex_level_2( pipes_struct *p, const UNISTR2 *uni_ if (!check_printer_ok(printer->info_2, snum)) { free_a_printer(&printer,2); - return ERROR_INVALID_PARAMETER; + return ERRinvalidparam; } + /* + * When a printer is created, the drivername bound to the printer is used + * to lookup previously saved driver initialization info, which is then + * bound to the new printer, simulating what happens in the Windows arch. + */ + set_driver_init(printer, 2); + /* write the ASCII on disk */ if (add_a_printer(*printer, 2) != 0) { free_a_printer(&printer,2); - return ERROR_ACCESS_DENIED; + return ERRnoaccess; } if (!open_printer_hnd(p, handle, name)) { /* Handle open failed - remove addition. */ del_a_printer(printer->info_2->sharename); free_a_printer(&printer,2); - return ERROR_ACCESS_DENIED; + return ERRnoaccess; } free_a_printer(&printer,2); srv_spoolss_sendnotify(p, handle); - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -5788,13 +5836,13 @@ uint32 _spoolss_addprinterex( pipes_struct *p, SPOOL_Q_ADDPRINTEREX *q_u, SPOOL_ case 1: /* we don't handle yet */ /* but I know what to do ... */ - return ERROR_INVALID_LEVEL; + return ERRunknownlevel; case 2: return spoolss_addprinterex_level_2(p, uni_srv_name, info, unk0, unk1, unk2, unk3, user_switch, user, handle); default: - return ERROR_INVALID_LEVEL; + return ERRunknownlevel; } } @@ -5807,7 +5855,7 @@ uint32 _spoolss_addprinterdriver(pipes_struct *p, SPOOL_Q_ADDPRINTERDRIVER *q_u, uint32 level = q_u->level; SPOOL_PRINTER_DRIVER_INFO_LEVEL *info = &q_u->info; - uint32 err = NT_STATUS_NO_PROBLEMO; + uint32 err = ERRsuccess; NT_PRINTER_DRIVER_INFO_LEVEL driver; struct current_user user; @@ -5818,18 +5866,18 @@ uint32 _spoolss_addprinterdriver(pipes_struct *p, SPOOL_Q_ADDPRINTERDRIVER *q_u, convert_printer_driver_info(info, &driver, level); DEBUG(5,("Cleaning driver's information\n")); - if ((err = clean_up_driver_struct(driver, level, &user)) != NT_STATUS_NO_PROBLEMO ) + if ((err = clean_up_driver_struct(driver, level, &user)) != ERRsuccess ) goto done; DEBUG(5,("Moving driver to final destination\n")); if(!move_driver_to_download_area(driver, level, &user, &err)) { if (err == 0) - err = ERROR_ACCESS_DENIED; + err = ERRnoaccess; goto done; } if (add_a_printer_driver(driver, level)!=0) { - err = ERROR_ACCESS_DENIED; + err = ERRnoaccess; goto done; } @@ -5856,11 +5904,11 @@ static uint32 getprinterdriverdir_level_1(UNISTR2 *name, UNISTR2 *uni_environmen unistr2_to_ascii(long_archi, uni_environment, sizeof(long_archi)-1); - if (get_short_archi(short_archi, long_archi)==FALSE) - return ERROR_INVALID_ENVIRONMENT; + if (get_short_archi(short_archi, long_archi)==False) + return ERRinvalidenvironment; if((info=(DRIVER_DIRECTORY_1 *)malloc(sizeof(DRIVER_DIRECTORY_1))) == NULL) - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; slprintf(path, sizeof(path)-1, "\\\\%s\\print$\\%s", global_myname, short_archi); @@ -5872,7 +5920,7 @@ static uint32 getprinterdriverdir_level_1(UNISTR2 *name, UNISTR2 *uni_environmen if (!alloc_buffer_size(buffer, *needed)) { safe_free(info); - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } smb_io_driverdir_1("", buffer, info, 0); @@ -5880,9 +5928,9 @@ static uint32 getprinterdriverdir_level_1(UNISTR2 *name, UNISTR2 *uni_environmen safe_free(info); if (*needed > offered) - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -5909,7 +5957,7 @@ uint32 _spoolss_getprinterdriverdirectory(pipes_struct *p, SPOOL_Q_GETPRINTERDRI case 1: return getprinterdriverdir_level_1(name, uni_environment, buffer, offered, needed); default: - return ERROR_INVALID_LEVEL; + return ERRunknownlevel; } } @@ -5959,14 +6007,14 @@ uint32 _spoolss_enumprinterdata(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATA *q_u, S if (!Printer) { DEBUG(0,("_spoolss_enumprinterdata: Invalid handle (%s).\n", OUR_HANDLE(handle))); - return ERROR_INVALID_HANDLE; + return ERRbadfid; } if (!get_printer_snum(p,handle, &snum)) - return ERROR_INVALID_HANDLE; + return ERRbadfid; if (get_a_printer(&printer, 2, lp_servicename(snum)) != 0) - return ERROR_INVALID_HANDLE; + return ERRbadfid; /* * The NT machine wants to know the biggest size of value and data @@ -5989,7 +6037,7 @@ uint32 _spoolss_enumprinterdata(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATA *q_u, S if (!get_specific_param_by_index(*printer, 2, idx, value, &data, &type, &data_len)) { safe_free(data); free_a_printer(&printer, 2); - return ERROR_NO_MORE_ITEMS; + return ERRnomoreitems; } #endif @@ -6020,7 +6068,7 @@ uint32 _spoolss_enumprinterdata(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATA *q_u, S if (param_index == 0) { /* No parameters found. */ free_a_printer(&printer, 2); - return ERROR_NO_MORE_ITEMS; + return ERRnomoreitems; } /* the value is an UNICODE string but realvaluesize is the length in bytes including the leading 0 */ @@ -6030,7 +6078,7 @@ uint32 _spoolss_enumprinterdata(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATA *q_u, S DEBUG(6,("final values: [%d], [%d]\n", *out_value_len, *out_data_len)); free_a_printer(&printer, 2); - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /* @@ -6041,7 +6089,7 @@ uint32 _spoolss_enumprinterdata(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATA *q_u, S if (!get_specific_param_by_index(*printer, 2, idx, value, &data, &type, &data_len)) { safe_free(data); free_a_printer(&printer, 2); - return ERROR_NO_MORE_ITEMS; + return ERRnomoreitems; } free_a_printer(&printer, 2); @@ -6058,7 +6106,7 @@ uint32 _spoolss_enumprinterdata(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATA *q_u, S *out_max_value_len=(in_value_len/sizeof(uint16)); if((*out_value=(uint16 *)talloc_zero(p->mem_ctx,in_value_len*sizeof(uint8))) == NULL) { safe_free(data); - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; } *out_value_len = (uint32)dos_PutUniCode((char *)*out_value, value, in_value_len, True); @@ -6069,7 +6117,7 @@ uint32 _spoolss_enumprinterdata(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATA *q_u, S *out_max_data_len=in_data_len; if((*data_out=(uint8 *)talloc_zero(p->mem_ctx, in_data_len*sizeof(uint8))) == NULL) { safe_free(data); - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; } memcpy(*data_out, data, (size_t)data_len); @@ -6077,7 +6125,7 @@ uint32 _spoolss_enumprinterdata(pipes_struct *p, SPOOL_Q_ENUMPRINTERDATA *q_u, S safe_free(data); - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -6103,22 +6151,41 @@ uint32 _spoolss_setprinterdata( pipes_struct *p, SPOOL_Q_SETPRINTERDATA *q_u, SP if (!Printer) { DEBUG(0,("_spoolss_setprinterdata: Invalid handle (%s).\n", OUR_HANDLE(handle))); - return ERROR_INVALID_HANDLE; + return ERRbadfid; } if (!get_printer_snum(p,handle, &snum)) - return ERROR_INVALID_HANDLE; + return ERRbadfid; + + ZERO_STRUCT(old_param); + + /* + * Access check : NT returns "access denied" if you make a + * SetPrinterData call without the necessary privildge. + * we were originally returning OK if nothing changed + * which made Win2k issue **a lot** of SetPrinterData + * when connecting to a printer --jerry + */ + + if (!print_access_check(NULL, snum, PRINTER_ACCESS_ADMINISTER)) { + DEBUG(3, ("security descriptor change denied by existing " + "security descriptor\n")); + status = ERRnoaccess; + goto done; + } + + + /* Check if we are making any changes or not. Return true if + nothing is actually changing. This is not needed anymore but + has been left in as an optimization to keep from from + writing to disk as often --jerry */ status = get_a_printer(&printer, 2, lp_servicename(snum)); if (status != 0x0) - return ERROR_INVALID_NAME; + return ERRinvalidname; convert_specific_param(¶m, value , type, data, real_len); - /* Check if we are making any changes or not. Return true if - nothing is actually changing. */ - - ZERO_STRUCT(old_param); if (get_specific_param(*printer, 2, param->value, &old_param.data, &old_param.type, (uint32 *)&old_param.data_len)) { @@ -6129,24 +6196,28 @@ uint32 _spoolss_setprinterdata( pipes_struct *p, SPOOL_Q_SETPRINTERDATA *q_u, SP old_param.data_len) == 0) { DEBUG(3, ("setprinterdata hasn't changed\n")); - status = NT_STATUS_NO_PROBLEMO; + status = ERRsuccess; goto done; } } - /* Access check */ - - if (!print_access_check(NULL, snum, PRINTER_ACCESS_ADMINISTER)) { - DEBUG(3, ("security descriptor change denied by existing " - "security descriptor\n")); - status = ERROR_ACCESS_DENIED; - goto done; - } - unlink_specific_param_if_exist(printer->info_2, param); - add_a_specific_param(printer->info_2, ¶m); - status = mod_a_printer(*printer, 2); + /* + * When client side code sets a magic printer data key, detect it and save + * the current printer data and the magic key's data (its the DEVMODE) for + * future printer/driver initializations. + */ + if (param->type==3 && !strcmp( param->value, PHANTOM_DEVMODE_KEY)) { + /* + * Set devmode and printer initialization info + */ + status = save_driver_init(printer, 2, param); + } + else { + add_a_specific_param(printer->info_2, ¶m); + status = mod_a_printer(*printer, 2); + } done: free_a_printer(&printer, 2); @@ -6175,27 +6246,27 @@ uint32 _spoolss_deleteprinterdata(pipes_struct *p, SPOOL_Q_DELETEPRINTERDATA *q_ if (!Printer) { DEBUG(0,("_spoolss_deleteprinterdata: Invalid handle (%s).\n", OUR_HANDLE(handle))); - return ERROR_INVALID_HANDLE; + return ERRbadfid; } if (!get_printer_snum(p, handle, &snum)) - return ERROR_INVALID_HANDLE; + return ERRbadfid; if (!print_access_check(NULL, snum, PRINTER_ACCESS_ADMINISTER)) { DEBUG(3, ("_spoolss_deleteprinterdata: printer properties " "change denied by existing security descriptor\n")); - return ERROR_ACCESS_DENIED; + return ERRnoaccess; } status = get_a_printer(&printer, 2, lp_servicename(snum)); if (status != 0x0) - return ERROR_INVALID_NAME; + return ERRinvalidname; ZERO_STRUCTP(¶m); unistr2_to_ascii(param.value, value, sizeof(param.value)-1); if(!unlink_specific_param_if_exist(printer->info_2, ¶m)) - status = ERROR_INVALID_PARAMETER; + status = ERRinvalidparam; else status = mod_a_printer(*printer, 2); @@ -6221,17 +6292,17 @@ uint32 _spoolss_addform( pipes_struct *p, SPOOL_Q_ADDFORM *q_u, SPOOL_R_ADDFORM if (!Printer) { DEBUG(0,("_spoolss_addform: Invalid handle (%s).\n", OUR_HANDLE(handle))); - return ERROR_INVALID_HANDLE; + return ERRbadfid; } /* can't add if builtin */ if (get_a_builtin_ntform(&form->name,&tmpForm)) { - return ERROR_INVALID_PARAMETER; + return ERRinvalidparam; } count=get_ntforms(&list); if(!add_a_form(&list, form, &count)) - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; write_ntforms(&list, count); safe_free(list); @@ -6256,17 +6327,17 @@ uint32 _spoolss_deleteform( pipes_struct *p, SPOOL_Q_DELETEFORM *q_u, SPOOL_R_DE if (!Printer) { DEBUG(0,("_spoolss_deleteform: Invalid handle (%s).\n", OUR_HANDLE(handle))); - return ERROR_INVALID_HANDLE; + return ERRbadfid; } /* can't delete if builtin */ if (get_a_builtin_ntform(form_name,&tmpForm)) { - return ERROR_INVALID_PARAMETER; + return ERRinvalidparam; } count = get_ntforms(&list); if(!delete_a_form(&list, form_name, &count, &ret)) - return ERROR_INVALID_PARAMETER; + return ERRinvalidparam; safe_free(list); @@ -6292,11 +6363,11 @@ uint32 _spoolss_setform(pipes_struct *p, SPOOL_Q_SETFORM *q_u, SPOOL_R_SETFORM * if (!Printer) { DEBUG(0,("_spoolss_setform: Invalid handle (%s).\n", OUR_HANDLE(handle))); - return ERROR_INVALID_HANDLE; + return ERRbadfid; } /* can't set if builtin */ if (get_a_builtin_ntform(&form->name,&tmpForm)) { - return ERROR_INVALID_PARAMETER; + return ERRinvalidparam; } count=get_ntforms(&list); @@ -6316,7 +6387,7 @@ static uint32 enumprintprocessors_level_1(NEW_BUFFER *buffer, uint32 offered, ui PRINTPROCESSOR_1 *info_1=NULL; if((info_1 = (PRINTPROCESSOR_1 *)malloc(sizeof(PRINTPROCESSOR_1))) == NULL) - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; (*returned) = 0x1; @@ -6325,7 +6396,7 @@ static uint32 enumprintprocessors_level_1(NEW_BUFFER *buffer, uint32 offered, ui *needed += spoolss_size_printprocessor_info_1(info_1); if (!alloc_buffer_size(buffer, *needed)) - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; smb_io_printprocessor_info_1("", buffer, info_1, 0); @@ -6333,10 +6404,10 @@ static uint32 enumprintprocessors_level_1(NEW_BUFFER *buffer, uint32 offered, ui if (*needed > offered) { *returned=0; - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -6372,7 +6443,7 @@ uint32 _spoolss_enumprintprocessors(pipes_struct *p, SPOOL_Q_ENUMPRINTPROCESSORS case 1: return enumprintprocessors_level_1(buffer, offered, needed, returned); default: - return ERROR_INVALID_LEVEL; + return ERRunknownlevel; } } @@ -6384,7 +6455,7 @@ static uint32 enumprintprocdatatypes_level_1(NEW_BUFFER *buffer, uint32 offered, PRINTPROCDATATYPE_1 *info_1=NULL; if((info_1 = (PRINTPROCDATATYPE_1 *)malloc(sizeof(PRINTPROCDATATYPE_1))) == NULL) - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; (*returned) = 0x1; @@ -6393,7 +6464,7 @@ static uint32 enumprintprocdatatypes_level_1(NEW_BUFFER *buffer, uint32 offered, *needed += spoolss_size_printprocdatatype_info_1(info_1); if (!alloc_buffer_size(buffer, *needed)) - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; smb_io_printprocdatatype_info_1("", buffer, info_1, 0); @@ -6401,10 +6472,10 @@ static uint32 enumprintprocdatatypes_level_1(NEW_BUFFER *buffer, uint32 offered, if (*needed > offered) { *returned=0; - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -6433,7 +6504,7 @@ uint32 _spoolss_enumprintprocdatatypes(pipes_struct *p, SPOOL_Q_ENUMPRINTPROCDAT case 1: return enumprintprocdatatypes_level_1(buffer, offered, needed, returned); default: - return ERROR_INVALID_LEVEL; + return ERRunknownlevel; } } @@ -6446,7 +6517,7 @@ static uint32 enumprintmonitors_level_1(NEW_BUFFER *buffer, uint32 offered, uint PRINTMONITOR_1 *info_1=NULL; if((info_1 = (PRINTMONITOR_1 *)malloc(sizeof(PRINTMONITOR_1))) == NULL) - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; (*returned) = 0x1; @@ -6455,7 +6526,7 @@ static uint32 enumprintmonitors_level_1(NEW_BUFFER *buffer, uint32 offered, uint *needed += spoolss_size_printmonitor_info_1(info_1); if (!alloc_buffer_size(buffer, *needed)) - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; smb_io_printmonitor_info_1("", buffer, info_1, 0); @@ -6463,10 +6534,10 @@ static uint32 enumprintmonitors_level_1(NEW_BUFFER *buffer, uint32 offered, uint if (*needed > offered) { *returned=0; - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -6477,7 +6548,7 @@ static uint32 enumprintmonitors_level_2(NEW_BUFFER *buffer, uint32 offered, uint PRINTMONITOR_2 *info_2=NULL; if((info_2 = (PRINTMONITOR_2 *)malloc(sizeof(PRINTMONITOR_2))) == NULL) - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; (*returned) = 0x1; @@ -6488,7 +6559,7 @@ static uint32 enumprintmonitors_level_2(NEW_BUFFER *buffer, uint32 offered, uint *needed += spoolss_size_printmonitor_info_2(info_2); if (!alloc_buffer_size(buffer, *needed)) - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; smb_io_printmonitor_info_2("", buffer, info_2, 0); @@ -6496,10 +6567,10 @@ static uint32 enumprintmonitors_level_2(NEW_BUFFER *buffer, uint32 offered, uint if (*needed > offered) { *returned=0; - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -6536,7 +6607,7 @@ uint32 _spoolss_enumprintmonitors(pipes_struct *p, SPOOL_Q_ENUMPRINTMONITORS *q_ case 2: return enumprintmonitors_level_2(buffer, offered, needed, returned); default: - return ERROR_INVALID_LEVEL; + return ERRunknownlevel; } } @@ -6552,7 +6623,7 @@ static uint32 getjob_level_1(print_queue_struct *queue, int count, int snum, uin if (info_1 == NULL) { safe_free(queue); - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; } for (i=0; i<count && found==False; i++) { @@ -6563,8 +6634,8 @@ static uint32 getjob_level_1(print_queue_struct *queue, int count, int snum, uin if (found==False) { safe_free(queue); safe_free(info_1); - /* I shoud reply something else ... I can't find the good one */ - return NT_STATUS_NO_PROBLEMO; + /* NT treats not found as bad param... yet another bad choice */ + return ERRinvalidparam; } fill_job_info_1(info_1, &(queue[i-1]), i, snum); @@ -6575,7 +6646,7 @@ static uint32 getjob_level_1(print_queue_struct *queue, int count, int snum, uin if (!alloc_buffer_size(buffer, *needed)) { safe_free(info_1); - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } smb_io_job_info_1("", buffer, info_1, 0); @@ -6583,9 +6654,9 @@ static uint32 getjob_level_1(print_queue_struct *queue, int count, int snum, uin safe_free(info_1); if (*needed > offered) - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } @@ -6604,7 +6675,7 @@ static uint32 getjob_level_2(print_queue_struct *queue, int count, int snum, uin if (info_2 == NULL) { safe_free(queue); - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; } for (i=0; i<count && found==False; i++) { @@ -6615,13 +6686,13 @@ static uint32 getjob_level_2(print_queue_struct *queue, int count, int snum, uin if (found==False) { safe_free(queue); safe_free(info_2); - /* I shoud reply something else ... I can't find the good one */ - return NT_STATUS_NO_PROBLEMO; + /* NT treats not found as bad param... yet another bad choice */ + return ERRinvalidparam; } if (get_a_printer(&ntprinter, 2, lp_servicename(snum)) !=0) { safe_free(queue); - return ERROR_NOT_ENOUGH_MEMORY; + return ERRnomem; } fill_job_info_2(info_2, &(queue[i-1]), i, snum, ntprinter); @@ -6633,7 +6704,7 @@ static uint32 getjob_level_2(print_queue_struct *queue, int count, int snum, uin if (!alloc_buffer_size(buffer, *needed)) { safe_free(info_2); - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; } smb_io_job_info_2("", buffer, info_2, 0); @@ -6642,9 +6713,9 @@ static uint32 getjob_level_2(print_queue_struct *queue, int count, int snum, uin free(info_2); if (*needed > offered) - return ERROR_INSUFFICIENT_BUFFER; + return ERRinsufficientbuffer; else - return NT_STATUS_NO_PROBLEMO; + return ERRsuccess; } /**************************************************************************** @@ -6675,7 +6746,7 @@ uint32 _spoolss_getjob( pipes_struct *p, SPOOL_Q_GETJOB *q_u, SPOOL_R_GETJOB *r_ *needed=0; if (!get_printer_snum(p, handle, &snum)) - return ERROR_INVALID_HANDLE; + return ERRbadfid; count = print_queue_status(snum, &queue, &prt_status); @@ -6689,6 +6760,6 @@ uint32 _spoolss_getjob( pipes_struct *p, SPOOL_Q_GETJOB *q_u, SPOOL_R_GETJOB *r_ return getjob_level_2(queue, count, snum, jobid, buffer, offered, needed); default: safe_free(queue); - return ERROR_INVALID_LEVEL; + return ERRunknownlevel; } } diff --git a/source/rpc_server/srv_srvsvc_nt.c b/source/rpc_server/srv_srvsvc_nt.c index b487eb1c824..b50cdf3dc4d 100644 --- a/source/rpc_server/srv_srvsvc_nt.c +++ b/source/rpc_server/srv_srvsvc_nt.c @@ -33,7 +33,7 @@ extern pstring global_myname; Fill in a share info level 1 structure. ********************************************************************/ -static void init_srv_share_info_1(SRV_SHARE_INFO_1 *sh1, int snum) +static void init_srv_share_info_1(pipes_struct *p, SRV_SHARE_INFO_1 *sh1, int snum) { int len_net_name; pstring net_name; @@ -42,7 +42,7 @@ static void init_srv_share_info_1(SRV_SHARE_INFO_1 *sh1, int snum) pstrcpy(net_name, lp_servicename(snum)); pstrcpy(remark, lp_comment(snum)); - pstring_sub(remark,"%S",lp_servicename(snum)); + standard_sub_conn(p->conn, remark); len_net_name = strlen(net_name); /* work out the share type */ @@ -63,7 +63,7 @@ static void init_srv_share_info_1(SRV_SHARE_INFO_1 *sh1, int snum) Fill in a share info level 2 structure. ********************************************************************/ -static void init_srv_share_info_2(SRV_SHARE_INFO_2 *sh2, int snum) +static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2, int snum) { int len_net_name; pstring net_name; @@ -74,7 +74,7 @@ static void init_srv_share_info_2(SRV_SHARE_INFO_2 *sh2, int snum) pstrcpy(net_name, lp_servicename(snum)); pstrcpy(remark, lp_comment(snum)); - pstring_sub(remark,"%S",lp_servicename(snum)); + standard_sub_conn(p->conn, remark); pstrcpy(path, "C:"); pstrcat(path, lp_pathname(snum)); @@ -125,7 +125,7 @@ BOOL share_info_db_init(void) char *vstring = "INFO/version"; if (share_tdb && local_pid == sys_getpid()) return True; - share_tdb = tdb_open_log(lock_path("share_info.tdb"), 0, 0, O_RDWR|O_CREAT, 0600); + share_tdb = tdb_open_log(lock_path("share_info.tdb"), 0, TDB_DEFAULT, O_RDWR|O_CREAT, 0600); if (!share_tdb) { DEBUG(0,("Failed to open share info database %s (%s)\n", lock_path("share_info.tdb"), strerror(errno) )); @@ -226,7 +226,7 @@ static BOOL set_share_security(TALLOC_CTX *ctx, const char *share_name, SEC_DESC prs_init(&ps, (uint32)sec_desc_size(psd), mem_ctx, MARSHALL); - if (!sec_io_desc("nt_printing_setsec", &psd, &ps, 1)) { + if (!sec_io_desc("share_security", &psd, &ps, 1)) { goto out; } @@ -307,8 +307,7 @@ BOOL share_access_check(connection_struct *conn, int snum, uint16 vuid, uint32 d TALLOC_CTX *mem_ctx = NULL; SEC_DESC *psd = NULL; size_t sd_size; - struct current_user tmp_user; - struct current_user *puser = NULL; + NT_USER_TOKEN *token = NULL; user_struct *vuser = get_valid_user_struct(vuid); BOOL ret = True; @@ -321,26 +320,12 @@ BOOL share_access_check(connection_struct *conn, int snum, uint16 vuid, uint32 d if (!psd) goto out; - ZERO_STRUCT(tmp_user); - if (vuser) { - tmp_user.vuid = vuid; - tmp_user.uid = vuser->uid; - tmp_user.gid = vuser->gid; - tmp_user.ngroups = vuser->n_groups; - tmp_user.groups = vuser->groups; - tmp_user.nt_user_token = vuser->nt_user_token; - } else { - tmp_user.vuid = vuid; - tmp_user.uid = conn->uid; - tmp_user.gid = conn->gid; - tmp_user.ngroups = conn->ngroups; - tmp_user.groups = conn->groups; - tmp_user.nt_user_token = conn->nt_user_token; - } - - puser = &tmp_user; + if (vuser) + token = vuser->nt_user_token; + else + token = conn->nt_user_token; - ret = se_access_check(psd, puser, desired_access, &granted, &status); + ret = se_access_check(psd, token, desired_access, &granted, &status); out: @@ -353,7 +338,7 @@ BOOL share_access_check(connection_struct *conn, int snum, uint16 vuid, uint32 d Fill in a share info level 502 structure. ********************************************************************/ -static void init_srv_share_info_502(TALLOC_CTX *ctx, SRV_SHARE_INFO_502 *sh502, int snum) +static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, int snum) { int len_net_name; pstring net_name; @@ -363,12 +348,14 @@ static void init_srv_share_info_502(TALLOC_CTX *ctx, SRV_SHARE_INFO_502 *sh502, uint32 type; SEC_DESC *sd; size_t sd_size; + TALLOC_CTX *ctx = p->mem_ctx; + ZERO_STRUCTP(sh502); pstrcpy(net_name, lp_servicename(snum)); pstrcpy(remark, lp_comment(snum)); - pstring_sub(remark,"%S",lp_servicename(snum)); + standard_sub_conn(p->conn, remark); pstrcpy(path, "C:"); pstrcat(path, lp_pathname(snum)); @@ -429,12 +416,13 @@ static BOOL is_admin_share(int snum) Fill in a share info structure. ********************************************************************/ -static BOOL init_srv_share_info_ctr(TALLOC_CTX *ctx, SRV_SHARE_INFO_CTR *ctr, +static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, uint32 info_level, uint32 *resume_hnd, uint32 *total_entries, BOOL all_shares) { int num_entries = 0; int num_services = lp_numservices(); int snum; + TALLOC_CTX *ctx = p->mem_ctx; DEBUG(5,("init_srv_share_info_ctr\n")); @@ -466,7 +454,7 @@ static BOOL init_srv_share_info_ctr(TALLOC_CTX *ctx, SRV_SHARE_INFO_CTR *ctr, for (snum = *resume_hnd; snum < num_services; snum++) { if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_admin_share(snum)) ) { - init_srv_share_info_1(&info1[i++], snum); + init_srv_share_info_1(p, &info1[i++], snum); } } @@ -483,7 +471,7 @@ static BOOL init_srv_share_info_ctr(TALLOC_CTX *ctx, SRV_SHARE_INFO_CTR *ctr, for (snum = *resume_hnd; snum < num_services; snum++) { if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_admin_share(snum)) ) { - init_srv_share_info_2(&info2[i++], snum); + init_srv_share_info_2(p, &info2[i++], snum); } } @@ -500,7 +488,7 @@ static BOOL init_srv_share_info_ctr(TALLOC_CTX *ctx, SRV_SHARE_INFO_CTR *ctr, for (snum = *resume_hnd; snum < num_services; snum++) { if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_admin_share(snum)) ) { - init_srv_share_info_502(ctx, &info502[i++], snum); + init_srv_share_info_502(p, &info502[i++], snum); } } @@ -520,14 +508,14 @@ static BOOL init_srv_share_info_ctr(TALLOC_CTX *ctx, SRV_SHARE_INFO_CTR *ctr, Inits a SRV_R_NET_SHARE_ENUM structure. ********************************************************************/ -static void init_srv_r_net_share_enum(TALLOC_CTX *ctx, SRV_R_NET_SHARE_ENUM *r_n, +static void init_srv_r_net_share_enum(pipes_struct *p, SRV_R_NET_SHARE_ENUM *r_n, uint32 info_level, uint32 resume_hnd, BOOL all) { DEBUG(5,("init_srv_r_net_share_enum: %d\n", __LINE__)); - if (init_srv_share_info_ctr(ctx, &r_n->ctr, info_level, + if (init_srv_share_info_ctr(p, &r_n->ctr, info_level, &resume_hnd, &r_n->total_entries, all)) { - r_n->status = NT_STATUS_NOPROBLEMO; + r_n->status = NT_STATUS_OK; } else { r_n->status = NT_STATUS_INVALID_INFO_CLASS; } @@ -539,10 +527,10 @@ static void init_srv_r_net_share_enum(TALLOC_CTX *ctx, SRV_R_NET_SHARE_ENUM *r_n Inits a SRV_R_NET_SHARE_GET_INFO structure. ********************************************************************/ -static void init_srv_r_net_share_get_info(TALLOC_CTX *ctx, SRV_R_NET_SHARE_GET_INFO *r_n, +static void init_srv_r_net_share_get_info(pipes_struct *p, SRV_R_NET_SHARE_GET_INFO *r_n, char *share_name, uint32 info_level) { - uint32 status = NT_STATUS_NOPROBLEMO; + uint32 status = NT_STATUS_OK; int snum; DEBUG(5,("init_srv_r_net_share_get_info: %d\n", __LINE__)); @@ -554,13 +542,13 @@ static void init_srv_r_net_share_get_info(TALLOC_CTX *ctx, SRV_R_NET_SHARE_GET_I if (snum >= 0) { switch (info_level) { case 1: - init_srv_share_info_1(&r_n->info.share.info1, snum); + init_srv_share_info_1(p, &r_n->info.share.info1, snum); break; case 2: - init_srv_share_info_2(&r_n->info.share.info2, snum); + init_srv_share_info_2(p, &r_n->info.share.info2, snum); break; case 502: - init_srv_share_info_502(ctx, &r_n->info.share.info502, snum); + init_srv_share_info_502(p, &r_n->info.share.info502, snum); break; case 1005: init_srv_share_info_1005(&r_n->info.share.info1005, snum); @@ -574,7 +562,7 @@ static void init_srv_r_net_share_get_info(TALLOC_CTX *ctx, SRV_R_NET_SHARE_GET_I status = NT_STATUS_BAD_NETWORK_NAME; } - r_n->info.ptr_share_ctr = (status == NT_STATUS_NOPROBLEMO) ? 1 : 0; + r_n->info.ptr_share_ctr = (status == NT_STATUS_OK) ? 1 : 0; r_n->status = status; } @@ -694,7 +682,7 @@ static void init_srv_sess_info_1(SRV_SESS_INFO_1 *ss1, uint32 *snum, uint32 *sto static uint32 init_srv_sess_info_ctr(SRV_SESS_INFO_CTR *ctr, int switch_value, uint32 *resume_hnd, uint32 *total_entries) { - uint32 status = NT_STATUS_NOPROBLEMO; + uint32 status = NT_STATUS_OK; DEBUG(5,("init_srv_sess_info_ctr: %d\n", __LINE__)); ctr->switch_value = switch_value; @@ -736,7 +724,7 @@ static void init_srv_r_net_sess_enum(SRV_R_NET_SESS_ENUM *r_n, else r_n->status = init_srv_sess_info_ctr(r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries); - if (r_n->status != NT_STATUS_NOPROBLEMO) + if (r_n->status != NT_STATUS_OK) resume_hnd = 0; init_enum_hnd(&r_n->enum_hnd, resume_hnd); @@ -850,7 +838,7 @@ static void init_srv_conn_info_1(SRV_CONN_INFO_1 *ss1, uint32 *snum, uint32 *sto static uint32 init_srv_conn_info_ctr(SRV_CONN_INFO_CTR *ctr, int switch_value, uint32 *resume_hnd, uint32 *total_entries) { - uint32 status = NT_STATUS_NOPROBLEMO; + uint32 status = NT_STATUS_OK; DEBUG(5,("init_srv_conn_info_ctr: %d\n", __LINE__)); ctr->switch_value = switch_value; @@ -891,7 +879,7 @@ static void init_srv_r_net_conn_enum(SRV_R_NET_CONN_ENUM *r_n, else r_n->status = init_srv_conn_info_ctr(r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries); - if (r_n->status != NT_STATUS_NOPROBLEMO) + if (r_n->status != NT_STATUS_OK) resume_hnd = 0; init_enum_hnd(&r_n->enum_hnd, resume_hnd); @@ -950,7 +938,7 @@ static void init_srv_file_info_3(SRV_FILE_INFO_3 *fl3, uint32 *fnum, uint32 *fto static uint32 init_srv_file_info_ctr(SRV_FILE_INFO_CTR *ctr, int switch_value, uint32 *resume_hnd, uint32 *total_entries) { - uint32 status = NT_STATUS_NOPROBLEMO; + uint32 status = NT_STATUS_OK; DEBUG(5,("init_srv_file_info_ctr: %d\n", __LINE__)); ctr->switch_value = switch_value; @@ -987,7 +975,7 @@ static void init_srv_r_net_file_enum(SRV_R_NET_FILE_ENUM *r_n, else r_n->status = init_srv_file_info_ctr(r_n->ctr, switch_value, &resume_hnd, &(r_n->total_entries)); - if (r_n->status != NT_STATUS_NOPROBLEMO) + if (r_n->status != NT_STATUS_OK) resume_hnd = 0; init_enum_hnd(&r_n->enum_hnd, resume_hnd); @@ -999,7 +987,7 @@ net server get info uint32 _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV_R_NET_SRV_GET_INFO *r_u) { - uint32 status = NT_STATUS_NOPROBLEMO; + uint32 status = NT_STATUS_OK; SRV_INFO_CTR *ctr = (SRV_INFO_CTR *)talloc(p->mem_ctx, sizeof(SRV_INFO_CTR)); if (!ctr) @@ -1056,7 +1044,7 @@ uint32 _srv_net_srv_set_info(pipes_struct *p, SRV_Q_NET_SRV_SET_INFO *q_u, SRV_R /* NT gives "Windows NT error 0xc00000022" if we return NT_STATUS_ACCESS_DENIED here so just pretend everything is OK. */ - uint32 status = NT_STATUS_NOPROBLEMO; + uint32 status = NT_STATUS_OK; DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__)); @@ -1153,7 +1141,7 @@ uint32 _srv_net_share_enum_all(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__)); /* Create the list of shares for the response. */ - init_srv_r_net_share_enum(p->mem_ctx, r_u, + init_srv_r_net_share_enum(p, r_u, q_u->ctr.info_level, get_enum_hnd(&q_u->enum_hnd), True); @@ -1171,7 +1159,7 @@ uint32 _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__)); /* Create the list of shares for the response. */ - init_srv_r_net_share_enum(p->mem_ctx, r_u, + init_srv_r_net_share_enum(p, r_u, q_u->ctr.info_level, get_enum_hnd(&q_u->enum_hnd), False); @@ -1192,7 +1180,7 @@ uint32 _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, S /* Create the list of shares for the response. */ unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name)); - init_srv_r_net_share_get_info(p->mem_ctx, r_u, share_name, q_u->info_level); + init_srv_r_net_share_get_info(p, r_u, share_name, q_u->info_level); DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__)); @@ -1229,9 +1217,7 @@ static char *valid_share_pathname(char *dos_pathname) if (getcwd(saved_pathname, sizeof(saved_pathname)) == NULL) return False; - /* Convert to UNIX charset. */ pstrcpy(unix_pathname, ptr); - dos_to_unix(unix_pathname, True); ret = chdir(unix_pathname); @@ -1266,7 +1252,7 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S r_u->switch_value = 0; if (strequal(share_name,"IPC$") || strequal(share_name,"ADMIN$") || strequal(share_name,"global")) - return ERROR_ACCESS_DENIED; + return ERRnoaccess; snum = find_service(share_name); @@ -1276,17 +1262,17 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S /* No change to printer shares. */ if (lp_print_ok(snum)) - return ERROR_ACCESS_DENIED; + return ERRnoaccess; get_current_user(&user,p); if (user.uid != 0) - return ERROR_ACCESS_DENIED; + return ERRnoaccess; switch (q_u->info_level) { case 1: /* Not enough info in a level 1 to do anything. */ - return ERROR_ACCESS_DENIED; + return ERRnoaccess; case 2: unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(share_name)); unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(share_name)); @@ -1301,7 +1287,7 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S map_generic_share_sd_bits(psd); break; case 1005: - return ERROR_ACCESS_DENIED; + return ERRnoaccess; case 1501: fstrcpy(pathname, lp_pathname(snum)); fstrcpy(comment, lp_comment(snum)); @@ -1316,7 +1302,7 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S /* We can only modify disk shares. */ if (type != STYPE_DISKTREE) - return ERROR_ACCESS_DENIED; + return ERRnoaccess; /* Check if the pathname is valid. */ if (!(ptr = valid_share_pathname( pathname ))) @@ -1334,16 +1320,15 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S if (strcmp(ptr, lp_pathname(snum)) || strcmp(comment, lp_comment(snum)) ) { if (!lp_change_share_cmd() || !*lp_change_share_cmd()) - return ERROR_ACCESS_DENIED; + return ERRnoaccess; slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\"", lp_change_share_cmd(), CONFIGFILE, share_name, ptr, comment); - dos_to_unix(command, True); /* Convert to unix-codepage */ DEBUG(10,("_srv_net_share_set_info: Running [%s]\n", command )); if ((ret = smbrun(command, NULL)) != 0) { DEBUG(0,("_srv_net_share_set_info: Running [%s] returned (%d)\n", command, ret )); - return ERROR_ACCESS_DENIED; + return ERRnoaccess; } /* Tell everyone we updated smb.conf. */ @@ -1369,7 +1354,7 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); - return NT_STATUS_NOPROBLEMO; + return NT_STATUS_OK; } /******************************************************************* @@ -1397,18 +1382,18 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S if (user.uid != 0) { DEBUG(10,("_srv_net_share_add: uid != 0. Access denied.\n")); - return ERROR_ACCESS_DENIED; + return ERRnoaccess; } if (!lp_add_share_cmd() || !*lp_add_share_cmd()) { DEBUG(10,("_srv_net_share_add: No add share command\n")); - return ERROR_ACCESS_DENIED; + return ERRnoaccess; } switch (q_u->info_level) { case 1: /* Not enough info in a level 1 to do anything. */ - return ERROR_ACCESS_DENIED; + return ERRnoaccess; case 2: unistr2_to_ascii(share_name, &q_u->info.share.info2.info_2_str.uni_netname, sizeof(share_name)); unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(share_name)); @@ -1425,14 +1410,14 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S break; case 1005: /* DFS only level. */ - return ERROR_ACCESS_DENIED; + return ERRnoaccess; default: DEBUG(5,("_srv_net_share_add: unsupported switch value %d\n", q_u->info_level)); return NT_STATUS_INVALID_INFO_CLASS; } if (strequal(share_name,"IPC$") || strequal(share_name,"ADMIN$") || strequal(share_name,"global")) - return ERROR_ACCESS_DENIED; + return ERRnoaccess; snum = find_service(share_name); @@ -1442,7 +1427,7 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S /* We can only add disk shares. */ if (type != STYPE_DISKTREE) - return ERROR_ACCESS_DENIED; + return ERRnoaccess; /* Check if the pathname is valid. */ if (!(ptr = valid_share_pathname( pathname ))) @@ -1455,12 +1440,11 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\"", lp_add_share_cmd(), CONFIGFILE, share_name, ptr, comment); - dos_to_unix(command, True); /* Convert to unix-codepage */ DEBUG(10,("_srv_net_share_add: Running [%s]\n", command )); if ((ret = smbrun(command, NULL)) != 0) { DEBUG(0,("_srv_net_share_add: Running [%s] returned (%d)\n", command, ret )); - return ERROR_ACCESS_DENIED; + return ERRnoaccess; } if (psd) { @@ -1480,7 +1464,7 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S DEBUG(5,("_srv_net_share_add: %d\n", __LINE__)); - return NT_STATUS_NOPROBLEMO; + return NT_STATUS_OK; } /******************************************************************* @@ -1501,7 +1485,7 @@ uint32 _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name)); if (strequal(share_name,"IPC$") || strequal(share_name,"ADMIN$") || strequal(share_name,"global")) - return ERROR_ACCESS_DENIED; + return ERRnoaccess; snum = find_service(share_name); @@ -1510,24 +1494,23 @@ uint32 _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S /* No change to printer shares. */ if (lp_print_ok(snum)) - return ERROR_ACCESS_DENIED; + return ERRnoaccess; get_current_user(&user,p); if (user.uid != 0) - return ERROR_ACCESS_DENIED; + return ERRnoaccess; if (!lp_delete_share_cmd() || !*lp_delete_share_cmd()) - return ERROR_ACCESS_DENIED; + return ERRnoaccess; slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\"", lp_delete_share_cmd(), CONFIGFILE, lp_servicename(snum)); - dos_to_unix(command, True); /* Convert to unix-codepage */ DEBUG(10,("_srv_net_share_del: Running [%s]\n", command )); if ((ret = smbrun(command, NULL)) != 0) { DEBUG(0,("_srv_net_share_del: Running [%s] returned (%d)\n", command, ret )); - return ERROR_ACCESS_DENIED; + return ERRnoaccess; } /* Delete the SD in the database. */ @@ -1538,7 +1521,7 @@ uint32 _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S lp_killservice(snum); - return NT_STATUS_NOPROBLEMO; + return NT_STATUS_OK; } /******************************************************************* @@ -1559,7 +1542,7 @@ uint32 _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET r_u->tod = tod; r_u->ptr_srv_tod = 0x1; - r_u->status = NT_STATUS_NOPROBLEMO; + r_u->status = NT_STATUS_OK; DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__)); @@ -1609,7 +1592,7 @@ uint32 _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC ZERO_STRUCT(st); - r_u->status = NT_STATUS_NOPROBLEMO; + r_u->status = NT_STATUS_OK; unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname)); @@ -1640,7 +1623,7 @@ uint32 _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC if (!fsp) { DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", filename)); - r_u->status = ERROR_ACCESS_DENIED; + r_u->status = ERRnoaccess; goto error_exit; } } @@ -1649,7 +1632,7 @@ uint32 _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC if (sd_size == 0) { DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", filename)); - r_u->status = ERROR_ACCESS_DENIED; + r_u->status = ERRnoaccess; goto error_exit; } @@ -1698,10 +1681,11 @@ uint32 _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ struct current_user user; fstring user_name; connection_struct *conn = NULL; + BOOL became_user = False; ZERO_STRUCT(st); - r_u->status = NT_STATUS_NOPROBLEMO; + r_u->status = NT_STATUS_OK; unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname)); @@ -1719,6 +1703,13 @@ uint32 _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ goto error_exit; } + if (!become_user(conn, conn->vuid)) { + DEBUG(0,("_srv_net_file_set_secdesc: Can't become connected user!\n")); + r_u->status = ERRnoaccess; + goto error_exit; + } + became_user = True; + unistr2_to_ascii(filename, &q_u->uni_file_name, sizeof(filename)); unix_convert(filename, conn, NULL, &bad_path, &st); @@ -1733,7 +1724,7 @@ uint32 _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ if (!fsp) { DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", filename)); - r_u->status = ERROR_ACCESS_DENIED; + r_u->status = ERRnoaccess; goto error_exit; } } @@ -1742,11 +1733,12 @@ uint32 _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ if (ret == False) { DEBUG(3,("_srv_net_file_set_secdesc: Unable to set NT ACL on file %s\n", filename)); - r_u->status = ERROR_ACCESS_DENIED; + r_u->status = ERRnoaccess; goto error_exit; } close_file(fsp, True); + unbecome_user(); close_cnum(conn, user.vuid); return r_u->status; @@ -1756,6 +1748,9 @@ uint32 _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ close_file(fsp, True); } + if (became_user) + unbecome_user(); + if (conn) close_cnum(conn, user.vuid); @@ -1814,7 +1809,7 @@ uint32 _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_D const char *disk_name; uint32 resume=get_enum_hnd(&q_u->enum_hnd); - r_u->status=NT_STATUS_NOPROBLEMO; + r_u->status=NT_STATUS_OK; r_u->total_entries = init_server_disk_enum(&resume); @@ -1849,7 +1844,7 @@ uint32 _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV int snum; fstring share_name; - r_u->status=NT_STATUS_NOPROBLEMO; + r_u->status=NT_STATUS_OK; switch(q_u->type) { @@ -1868,7 +1863,7 @@ uint32 _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV default: /*unsupported type*/ - r_u->status = ERROR_INVALID_LEVEL; + r_u->status = ERRunknownlevel; break; } diff --git a/source/rpc_server/srv_util.c b/source/rpc_server/srv_util.c index 8f15b7f117b..22e573402e9 100644 --- a/source/rpc_server/srv_util.c +++ b/source/rpc_server/srv_util.c @@ -251,8 +251,10 @@ uint32 local_lookup_alias_name(uint32 rid, char *alias_name, uint32 *type) ********************************************************************/ uint32 local_lookup_user_name(uint32 rid, char *user_name, uint32 *type) { - struct sam_disp_info *disp_info; + SAM_ACCOUNT *sampwd=NULL; int i = 0; + BOOL ret; + (*type) = SID_NAME_USER; DEBUG(5,("lookup_user_name: rid: %d", rid)); @@ -263,26 +265,28 @@ uint32 local_lookup_user_name(uint32 rid, char *user_name, uint32 *type) i++; } - if (domain_user_rids[i].rid != 0) - { + if (domain_user_rids[i].rid != 0) { fstrcpy(user_name, domain_user_rids[i].name); DEBUG(5,(" = %s\n", user_name)); return 0x0; } + pdb_init_sam(&sampwd); + /* ok, it's a user. find the user account */ become_root(); - disp_info = getsamdisprid(rid); + ret = pdb_getsampwrid(sampwd, rid); unbecome_root(); - if (disp_info != NULL) - { - fstrcpy(user_name, disp_info->smb_name); + if (ret == True) { + fstrcpy(user_name, pdb_get_username(sampwd) ); DEBUG(5,(" = %s\n", user_name)); + pdb_free_sam(sampwd); return 0x0; } DEBUG(5,(" none mapped\n")); + pdb_free_sam(sampwd); return NT_STATUS_NONE_MAPPED; } @@ -329,19 +333,24 @@ uint32 local_lookup_alias_rid(char *alias_name, uint32 *rid) ********************************************************************/ uint32 local_lookup_user_rid(char *user_name, uint32 *rid) { - struct sam_passwd *sam_pass; + SAM_ACCOUNT *sampass=NULL; + BOOL ret; + (*rid) = 0; + pdb_init_sam(&sampass); + /* find the user account */ become_root(); - sam_pass = getsam21pwnam(user_name); + ret = pdb_getsampwnam(sampass, user_name); unbecome_root(); - if (sam_pass != NULL) - { - (*rid) = sam_pass->user_rid; + if (ret == True) { + (*rid) = pdb_get_user_rid(sampass); + pdb_free_sam(sampass); return 0x0; } + pdb_free_sam(sampass); return NT_STATUS_NONE_MAPPED; } diff --git a/source/rpc_server/srv_wkssvc_nt.c b/source/rpc_server/srv_wkssvc_nt.c index 40771d2fb93..c20ebb57067 100644 --- a/source/rpc_server/srv_wkssvc_nt.c +++ b/source/rpc_server/srv_wkssvc_nt.c @@ -72,7 +72,7 @@ uint32 _wks_query_info(pipes_struct *p, WKS_Q_QUERY_INFO *q_u, WKS_R_QUERY_INFO return NT_STATUS_NO_MEMORY; create_wks_info_100(wks100); - init_wks_r_query_info(r_u, q_u->switch_value, wks100, NT_STATUS_NOPROBLEMO); + init_wks_r_query_info(r_u, q_u->switch_value, wks100, NT_STATUS_OK); DEBUG(5,("_wks_query_info: %d\n", __LINE__)); |