diff options
Diffstat (limited to 'source3/smbd/lanman.c')
-rw-r--r-- | source3/smbd/lanman.c | 213 |
1 files changed, 110 insertions, 103 deletions
diff --git a/source3/smbd/lanman.c b/source3/smbd/lanman.c index f56ea30c0e..d54e1d51e6 100644 --- a/source3/smbd/lanman.c +++ b/source3/smbd/lanman.c @@ -79,7 +79,7 @@ static char *smb_realloc_limit(void *ptr, size_t size) } static bool api_Unsupported(struct smbd_server_connection *sconn, - connection_struct *conn, uint16 vuid, + connection_struct *conn, uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, @@ -87,7 +87,7 @@ static bool api_Unsupported(struct smbd_server_connection *sconn, int *rdata_len, int *rparam_len); static bool api_TooSmall(struct smbd_server_connection *sconn, - connection_struct *conn, uint16 vuid, char *param, char *data, + connection_struct *conn, uint64_t vuid, char *param, char *data, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len); @@ -110,18 +110,18 @@ static int CopyExpanded(connection_struct *conn, *p_space_remaining = 0; return 0; } - buf = talloc_string_sub(ctx, buf,"%S",lp_servicename(snum)); + buf = talloc_string_sub(ctx, buf,"%S", lp_servicename(ctx, snum)); if (!buf) { *p_space_remaining = 0; return 0; } buf = talloc_sub_advanced(ctx, - lp_servicename(SNUM(conn)), - conn->session_info->unix_name, + lp_servicename(ctx, SNUM(conn)), + conn->session_info->unix_info->unix_name, conn->connectpath, - conn->session_info->utok.gid, - conn->session_info->sanitized_username, - conn->session_info->info3->base.domain.string, + conn->session_info->unix_token->gid, + conn->session_info->unix_info->sanitized_username, + conn->session_info->info->domain_name, buf); if (!buf) { *p_space_remaining = 0; @@ -162,17 +162,17 @@ static int StrlenExpanded(connection_struct *conn, int snum, char *s) if (!buf) { return 0; } - buf = talloc_string_sub(ctx,buf,"%S",lp_servicename(snum)); + buf = talloc_string_sub(ctx,buf,"%S",lp_servicename(ctx, snum)); if (!buf) { return 0; } buf = talloc_sub_advanced(ctx, - lp_servicename(SNUM(conn)), - conn->session_info->unix_name, + lp_servicename(ctx, SNUM(conn)), + conn->session_info->unix_info->unix_name, conn->connectpath, - conn->session_info->utok.gid, - conn->session_info->sanitized_username, - conn->session_info->info3->base.domain.string, + conn->session_info->unix_token->gid, + conn->session_info->unix_info->sanitized_username, + conn->session_info->info->domain_name, buf); if (!buf) { return 0; @@ -612,9 +612,9 @@ static void fill_printq_info_52(struct spoolss_DriverInfo3 *driver, { int i; fstring location; - trim_string((char *)driver->driver_path, "\\print$\\WIN40\\0\\", 0); - trim_string((char *)driver->data_file, "\\print$\\WIN40\\0\\", 0); - trim_string((char *)driver->help_file, "\\print$\\WIN40\\0\\", 0); + trim_string(discard_const_p(char, driver->driver_path), "\\print$\\WIN40\\0\\", 0); + trim_string(discard_const_p(char, driver->data_file), "\\print$\\WIN40\\0\\", 0); + trim_string(discard_const_p(char, driver->help_file), "\\print$\\WIN40\\0\\", 0); PACKI(desc, "W", 0x0400); /* don't know */ PACKS(desc, "z", driver->driver_name); /* long printer name */ @@ -641,7 +641,7 @@ static void fill_printq_info_52(struct spoolss_DriverInfo3 *driver, for ( i=0; i<count && driver->dependent_files && *driver->dependent_files[i]; i++) { - trim_string((char *)driver->dependent_files[i], "\\print$\\WIN40\\0\\", 0); + trim_string(discard_const_p(char, driver->dependent_files[i]), "\\print$\\WIN40\\0\\", 0); PACKS(desc,"z",driver->dependent_files[i]); /* driver files to copy */ DEBUG(3,("Dependent File: %s:\n", driver->dependent_files[i])); } @@ -756,7 +756,7 @@ static int get_printerdrivernumber(const struct spoolss_DriverInfo3 *driver) } static bool api_DosPrintQGetInfo(struct smbd_server_connection *sconn, - connection_struct *conn, uint16 vuid, + connection_struct *conn, uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt,int mprcnt, @@ -834,7 +834,7 @@ static bool api_DosPrintQGetInfo(struct smbd_server_connection *sconn, status = rpc_pipe_open_interface(conn, &ndr_table_spoolss.syntax_id, conn->session_info, - &conn->sconn->client_id, + conn->sconn->remote_address, conn->sconn->msg_ctx, &cli); if (!NT_STATUS_IS_OK(status)) { @@ -971,7 +971,7 @@ static bool api_DosPrintQGetInfo(struct smbd_server_connection *sconn, ****************************************************************************/ static bool api_DosPrintQEnum(struct smbd_server_connection *sconn, - connection_struct *conn, uint16 vuid, + connection_struct *conn, uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, @@ -1031,7 +1031,7 @@ static bool api_DosPrintQEnum(struct smbd_server_connection *sconn, status = rpc_pipe_open_interface(conn, &ndr_table_spoolss.syntax_id, conn->session_info, - &conn->sconn->client_id, + conn->sconn->remote_address, conn->sconn->msg_ctx, &cli); if (!NT_STATUS_IS_OK(status)) { @@ -1427,7 +1427,7 @@ static int fill_srv_info(struct srv_info_struct *service, static int srv_comp(struct srv_info_struct *s1,struct srv_info_struct *s2) { - return StrCaseCmp(s1->name,s2->name); + return strcasecmp_m(s1->name,s2->name); } /**************************************************************************** @@ -1436,7 +1436,7 @@ static int srv_comp(struct srv_info_struct *s1,struct srv_info_struct *s2) ****************************************************************************/ static bool api_RNetServerEnum2(struct smbd_server_connection *sconn, - connection_struct *conn, uint16 vuid, + connection_struct *conn, uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, @@ -1596,7 +1596,7 @@ static int srv_name_match(const char *n1, const char *n2) * the server will return a list of servers that exist on * the network greater than or equal to the FirstNameToReturn. */ - int ret = StrCaseCmp(n1, n2); + int ret = strcasecmp_m(n1, n2); if (ret <= 0) { return 0; @@ -1606,7 +1606,7 @@ static int srv_name_match(const char *n1, const char *n2) } static bool api_RNetServerEnum3(struct smbd_server_connection *sconn, - connection_struct *conn, uint16 vuid, + connection_struct *conn, uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, @@ -1708,7 +1708,7 @@ static bool api_RNetServerEnum3(struct smbd_server_connection *sconn, */ for (;first > 0;) { int ret; - ret = StrCaseCmp(first_name, + ret = strcasecmp_m(first_name, servers[first-1].name); if (ret > 0) { break; @@ -1799,7 +1799,7 @@ static bool api_RNetServerEnum3(struct smbd_server_connection *sconn, ****************************************************************************/ static bool api_RNetGroupGetUsers(struct smbd_server_connection *sconn, - connection_struct *conn, uint16 vuid, + connection_struct *conn, uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, char **rdata, @@ -1906,10 +1906,10 @@ static int fill_share_info(connection_struct *conn, int snum, int uLevel, len = 0; if (uLevel > 0) { - len += StrlenExpanded(conn,snum,lp_comment(snum)); + len += StrlenExpanded(conn,snum,lp_comment(talloc_tos(), snum)); } if (uLevel > 1) { - len += strlen(lp_pathname(snum)) + 1; + len += strlen(lp_pathname(talloc_tos(), snum)) + 1; } if (buflen) { *buflen = struct_len; @@ -1938,7 +1938,7 @@ static int fill_share_info(connection_struct *conn, int snum, int uLevel, baseaddr = p; } - push_ascii(p,lp_servicename(snum),13, STR_TERMINATE); + push_ascii(p,lp_servicename(talloc_tos(), snum),13, STR_TERMINATE); if (uLevel > 0) { int type; @@ -1948,12 +1948,12 @@ static int fill_share_info(connection_struct *conn, int snum, int uLevel, if (lp_print_ok(snum)) { type = STYPE_PRINTQ; } - if (strequal("IPC",lp_fstype(snum))) { + if (strequal("IPC",lp_fstype(talloc_tos(),snum))) { type = STYPE_IPC; } SSVAL(p,14,type); /* device type */ SIVAL(p,16,PTR_DIFF(p2,baseaddr)); - len += CopyExpanded(conn,snum,&p2,lp_comment(snum),&l2); + len += CopyExpanded(conn,snum,&p2,lp_comment(talloc_tos(),snum),&l2); } if (uLevel > 1) { @@ -1961,7 +1961,7 @@ static int fill_share_info(connection_struct *conn, int snum, int uLevel, SSVALS(p,22,-1); /* max uses */ SSVAL(p,24,1); /* current uses */ SIVAL(p,26,PTR_DIFF(p2,baseaddr)); /* local pathname */ - len += CopyAndAdvance(&p2,lp_pathname(snum),&l2); + len += CopyAndAdvance(&p2,lp_pathname(talloc_tos(),snum),&l2); memset(p+30,0,SHPWLEN+2); /* passwd (reserved), pad field */ } @@ -1990,7 +1990,7 @@ static int fill_share_info(connection_struct *conn, int snum, int uLevel, } static bool api_RNetShareGetInfo(struct smbd_server_connection *sconn, - connection_struct *conn,uint16 vuid, + connection_struct *conn,uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt,int mprcnt, @@ -2005,7 +2005,7 @@ static bool api_RNetShareGetInfo(struct smbd_server_connection *sconn, int uLevel = get_safe_SVAL(param,tpscnt,p,0,-1); int snum; - if (!str1 || !str2 || !netname || !p) { + if (!str1 || !str2 || !netname_in || !p) { return False; } @@ -2055,7 +2055,7 @@ static bool api_RNetShareGetInfo(struct smbd_server_connection *sconn, ****************************************************************************/ static bool api_RNetShareEnum(struct smbd_server_connection *sconn, - connection_struct *conn, uint16 vuid, + connection_struct *conn, uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, @@ -2092,7 +2092,7 @@ static bool api_RNetShareEnum(struct smbd_server_connection *sconn, /* Ensure all the usershares are loaded. */ become_root(); load_registry_shares(); - count = load_usershare_shares(); + count = load_usershare_shares(NULL, connections_snum_used); unbecome_root(); data_len = fixed_len = string_len = 0; @@ -2101,7 +2101,7 @@ static bool api_RNetShareEnum(struct smbd_server_connection *sconn, if (!(lp_browseable(i) && lp_snum_ok(i))) { continue; } - push_ascii_fstring(servicename_dos, lp_servicename(i)); + push_ascii_fstring(servicename_dos, lp_servicename(talloc_tos(), i)); /* Maximum name length = 13. */ if( lp_browseable( i ) && lp_snum_ok( i ) && (strlen(servicename_dos) < 13)) { total++; @@ -2133,7 +2133,8 @@ static bool api_RNetShareEnum(struct smbd_server_connection *sconn, continue; } - push_ascii_fstring(servicename_dos, lp_servicename(i)); + push_ascii_fstring(servicename_dos, + lp_servicename(talloc_tos(), i)); if (lp_browseable(i) && lp_snum_ok(i) && (strlen(servicename_dos) < 13)) { if (fill_share_info( conn,i,uLevel,&p,&f_len,&p2,&s_len,*rdata ) < 0) { break; @@ -2163,7 +2164,7 @@ static bool api_RNetShareEnum(struct smbd_server_connection *sconn, ****************************************************************************/ static bool api_RNetShareAdd(struct smbd_server_connection *sconn, - connection_struct *conn,uint16 vuid, + connection_struct *conn,uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt,int mprcnt, @@ -2256,7 +2257,7 @@ static bool api_RNetShareAdd(struct smbd_server_connection *sconn, status = rpc_pipe_open_interface(mem_ctx, &ndr_table_srvsvc.syntax_id, conn->session_info, - &conn->sconn->client_id, + conn->sconn->remote_address, conn->sconn->msg_ctx, &cli); if (!NT_STATUS_IS_OK(status)) { @@ -2324,7 +2325,7 @@ static bool api_RNetShareAdd(struct smbd_server_connection *sconn, ****************************************************************************/ static bool api_RNetGroupEnum(struct smbd_server_connection *sconn, - connection_struct *conn,uint16 vuid, + connection_struct *conn,uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt,int mprcnt, @@ -2367,7 +2368,7 @@ static bool api_RNetGroupEnum(struct smbd_server_connection *sconn, status = rpc_pipe_open_interface( talloc_tos(), &ndr_table_samr.syntax_id, - conn->session_info, &conn->sconn->client_id, + conn->session_info, conn->sconn->remote_address, conn->sconn->msg_ctx, &samr_pipe); if (!NT_STATUS_IS_OK(status)) { DEBUG(0, ("api_RNetUserEnum: Could not connect to samr: %s\n", @@ -2377,7 +2378,7 @@ static bool api_RNetGroupEnum(struct smbd_server_connection *sconn, b = samr_pipe->binding_handle; - status = dcerpc_samr_Connect2(b, talloc_tos(), global_myname(), + status = dcerpc_samr_Connect2(b, talloc_tos(), lp_netbios_name(), SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle, &result); if (!NT_STATUS_IS_OK(status)) { @@ -2506,7 +2507,7 @@ static bool api_RNetGroupEnum(struct smbd_server_connection *sconn, ******************************************************************/ static bool api_NetUserGetGroups(struct smbd_server_connection *sconn, - connection_struct *conn,uint16 vuid, + connection_struct *conn,uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt,int mprcnt, @@ -2573,7 +2574,7 @@ static bool api_NetUserGetGroups(struct smbd_server_connection *sconn, status = rpc_pipe_open_interface( talloc_tos(), &ndr_table_samr.syntax_id, - conn->session_info, &conn->sconn->client_id, + conn->session_info, conn->sconn->remote_address, conn->sconn->msg_ctx, &samr_pipe); if (!NT_STATUS_IS_OK(status)) { DEBUG(0, ("api_RNetUserEnum: Could not connect to samr: %s\n", @@ -2583,7 +2584,7 @@ static bool api_NetUserGetGroups(struct smbd_server_connection *sconn, b = samr_pipe->binding_handle; - status = dcerpc_samr_Connect2(b, talloc_tos(), global_myname(), + status = dcerpc_samr_Connect2(b, talloc_tos(), lp_netbios_name(), SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle, &result); if (!NT_STATUS_IS_OK(status)) { @@ -2701,7 +2702,7 @@ static bool api_NetUserGetGroups(struct smbd_server_connection *sconn, ******************************************************************/ static bool api_RNetUserEnum(struct smbd_server_connection *sconn, - connection_struct *conn, uint16 vuid, + connection_struct *conn, uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt,int mprcnt, @@ -2765,7 +2766,7 @@ static bool api_RNetUserEnum(struct smbd_server_connection *sconn, status = rpc_pipe_open_interface( talloc_tos(), &ndr_table_samr.syntax_id, - conn->session_info, &conn->sconn->client_id, + conn->session_info, conn->sconn->remote_address, conn->sconn->msg_ctx, &samr_pipe); if (!NT_STATUS_IS_OK(status)) { DEBUG(0, ("api_RNetUserEnum: Could not connect to samr: %s\n", @@ -2775,7 +2776,7 @@ static bool api_RNetUserEnum(struct smbd_server_connection *sconn, b = samr_pipe->binding_handle; - status = dcerpc_samr_Connect2(b, talloc_tos(), global_myname(), + status = dcerpc_samr_Connect2(b, talloc_tos(), lp_netbios_name(), SAMR_ACCESS_LOOKUP_DOMAIN, &samr_handle, &result); if (!NT_STATUS_IS_OK(status)) { @@ -2884,7 +2885,7 @@ static bool api_RNetUserEnum(struct smbd_server_connection *sconn, ****************************************************************************/ static bool api_NetRemoteTOD(struct smbd_server_connection *sconn, - connection_struct *conn,uint16 vuid, + connection_struct *conn,uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt,int mprcnt, @@ -2943,7 +2944,7 @@ static bool api_NetRemoteTOD(struct smbd_server_connection *sconn, *****************************************************************************/ static bool api_SetUserPassword(struct smbd_server_connection *sconn, - connection_struct *conn,uint16 vuid, + connection_struct *conn,uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt,int mprcnt, @@ -3031,7 +3032,7 @@ static bool api_SetUserPassword(struct smbd_server_connection *sconn, status = rpc_pipe_open_interface(mem_ctx, &ndr_table_samr.syntax_id, conn->session_info, - &conn->sconn->client_id, + conn->sconn->remote_address, conn->sconn->msg_ctx, &cli); if (!NT_STATUS_IS_OK(status)) { @@ -3044,7 +3045,7 @@ static bool api_SetUserPassword(struct smbd_server_connection *sconn, b = cli->binding_handle; status = dcerpc_samr_Connect2(b, mem_ctx, - global_myname(), + lp_netbios_name(), SAMR_ACCESS_CONNECT_TO_SERVER | SAMR_ACCESS_ENUM_DOMAINS | SAMR_ACCESS_LOOKUP_DOMAIN, @@ -3145,7 +3146,7 @@ static bool api_SetUserPassword(struct smbd_server_connection *sconn, ZERO_STRUCT(old_lm_hash); ZERO_STRUCT(new_lm_hash); memcpy(old_lm_hash.hash, pass1, MIN(strlen(pass1), 16)); - memcpy(new_lm_hash.hash, pass1, MIN(strlen(pass2), 16)); + memcpy(new_lm_hash.hash, pass2, MIN(strlen(pass2), 16)); } status = dcerpc_samr_ChangePasswordUser(b, mem_ctx, @@ -3196,7 +3197,7 @@ static bool api_SetUserPassword(struct smbd_server_connection *sconn, ****************************************************************************/ static bool api_SamOEMChangePassword(struct smbd_server_connection *sconn, - connection_struct *conn,uint16 vuid, + connection_struct *conn,uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt,int mprcnt, @@ -3282,7 +3283,7 @@ static bool api_SamOEMChangePassword(struct smbd_server_connection *sconn, status = rpc_pipe_open_interface(mem_ctx, &ndr_table_samr.syntax_id, conn->session_info, - &conn->sconn->client_id, + conn->sconn->remote_address, conn->sconn->msg_ctx, &cli); if (!NT_STATUS_IS_OK(status)) { @@ -3294,7 +3295,7 @@ static bool api_SamOEMChangePassword(struct smbd_server_connection *sconn, b = cli->binding_handle; - init_lsa_AsciiString(&server, global_myname()); + init_lsa_AsciiString(&server, lp_netbios_name()); init_lsa_AsciiString(&account, user); status = dcerpc_samr_OemChangePasswordUser2(b, mem_ctx, @@ -3326,7 +3327,7 @@ static bool api_SamOEMChangePassword(struct smbd_server_connection *sconn, ****************************************************************************/ static bool api_RDosPrintJobDel(struct smbd_server_connection *sconn, - connection_struct *conn,uint16 vuid, + connection_struct *conn,uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt,int mprcnt, @@ -3379,7 +3380,7 @@ static bool api_RDosPrintJobDel(struct smbd_server_connection *sconn, status = rpc_pipe_open_interface(conn, &ndr_table_spoolss.syntax_id, conn->session_info, - &conn->sconn->client_id, + conn->sconn->remote_address, conn->sconn->msg_ctx, &cli); if (!NT_STATUS_IS_OK(status)) { @@ -3459,7 +3460,7 @@ static bool api_RDosPrintJobDel(struct smbd_server_connection *sconn, ****************************************************************************/ static bool api_WPrintQueueCtrl(struct smbd_server_connection *sconn, - connection_struct *conn,uint16 vuid, + connection_struct *conn,uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt,int mprcnt, @@ -3507,7 +3508,7 @@ static bool api_WPrintQueueCtrl(struct smbd_server_connection *sconn, status = rpc_pipe_open_interface(conn, &ndr_table_spoolss.syntax_id, conn->session_info, - &conn->sconn->client_id, + conn->sconn->remote_address, conn->sconn->msg_ctx, &cli); if (!NT_STATUS_IS_OK(status)) { @@ -3621,7 +3622,7 @@ static int check_printjob_info(struct pack_desc* desc, } static bool api_PrintJobInfo(struct smbd_server_connection *sconn, - connection_struct *conn, uint16 vuid, + connection_struct *conn, uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt,int mprcnt, @@ -3689,7 +3690,7 @@ static bool api_PrintJobInfo(struct smbd_server_connection *sconn, status = rpc_pipe_open_interface(conn, &ndr_table_spoolss.syntax_id, conn->session_info, - &conn->sconn->client_id, + conn->sconn->remote_address, conn->sconn->msg_ctx, &cli); if (!NT_STATUS_IS_OK(status)) { @@ -3781,7 +3782,7 @@ static bool api_PrintJobInfo(struct smbd_server_connection *sconn, ****************************************************************************/ static bool api_RNetServerGetInfo(struct smbd_server_connection *sconn, - connection_struct *conn,uint16 vuid, + connection_struct *conn,uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt,int mprcnt, @@ -3866,7 +3867,7 @@ static bool api_RNetServerGetInfo(struct smbd_server_connection *sconn, status = rpc_pipe_open_interface(mem_ctx, &ndr_table_srvsvc.syntax_id, conn->session_info, - &conn->sconn->client_id, + conn->sconn->remote_address, conn->sconn->msg_ctx, &cli); if (!NT_STATUS_IS_OK(status)) { @@ -3953,7 +3954,7 @@ static bool api_RNetServerGetInfo(struct smbd_server_connection *sconn, ****************************************************************************/ static bool api_NetWkstaGetInfo(struct smbd_server_connection *sconn, - connection_struct *conn,uint16 vuid, + connection_struct *conn,uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt,int mprcnt, @@ -4003,7 +4004,9 @@ static bool api_NetWkstaGetInfo(struct smbd_server_connection *sconn, SIVAL(p,0,PTR_DIFF(p2,*rdata)); /* host name */ strlcpy(p2,get_local_machine_name(),PTR_DIFF(endp,p2)); - strupper_m(p2); + if (!strupper_m(p2)) { + return false; + } p2 = skip_string(*rdata,*rdata_len,p2); if (!p2) { return False; @@ -4011,7 +4014,7 @@ static bool api_NetWkstaGetInfo(struct smbd_server_connection *sconn, p += 4; SIVAL(p,0,PTR_DIFF(p2,*rdata)); - strlcpy(p2,conn->session_info->sanitized_username,PTR_DIFF(endp,p2)); + strlcpy(p2,conn->session_info->unix_info->sanitized_username,PTR_DIFF(endp,p2)); p2 = skip_string(*rdata,*rdata_len,p2); if (!p2) { return False; @@ -4020,15 +4023,17 @@ static bool api_NetWkstaGetInfo(struct smbd_server_connection *sconn, SIVAL(p,0,PTR_DIFF(p2,*rdata)); /* login domain */ strlcpy(p2,lp_workgroup(),PTR_DIFF(endp,p2)); - strupper_m(p2); + if (!strupper_m(p2)) { + return false; + } p2 = skip_string(*rdata,*rdata_len,p2); if (!p2) { return False; } p += 4; - SCVAL(p,0,lp_major_announce_version()); /* system version - e.g 4 in 4.1 */ - SCVAL(p,1,lp_minor_announce_version()); /* system version - e.g .1 in 4.1 */ + SCVAL(p,0,SAMBA_MAJOR_NBT_ANNOUNCE_VERSION); /* system version - e.g 4 in 4.1 */ + SCVAL(p,1,SAMBA_MINOR_NBT_ANNOUNCE_VERSION); /* system version - e.g .1 in 4.1 */ p += 2; SIVAL(p,0,PTR_DIFF(p2,*rdata)); @@ -4215,7 +4220,7 @@ There is no auxiliary data in the response. #define usri11_end 86 static bool api_RNetUserGetInfo(struct smbd_server_connection *sconn, - connection_struct *conn, uint16 vuid, + connection_struct *conn, uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt,int mprcnt, @@ -4293,7 +4298,7 @@ static bool api_RNetUserGetInfo(struct smbd_server_connection *sconn, status = rpc_pipe_open_interface(mem_ctx, &ndr_table_samr.syntax_id, conn->session_info, - &conn->sconn->client_id, + conn->sconn->remote_address, conn->sconn->msg_ctx, &cli); if (!NT_STATUS_IS_OK(status)) { @@ -4306,7 +4311,7 @@ static bool api_RNetUserGetInfo(struct smbd_server_connection *sconn, b = cli->binding_handle; status = dcerpc_samr_Connect2(b, mem_ctx, - global_myname(), + lp_netbios_name(), SAMR_ACCESS_CONNECT_TO_SERVER | SAMR_ACCESS_ENUM_DOMAINS | SAMR_ACCESS_LOOKUP_DOMAIN, @@ -4612,7 +4617,7 @@ static bool api_RNetUserGetInfo(struct smbd_server_connection *sconn, } static bool api_WWkstaUserLogon(struct smbd_server_connection *sconn, - connection_struct *conn,uint16 vuid, + connection_struct *conn,uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt,int mprcnt, @@ -4627,7 +4632,7 @@ static bool api_WWkstaUserLogon(struct smbd_server_connection *sconn, char* name; /* With share level security vuid will always be zero. Don't depend on vuser being non-null !!. JRA */ - user_struct *vuser = get_valid_user_struct(sconn, vuid); + struct user_struct *vuser = get_valid_user_struct(sconn, vuid); if (!str1 || !str2 || !p) { return False; @@ -4635,8 +4640,8 @@ static bool api_WWkstaUserLogon(struct smbd_server_connection *sconn, if(vuser != NULL) { DEBUG(3,(" Username of UID %d is %s\n", - (int)vuser->session_info->utok.uid, - vuser->session_info->unix_name)); + (int)vuser->session_info->unix_token->uid, + vuser->session_info->unix_info->unix_name)); } uLevel = get_safe_SVAL(param,tpscnt,p,0,-1); @@ -4690,13 +4695,15 @@ static bool api_WWkstaUserLogon(struct smbd_server_connection *sconn, fstring mypath; fstrcpy(mypath,"\\\\"); fstrcat(mypath,get_local_machine_name()); - strupper_m(mypath); + if (!strupper_m(mypath)) { + return false; + } PACKS(&desc,"z",mypath); /* computer */ } PACKS(&desc,"z",lp_workgroup());/* domain */ PACKS(&desc,"z", vuser ? - vuser->session_info->info3->base.logon_script.string + vuser->session_info->info->logon_script : ""); /* script path */ PACKI(&desc,"D",0x00000000); /* reserved */ } @@ -4721,7 +4728,7 @@ static bool api_WWkstaUserLogon(struct smbd_server_connection *sconn, ****************************************************************************/ static bool api_WAccessGetUserPerms(struct smbd_server_connection *sconn, - connection_struct *conn,uint16 vuid, + connection_struct *conn,uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt,int mprcnt, @@ -4767,7 +4774,7 @@ static bool api_WAccessGetUserPerms(struct smbd_server_connection *sconn, ****************************************************************************/ static bool api_WPrintJobGetInfo(struct smbd_server_connection *sconn, - connection_struct *conn, uint16 vuid, + connection_struct *conn, uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt,int mprcnt, @@ -4820,7 +4827,7 @@ static bool api_WPrintJobGetInfo(struct smbd_server_connection *sconn, status = rpc_pipe_open_interface(conn, &ndr_table_spoolss.syntax_id, conn->session_info, - &conn->sconn->client_id, + conn->sconn->remote_address, conn->sconn->msg_ctx, &cli); if (!NT_STATUS_IS_OK(status)) { @@ -4905,7 +4912,7 @@ static bool api_WPrintJobGetInfo(struct smbd_server_connection *sconn, } static bool api_WPrintJobEnumerate(struct smbd_server_connection *sconn, - connection_struct *conn, uint16 vuid, + connection_struct *conn, uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt,int mprcnt, @@ -4962,7 +4969,7 @@ static bool api_WPrintJobEnumerate(struct smbd_server_connection *sconn, status = rpc_pipe_open_interface(conn, &ndr_table_spoolss.syntax_id, conn->session_info, - &conn->sconn->client_id, + conn->sconn->remote_address, conn->sconn->msg_ctx, &cli); if (!NT_STATUS_IS_OK(status)) { @@ -5081,7 +5088,7 @@ static void fill_printdest_info(struct spoolss_PrinterInfo2 *info2, int uLevel, strncpy(buf, info2->printername, sizeof(buf)-1); buf[sizeof(buf)-1] = 0; - strupper_m(buf); + (void)strupper_m(buf); if (uLevel <= 1) { PACKS(desc,"B9",buf); /* szName */ @@ -5111,7 +5118,7 @@ static void fill_printdest_info(struct spoolss_PrinterInfo2 *info2, int uLevel, } static bool api_WPrintDestGetInfo(struct smbd_server_connection *sconn, - connection_struct *conn, uint16 vuid, + connection_struct *conn, uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt,int mprcnt, @@ -5162,7 +5169,7 @@ static bool api_WPrintDestGetInfo(struct smbd_server_connection *sconn, status = rpc_pipe_open_interface(conn, &ndr_table_spoolss.syntax_id, conn->session_info, - &conn->sconn->client_id, + conn->sconn->remote_address, conn->sconn->msg_ctx, &cli); if (!NT_STATUS_IS_OK(status)) { @@ -5249,7 +5256,7 @@ static bool api_WPrintDestGetInfo(struct smbd_server_connection *sconn, } static bool api_WPrintDestEnum(struct smbd_server_connection *sconn, - connection_struct *conn, uint16 vuid, + connection_struct *conn, uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt,int mprcnt, @@ -5294,7 +5301,7 @@ static bool api_WPrintDestEnum(struct smbd_server_connection *sconn, status = rpc_pipe_open_interface(conn, &ndr_table_spoolss.syntax_id, conn->session_info, - &conn->sconn->client_id, + conn->sconn->remote_address, conn->sconn->msg_ctx, &cli); if (!NT_STATUS_IS_OK(status)) { @@ -5360,7 +5367,7 @@ static bool api_WPrintDestEnum(struct smbd_server_connection *sconn, } static bool api_WPrintDriverEnum(struct smbd_server_connection *sconn, - connection_struct *conn, uint16 vuid, + connection_struct *conn, uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt,int mprcnt, @@ -5424,7 +5431,7 @@ static bool api_WPrintDriverEnum(struct smbd_server_connection *sconn, } static bool api_WPrintQProcEnum(struct smbd_server_connection *sconn, - connection_struct *conn, uint16 vuid, + connection_struct *conn, uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt,int mprcnt, @@ -5488,7 +5495,7 @@ static bool api_WPrintQProcEnum(struct smbd_server_connection *sconn, } static bool api_WPrintPortEnum(struct smbd_server_connection *sconn, - connection_struct *conn, uint16 vuid, + connection_struct *conn, uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt,int mprcnt, @@ -5558,7 +5565,7 @@ static bool api_WPrintPortEnum(struct smbd_server_connection *sconn, ****************************************************************************/ static bool api_RNetSessionEnum(struct smbd_server_connection *sconn, - connection_struct *conn, uint16 vuid, + connection_struct *conn, uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt,int mprcnt, @@ -5605,7 +5612,7 @@ static bool api_RNetSessionEnum(struct smbd_server_connection *sconn, status = rpc_pipe_open_interface(conn, &ndr_table_srvsvc.syntax_id, conn->session_info, - &conn->sconn->client_id, + conn->sconn->remote_address, conn->sconn->msg_ctx, &cli); if (!NT_STATUS_IS_OK(status)) { @@ -5697,7 +5704,7 @@ static bool api_RNetSessionEnum(struct smbd_server_connection *sconn, ****************************************************************************/ static bool api_TooSmall(struct smbd_server_connection *sconn, - connection_struct *conn,uint16 vuid, char *param, char *data, + connection_struct *conn,uint64_t vuid, char *param, char *data, int mdrcnt, int mprcnt, char **rdata, char **rparam, int *rdata_len, int *rparam_len) @@ -5722,7 +5729,7 @@ static bool api_TooSmall(struct smbd_server_connection *sconn, ****************************************************************************/ static bool api_Unsupported(struct smbd_server_connection *sconn, - connection_struct *conn, uint16 vuid, + connection_struct *conn, uint64_t vuid, char *param, int tpscnt, char *data, int tdscnt, int mdrcnt, int mprcnt, @@ -5749,7 +5756,7 @@ static const struct { const char *name; int id; bool (*fn)(struct smbd_server_connection *sconn, - connection_struct *, uint16, + connection_struct *, uint64_t, char *, int, char *, int, int,int,char **,char **,int *,int *); @@ -5801,7 +5808,7 @@ static const struct { Handle remote api calls. ****************************************************************************/ -void api_reply(connection_struct *conn, uint16 vuid, +void api_reply(connection_struct *conn, uint64_t vuid, struct smb_request *req, char *data, char *params, int tdscnt, int tpscnt, @@ -5855,9 +5862,9 @@ void api_reply(connection_struct *conn, uint16 vuid, /* Check whether this api call can be done anonymously */ if (api_commands[i].auth_user && lp_restrict_anonymous()) { - user_struct *user = get_valid_user_struct(req->sconn, vuid); + struct user_struct *user = get_valid_user_struct(req->sconn, vuid); - if (!user || user->session_info->guest) { + if (!user || security_session_user_level(user->session_info, NULL) < SECURITY_USER) { reply_nterror(req, NT_STATUS_ACCESS_DENIED); return; } |