From dbc5cace14de14556da7a32cd9f4a82ef522e401 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 27 Feb 2001 18:22:39 +0000 Subject: Hmmm. I thought I'd added these files to CVS head..... Jeremy. (This used to be commit d573700a9218bce8efd21f0be70afec6b460f8b9) --- source3/rpc_server/srv_srvsvc_nt.c | 866 +++++++++++++++++++++++++++++++++++++ 1 file changed, 866 insertions(+) create mode 100644 source3/rpc_server/srv_srvsvc_nt.c (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c new file mode 100644 index 0000000000..80794609ea --- /dev/null +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -0,0 +1,866 @@ +#define OLD_NTDOMAIN 1 +/* + * Unix SMB/Netbios implementation. + * Version 1.9. + * RPC Pipe client / server routines + * Copyright (C) Andrew Tridgell 1992-1997, + * Copyright (C) Luke Kenneth Casson Leighton 1996-1997, + * Copyright (C) Paul Ashton 1997. + * Copyright (C) Jeremy Allison 2001. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* This is the implementation of the srvsvc pipe. */ + +#include "includes.h" + +extern int DEBUGLEVEL; +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) +{ + int len_net_name; + pstring net_name; + pstring remark; + uint32 type; + + pstrcpy(net_name, lp_servicename(snum)); + pstrcpy(remark, lp_comment(snum)); + pstring_sub(remark,"%S",lp_servicename(snum)); + len_net_name = strlen(net_name); + + /* work out the share type */ + type = STYPE_DISKTREE; + + if (lp_print_ok(snum)) + type = STYPE_PRINTQ; + if (strequal("IPC$", net_name)) + type = STYPE_IPC; + if (net_name[len_net_name] == '$') + type |= STYPE_HIDDEN; + + init_srv_share_info1(&sh1->info_1, net_name, type, remark); + init_srv_share_info1_str(&sh1->info_1_str, net_name, remark); +} + +/******************************************************************* + Fill in a share info level 2 structure. + ********************************************************************/ + +static void init_srv_share_info_2(SRV_SHARE_INFO_2 *sh2, int snum) +{ + int len_net_name; + pstring net_name; + pstring remark; + pstring path; + pstring passwd; + uint32 type; + + pstrcpy(net_name, lp_servicename(snum)); + pstrcpy(remark, lp_comment(snum)); + pstring_sub(remark,"%S",lp_servicename(snum)); + pstrcpy(path, lp_pathname(snum)); + pstrcpy(passwd, ""); + len_net_name = strlen(net_name); + + /* work out the share type */ + type = STYPE_DISKTREE; + + if (lp_print_ok(snum)) + type = STYPE_PRINTQ; + if (strequal("IPC$", net_name)) + type = STYPE_IPC; + if (net_name[len_net_name] == '$') + type |= STYPE_HIDDEN; + + init_srv_share_info2(&sh2->info_2, net_name, type, remark, 0, 0xffffffff, 1, path, passwd); + init_srv_share_info2_str(&sh2->info_2_str, net_name, remark, path, passwd); +} + +/*************************************************************************** + Fill in a share info level 1005 structure. + ***************************************************************************/ + +static void init_srv_share_info_1005(SRV_SHARE_INFO_1005* sh1005, int snum) +{ + sh1005->dfs_root_flag = 0; + +#ifdef WITH_MSDFS + if(lp_host_msdfs() && lp_msdfs_root(snum)) + sh1005->dfs_root_flag = 3; +#endif + +} + +/******************************************************************* + Fill in a share info structure. + ********************************************************************/ + +static BOOL init_srv_share_info_ctr(TALLOC_CTX *ctx, SRV_SHARE_INFO_CTR *ctr, + uint32 info_level, uint32 *resume_hnd, uint32 *total_entries) +{ + int num_entries = 0; + int num_services = lp_numservices(); + int snum; + + DEBUG(5,("init_srv_share_info_ctr\n")); + + ZERO_STRUCTPN(ctr); + + ctr->info_level = ctr->switch_value = info_level; + *resume_hnd = 0; + + /* Count the number of entries. */ + for (snum = 0; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum)) + num_entries++; + } + + *total_entries = num_entries; + ctr->num_entries2 = ctr->num_entries = num_entries; + ctr->ptr_share_info = ctr->ptr_entries = 1; + + if (!num_entries) + return True; + + switch (info_level) { + case 1: + { + SRV_SHARE_INFO_1 *info1; + int i = 0; + + info1 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_1)); + + for (snum = *resume_hnd; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum)) { + init_srv_share_info_1(&info1[i++], snum); + } + } + + ctr->share.info1 = info1; + break; + } + + case 2: + { + SRV_SHARE_INFO_2 *info2; + int i = 0; + + info2 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_2)); + + for (snum = *resume_hnd; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum)) { + init_srv_share_info_2(&info2[i++], snum); + } + } + + ctr->share.info2 = info2; + break; + } + + default: + DEBUG(5,("init_srv_share_info_ctr: unsupported switch value %d\n", info_level)); + return False; + } + + return True; +} + +/******************************************************************* + 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, + uint32 info_level, uint32 resume_hnd) +{ + DEBUG(5,("init_srv_r_net_share_enum: %d\n", __LINE__)); + + if (init_srv_share_info_ctr(ctx, &r_n->ctr, info_level, + &resume_hnd, &r_n->total_entries)) { + r_n->status = NT_STATUS_NOPROBLEMO; + } else { + r_n->status = NT_STATUS_INVALID_INFO_CLASS; + } + + init_enum_hnd(&r_n->enum_hnd, resume_hnd); +} + +/******************************************************************* + Inits a SRV_R_NET_SHARE_GET_INFO structure. +********************************************************************/ + +static void init_srv_r_net_share_get_info(SRV_R_NET_SHARE_GET_INFO *r_n, + char *share_name, uint32 info_level) +{ + uint32 status = NT_STATUS_NOPROBLEMO; + int snum; + + DEBUG(5,("init_srv_r_net_share_get_info: %d\n", __LINE__)); + + r_n->switch_value = info_level; + + snum = find_service(share_name); + + if (snum >= 0) { + switch (info_level) { + case 1: + init_srv_share_info_1(&r_n->share.info1, snum); + break; + case 2: + init_srv_share_info_2(&r_n->share.info2, snum); + break; + case 1005: + init_srv_share_info_1005(&r_n->share.info1005, snum); + break; + default: + DEBUG(5,("init_srv_net_share_get_info: unsupported switch value %d\n", info_level)); + status = NT_STATUS_INVALID_INFO_CLASS; + break; + } + } else { + status = NT_STATUS_BAD_NETWORK_NAME; + } + + r_n->ptr_share_ctr = (status == NT_STATUS_NOPROBLEMO) ? 1 : 0; + r_n->status = status; +} + +/******************************************************************* + fill in a sess info level 1 structure. + ********************************************************************/ + +static void init_srv_sess_0_info(SESS_INFO_0 *se0, SESS_INFO_0_STR *str0, char *name) +{ + init_srv_sess_info0(se0, name); + init_srv_sess_info0_str(str0, name); +} + +/******************************************************************* + fill in a sess info level 0 structure. + ********************************************************************/ + +static void init_srv_sess_info_0(SRV_SESS_INFO_0 *ss0, uint32 *snum, uint32 *stot) +{ + uint32 num_entries = 0; + (*stot) = 1; + + if (ss0 == NULL) { + (*snum) = 0; + return; + } + + DEBUG(5,("init_srv_sess_0_ss0\n")); + + if (snum) { + for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) { + init_srv_sess_0_info(&ss0->info_0[num_entries], + &ss0->info_0_str[num_entries], "MACHINE"); + + /* move on to creating next session */ + /* move on to creating next sess */ + num_entries++; + } + + ss0->num_entries_read = num_entries; + ss0->ptr_sess_info = num_entries > 0 ? 1 : 0; + ss0->num_entries_read2 = num_entries; + + if ((*snum) >= (*stot)) { + (*snum) = 0; + } + + } else { + ss0->num_entries_read = 0; + ss0->ptr_sess_info = 0; + ss0->num_entries_read2 = 0; + } +} + +/******************************************************************* + fill in a sess info level 1 structure. + ********************************************************************/ + +static void init_srv_sess_1_info(SESS_INFO_1 *se1, SESS_INFO_1_STR *str1, + char *name, char *user, + uint32 num_opens, + uint32 open_time, uint32 idle_time, + uint32 usr_flgs) +{ + init_srv_sess_info1(se1 , name, user, num_opens, open_time, idle_time, usr_flgs); + init_srv_sess_info1_str(str1, name, user); +} + +/******************************************************************* + fill in a sess info level 1 structure. + ********************************************************************/ + +static void init_srv_sess_info_1(SRV_SESS_INFO_1 *ss1, uint32 *snum, uint32 *stot) +{ + uint32 num_entries = 0; + (*stot) = 1; + + if (ss1 == NULL) { + (*snum) = 0; + return; + } + + DEBUG(5,("init_srv_sess_1_ss1\n")); + + if (snum) { + for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) { + init_srv_sess_1_info(&ss1->info_1[num_entries], + &ss1->info_1_str[num_entries], + "MACHINE", "dummy_user", 1, 10, 5, 0); + + /* move on to creating next session */ + /* move on to creating next sess */ + num_entries++; + } + + ss1->num_entries_read = num_entries; + ss1->ptr_sess_info = num_entries > 0 ? 1 : 0; + ss1->num_entries_read2 = num_entries; + + if ((*snum) >= (*stot)) { + (*snum) = 0; + } + + } else { + ss1->num_entries_read = 0; + ss1->ptr_sess_info = 0; + ss1->num_entries_read2 = 0; + + (*stot) = 0; + } +} + +/******************************************************************* + makes a SRV_R_NET_SESS_ENUM structure. +********************************************************************/ + +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; + DEBUG(5,("init_srv_sess_info_ctr: %d\n", __LINE__)); + + ctr->switch_value = switch_value; + + switch (switch_value) { + case 0: + init_srv_sess_info_0(&(ctr->sess.info0), resume_hnd, total_entries); + ctr->ptr_sess_ctr = 1; + break; + case 1: + init_srv_sess_info_1(&(ctr->sess.info1), resume_hnd, total_entries); + ctr->ptr_sess_ctr = 1; + break; + default: + DEBUG(5,("init_srv_sess_info_ctr: unsupported switch value %d\n", switch_value)); + (*resume_hnd) = 0; + (*total_entries) = 0; + ctr->ptr_sess_ctr = 0; + status = NT_STATUS_INVALID_INFO_CLASS; + break; + } + + return status; +} + +/******************************************************************* + makes a SRV_R_NET_SESS_ENUM structure. +********************************************************************/ + +static void init_srv_r_net_sess_enum(SRV_R_NET_SESS_ENUM *r_n, + uint32 resume_hnd, int sess_level, int switch_value) +{ + DEBUG(5,("init_srv_r_net_sess_enum: %d\n", __LINE__)); + + r_n->sess_level = sess_level; + + if (sess_level == -1) + r_n->status = NT_STATUS_INVALID_INFO_CLASS; + 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) + resume_hnd = 0; + + init_enum_hnd(&r_n->enum_hnd, resume_hnd); +} + +/******************************************************************* + fill in a conn info level 0 structure. + ********************************************************************/ + +static void init_srv_conn_info_0(SRV_CONN_INFO_0 *ss0, uint32 *snum, uint32 *stot) +{ + uint32 num_entries = 0; + (*stot) = 1; + + if (ss0 == NULL) { + (*snum) = 0; + return; + } + + DEBUG(5,("init_srv_conn_0_ss0\n")); + + if (snum) { + for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) { + + init_srv_conn_info0(&ss0->info_0[num_entries], (*stot)); + + /* move on to creating next connection */ + /* move on to creating next conn */ + num_entries++; + } + + ss0->num_entries_read = num_entries; + ss0->ptr_conn_info = num_entries > 0 ? 1 : 0; + ss0->num_entries_read2 = num_entries; + + if ((*snum) >= (*stot)) { + (*snum) = 0; + } + + } else { + ss0->num_entries_read = 0; + ss0->ptr_conn_info = 0; + ss0->num_entries_read2 = 0; + + (*stot) = 0; + } +} + +/******************************************************************* + fill in a conn info level 1 structure. + ********************************************************************/ + +static void init_srv_conn_1_info(CONN_INFO_1 *se1, CONN_INFO_1_STR *str1, + uint32 id, uint32 type, + uint32 num_opens, uint32 num_users, uint32 open_time, + char *usr_name, char *net_name) +{ + init_srv_conn_info1(se1 , id, type, num_opens, num_users, open_time, usr_name, net_name); + init_srv_conn_info1_str(str1, usr_name, net_name); +} + +/******************************************************************* + fill in a conn info level 1 structure. + ********************************************************************/ + +static void init_srv_conn_info_1(SRV_CONN_INFO_1 *ss1, uint32 *snum, uint32 *stot) +{ + uint32 num_entries = 0; + (*stot) = 1; + + if (ss1 == NULL) { + (*snum) = 0; + return; + } + + DEBUG(5,("init_srv_conn_1_ss1\n")); + + if (snum) { + for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) { + init_srv_conn_1_info(&ss1->info_1[num_entries], + &ss1->info_1_str[num_entries], + (*stot), 0x3, 1, 1, 3,"dummy_user", "IPC$"); + + /* move on to creating next connection */ + /* move on to creating next conn */ + num_entries++; + } + + ss1->num_entries_read = num_entries; + ss1->ptr_conn_info = num_entries > 0 ? 1 : 0; + ss1->num_entries_read2 = num_entries; + + + if ((*snum) >= (*stot)) { + (*snum) = 0; + } + + } else { + ss1->num_entries_read = 0; + ss1->ptr_conn_info = 0; + ss1->num_entries_read2 = 0; + + (*stot) = 0; + } +} + +/******************************************************************* + makes a SRV_R_NET_CONN_ENUM structure. +********************************************************************/ + +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; + DEBUG(5,("init_srv_conn_info_ctr: %d\n", __LINE__)); + + ctr->switch_value = switch_value; + + switch (switch_value) { + case 0: + init_srv_conn_info_0(&ctr->conn.info0, resume_hnd, total_entries); + ctr->ptr_conn_ctr = 1; + break; + case 1: + init_srv_conn_info_1(&ctr->conn.info1, resume_hnd, total_entries); + ctr->ptr_conn_ctr = 1; + break; + default: + DEBUG(5,("init_srv_conn_info_ctr: unsupported switch value %d\n", switch_value)); + (*resume_hnd = 0); + (*total_entries) = 0; + ctr->ptr_conn_ctr = 0; + status = NT_STATUS_INVALID_INFO_CLASS; + break; + } + + return status; +} + +/******************************************************************* + makes a SRV_R_NET_CONN_ENUM structure. +********************************************************************/ + +static void init_srv_r_net_conn_enum(SRV_R_NET_CONN_ENUM *r_n, + uint32 resume_hnd, int conn_level, int switch_value) +{ + DEBUG(5,("init_srv_r_net_conn_enum: %d\n", __LINE__)); + + r_n->conn_level = conn_level; + if (conn_level == -1) + r_n->status = NT_STATUS_INVALID_INFO_CLASS; + 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) + resume_hnd = 0; + + init_enum_hnd(&r_n->enum_hnd, resume_hnd); +} + +/******************************************************************* + fill in a file info level 3 structure. + ********************************************************************/ + +static void init_srv_file_3_info(FILE_INFO_3 *fl3, FILE_INFO_3_STR *str3, + uint32 fnum, uint32 perms, uint32 num_locks, + char *path_name, char *user_name) +{ + init_srv_file_info3(fl3 , fnum, perms, num_locks, path_name, user_name); + init_srv_file_info3_str(str3, path_name, user_name); +} + +/******************************************************************* + fill in a file info level 3 structure. + ********************************************************************/ + +static void init_srv_file_info_3(SRV_FILE_INFO_3 *fl3, uint32 *fnum, uint32 *ftot) +{ + uint32 num_entries = 0; + (*ftot) = 1; + + if (fl3 == NULL) { + (*fnum) = 0; + return; + } + + DEBUG(5,("init_srv_file_3_fl3\n")); + + for (; (*fnum) < (*ftot) && num_entries < MAX_FILE_ENTRIES; (*fnum)++) { + init_srv_file_3_info(&fl3->info_3[num_entries], + &fl3->info_3_str[num_entries], + (*fnum), 0x35, 0, "\\PIPE\\samr", "dummy user"); + + /* move on to creating next file */ + num_entries++; + } + + fl3->num_entries_read = num_entries; + fl3->ptr_file_info = num_entries > 0 ? 1 : 0; + fl3->num_entries_read2 = num_entries; + + if ((*fnum) >= (*ftot)) { + (*fnum) = 0; + } +} + +/******************************************************************* + makes a SRV_R_NET_FILE_ENUM structure. +********************************************************************/ + +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; + DEBUG(5,("init_srv_file_info_ctr: %d\n", __LINE__)); + + ctr->switch_value = switch_value; + + switch (switch_value) { + case 3: + init_srv_file_info_3(&ctr->file.info3, resume_hnd, total_entries); + ctr->ptr_file_ctr = 1; + break; + default: + DEBUG(5,("init_srv_file_info_ctr: unsupported switch value %d\n", switch_value)); + (*resume_hnd = 0); + (*total_entries) = 0; + ctr->ptr_file_ctr = 0; + status = NT_STATUS_INVALID_INFO_CLASS; + break; + } + + return status; +} + +/******************************************************************* + makes a SRV_R_NET_FILE_ENUM structure. +********************************************************************/ + +static void init_srv_r_net_file_enum(SRV_R_NET_FILE_ENUM *r_n, + uint32 resume_hnd, int file_level, int switch_value) +{ + DEBUG(5,("init_srv_r_net_file_enum: %d\n", __LINE__)); + + r_n->file_level = file_level; + if (file_level == 0) + r_n->status = NT_STATUS_INVALID_INFO_CLASS; + 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) + resume_hnd = 0; + + init_enum_hnd(&r_n->enum_hnd, resume_hnd); +} + +/******************************************************************* +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; + SRV_INFO_CTR *ctr = (SRV_INFO_CTR *)talloc(p->mem_ctx, sizeof(SRV_INFO_CTR)); + + if (!ctr) + return NT_STATUS_NO_MEMORY; + + ZERO_STRUCTP(ctr); + + DEBUG(5,("srv_net_srv_get_info: %d\n", __LINE__)); + + switch (q_u->switch_value) { + case 102: + init_srv_info_102(&ctr->srv.sv102, + 500, global_myname, + string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH), + lp_major_announce_version(), lp_minor_announce_version(), + lp_default_server_announce(), + 0xffffffff, /* users */ + 0xf, /* disc */ + 0, /* hidden */ + 240, /* announce */ + 3000, /* announce delta */ + 100000, /* licenses */ + "c:\\"); /* user path */ + break; + case 101: + init_srv_info_101(&ctr->srv.sv101, + 500, global_myname, + lp_major_announce_version(), lp_minor_announce_version(), + lp_default_server_announce(), + string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH)); + break; + default: + status = NT_STATUS_INVALID_INFO_CLASS; + break; + } + + /* set up the net server get info structure */ + init_srv_r_net_srv_get_info(r_u, q_u->switch_value, ctr, status); + + DEBUG(5,("srv_net_srv_get_info: %d\n", __LINE__)); + + return r_u->status; +} + +/******************************************************************* +net file enum +********************************************************************/ + +uint32 _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_FILE_ENUM *r_u) +{ + r_u->ctr = (SRV_FILE_INFO_CTR *)talloc(p->mem_ctx, sizeof(SRV_FILE_INFO_CTR)); + if (!r_u->ctr) + return NT_STATUS_NO_MEMORY; + + ZERO_STRUCTP(r_u->ctr); + + DEBUG(5,("srv_net_file_enum: %d\n", __LINE__)); + + /* set up the */ + init_srv_r_net_file_enum(r_u, + get_enum_hnd(&q_u->enum_hnd), + q_u->file_level, + q_u->ctr->switch_value); + + DEBUG(5,("srv_net_file_enum: %d\n", __LINE__)); + + return r_u->status; +} + +/******************************************************************* +net conn enum +********************************************************************/ + +uint32 _srv_net_conn_enum(pipes_struct *p, SRV_Q_NET_CONN_ENUM *q_u, SRV_R_NET_CONN_ENUM *r_u) +{ + DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__)); + + r_u->ctr = (SRV_CONN_INFO_CTR *)talloc(p->mem_ctx, sizeof(SRV_CONN_INFO_CTR)); + if (!r_u->ctr) + return NT_STATUS_NO_MEMORY; + + ZERO_STRUCTP(r_u->ctr); + + /* set up the */ + init_srv_r_net_conn_enum(r_u, + get_enum_hnd(&q_u->enum_hnd), + q_u->conn_level, + q_u->ctr->switch_value); + + DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__)); + + return r_u->status; +} + +/******************************************************************* +net sess enum +********************************************************************/ + +uint32 _srv_net_sess_enum(pipes_struct *p, SRV_Q_NET_SESS_ENUM *q_u, SRV_R_NET_SESS_ENUM *r_u) +{ + DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__)); + + r_u->ctr = (SRV_SESS_INFO_CTR *)talloc(p->mem_ctx, sizeof(SRV_SESS_INFO_CTR)); + if (!r_u->ctr) + return NT_STATUS_NO_MEMORY; + + ZERO_STRUCTP(r_u->ctr); + + /* set up the */ + init_srv_r_net_sess_enum(r_u, + get_enum_hnd(&q_u->enum_hnd), + q_u->sess_level, + q_u->ctr->switch_value); + + DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__)); + + return r_u->status; +} + +/******************************************************************* + Net share enum. +********************************************************************/ + +uint32 _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u) +{ + 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, + q_u->ctr.info_level, + get_enum_hnd(&q_u->enum_hnd)); + + DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__)); + + return r_u->status; +} + +/******************************************************************* + Net share get info. +********************************************************************/ + +uint32 _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, SRV_R_NET_SHARE_GET_INFO *r_u) +{ + char *share_name; + + DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__)); + + /* Create the list of shares for the response. */ + share_name = dos_unistr2_to_str(&q_u->uni_share_name); + init_srv_r_net_share_get_info(r_u, share_name, q_u->info_level); + + DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__)); + + return r_u->status; +} + +/******************************************************************* +time of day +********************************************************************/ + +uint32 _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET_REMOTE_TOD *r_u) +{ + TIME_OF_DAY_INFO *tod; + struct tm *t; + time_t unixdate = time(NULL); + + tod = (TIME_OF_DAY_INFO *)talloc(p->mem_ctx, sizeof(TIME_OF_DAY_INFO)); + if (!tod) + return NT_STATUS_NO_MEMORY; + + ZERO_STRUCTP(tod); + + r_u->tod = tod; + r_u->ptr_srv_tod = 0x1; + r_u->status = NT_STATUS_NOPROBLEMO; + + DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__)); + + t = gmtime(&unixdate); + + /* set up the */ + init_time_of_day_info(tod, + unixdate, + 0, + t->tm_hour, + t->tm_min, + t->tm_sec, + 0, + TimeDiff(unixdate)/60, + 10000, + t->tm_mday, + t->tm_mon + 1, + 1900+t->tm_year, + t->tm_wday); + + DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__)); + + return r_u->status; +} +#undef OLD_NTDOMAIN -- cgit From da3053048c3d224a20d6383ac6682d31059cd46c Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Sun, 11 Mar 2001 00:32:10 +0000 Subject: Merge of new 2.2 code into HEAD (Gerald I hate you :-) :-). Allows new SAMR RPC code to merge with new passdb code. Currently rpcclient doesn't compile. I'm working on it... Jeremy. (This used to be commit 0be41d5158ea4e645e93e8cd30617c038416e549) --- source3/rpc_server/srv_srvsvc_nt.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 80794609ea..6e0043b0bb 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1,4 +1,3 @@ -#define OLD_NTDOMAIN 1 /* * Unix SMB/Netbios implementation. * Version 1.9. @@ -695,6 +694,9 @@ uint32 _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV_R lp_default_server_announce(), string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH)); break; + case 100: + init_srv_info_100(&ctr->srv.sv100, 500, global_myname); + break; default: status = NT_STATUS_INVALID_INFO_CLASS; break; @@ -863,4 +865,3 @@ uint32 _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET return r_u->status; } -#undef OLD_NTDOMAIN -- cgit From 0ef2179d23a2f9826e17c2b858fd8f2a9634b332 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 13 Mar 2001 01:44:05 +0000 Subject: Fixed reading of strings from big-endian RPC clients. Jeremy. (This used to be commit e7ecb9410ff2e4fcd33bca9f82e14c060590942a) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 6e0043b0bb..01e289866b 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -814,7 +814,7 @@ uint32 _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, S DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__)); /* Create the list of shares for the response. */ - share_name = dos_unistr2_to_str(&q_u->uni_share_name); + share_name = rpc_unistr2_to_str(&q_u->uni_share_name, p->endian); init_srv_r_net_share_get_info(r_u, share_name, q_u->info_level); DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__)); -- cgit From 4ab6182a0ffdbe92a01dd6533e0862aa8d0f6d83 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 15 Mar 2001 00:49:13 +0000 Subject: AS/U on a sparc now joins and authenticates against a Samba PDC ! Jeremy. (This used to be commit 28a0bc5f5710aa732db662caa38f9da2138b5db2) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 01e289866b..6e0043b0bb 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -814,7 +814,7 @@ uint32 _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, S DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__)); /* Create the list of shares for the response. */ - share_name = rpc_unistr2_to_str(&q_u->uni_share_name, p->endian); + share_name = dos_unistr2_to_str(&q_u->uni_share_name); init_srv_r_net_share_get_info(r_u, share_name, q_u->info_level); DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__)); -- cgit From abb183317342fbfdc75a6858d427e550f8f7123d Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 17 Mar 2001 14:07:10 +0000 Subject: fix this in rpc calls as well - ADMIN$ is an IPC share, not a disk share (This used to be commit d039d84164fa15ba242b03fdadfab2e259ca6b65) --- source3/rpc_server/srv_srvsvc_nt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 6e0043b0bb..061c70454f 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -50,7 +50,7 @@ static void init_srv_share_info_1(SRV_SHARE_INFO_1 *sh1, int snum) if (lp_print_ok(snum)) type = STYPE_PRINTQ; - if (strequal("IPC$", net_name)) + if (strequal("IPC", lp_fstype(snum))) type = STYPE_IPC; if (net_name[len_net_name] == '$') type |= STYPE_HIDDEN; @@ -84,7 +84,7 @@ static void init_srv_share_info_2(SRV_SHARE_INFO_2 *sh2, int snum) if (lp_print_ok(snum)) type = STYPE_PRINTQ; - if (strequal("IPC$", net_name)) + if (strequal("IPC", lp_fstype(snum))) type = STYPE_IPC; if (net_name[len_net_name] == '$') type |= STYPE_HIDDEN; -- cgit From 852242a1b53069e5e6c8861f8243fe4a5016001a Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 4 Apr 2001 23:42:17 +0000 Subject: I know we're supposed to be feature frozen, but I couldn't resist this... :-). I worked out and added the per-share get/set RPCs for security descriptors. Currently this code returns Everyone, full access on get and permission denied on set, but backending this with a tdb and checking it on tconX (to give full NT semantics for security on shares) is now an excersise for the reader... :-). Jeremy. (This used to be commit 3bfd155ba78798c50588904d4ea3389f50f8abb6) --- source3/rpc_server/srv_srvsvc_nt.c | 152 +++++++++++++++++++++++++++++++++++-- 1 file changed, 145 insertions(+), 7 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 061c70454f..4d6d7518bf 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -93,6 +93,73 @@ static void init_srv_share_info_2(SRV_SHARE_INFO_2 *sh2, int snum) init_srv_share_info2_str(&sh2->info_2_str, net_name, remark, path, passwd); } +/******************************************************************* + Fake up a Everyone, full access for now. + ********************************************************************/ + +static SEC_DESC *get_share_security( TALLOC_CTX *ctx, int snum, size_t *psize) +{ + extern DOM_SID global_sid_World; + SEC_ACCESS sa; + SEC_ACE ace; + SEC_ACL *psa = NULL; + SEC_DESC *psd = NULL; + + init_sec_access(&sa, GENERIC_ALL_ACCESS ); + init_sec_ace(&ace, &global_sid_World, SEC_ACE_TYPE_ACCESS_ALLOWED, sa, 0); + + if ((psa = make_sec_acl(ctx, NT4_ACL_REVISION, 1, &ace)) != NULL) { + psd = make_sec_desc(ctx, SEC_DESC_REVISION, NULL, NULL, NULL, psa, psize); + } + + if (!psd) { + DEBUG(0,("get_share_security: Failed to make SEC_DESC.\n")); + return NULL; + } + + return psd; +} + +/******************************************************************* + 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) +{ + int len_net_name; + pstring net_name; + pstring remark; + pstring path; + pstring passwd; + uint32 type; + SEC_DESC *sd; + size_t sd_size; + + ZERO_STRUCTP(sh502); + + pstrcpy(net_name, lp_servicename(snum)); + pstrcpy(remark, lp_comment(snum)); + pstring_sub(remark,"%S",lp_servicename(snum)); + pstrcpy(path, lp_pathname(snum)); + pstrcpy(passwd, ""); + len_net_name = strlen(net_name); + + /* work out the share type */ + type = STYPE_DISKTREE; + + if (lp_print_ok(snum)) + type = STYPE_PRINTQ; + if (strequal("IPC$", net_name)) + type = STYPE_IPC; + if (net_name[len_net_name] == '$') + type |= STYPE_HIDDEN; + + sd = get_share_security(ctx, snum, &sd_size); + + init_srv_share_info502(&sh502->info_502, net_name, type, remark, 0, 0xffffffff, 1, path, passwd, sd, sd_size); + init_srv_share_info502_str(&sh502->info_502_str, net_name, remark, path, passwd, sd, sd_size); +} + /*************************************************************************** Fill in a share info level 1005 structure. ***************************************************************************/ @@ -174,6 +241,23 @@ static BOOL init_srv_share_info_ctr(TALLOC_CTX *ctx, SRV_SHARE_INFO_CTR *ctr, break; } + case 502: + { + SRV_SHARE_INFO_502 *info502; + int i = 0; + + info502 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_502)); + + for (snum = *resume_hnd; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum)) { + init_srv_share_info_502(ctx, &info502[i++], snum); + } + } + + ctr->share.info502 = info502; + break; + } + default: DEBUG(5,("init_srv_share_info_ctr: unsupported switch value %d\n", info_level)); return False; @@ -205,7 +289,7 @@ 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(SRV_R_NET_SHARE_GET_INFO *r_n, +static void init_srv_r_net_share_get_info(TALLOC_CTX *ctx, SRV_R_NET_SHARE_GET_INFO *r_n, char *share_name, uint32 info_level) { uint32 status = NT_STATUS_NOPROBLEMO; @@ -213,20 +297,23 @@ static void init_srv_r_net_share_get_info(SRV_R_NET_SHARE_GET_INFO *r_n, DEBUG(5,("init_srv_r_net_share_get_info: %d\n", __LINE__)); - r_n->switch_value = info_level; + r_n->info.switch_value = info_level; snum = find_service(share_name); if (snum >= 0) { switch (info_level) { case 1: - init_srv_share_info_1(&r_n->share.info1, snum); + init_srv_share_info_1(&r_n->info.share.info1, snum); break; case 2: - init_srv_share_info_2(&r_n->share.info2, snum); + init_srv_share_info_2(&r_n->info.share.info2, snum); + break; + case 502: + init_srv_share_info_502(ctx, &r_n->info.share.info502, snum); break; case 1005: - init_srv_share_info_1005(&r_n->share.info1005, snum); + init_srv_share_info_1005(&r_n->info.share.info1005, snum); break; default: DEBUG(5,("init_srv_net_share_get_info: unsupported switch value %d\n", info_level)); @@ -237,7 +324,7 @@ static void init_srv_r_net_share_get_info(SRV_R_NET_SHARE_GET_INFO *r_n, status = NT_STATUS_BAD_NETWORK_NAME; } - r_n->ptr_share_ctr = (status == NT_STATUS_NOPROBLEMO) ? 1 : 0; + r_n->info.ptr_share_ctr = (status == NT_STATUS_NOPROBLEMO) ? 1 : 0; r_n->status = status; } @@ -815,13 +902,64 @@ 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. */ share_name = dos_unistr2_to_str(&q_u->uni_share_name); - init_srv_r_net_share_get_info(r_u, share_name, q_u->info_level); + init_srv_r_net_share_get_info(p->mem_ctx, r_u, share_name, q_u->info_level); DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__)); return r_u->status; } +/******************************************************************* + Net share set info. +********************************************************************/ + +uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, SRV_R_NET_SHARE_SET_INFO *r_u) +{ + char *share_name; + uint32 status = NT_STATUS_NOPROBLEMO; + int snum; + + DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); + + share_name = dos_unistr2_to_str(&q_u->uni_share_name); + + r_u->switch_value = q_u->info_level; + + snum = find_service(share_name); + + /* For now we only handle setting the security descriptor. JRA. */ + + if (snum >= 0) { + switch (q_u->info_level) { + case 1: + status = NT_STATUS_ACCESS_DENIED; + break; + case 2: + status = NT_STATUS_ACCESS_DENIED; + break; + case 502: + /* we set sd's here. FIXME. JRA */ + status = NT_STATUS_ACCESS_DENIED; + break; + case 1005: + status = NT_STATUS_ACCESS_DENIED; + break; + default: + DEBUG(5,("_srv_net_share_set_info: unsupported switch value %d\n", q_u->info_level)); + status = NT_STATUS_INVALID_INFO_CLASS; + break; + } + } else { + status = NT_STATUS_BAD_NETWORK_NAME; + } + + r_u->status = status; + + DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); + + return r_u->status; +} + /******************************************************************* time of day ********************************************************************/ -- cgit From 529f7c07f507f186c599826d0b10d10c131ff902 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 6 Apr 2001 01:39:12 +0000 Subject: We can now use server manager to look at Samba shares. NT still expects a ":" in the path though.... I'm looking into it. Jeremy. (This used to be commit a152c2c59a9a8972a3c73287e26e4de2f49c2d65) --- source3/rpc_server/srv_srvsvc_nt.c | 46 +++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 8 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 4d6d7518bf..5c0bdf57cb 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -175,12 +175,24 @@ static void init_srv_share_info_1005(SRV_SHARE_INFO_1005* sh1005, int snum) } +/******************************************************************* + True if it ends in '$'. + ********************************************************************/ + +static BOOL is_admin_share(int snum) +{ + pstring net_name; + + pstrcpy(net_name, lp_servicename(snum)); + return (net_name[strlen(net_name)] == '$') ? True : False; +} + /******************************************************************* Fill in a share info structure. ********************************************************************/ static BOOL init_srv_share_info_ctr(TALLOC_CTX *ctx, SRV_SHARE_INFO_CTR *ctr, - uint32 info_level, uint32 *resume_hnd, uint32 *total_entries) + uint32 info_level, uint32 *resume_hnd, uint32 *total_entries, BOOL all_shares) { int num_entries = 0; int num_services = lp_numservices(); @@ -195,7 +207,7 @@ static BOOL init_srv_share_info_ctr(TALLOC_CTX *ctx, SRV_SHARE_INFO_CTR *ctr, /* Count the number of entries. */ for (snum = 0; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum)) + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_admin_share(snum)) ) num_entries++; } @@ -215,7 +227,7 @@ static BOOL init_srv_share_info_ctr(TALLOC_CTX *ctx, SRV_SHARE_INFO_CTR *ctr, info1 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_1)); for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum)) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_admin_share(snum)) ) { init_srv_share_info_1(&info1[i++], snum); } } @@ -232,7 +244,7 @@ static BOOL init_srv_share_info_ctr(TALLOC_CTX *ctx, SRV_SHARE_INFO_CTR *ctr, info2 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_2)); for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum)) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_admin_share(snum)) ) { init_srv_share_info_2(&info2[i++], snum); } } @@ -249,7 +261,7 @@ static BOOL init_srv_share_info_ctr(TALLOC_CTX *ctx, SRV_SHARE_INFO_CTR *ctr, info502 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_502)); for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum)) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_admin_share(snum)) ) { init_srv_share_info_502(ctx, &info502[i++], snum); } } @@ -271,12 +283,12 @@ static BOOL init_srv_share_info_ctr(TALLOC_CTX *ctx, SRV_SHARE_INFO_CTR *ctr, ********************************************************************/ static void init_srv_r_net_share_enum(TALLOC_CTX *ctx, SRV_R_NET_SHARE_ENUM *r_n, - uint32 info_level, uint32 resume_hnd) + 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, - &resume_hnd, &r_n->total_entries)) { + &resume_hnd, &r_n->total_entries, all)) { r_n->status = NT_STATUS_NOPROBLEMO; } else { r_n->status = NT_STATUS_INVALID_INFO_CLASS; @@ -872,6 +884,24 @@ uint32 _srv_net_sess_enum(pipes_struct *p, SRV_Q_NET_SESS_ENUM *q_u, SRV_R_NET_S return r_u->status; } +/******************************************************************* + Net share enum all. +********************************************************************/ + +uint32 _srv_net_share_enum_all(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u) +{ + 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, + q_u->ctr.info_level, + get_enum_hnd(&q_u->enum_hnd), True); + + DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__)); + + return r_u->status; +} + /******************************************************************* Net share enum. ********************************************************************/ @@ -883,7 +913,7 @@ uint32 _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET /* Create the list of shares for the response. */ init_srv_r_net_share_enum(p->mem_ctx, r_u, q_u->ctr.info_level, - get_enum_hnd(&q_u->enum_hnd)); + get_enum_hnd(&q_u->enum_hnd), False); DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__)); -- cgit From 68c8638b36b5326a33f0c7ce09cdb8d400495de3 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 6 Apr 2001 02:12:07 +0000 Subject: NT sucks ! :-). We have to prefix the UNIX path with a C: in order to pass the server manager tests :-). Ensure we don't set a return level on set as server manager barfs.... Jeremy. (This used to be commit cb66e78c181878809e367f4f03f3b4c31cb4b8e1) --- source3/rpc_server/srv_srvsvc_nt.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 5c0bdf57cb..82a299d18e 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -75,7 +75,8 @@ 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)); - pstrcpy(path, lp_pathname(snum)); + pstrcpy(path, "C:"); + pstrcat(path, lp_pathname(snum)); pstrcpy(passwd, ""); len_net_name = strlen(net_name); @@ -140,7 +141,8 @@ static void init_srv_share_info_502(TALLOC_CTX *ctx, SRV_SHARE_INFO_502 *sh502, pstrcpy(net_name, lp_servicename(snum)); pstrcpy(remark, lp_comment(snum)); pstring_sub(remark,"%S",lp_servicename(snum)); - pstrcpy(path, lp_pathname(snum)); + pstrcpy(path, "C:"); + pstrcat(path, lp_pathname(snum)); pstrcpy(passwd, ""); len_net_name = strlen(net_name); @@ -962,17 +964,17 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S if (snum >= 0) { switch (q_u->info_level) { case 1: - status = NT_STATUS_ACCESS_DENIED; + status = ERROR_ACCESS_DENIED; break; case 2: - status = NT_STATUS_ACCESS_DENIED; + status = ERROR_ACCESS_DENIED; break; case 502: /* we set sd's here. FIXME. JRA */ - status = NT_STATUS_ACCESS_DENIED; + status = ERROR_ACCESS_DENIED; break; case 1005: - status = NT_STATUS_ACCESS_DENIED; + status = ERROR_ACCESS_DENIED; break; default: DEBUG(5,("_srv_net_share_set_info: unsupported switch value %d\n", q_u->info_level)); @@ -983,6 +985,7 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S status = NT_STATUS_BAD_NETWORK_NAME; } + r_u->switch_value = 0; r_u->status = status; DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); -- cgit From 3874261774ef9b56461602b4aea3cf4e7b9cc5a0 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 6 Apr 2001 17:41:47 +0000 Subject: Added stub function for NET_SHARE_ADD. Once this is implemented to call a hook function (same for NET_SHARE_DELETE and NET_SHARE_SET) we will be able to manage the shares section in smb.conf via NT server manager........ This should enhance the friendliness of Samba in NT-only shops by an order of magnitude. Jeremy. (This used to be commit a2cd5f2ba11164a17622b96374ab43070f9ed691) --- source3/rpc_server/srv_srvsvc_nt.c | 40 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 82a299d18e..acb8846db6 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -993,6 +993,46 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S return r_u->status; } +/******************************************************************* + Net share add. Stub for now. JRA. +********************************************************************/ + +uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_SHARE_ADD *r_u) +{ + uint32 status = NT_STATUS_NOPROBLEMO; + + DEBUG(5,("_srv_net_share_add: %d\n", __LINE__)); + + r_u->switch_value = q_u->info_level; + + switch (q_u->info_level) { + case 1: + status = ERROR_ACCESS_DENIED; + break; + case 2: + status = ERROR_ACCESS_DENIED; + break; + case 502: + /* we set sd's here. FIXME. JRA */ + status = ERROR_ACCESS_DENIED; + break; + case 1005: + status = ERROR_ACCESS_DENIED; + break; + default: + DEBUG(5,("_srv_net_share_add: unsupported switch value %d\n", q_u->info_level)); + status = NT_STATUS_INVALID_INFO_CLASS; + break; + } + + r_u->switch_value = 0; + r_u->status = status; + + DEBUG(5,("_srv_net_share_add: %d\n", __LINE__)); + + return r_u->status; +} + /******************************************************************* time of day ********************************************************************/ -- cgit From 97cf9d3a3de4d005477ee07423b7d9c34d6d1761 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 6 Apr 2001 18:25:17 +0000 Subject: Implemented stub function for NET_SHARE_DELETE. Now to implement the real internals to support server manager. Jeremy (This used to be commit 3512ba1f655d5588db87f1afa1d12f599ad7b74a) --- source3/rpc_server/srv_srvsvc_nt.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index acb8846db6..0e03918bfb 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -955,7 +955,7 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S share_name = dos_unistr2_to_str(&q_u->uni_share_name); - r_u->switch_value = q_u->info_level; + r_u->switch_value = 0; snum = find_service(share_name); @@ -985,7 +985,6 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S status = NT_STATUS_BAD_NETWORK_NAME; } - r_u->switch_value = 0; r_u->status = status; DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); @@ -1003,7 +1002,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__)); - r_u->switch_value = q_u->info_level; + r_u->switch_value = 0; switch (q_u->info_level) { case 1: @@ -1025,7 +1024,6 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S break; } - r_u->switch_value = 0; r_u->status = status; DEBUG(5,("_srv_net_share_add: %d\n", __LINE__)); @@ -1033,6 +1031,29 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S return r_u->status; } +/******************************************************************* + Net share delete. Stub for now. JRA. +********************************************************************/ + +uint32 _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u) +{ + char *share_name; + uint32 status = NT_STATUS_NOPROBLEMO; + int snum; + + DEBUG(5,("_srv_net_share_del: %d\n", __LINE__)); + + share_name = dos_unistr2_to_str(&q_u->uni_share_name); + + snum = find_service(share_name); + + if (snum < 0) + return NT_STATUS_BAD_NETWORK_NAME; + + /* Stub... */ + return ERROR_ACCESS_DENIED; +} + /******************************************************************* time of day ********************************************************************/ -- cgit From 950f1d9605179d75ab0755cecffbabbde769beb9 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Sat, 7 Apr 2001 00:36:38 +0000 Subject: Added 3 params to manipulate shares. "add share command/change share command/ delete share command". Implemented "delete" - more work to come on add and change. Jeremy. (This used to be commit 2e6b1759e14456421066ee131af70a495f862f2b) --- source3/rpc_server/srv_srvsvc_nt.c | 95 ++++++++++++++++++++++++++++++++------ 1 file changed, 82 insertions(+), 13 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 0e03918bfb..fb911a0d85 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -928,12 +928,12 @@ uint32 _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET uint32 _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, SRV_R_NET_SHARE_GET_INFO *r_u) { - char *share_name; + fstring share_name; DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__)); /* Create the list of shares for the response. */ - share_name = dos_unistr2_to_str(&q_u->uni_share_name); + 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); DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__)); @@ -947,13 +947,16 @@ uint32 _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, S uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, SRV_R_NET_SHARE_SET_INFO *r_u) { - char *share_name; + fstring share_name; uint32 status = NT_STATUS_NOPROBLEMO; int snum; + fstring servicename; + fstring comment; + pstring pathname; DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); - share_name = dos_unistr2_to_str(&q_u->uni_share_name); + unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name)); r_u->switch_value = 0; @@ -993,29 +996,51 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S } /******************************************************************* - Net share add. Stub for now. JRA. + Net share add. Call 'add_share_command "sharename" "pathname" "comment"' ********************************************************************/ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_SHARE_ADD *r_u) { + struct current_user user; + pstring command; uint32 status = NT_STATUS_NOPROBLEMO; + fstring share_name; + fstring comment; + pstring pathname; + char *ptr; + int type; + int snum; DEBUG(5,("_srv_net_share_add: %d\n", __LINE__)); r_u->switch_value = 0; + get_current_user(&user,p); + + if (user.uid != 0) + return ERROR_ACCESS_DENIED; + + if (!lp_add_share_cmd()) + return ERROR_ACCESS_DENIED; + switch (q_u->info_level) { case 1: + /* Not enough info in a level 1 to do anything. */ status = ERROR_ACCESS_DENIED; break; case 2: - status = ERROR_ACCESS_DENIED; + 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)); + unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(share_name)); break; case 502: /* we set sd's here. FIXME. JRA */ - status = ERROR_ACCESS_DENIED; + unistr2_to_ascii(share_name, &q_u->info.share.info502.info_502_str.uni_netname, sizeof(share_name)); + unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(share_name)); + unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(share_name)); break; case 1005: + /* DFS only level. */ status = ERROR_ACCESS_DENIED; break; default: @@ -1024,6 +1049,26 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S break; } + snum = find_service(share_name); + + /* Share already exists. */ + if (snum >= 0) + return NT_STATUS_BAD_NETWORK_NAME; + + /* Convert any '\' paths to '/' */ + unix_format(pathname); + unix_clean_name(pathname); + + /* NT is braindead - it wants a C: prefix to a pathname ! */ + ptr = pathname; + if (strlen(pathname) > 2 && ptr[1] == ':' && ptr[0] != '/') + ptr += 2; + + slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\"", + lp_add_share_cmd(), share_name, ptr, comment ); + +/* HERE ! JRA */ + r_u->status = status; DEBUG(5,("_srv_net_share_add: %d\n", __LINE__)); @@ -1032,26 +1077,50 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S } /******************************************************************* - Net share delete. Stub for now. JRA. + Net share delete. Call "delete share command" with the share name as + a parameter. ********************************************************************/ uint32 _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u) { - char *share_name; - uint32 status = NT_STATUS_NOPROBLEMO; + struct current_user user; + pstring command; + fstring share_name; + int ret; int snum; DEBUG(5,("_srv_net_share_del: %d\n", __LINE__)); - share_name = dos_unistr2_to_str(&q_u->uni_share_name); + unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name)); snum = find_service(share_name); if (snum < 0) return NT_STATUS_BAD_NETWORK_NAME; - /* Stub... */ - return ERROR_ACCESS_DENIED; + get_current_user(&user,p); + + if (user.uid != 0) + return ERROR_ACCESS_DENIED; + + if (!lp_delete_share_cmd()) + return ERROR_ACCESS_DENIED; + + slprintf(command, sizeof(command)-1, "%s \"%s\"", lp_delete_share_cmd(), 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, False)) != 0) { + DEBUG(0,("_srv_net_share_del: Running [%s] returned (%d)\n", command, ret )); + return ERROR_ACCESS_DENIED; + } + + /* Send SIGHUP to process group. */ + kill(0, SIGHUP); + + lp_killservice(snum); + + return NT_STATUS_NOPROBLEMO; } /******************************************************************* -- cgit From 8e9d11f0144a5e216197ed419ffd4883736edd3c Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Sat, 7 Apr 2001 18:46:47 +0000 Subject: Fixed up the "add" command - although not SD's yet. Now for the SD db and the "change" command. Jeremy. (This used to be commit bdec63bedbeabb9d74d68a7f03254acc291df76b) --- source3/rpc_server/srv_srvsvc_nt.c | 93 ++++++++++++++++++++++++++++++-------- 1 file changed, 74 insertions(+), 19 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index fb911a0d85..1bff054aa4 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -950,9 +950,11 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S fstring share_name; uint32 status = NT_STATUS_NOPROBLEMO; int snum; +#if 0 fstring servicename; fstring comment; pstring pathname; +#endif DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); @@ -995,6 +997,49 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S return r_u->status; } +/******************************************************************* + Check a given DOS pathname is valid for a share. +********************************************************************/ + +static char *valid_share_pathname(char *dos_pathname) +{ + pstring saved_pathname; + pstring unix_pathname; + char *ptr; + int ret; + + /* Convert any '\' paths to '/' */ + unix_format(dos_pathname); + unix_clean_name(dos_pathname); + + /* NT is braindead - it wants a C: prefix to a pathname ! So strip it. */ + ptr = dos_pathname; + if (strlen(dos_pathname) > 2 && ptr[1] == ':' && ptr[0] != '/') + ptr += 2; + + /* Only abolute paths allowed. */ + if (*ptr != '/') + return NULL; + + /* Can we cd to it ? */ + + /* First save our current directory. */ + 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); + + /* We *MUST* be able to chdir back. Abort if we can't. */ + if (chdir(saved_pathname) == -1) + smb_panic("valid_share_pathname: Unable to restore current directory.\n"); + + return (ret != -1) ? ptr : NULL; +} + /******************************************************************* Net share add. Call 'add_share_command "sharename" "pathname" "comment"' ********************************************************************/ @@ -1003,13 +1048,13 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S { struct current_user user; pstring command; - uint32 status = NT_STATUS_NOPROBLEMO; fstring share_name; fstring comment; pstring pathname; - char *ptr; int type; int snum; + int ret; + char *ptr; DEBUG(5,("_srv_net_share_add: %d\n", __LINE__)); @@ -1026,27 +1071,26 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S switch (q_u->info_level) { case 1: /* Not enough info in a level 1 to do anything. */ - status = ERROR_ACCESS_DENIED; - break; + return ERROR_ACCESS_DENIED; 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)); unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(share_name)); + type = q_u->info.share.info2.info_2.type; break; case 502: /* we set sd's here. FIXME. JRA */ unistr2_to_ascii(share_name, &q_u->info.share.info502.info_502_str.uni_netname, sizeof(share_name)); unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(share_name)); unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(share_name)); + type = q_u->info.share.info502.info_502.type; break; case 1005: /* DFS only level. */ - status = ERROR_ACCESS_DENIED; - break; + return ERROR_ACCESS_DENIED; default: DEBUG(5,("_srv_net_share_add: unsupported switch value %d\n", q_u->info_level)); - status = NT_STATUS_INVALID_INFO_CLASS; - break; + return NT_STATUS_INVALID_INFO_CLASS; } snum = find_service(share_name); @@ -1055,25 +1099,36 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S if (snum >= 0) return NT_STATUS_BAD_NETWORK_NAME; - /* Convert any '\' paths to '/' */ - unix_format(pathname); - unix_clean_name(pathname); - - /* NT is braindead - it wants a C: prefix to a pathname ! */ - ptr = pathname; - if (strlen(pathname) > 2 && ptr[1] == ':' && ptr[0] != '/') - ptr += 2; + /* We can only add disk shares. */ + if (type != STYPE_DISKTREE) + return ERROR_ACCESS_DENIED; + + /* Check if the pathname is valid. */ + if (!(ptr = valid_share_pathname( pathname ))) + return ERRbadpath; slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\"", lp_add_share_cmd(), share_name, ptr, comment ); + dos_to_unix(command, True); /* Convert to unix-codepage */ -/* HERE ! JRA */ + DEBUG(10,("_srv_net_share_add: Running [%s]\n", command )); + if ((ret = smbrun(command, NULL, False)) != 0) { + DEBUG(0,("_srv_net_share_add: Running [%s] returned (%d)\n", command, ret )); + return ERROR_ACCESS_DENIED; + } - r_u->status = status; + /* Send SIGHUP to process group. */ + kill(0, SIGHUP); + + /* + * We don't call reload_services() here, the SIGHUP will + * cause this to be done before the next packet is read + * from the client. JRA. + */ DEBUG(5,("_srv_net_share_add: %d\n", __LINE__)); - return r_u->status; + return NT_STATUS_NOPROBLEMO; } /******************************************************************* -- cgit From 607d5d508d091d6c9b9cd6549b2a89f7359d780c Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Sun, 8 Apr 2001 20:01:51 +0000 Subject: Added per-share security tdb. Tidied up many slprintfs (need -1 on length). Jeremy. (This used to be commit d786191bc116c17a3f53a1c272d969942b7e5d25) --- source3/rpc_server/srv_srvsvc_nt.c | 258 ++++++++++++++++++++++++++++--------- 1 file changed, 198 insertions(+), 60 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 1bff054aa4..5c1c16c02a 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -95,10 +95,43 @@ static void init_srv_share_info_2(SRV_SHARE_INFO_2 *sh2, int snum) } /******************************************************************* - Fake up a Everyone, full access for now. + Create the share security tdb. ********************************************************************/ -static SEC_DESC *get_share_security( TALLOC_CTX *ctx, int snum, size_t *psize) +static TDB_CONTEXT *share_tdb; /* used for share security descriptors */ +#define SHARE_DATABASE_VERSION 1 + +BOOL share_info_db_init(void) +{ + static pid_t local_pid; + char *vstring = "INFO/version"; + + if (share_tdb && local_pid == sys_getpid()) return True; + share_tdb = tdb_open(lock_path("share_info.tdb"), 0, 0, 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) )); + return False; + } + + local_pid = sys_getpid(); + + /* handle a Samba upgrade */ + tdb_lock_bystring(share_tdb, vstring); + if (tdb_fetch_int(share_tdb, vstring) != SHARE_DATABASE_VERSION) { + tdb_traverse(share_tdb, (tdb_traverse_func)tdb_delete, NULL); + tdb_store_int(share_tdb, vstring, SHARE_DATABASE_VERSION); + } + tdb_unlock_bystring(share_tdb, vstring); + + return True; +} + +/******************************************************************* + Fake up a Everyone, full access as a default. + ********************************************************************/ + +static SEC_DESC *get_share_security_default( TALLOC_CTX *ctx, int snum, size_t *psize) { extern DOM_SID global_sid_World; SEC_ACCESS sa; @@ -121,6 +154,94 @@ static SEC_DESC *get_share_security( TALLOC_CTX *ctx, int snum, size_t *psize) return psd; } +/******************************************************************* + Pull a security descriptor from the share tdb. + ********************************************************************/ + +SEC_DESC *get_share_security( TALLOC_CTX *ctx, int snum, size_t *psize) +{ + prs_struct ps; + fstring key; + SEC_DESC *psd; + + /* Fetch security descriptor from tdb */ + + slprintf(key, sizeof(key)-1, "SECDESC/%s", lp_servicename(snum)); + + if (tdb_prs_fetch(share_tdb, key, &ps, ctx)!=0 || + !sec_io_desc("get_share_security", &psd, &ps, 1)) { + + DEBUG(4,("get_share_security: using default secdesc for %s\n", lp_servicename(snum) )); + + return get_share_security_default(ctx, snum, psize); + } + + prs_mem_free(&ps); + return psd; +} + +/******************************************************************* + Store a security descriptor in the share db. + ********************************************************************/ + +static BOOL set_share_security(TALLOC_CTX *ctx, int snum, SEC_DESC *psd) +{ + prs_struct ps; + TALLOC_CTX *mem_ctx = NULL; + fstring key; + BOOL ret = False; + + mem_ctx = talloc_init(); + if (mem_ctx == NULL) + return False; + + prs_init(&ps, (uint32)sec_desc_size(psd), mem_ctx, MARSHALL); + + if (!sec_io_desc("nt_printing_setsec", &psd, &ps, 1)) { + goto out; + } + + slprintf(key, sizeof(key)-1, "SECDESC/%s", lp_servicename(snum)); + + if (tdb_prs_store(share_tdb, key, &ps)==0) { + ret = True; + DEBUG(5,("set_share_security: stored secdesc for %s\n", lp_servicename(snum) )); + } else { + DEBUG(1,("set_share_security: Failed to store secdesc for %s\n", lp_servicename(snum) )); + } + + /* Free malloc'ed memory */ + + out: + + prs_mem_free(&ps); + if (mem_ctx) + talloc_destroy(mem_ctx); + return ret; +} + +/******************************************************************* + Delete a security descriptor. +********************************************************************/ + +static BOOL delete_share_security(int snum) +{ + TDB_DATA kbuf; + fstring key; + + slprintf(key, sizeof(key)-1, "SECDESC/%s", lp_servicename(snum)); + kbuf.dptr = key; + kbuf.dsize = strlen(key)+1; + + if (tdb_delete(share_tdb, kbuf) != 0) { + DEBUG(0,("delete_share_security: Failed to delete entry for share %s\n", + lp_servicename(snum) )); + return False; + } + + return True; +} + /******************************************************************* Fill in a share info level 502 structure. ********************************************************************/ @@ -941,62 +1062,6 @@ uint32 _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, S return r_u->status; } -/******************************************************************* - Net share set info. -********************************************************************/ - -uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, SRV_R_NET_SHARE_SET_INFO *r_u) -{ - fstring share_name; - uint32 status = NT_STATUS_NOPROBLEMO; - int snum; -#if 0 - fstring servicename; - fstring comment; - pstring pathname; -#endif - - DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); - - unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name)); - - r_u->switch_value = 0; - - snum = find_service(share_name); - - /* For now we only handle setting the security descriptor. JRA. */ - - if (snum >= 0) { - switch (q_u->info_level) { - case 1: - status = ERROR_ACCESS_DENIED; - break; - case 2: - status = ERROR_ACCESS_DENIED; - break; - case 502: - /* we set sd's here. FIXME. JRA */ - status = ERROR_ACCESS_DENIED; - break; - case 1005: - status = ERROR_ACCESS_DENIED; - break; - default: - DEBUG(5,("_srv_net_share_set_info: unsupported switch value %d\n", q_u->info_level)); - status = NT_STATUS_INVALID_INFO_CLASS; - break; - } - } else { - status = NT_STATUS_BAD_NETWORK_NAME; - } - - r_u->status = status; - - DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); - - return r_u->status; -} - /******************************************************************* Check a given DOS pathname is valid for a share. ********************************************************************/ @@ -1040,6 +1105,68 @@ static char *valid_share_pathname(char *dos_pathname) return (ret != -1) ? ptr : NULL; } +/******************************************************************* + Net share set info. Modify share details. +********************************************************************/ + +uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, SRV_R_NET_SHARE_SET_INFO *r_u) +{ + struct current_user user; + pstring command; + fstring share_name; + fstring comment; + pstring pathname; + int type; + int snum; + int ret; + char *ptr; + BOOL read_only; + + DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); + + unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name)); + + r_u->switch_value = 0; + + snum = find_service(share_name); + + /* Does this share exist ? */ + if (snum < 0) + return NT_STATUS_BAD_NETWORK_NAME; + + get_current_user(&user,p); + + if (user.uid != 0) + return ERROR_ACCESS_DENIED; + + if (!lp_change_share_cmd()) + return ERROR_ACCESS_DENIED; + + switch (q_u->info_level) { + case 1: + return ERROR_ACCESS_DENIED; + break; + case 2: + return ERROR_ACCESS_DENIED; + break; + case 502: + /* we set sd's here. FIXME. JRA */ + return ERROR_ACCESS_DENIED; + break; + case 1005: + return ERROR_ACCESS_DENIED; + break; + default: + DEBUG(5,("_srv_net_share_set_info: unsupported switch value %d\n", q_u->info_level)); + return NT_STATUS_INVALID_INFO_CLASS; + break; + } + + DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); + + return NT_STATUS_NOPROBLEMO; +} + /******************************************************************* Net share add. Call 'add_share_command "sharename" "pathname" "comment"' ********************************************************************/ @@ -1055,6 +1182,7 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S int snum; int ret; char *ptr; + BOOL read_only = False; DEBUG(5,("_srv_net_share_add: %d\n", __LINE__)); @@ -1077,6 +1205,7 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S 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)); type = q_u->info.share.info2.info_2.type; + read_only = False; /* No SD means "Everyone full access. */ break; case 502: /* we set sd's here. FIXME. JRA */ @@ -1107,8 +1236,14 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S if (!(ptr = valid_share_pathname( pathname ))) return ERRbadpath; - slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\"", - lp_add_share_cmd(), share_name, ptr, comment ); + /* Ensure share name, pathname and comment don't contain '"' characters. */ + string_replace(share_name, '"', ' '); + string_replace(ptr, '"', ' '); + string_replace(comment, '"', ' '); + + slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\"", + lp_add_share_cmd(), share_name, ptr, comment, + read_only ? "read only = yes" : "read only = no" ); dos_to_unix(command, True); /* Convert to unix-codepage */ DEBUG(10,("_srv_net_share_add: Running [%s]\n", command )); @@ -1170,6 +1305,9 @@ uint32 _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S return ERROR_ACCESS_DENIED; } + /* Delete the SD in the database. */ + delete_share_security(snum); + /* Send SIGHUP to process group. */ kill(0, SIGHUP); -- cgit From 9d6dd97624f50dec3edd3bb9a3c0f7f47f9ae071 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 9 Apr 2001 06:36:38 +0000 Subject: Added set/get SD's on shares. Check before tcon. Jeremy. (This used to be commit 036b1a8b09fe6a7cca83d631624145574acad7f2) --- source3/rpc_server/srv_srvsvc_nt.c | 159 +++++++++++++++++++++++++++++++++---- 1 file changed, 142 insertions(+), 17 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 5c1c16c02a..4395a20e46 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -158,7 +158,7 @@ static SEC_DESC *get_share_security_default( TALLOC_CTX *ctx, int snum, size_t * Pull a security descriptor from the share tdb. ********************************************************************/ -SEC_DESC *get_share_security( TALLOC_CTX *ctx, int snum, size_t *psize) +static SEC_DESC *get_share_security( TALLOC_CTX *ctx, int snum, size_t *psize) { prs_struct ps; fstring key; @@ -184,7 +184,7 @@ SEC_DESC *get_share_security( TALLOC_CTX *ctx, int snum, size_t *psize) Store a security descriptor in the share db. ********************************************************************/ -static BOOL set_share_security(TALLOC_CTX *ctx, int snum, SEC_DESC *psd) +static BOOL set_share_security(TALLOC_CTX *ctx, const char *share_name, SEC_DESC *psd) { prs_struct ps; TALLOC_CTX *mem_ctx = NULL; @@ -201,13 +201,13 @@ static BOOL set_share_security(TALLOC_CTX *ctx, int snum, SEC_DESC *psd) goto out; } - slprintf(key, sizeof(key)-1, "SECDESC/%s", lp_servicename(snum)); + slprintf(key, sizeof(key)-1, "SECDESC/%s", share_name); if (tdb_prs_store(share_tdb, key, &ps)==0) { ret = True; - DEBUG(5,("set_share_security: stored secdesc for %s\n", lp_servicename(snum) )); + DEBUG(5,("set_share_security: stored secdesc for %s\n", share_name )); } else { - DEBUG(1,("set_share_security: Failed to store secdesc for %s\n", lp_servicename(snum) )); + DEBUG(1,("set_share_security: Failed to store secdesc for %s\n", share_name )); } /* Free malloc'ed memory */ @@ -242,6 +242,73 @@ static BOOL delete_share_security(int snum) return True; } +/******************************************************************* + Does this security descriptor map to a read only share ? +********************************************************************/ + +static BOOL read_only_share_sd(SEC_DESC *psd) +{ + int i; + SEC_ACL *ps_dacl = psd->dacl; + + if (!ps_dacl) + return True; + + for (i = 0; i < ps_dacl->num_aces; i++) { + SEC_ACE *psa = &ps_dacl->ace[i]; + + if (psa->type == SEC_ACE_TYPE_ACCESS_ALLOWED && + psa->info.mask & FILE_WRITE_DATA) + return False; + } + + return True; +} + +/******************************************************************* + Can this user access with share with the required permissions ? +********************************************************************/ + +BOOL share_access_check(int snum, uint16 vuid, uint32 desired_access) +{ + uint32 granted, status; + TALLOC_CTX *mem_ctx = NULL; + SEC_DESC *psd = NULL; + size_t sd_size; + struct current_user tmp_user; + struct current_user *puser = NULL; + user_struct *vuser = get_valid_user_struct(vuid); + BOOL ret = True; + + mem_ctx = talloc_init(); + if (mem_ctx == NULL) + return False; + + psd = get_share_security(mem_ctx, snum, &sd_size); + + if (!psd) + goto out; + + if (vuser) { + ZERO_STRUCT(tmp_user); + 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; + puser = &tmp_user; + } + + ret = se_access_check(psd, puser, desired_access, &granted, &status); + + out: + + talloc_destroy(mem_ctx); + + return ret; +} + /******************************************************************* Fill in a share info level 502 structure. ********************************************************************/ @@ -1120,7 +1187,8 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S int snum; int ret; char *ptr; - BOOL read_only; + SEC_DESC *psd = NULL; + BOOL read_only = False; DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); @@ -1139,27 +1207,76 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S if (user.uid != 0) return ERROR_ACCESS_DENIED; - if (!lp_change_share_cmd()) - return ERROR_ACCESS_DENIED; - switch (q_u->info_level) { case 1: + /* Not enough info in a level 1 to do anything. */ return ERROR_ACCESS_DENIED; - break; case 2: - return ERROR_ACCESS_DENIED; + 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)); + type = q_u->info.share.info2.info_2.type; + read_only = False; /* No SD means "Everyone full access. */ break; case 502: - /* we set sd's here. FIXME. JRA */ - return ERROR_ACCESS_DENIED; + unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(share_name)); + unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(share_name)); + type = q_u->info.share.info502.info_502.type; + psd = q_u->info.share.info502.info_502_str.sd; + read_only = read_only_share_sd(psd); break; case 1005: return ERROR_ACCESS_DENIED; - break; default: DEBUG(5,("_srv_net_share_set_info: unsupported switch value %d\n", q_u->info_level)); return NT_STATUS_INVALID_INFO_CLASS; - break; + } + + /* We can only modify disk shares. */ + if (type != STYPE_DISKTREE) + return ERROR_ACCESS_DENIED; + + /* Check if the pathname is valid. */ + if (!(ptr = valid_share_pathname( pathname ))) + return ERRbadpath; + + /* Ensure share name, pathname and comment don't contain '"' characters. */ + string_replace(share_name, '"', ' '); + string_replace(ptr, '"', ' '); + string_replace(comment, '"', ' '); + + /* Only call modify function if something changed. */ + + if (read_only != lp_readonly(snum) || strcmp(ptr, lp_pathname(snum)) || strcmp(comment, lp_comment(snum)) ) { + if (!lp_change_share_cmd()) + return ERROR_ACCESS_DENIED; + + slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\"", + lp_change_share_cmd(), share_name, ptr, comment, + read_only ? "read only = yes" : "read only = no" ); + 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, False)) != 0) { + DEBUG(0,("_srv_net_share_set_info: Running [%s] returned (%d)\n", command, ret )); + return ERROR_ACCESS_DENIED; + } + + /* Send SIGHUP to process group. */ + kill(0, SIGHUP); + } + + /* Replace SD if changed. */ + if (psd) { + SEC_DESC *old_sd; + size_t sd_size; + + old_sd = get_share_security(p->mem_ctx, snum, &sd_size); + + if (old_sd && !sec_desc_equal(old_sd, psd)) { + if (!set_share_security(p->mem_ctx, share_name, psd)) + DEBUG(0,("_srv_net_share_set_info: Failed to change security info in share %s.\n", + share_name )); + } } DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); @@ -1168,7 +1285,7 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S } /******************************************************************* - Net share add. Call 'add_share_command "sharename" "pathname" "comment"' + Net share add. Call 'add_share_command "sharename" "pathname" "comment" "read only = xxx"' ********************************************************************/ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_SHARE_ADD *r_u) @@ -1183,6 +1300,7 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S int ret; char *ptr; BOOL read_only = False; + SEC_DESC *psd = NULL; DEBUG(5,("_srv_net_share_add: %d\n", __LINE__)); @@ -1208,11 +1326,12 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S read_only = False; /* No SD means "Everyone full access. */ break; case 502: - /* we set sd's here. FIXME. JRA */ unistr2_to_ascii(share_name, &q_u->info.share.info502.info_502_str.uni_netname, sizeof(share_name)); unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(share_name)); unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(share_name)); type = q_u->info.share.info502.info_502.type; + psd = q_u->info.share.info502.info_502_str.sd; + read_only = read_only_share_sd(psd); break; case 1005: /* DFS only level. */ @@ -1252,6 +1371,12 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S return ERROR_ACCESS_DENIED; } + if (psd) { + if (!set_share_security(p->mem_ctx, share_name, psd)) + DEBUG(0,("_srv_net_share_add: Failed to add security info to share %s.\n", + share_name )); + } + /* Send SIGHUP to process group. */ kill(0, SIGHUP); -- cgit From 33706e48f072fa17363155de19650764c5aa4a84 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 9 Apr 2001 07:03:28 +0000 Subject: Ensure Everyone/All access is mapped correctly to file generic perms to allow anonymous IPC access. Jeremy. (This used to be commit 2f34e144c53d6be911de96298c55c34d08c4733f) --- source3/rpc_server/srv_srvsvc_nt.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 4395a20e46..e78968a6bb 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -134,12 +134,16 @@ BOOL share_info_db_init(void) static SEC_DESC *get_share_security_default( TALLOC_CTX *ctx, int snum, size_t *psize) { extern DOM_SID global_sid_World; + extern struct generic_mapping file_generic_mapping; SEC_ACCESS sa; SEC_ACE ace; SEC_ACL *psa = NULL; SEC_DESC *psd = NULL; + uint32 def_access = GENERIC_ALL_ACCESS; - init_sec_access(&sa, GENERIC_ALL_ACCESS ); + se_map_generic(&def_access, &file_generic_mapping); + + init_sec_access(&sa, GENERIC_ALL_ACCESS | def_access ); init_sec_ace(&ace, &global_sid_World, SEC_ACE_TYPE_ACCESS_ALLOWED, sa, 0); if ((psa = make_sec_acl(ctx, NT4_ACL_REVISION, 1, &ace)) != NULL) { -- cgit From 2b9e23855e6e4a20021bb7a1bb0df082efe4eac5 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 9 Apr 2001 08:00:19 +0000 Subject: Set SD's for share. Added level 1501. Map GENERIC file bits to specific bits. Jeremy. (This used to be commit 04976c32f319531e16d890797b45a76dab64f370) --- source3/rpc_server/srv_srvsvc_nt.c | 48 +++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index e78968a6bb..9860df6f62 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -253,8 +253,12 @@ static BOOL delete_share_security(int snum) static BOOL read_only_share_sd(SEC_DESC *psd) { int i; - SEC_ACL *ps_dacl = psd->dacl; + SEC_ACL *ps_dacl = NULL; + if (!psd) + return True; + + ps_dacl = psd->dacl; if (!ps_dacl) return True; @@ -269,6 +273,32 @@ static BOOL read_only_share_sd(SEC_DESC *psd) return True; } +/******************************************************************* + Map any generic bits to file specific bits. +********************************************************************/ + +void map_generic_share_sd_bits(SEC_DESC *psd) +{ + extern struct generic_mapping file_generic_mapping; + int i; + SEC_ACL *ps_dacl = NULL; + + if (!psd) + return; + + ps_dacl = psd->dacl; + if (!ps_dacl) + return; + + for (i = 0; i < ps_dacl->num_aces; i++) { + SEC_ACE *psa = &ps_dacl->ace[i]; + uint32 orig_mask = psa->info.mask; + + se_map_generic(&psa->info.mask, &file_generic_mapping); + psa->info.mask |= orig_mask; + } +} + /******************************************************************* Can this user access with share with the required permissions ? ********************************************************************/ @@ -1200,6 +1230,9 @@ 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$")) + return NT_STATUS_BAD_NETWORK_NAME; + snum = find_service(share_name); /* Does this share exist ? */ @@ -1220,16 +1253,26 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(share_name)); type = q_u->info.share.info2.info_2.type; read_only = False; /* No SD means "Everyone full access. */ + psd = NULL; break; case 502: unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(share_name)); unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(share_name)); type = q_u->info.share.info502.info_502.type; psd = q_u->info.share.info502.info_502_str.sd; + map_generic_share_sd_bits(psd); read_only = read_only_share_sd(psd); break; case 1005: return ERROR_ACCESS_DENIED; + case 1501: + fstrcpy(pathname, lp_pathname(snum)); + fstrcpy(comment, lp_comment(snum)); + psd = q_u->info.share.info1501.sdb->sec; + map_generic_share_sd_bits(psd); + read_only = read_only_share_sd(psd); + type = STYPE_DISKTREE; + break; default: DEBUG(5,("_srv_net_share_set_info: unsupported switch value %d\n", q_u->info_level)); return NT_STATUS_INVALID_INFO_CLASS; @@ -1267,6 +1310,8 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S /* Send SIGHUP to process group. */ kill(0, SIGHUP); + } else { + DEBUG(10,("_srv_net_share_set_info: No change to share name (%s)\n", share_name )); } /* Replace SD if changed. */ @@ -1335,6 +1380,7 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(share_name)); type = q_u->info.share.info502.info_502.type; psd = q_u->info.share.info502.info_502_str.sd; + map_generic_share_sd_bits(psd); read_only = read_only_share_sd(psd); break; case 1005: -- cgit From 7fba7a0e82e887001d3aa5c3b38c7ee4203a55bc Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 9 Apr 2001 17:10:06 +0000 Subject: Get/Set of SD's on shares now works. Correctly ensure scripts exist before calling. Jeremy. (This used to be commit aae44ee41f2f133524e37f72b46b63ce6ddb192b) --- source3/rpc_server/srv_srvsvc_nt.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 9860df6f62..4537cd30d0 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -166,7 +166,9 @@ static SEC_DESC *get_share_security( TALLOC_CTX *ctx, int snum, size_t *psize) { prs_struct ps; fstring key; - SEC_DESC *psd; + SEC_DESC *psd = NULL; + + *psize = 0; /* Fetch security descriptor from tdb */ @@ -180,6 +182,9 @@ static SEC_DESC *get_share_security( TALLOC_CTX *ctx, int snum, size_t *psize) return get_share_security_default(ctx, snum, psize); } + if (psd) + *psize = sec_desc_size(psd); + prs_mem_free(&ps); return psd; } @@ -1222,7 +1227,6 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S int ret; char *ptr; SEC_DESC *psd = NULL; - BOOL read_only = False; DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); @@ -1252,7 +1256,6 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S 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)); type = q_u->info.share.info2.info_2.type; - read_only = False; /* No SD means "Everyone full access. */ psd = NULL; break; case 502: @@ -1261,7 +1264,6 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S type = q_u->info.share.info502.info_502.type; psd = q_u->info.share.info502.info_502_str.sd; map_generic_share_sd_bits(psd); - read_only = read_only_share_sd(psd); break; case 1005: return ERROR_ACCESS_DENIED; @@ -1270,7 +1272,6 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S fstrcpy(comment, lp_comment(snum)); psd = q_u->info.share.info1501.sdb->sec; map_generic_share_sd_bits(psd); - read_only = read_only_share_sd(psd); type = STYPE_DISKTREE; break; default: @@ -1291,15 +1292,17 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S string_replace(ptr, '"', ' '); string_replace(comment, '"', ' '); + DEBUG(10,("_srv_net_share_set_info: change share command = %s\n", + lp_change_share_cmd() ? lp_change_share_cmd() : "NULL" )); + /* Only call modify function if something changed. */ - if (read_only != lp_readonly(snum) || strcmp(ptr, lp_pathname(snum)) || strcmp(comment, lp_comment(snum)) ) { - if (!lp_change_share_cmd()) + if (strcmp(ptr, lp_pathname(snum)) || strcmp(comment, lp_comment(snum)) ) { + if (!lp_change_share_cmd() || !*lp_change_share_cmd()) return ERROR_ACCESS_DENIED; - slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\"", - lp_change_share_cmd(), share_name, ptr, comment, - read_only ? "read only = yes" : "read only = no" ); + slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\"", + lp_change_share_cmd(), share_name, ptr, comment); dos_to_unix(command, True); /* Convert to unix-codepage */ DEBUG(10,("_srv_net_share_set_info: Running [%s]\n", command )); @@ -1360,7 +1363,7 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S if (user.uid != 0) return ERROR_ACCESS_DENIED; - if (!lp_add_share_cmd()) + if (!lp_add_share_cmd() || !*lp_add_share_cmd()) return ERROR_ACCESS_DENIED; switch (q_u->info_level) { @@ -1468,7 +1471,7 @@ uint32 _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S if (user.uid != 0) return ERROR_ACCESS_DENIED; - if (!lp_delete_share_cmd()) + if (!lp_delete_share_cmd() || !*lp_delete_share_cmd()) return ERROR_ACCESS_DENIED; slprintf(command, sizeof(command)-1, "%s \"%s\"", lp_delete_share_cmd(), lp_servicename(snum)); -- cgit From 7130bb0dcf6194e7098a4d81c6149d810179fb7c Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 9 Apr 2001 18:03:02 +0000 Subject: Tidy up return codes for server manager. Jeremy. (This used to be commit b4cbdcb644066e132d5c806ae4f45d6a05276beb) --- source3/rpc_server/srv_srvsvc_nt.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 4537cd30d0..3b0bb352fe 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1235,13 +1235,17 @@ 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$")) - return NT_STATUS_BAD_NETWORK_NAME; + return ERROR_ACCESS_DENIED; snum = find_service(share_name); /* Does this share exist ? */ if (snum < 0) - return NT_STATUS_BAD_NETWORK_NAME; + return ERRnosuchshare; + + /* No change to printer shares. */ + if (lp_print_ok(snum)) + return ERROR_ACCESS_DENIED; get_current_user(&user,p); @@ -1360,11 +1364,15 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S get_current_user(&user,p); - if (user.uid != 0) + if (user.uid != 0) { + DEBUG(10,("_srv_net_share_add: uid != 0. Access denied.\n")); return ERROR_ACCESS_DENIED; + } - if (!lp_add_share_cmd() || !*lp_add_share_cmd()) + if (!lp_add_share_cmd() || !*lp_add_share_cmd()) { + DEBUG(10,("_srv_net_share_add: No add share command\n")); return ERROR_ACCESS_DENIED; + } switch (q_u->info_level) { case 1: @@ -1398,7 +1406,7 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S /* Share already exists. */ if (snum >= 0) - return NT_STATUS_BAD_NETWORK_NAME; + return ERRfilexists; /* We can only add disk shares. */ if (type != STYPE_DISKTREE) @@ -1461,10 +1469,17 @@ 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$")) + return ERROR_ACCESS_DENIED; + snum = find_service(share_name); if (snum < 0) - return NT_STATUS_BAD_NETWORK_NAME; + return ERRnosuchshare; + + /* No change to printer shares. */ + if (lp_print_ok(snum)) + return ERROR_ACCESS_DENIED; get_current_user(&user,p); -- cgit From e796a35a8bf677b25ff733ff4466e54226b7e461 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 9 Apr 2001 20:12:53 +0000 Subject: Removed "read only" arg as it isn't useful. Jeremy. (This used to be commit 6b75d79c4bcfb8333aaf1ed61cf8bd022e498f75) --- source3/rpc_server/srv_srvsvc_nt.c | 35 ++--------------------------------- 1 file changed, 2 insertions(+), 33 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 3b0bb352fe..b3a5d1a901 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -251,33 +251,6 @@ static BOOL delete_share_security(int snum) return True; } -/******************************************************************* - Does this security descriptor map to a read only share ? -********************************************************************/ - -static BOOL read_only_share_sd(SEC_DESC *psd) -{ - int i; - SEC_ACL *ps_dacl = NULL; - - if (!psd) - return True; - - ps_dacl = psd->dacl; - if (!ps_dacl) - return True; - - for (i = 0; i < ps_dacl->num_aces; i++) { - SEC_ACE *psa = &ps_dacl->ace[i]; - - if (psa->type == SEC_ACE_TYPE_ACCESS_ALLOWED && - psa->info.mask & FILE_WRITE_DATA) - return False; - } - - return True; -} - /******************************************************************* Map any generic bits to file specific bits. ********************************************************************/ @@ -1355,7 +1328,6 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S int snum; int ret; char *ptr; - BOOL read_only = False; SEC_DESC *psd = NULL; DEBUG(5,("_srv_net_share_add: %d\n", __LINE__)); @@ -1383,7 +1355,6 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S 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)); type = q_u->info.share.info2.info_2.type; - read_only = False; /* No SD means "Everyone full access. */ break; case 502: unistr2_to_ascii(share_name, &q_u->info.share.info502.info_502_str.uni_netname, sizeof(share_name)); @@ -1392,7 +1363,6 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S type = q_u->info.share.info502.info_502.type; psd = q_u->info.share.info502.info_502_str.sd; map_generic_share_sd_bits(psd); - read_only = read_only_share_sd(psd); break; case 1005: /* DFS only level. */ @@ -1421,9 +1391,8 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S string_replace(ptr, '"', ' '); string_replace(comment, '"', ' '); - slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\"", - lp_add_share_cmd(), share_name, ptr, comment, - read_only ? "read only = yes" : "read only = no" ); + slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\"", + lp_add_share_cmd(), share_name, ptr, comment); dos_to_unix(command, True); /* Convert to unix-codepage */ DEBUG(10,("_srv_net_share_add: Running [%s]\n", command )); -- cgit From a9f6e205fc522a13da97485abd0f39d40630946c Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 10 Apr 2001 01:44:45 +0000 Subject: Use message system to notify when smb.conf is updated. Jeremy. (This used to be commit ae9eda5c3c3bbfc8ec795b43ab18dc492e5fdcf6) --- source3/rpc_server/srv_srvsvc_nt.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index b3a5d1a901..cef31f7a8c 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -94,6 +94,16 @@ static void init_srv_share_info_2(SRV_SHARE_INFO_2 *sh2, int snum) init_srv_share_info2_str(&sh2->info_2_str, net_name, remark, path, passwd); } +/******************************************************************* + What to do when smb.conf is updated. + ********************************************************************/ + +static void smb_conf_updated(int msg_type, pid_t src, void *buf, size_t len) +{ + DEBUG(10,("smb_conf_updated: Got message saying smb.conf was updated. Reloading.\n")); + reload_services(False); +} + /******************************************************************* Create the share security tdb. ********************************************************************/ @@ -123,6 +133,8 @@ BOOL share_info_db_init(void) tdb_store_int(share_tdb, vstring, SHARE_DATABASE_VERSION); } tdb_unlock_bystring(share_tdb, vstring); + + message_register(MSG_SMB_CONF_UPDATED, smb_conf_updated); return True; } @@ -1288,8 +1300,9 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S return ERROR_ACCESS_DENIED; } - /* Send SIGHUP to process group. */ - kill(0, SIGHUP); + /* Tell everyone we updated smb.conf. */ + message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False); + } else { DEBUG(10,("_srv_net_share_set_info: No change to share name (%s)\n", share_name )); } @@ -1407,11 +1420,11 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S share_name )); } - /* Send SIGHUP to process group. */ - kill(0, SIGHUP); + /* Tell everyone we updated smb.conf. */ + message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False); /* - * We don't call reload_services() here, the SIGHUP will + * We don't call reload_services() here, the message will * cause this to be done before the next packet is read * from the client. JRA. */ @@ -1470,8 +1483,8 @@ uint32 _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S /* Delete the SD in the database. */ delete_share_security(snum); - /* Send SIGHUP to process group. */ - kill(0, SIGHUP); + /* Tell everyone we updated smb.conf. */ + message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False); lp_killservice(snum); -- cgit From 6d96224f81039756180d496a95b121768953f5ed Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 10 Apr 2001 19:43:14 +0000 Subject: passdb/pass_check.c: Ensure second check is done only if given username is all in caps. rpc_server/srv_srvsvc_nt.c: Added "CONFIGFILE" arg to scripts so path to smb.conf is given. Jeremy. (This used to be commit 3c4c649951464be51541d5890afb997e3ecfcd23) --- source3/rpc_server/srv_srvsvc_nt.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index cef31f7a8c..bce5c33225 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1219,7 +1219,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$")) + if (strequal(share_name,"IPC$") || strequal(share_name,"ADMIN$") || strequal(share_name,"global")) return ERROR_ACCESS_DENIED; snum = find_service(share_name); @@ -1290,8 +1290,8 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S if (!lp_change_share_cmd() || !*lp_change_share_cmd()) return ERROR_ACCESS_DENIED; - slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\"", - lp_change_share_cmd(), share_name, ptr, comment); + 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 )); @@ -1385,6 +1385,9 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S return NT_STATUS_INVALID_INFO_CLASS; } + if (strequal(share_name,"IPC$") || strequal(share_name,"ADMIN$") || strequal(share_name,"global")) + return ERROR_ACCESS_DENIED; + snum = find_service(share_name); /* Share already exists. */ @@ -1404,8 +1407,8 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S string_replace(ptr, '"', ' '); string_replace(comment, '"', ' '); - slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\"", - lp_add_share_cmd(), share_name, ptr, comment); + 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 )); @@ -1451,7 +1454,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$")) + if (strequal(share_name,"IPC$") || strequal(share_name,"ADMIN$") || strequal(share_name,"global")) return ERROR_ACCESS_DENIED; snum = find_service(share_name); @@ -1471,7 +1474,8 @@ uint32 _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S if (!lp_delete_share_cmd() || !*lp_delete_share_cmd()) return ERROR_ACCESS_DENIED; - slprintf(command, sizeof(command)-1, "%s \"%s\"", lp_delete_share_cmd(), lp_servicename(snum)); + 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 )); -- cgit From 0ca9f5c023df2ee498dcd1bdb2f29abc632a5d60 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 11 Apr 2001 21:19:25 +0000 Subject: Fix for core dump in security = share code with new share security db. Jeremy. (This used to be commit 20b13bafdff2fd7be9219ed164e7fe91b597298d) --- source3/rpc_server/srv_srvsvc_nt.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index bce5c33225..0c165bf9fa 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -293,7 +293,7 @@ void map_generic_share_sd_bits(SEC_DESC *psd) Can this user access with share with the required permissions ? ********************************************************************/ -BOOL share_access_check(int snum, uint16 vuid, uint32 desired_access) +BOOL share_access_check(connection_struct *conn, int snum, uint16 vuid, uint32 desired_access) { uint32 granted, status; TALLOC_CTX *mem_ctx = NULL; @@ -313,17 +313,25 @@ BOOL share_access_check(int snum, uint16 vuid, uint32 desired_access) if (!psd) goto out; + ZERO_STRUCT(tmp_user); if (vuser) { - ZERO_STRUCT(tmp_user); 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; - puser = &tmp_user; + } 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; + ret = se_access_check(psd, puser, desired_access, &granted, &status); out: -- cgit From 50e78a9ac8cf0949c2471fafde844c674f97d73d Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 13 Apr 2001 00:37:00 +0000 Subject: As Andrew suggested, make smbrun return a fd for a deleted file which can then be read. Jeremy. (This used to be commit e7d59d6de89a5fdd201e4b5c6072dab08b1519db) --- source3/rpc_server/srv_srvsvc_nt.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 0c165bf9fa..e5d93b8b3d 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1303,7 +1303,7 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S 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, False)) != 0) { + if ((ret = smbrun(command, NULL, NULL)) != 0) { DEBUG(0,("_srv_net_share_set_info: Running [%s] returned (%d)\n", command, ret )); return ERROR_ACCESS_DENIED; } @@ -1420,7 +1420,7 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S dos_to_unix(command, True); /* Convert to unix-codepage */ DEBUG(10,("_srv_net_share_add: Running [%s]\n", command )); - if ((ret = smbrun(command, NULL, False)) != 0) { + if ((ret = smbrun(command, NULL, NULL)) != 0) { DEBUG(0,("_srv_net_share_add: Running [%s] returned (%d)\n", command, ret )); return ERROR_ACCESS_DENIED; } @@ -1487,7 +1487,7 @@ uint32 _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S dos_to_unix(command, True); /* Convert to unix-codepage */ DEBUG(10,("_srv_net_share_del: Running [%s]\n", command )); - if ((ret = smbrun(command, NULL, False)) != 0) { + if ((ret = smbrun(command, NULL, NULL)) != 0) { DEBUG(0,("_srv_net_share_del: Running [%s] returned (%d)\n", command, ret )); return ERROR_ACCESS_DENIED; } -- cgit From 2ef68c7e92d4661664f0410509f7cb551e74a198 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 13 Apr 2001 19:12:06 +0000 Subject: Merge of Andrew's changes in 2.2. Jeremy. (This used to be commit fc76681812b1469208ad6c8847afdfc68bc6db49) --- source3/rpc_server/srv_srvsvc_nt.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index e5d93b8b3d..887c100d57 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -50,7 +50,7 @@ static void init_srv_share_info_1(SRV_SHARE_INFO_1 *sh1, int snum) if (lp_print_ok(snum)) type = STYPE_PRINTQ; - if (strequal("IPC", lp_fstype(snum))) + if (strequal("IPC$", net_name) || strequal("ADMIN$", net_name)) type = STYPE_IPC; if (net_name[len_net_name] == '$') type |= STYPE_HIDDEN; @@ -85,7 +85,7 @@ static void init_srv_share_info_2(SRV_SHARE_INFO_2 *sh2, int snum) if (lp_print_ok(snum)) type = STYPE_PRINTQ; - if (strequal("IPC", lp_fstype(snum))) + if (strequal("IPC$", net_name) || strequal("ADMIN$", net_name)) type = STYPE_IPC; if (net_name[len_net_name] == '$') type |= STYPE_HIDDEN; @@ -1303,7 +1303,7 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S 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, NULL)) != 0) { + if ((ret = smbrun(command, NULL)) != 0) { DEBUG(0,("_srv_net_share_set_info: Running [%s] returned (%d)\n", command, ret )); return ERROR_ACCESS_DENIED; } @@ -1420,7 +1420,7 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S dos_to_unix(command, True); /* Convert to unix-codepage */ DEBUG(10,("_srv_net_share_add: Running [%s]\n", command )); - if ((ret = smbrun(command, NULL, NULL)) != 0) { + if ((ret = smbrun(command, NULL)) != 0) { DEBUG(0,("_srv_net_share_add: Running [%s] returned (%d)\n", command, ret )); return ERROR_ACCESS_DENIED; } @@ -1487,7 +1487,7 @@ uint32 _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S dos_to_unix(command, True); /* Convert to unix-codepage */ DEBUG(10,("_srv_net_share_del: Running [%s]\n", command )); - if ((ret = smbrun(command, NULL, NULL)) != 0) { + if ((ret = smbrun(command, NULL)) != 0) { DEBUG(0,("_srv_net_share_del: Running [%s] returned (%d)\n", command, ret )); return ERROR_ACCESS_DENIED; } -- cgit From 8bd2a11c86ddc3bbb2bec32415e027d87df639af Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 1 May 2001 01:01:19 +0000 Subject: Added code from "Nigel Williams" (yes, the same famous Nigel Williams who did NIS/GINA !) to implement add/modify/delete shares for Win2k. Needs testing as I made a few mods to the original code. Jeremy. (This used to be commit 9b3dd801765fad28c0f9d58e5af2537cfccdd4ee) --- source3/rpc_server/srv_srvsvc_nt.c | 131 ++++++++++++++++++++++++++++++++++++- 1 file changed, 130 insertions(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 887c100d57..48961dcb64 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -77,6 +77,14 @@ static void init_srv_share_info_2(SRV_SHARE_INFO_2 *sh2, int snum) pstring_sub(remark,"%S",lp_servicename(snum)); pstrcpy(path, "C:"); pstrcat(path, lp_pathname(snum)); + + /* + * Change / to \\ so that win2k will see it as a valid path. This was added to + * enable use of browsing in win2k add share dialog. + */ + + string_replace(path, '/', '\\'); + pstrcpy(passwd, ""); len_net_name = strlen(net_name); @@ -363,6 +371,14 @@ static void init_srv_share_info_502(TALLOC_CTX *ctx, SRV_SHARE_INFO_502 *sh502, pstring_sub(remark,"%S",lp_servicename(snum)); pstrcpy(path, "C:"); pstrcat(path, lp_pathname(snum)); + + /* + * Change / to \\ so that win2k will see it as a valid path. This was added to + * enable use of browsing in win2k add share dialog. + */ + + string_replace(path, '/', '\\'); + pstrcpy(passwd, ""); len_net_name = strlen(net_name); @@ -379,7 +395,7 @@ static void init_srv_share_info_502(TALLOC_CTX *ctx, SRV_SHARE_INFO_502 *sh502, sd = get_share_security(ctx, snum, &sd_size); init_srv_share_info502(&sh502->info_502, net_name, type, remark, 0, 0xffffffff, 1, path, passwd, sd, sd_size); - init_srv_share_info502_str(&sh502->info_502_str, net_name, remark, path, passwd, sd, sd_size); + init_srv_share_info502_str(&sh502->info_502_str, &sh502->info_502, net_name, remark, path, passwd, sd, sd_size); } /*************************************************************************** @@ -1546,3 +1562,116 @@ uint32 _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET return r_u->status; } + +/*********************************************************************************** + It may be that we want to limit users to creating shares on certain areas of the UNIX file area. + We could define areas by mapping Windows style disks to points on the UNIX directory hierarchy. + These disks would the disks listed by this function. + Users could then create shares relative to these disks. Watch out for moving these disks around. + "Nigel Williams" . +/***********************************************************************************/ + +const char *server_disks[] = {"C:"}; + +static uint32 get_server_disk_count(void) +{ + return sizeof(server_disks)/sizeof(server_disks[0]); +} + +static uint32 init_server_disk_enum(uint32 *resume) +{ + uint32 server_disk_count = get_server_disk_count(); + + /*resume can be an offset into the list for now*/ + + if(*resume < 0) + *resume = 0; + + if(*resume > server_disk_count) + *resume = server_disk_count; + + return server_disk_count - *resume; +} + +static const char *next_server_disk_enum(uint32 *resume) +{ + const char *disk; + + if(init_server_disk_enum(resume) == 0) + return NULL; + + disk = server_disks[*resume]; + + (*resume)++; + + DEBUG(10, ("next_server_disk_enum: reporting disk %s. resume handle %d.\n", disk, *resume)); + + return disk; +} + +uint32 _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_DISK_ENUM *r_u) +{ + uint32 i; + const char *disk_name; + uint32 resume=get_enum_hnd(&q_u->enum_hnd); + + r_u->status=NT_STATUS_NOPROBLEMO; + + r_u->total_entries = init_server_disk_enum(&resume); + + r_u->disk_enum_ctr.unknown = 0; + + r_u->disk_enum_ctr.disk_info_ptr = (uint32) r_u->disk_enum_ctr.disk_info; + + /*allow one DISK_INFO for null terminator*/ + + for(i = 0; i < MAX_SERVER_DISK_ENTRIES -1 && (disk_name = next_server_disk_enum(&resume)); i++) { + + r_u->disk_enum_ctr.entries_read++; + + /*copy disk name into a unicode string*/ + + init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, disk_name); + } + + /*add a terminating null string. Is this there if there is more data to come?*/ + + r_u->disk_enum_ctr.entries_read++; + + init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, ""); + + init_enum_hnd(&r_u->enum_hnd, resume); + + return r_u->status; +} + +uint32 _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV_R_NET_NAME_VALIDATE *r_u) +{ + int snum; + fstring share_name; + + r_u->status=NT_STATUS_NOPROBLEMO; + + switch(q_u->type) { + + case 0x9: + + /*check if share name is ok*/ + /*also check if we already have a share with this name*/ + + unistr2_to_ascii(share_name, &q_u->uni_name, sizeof(share_name)); + snum = find_service(share_name); + + /* Share already exists. */ + if (snum >= 0) + r_u->status = NT_STATUS_OBJECT_NAME_INVALID; + break; + + default: + /*unsupported type*/ + r_u->status = ERROR_INVALID_LEVEL; + break; + } + + return r_u->status; +} -- cgit From e51cc47cec2e3a5fe4e23310f497bf6a13b0a577 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 1 May 2001 04:02:15 +0000 Subject: fixed comment-in-comment (This used to be commit 4c456c82642649a6dfaadf578488119d195c5b6b) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 48961dcb64..b3c95c6c32 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1569,7 +1569,7 @@ uint32 _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET These disks would the disks listed by this function. Users could then create shares relative to these disks. Watch out for moving these disks around. "Nigel Williams" . -/***********************************************************************************/ + ***********************************************************************************/ const char *server_disks[] = {"C:"}; -- cgit From 3c525aaaa381055d34e2b66e95ae5320f3b9ac58 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 2 May 2001 08:14:00 +0000 Subject: Remove embedded '/*' in comment. Jeremy. (This used to be commit 9a85dc9cdbc6409e25a528be4be960d4eb3ac117) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index b3c95c6c32..93c3e18ca7 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1569,7 +1569,7 @@ uint32 _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET These disks would the disks listed by this function. Users could then create shares relative to these disks. Watch out for moving these disks around. "Nigel Williams" . - ***********************************************************************************/ +***********************************************************************************/ const char *server_disks[] = {"C:"}; -- cgit From 05fc3e578c895f632b351969d09cd00feb7599c7 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 4 Jun 2001 05:13:59 +0000 Subject: use LDSHFLAGS not -shared in several places (This used to be commit 8ec9c87b5d1a7dae17d5b1a30f58effaf5e69e4b) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 93c3e18ca7..13d27788e0 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -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(lock_path("share_info.tdb"), 0, 0, O_RDWR|O_CREAT, 0600); + share_tdb = tdb_open_log(lock_path("share_info.tdb"), 0, 0, 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) )); -- cgit From af604fe7694f3e1d1acdecfab366dfe31cfee9ef Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Sat, 16 Jun 2001 00:32:13 +0000 Subject: Modified version of Jim's 0x27 and 0x28 Win9x Secdesc patch. Jeremy. (This used to be commit 5690ec77c87475f1fd2e854cda594eb996d6fd04) --- source3/rpc_server/srv_srvsvc_nt.c | 167 +++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 13d27788e0..7ae95a5eac 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1563,6 +1563,173 @@ uint32 _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET return r_u->status; } +/*********************************************************************************** + Win9x NT tools get security descriptor. +***********************************************************************************/ + +uint32 _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC *q_u, + SRV_R_NET_FILE_QUERY_SECDESC *r_u) +{ + SEC_DESC *psd = NULL; + size_t sd_size; + fstring null_pw; + pstring filename; + pstring qualname; + files_struct *fsp = NULL; + SMB_STRUCT_STAT st; + BOOL bad_path; + int access_mode; + int action; + int ecode; + struct current_user user; + fstring user_name; + connection_struct *conn = NULL; + + ZERO_STRUCT(st); + + r_u->status = NT_STATUS_NOPROBLEMO; + + unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname)); + + /* Null password is ok - we are already an authenticated user... */ + *null_pw = '\0'; + + get_current_user(&user, p); + fstrcpy(user_name, uidtoname(user.uid)); + + conn = make_connection(qualname, user_name, "", 0, "A:", user.vuid, &ecode); + + if (conn == NULL) { + DEBUG(3,("_srv_net_file_query_secdesc: Unable to connect to %s\n", qualname)); + r_u->status = (uint32)ecode; + goto error_exit; + } + + unistr2_to_ascii(filename, &q_u->uni_file_name, sizeof(filename)); + unix_convert(filename, conn, NULL, &bad_path, &st); + fsp = open_file_shared(conn, filename, &st, SET_OPEN_MODE(DOS_OPEN_RDONLY), + (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, 0, &access_mode, &action); + + if (!fsp) { + DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", filename)); + r_u->status = ERROR_ACCESS_DENIED; + goto error_exit; + } + + sd_size = conn->vfs_ops.get_nt_acl(fsp, fsp->fsp_name, &psd); + + 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; + goto error_exit; + } + + r_u->ptr_response = 1; + r_u->size_response = sd_size; + r_u->ptr_secdesc = 1; + r_u->size_secdesc = sd_size; + r_u->sec_desc = psd; + + psd->dacl->revision = (uint16) NT4_ACL_REVISION; + + fsp->conn->vfs_ops.close(fsp, fsp->fd); + file_free(fsp); + + close_cnum(conn, user.vuid); + return r_u->status; + + error_exit: + + if(fsp) { + fsp->conn->vfs_ops.close(fsp, fsp->fd); + file_free(fsp); + } + + if (conn) + close_cnum(conn, user.vuid); + + return r_u->status; +} + +/*********************************************************************************** + Win9x NT tools set security descriptor. +***********************************************************************************/ + +uint32 _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_u, + SRV_R_NET_FILE_SET_SECDESC *r_u) +{ + BOOL ret; + pstring filename; + pstring qualname; + fstring null_pw; + files_struct *fsp = NULL; + SMB_STRUCT_STAT st; + BOOL bad_path; + int access_mode; + int action; + int ecode; + struct current_user user; + fstring user_name; + connection_struct *conn = NULL; + + ZERO_STRUCT(st); + + r_u->status = NT_STATUS_NOPROBLEMO; + + unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname)); + + /* Null password is ok - we are already an authenticated user... */ + *null_pw = '\0'; + + get_current_user(&user, p); + fstrcpy(user_name, uidtoname(user.uid)); + + conn = make_connection(qualname, user_name, null_pw, 0, "A:", user.vuid, &ecode); + + if (conn == NULL) { + DEBUG(3,("_srv_net_file_set_secdesc: Unable to connect to %s\n", qualname)); + r_u->status = (uint32)ecode; + goto error_exit; + } + + unistr2_to_ascii(filename, &q_u->uni_file_name, sizeof(filename)); + unix_convert(filename, conn, NULL, &bad_path, &st); + + fsp = open_file_shared(conn, filename, &st, SET_OPEN_MODE(DOS_OPEN_RDWR), + (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, 0, &access_mode, &action); + + if (!fsp) { + DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", filename)); + r_u->status = ERROR_ACCESS_DENIED; + goto error_exit; + } + + ret = conn->vfs_ops.set_nt_acl(fsp, fsp->fsp_name, q_u->sec_info, q_u->sec_desc); + + 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; + goto error_exit; + } + + fsp->conn->vfs_ops.close(fsp, fsp->fd); + file_free(fsp); + close_cnum(conn, user.vuid); + return r_u->status; + + error_exit: + + if(fsp) { + fsp->conn->vfs_ops.close(fsp, fsp->fd); + file_free(fsp); + } + + if (conn) + close_cnum(conn, user.vuid); + + return r_u->status; +} + /*********************************************************************************** It may be that we want to limit users to creating shares on certain areas of the UNIX file area. We could define areas by mapping Windows style disks to points on the UNIX directory hierarchy. -- cgit From 0417200fa9af35167de3e4d6df7c3071f07b15a9 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 18 Jun 2001 17:52:58 +0000 Subject: Added "Jim McDonough" patches for directory support for Win9x. Jeremy. (This used to be commit 70194b194e0ca4b0f4f9c1eece9176415f9bb928) --- source3/rpc_server/srv_srvsvc_nt.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 7ae95a5eac..b28a0c9683 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1611,9 +1611,14 @@ uint32 _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, 0, &access_mode, &action); if (!fsp) { - DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", filename)); - r_u->status = ERROR_ACCESS_DENIED; - goto error_exit; + /* Perhaps it is a directory */ + fsp = open_directory(conn, filename, &st, + (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, &action); + if (!fsp) { + DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", filename)); + r_u->status = ERROR_ACCESS_DENIED; + goto error_exit; + } } sd_size = conn->vfs_ops.get_nt_acl(fsp, fsp->fsp_name, &psd); @@ -1699,9 +1704,14 @@ uint32 _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, 0, &access_mode, &action); if (!fsp) { - DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", filename)); - r_u->status = ERROR_ACCESS_DENIED; - goto error_exit; + /* Perhaps it is a directory */ + fsp = open_directory(conn, filename, &st, + (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, &action); + if (!fsp) { + DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", filename)); + r_u->status = ERROR_ACCESS_DENIED; + goto error_exit; + } } ret = conn->vfs_ops.set_nt_acl(fsp, fsp->fsp_name, q_u->sec_info, q_u->sec_desc); -- cgit From c1fbf761ce819a4da9f26758129e0923bfc1e6ff Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 19 Jun 2001 00:44:23 +0000 Subject: rpc_server/srv_srvsvc_nt.c: Don't test an uint32 for < 0. utils/smbcacls.c: Set enum correctly. Jeremy. (This used to be commit 66f959e0ffb0cd385167a34c7db3f4959eaf1d7f) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index b28a0c9683..e56e63490d 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1761,7 +1761,7 @@ static uint32 init_server_disk_enum(uint32 *resume) /*resume can be an offset into the list for now*/ - if(*resume < 0) + if(*resume & 0x80000000) *resume = 0; if(*resume > server_disk_count) -- cgit From d2846a3ea93984ab091b6a70bf127e9f7eab1c58 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 19 Jun 2001 18:43:17 +0000 Subject: Only try and open a directory if we get EISDIR. Jeremy. (This used to be commit 5b1245f80357f585ef3b24704e5ef34ef71e232f) --- source3/rpc_server/srv_srvsvc_nt.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index e56e63490d..4650512218 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1612,8 +1612,10 @@ uint32 _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC if (!fsp) { /* Perhaps it is a directory */ - fsp = open_directory(conn, filename, &st, - (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, &action); + if (errno == EISDIR) + fsp = open_directory(conn, filename, &st, + (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, &action); + if (!fsp) { DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", filename)); r_u->status = ERROR_ACCESS_DENIED; @@ -1705,8 +1707,10 @@ uint32 _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ if (!fsp) { /* Perhaps it is a directory */ - fsp = open_directory(conn, filename, &st, - (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, &action); + if (errno == EISDIR) + fsp = open_directory(conn, filename, &st, + (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, &action); + if (!fsp) { DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", filename)); r_u->status = ERROR_ACCESS_DENIED; -- cgit From b08ee8995da1960546df31fdf876665c996083b3 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 22 Jun 2001 18:58:35 +0000 Subject: Fix from "Jim McDonough" " - when we use open_file_shared(), we need to close with close_file(). Jeremy. (This used to be commit 5b2ffd160f3b4b9607bb6fd6db1644af9254ad9e) --- source3/rpc_server/srv_srvsvc_nt.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 4650512218..d071572804 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1639,7 +1639,7 @@ uint32 _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC psd->dacl->revision = (uint16) NT4_ACL_REVISION; - fsp->conn->vfs_ops.close(fsp, fsp->fd); + close_file(fsp, True); file_free(fsp); close_cnum(conn, user.vuid); @@ -1648,7 +1648,7 @@ uint32 _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC error_exit: if(fsp) { - fsp->conn->vfs_ops.close(fsp, fsp->fd); + close_file(fsp, True); file_free(fsp); } @@ -1726,7 +1726,7 @@ uint32 _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ goto error_exit; } - fsp->conn->vfs_ops.close(fsp, fsp->fd); + close_file(fsp, True); file_free(fsp); close_cnum(conn, user.vuid); return r_u->status; @@ -1734,7 +1734,7 @@ uint32 _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ error_exit: if(fsp) { - fsp->conn->vfs_ops.close(fsp, fsp->fd); + close_file(fsp, True); file_free(fsp); } -- cgit From 6e0605c3ab266749a411fe50301020fac52eea98 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Mon, 25 Jun 2001 06:13:27 +0000 Subject: Cosmetic fixups found while playing with the server manager. Added support for NET_SRV_SET_INFO rpc call which is made when double-clicking on a computer in the server manager and changing the description. We always return NT_STATUS_NOPROBLEMO as NT doesn't seem to decode any error messages passed back. Maybe the changed comment string could be stored in a tdb and regurgitated instead of the "server string" smb.conf parameter? (This used to be commit d936ffedd90fe442f990c9ac2e172877f28d7230) --- source3/rpc_server/srv_srvsvc_nt.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index d071572804..902f47f5a2 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1047,6 +1047,28 @@ uint32 _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV_R return r_u->status; } +/******************************************************************* +net server set info +********************************************************************/ + +uint32 _srv_net_srv_set_info(pipes_struct *p, SRV_Q_NET_SRV_SET_INFO *q_u, SRV_R_NET_SRV_SET_INFO *r_u) +{ + /* 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; + + DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__)); + + /* Set up the net server set info structure. */ + + init_srv_r_net_srv_set_info(r_u, 0x0, status); + + DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__)); + + return r_u->status; +} + /******************************************************************* net file enum ********************************************************************/ -- cgit From c2cfcb34e1fdef24ac7979bb0f77340d27fc6926 Mon Sep 17 00:00:00 2001 From: Herb Lewis Date: Tue, 26 Jun 2001 20:23:45 +0000 Subject: SGI compiler fixes. Jeremy (This used to be commit 45bf995bf62aa6cc176d57e2f954cc2d379717ef) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 902f47f5a2..39e482dc3c 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1619,7 +1619,7 @@ uint32 _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC get_current_user(&user, p); fstrcpy(user_name, uidtoname(user.uid)); - conn = make_connection(qualname, user_name, "", 0, "A:", user.vuid, &ecode); + conn = make_connection(qualname, user_name, null_pw, 0, "A:", user.vuid, &ecode); if (conn == NULL) { DEBUG(3,("_srv_net_file_query_secdesc: Unable to connect to %s\n", qualname)); -- cgit From e682d6d54e3f23266e3a75d1461e8dff2d729006 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 2 Jul 2001 13:43:46 +0000 Subject: This fix from Eelco Vriezekolk is for a SIG11 bug where we would always file_free(fsp) twice, once in close_file and once afterwoulds. The bug was reported in SAMBA_2_2, but a code inspection shows it to be in HEAD as well. (Unfortunetly I don't have the facilites to actualy check this, but the change is quite simple, makes sence and compiles). Andrew Bartlett (This used to be commit 5d3f622375842961a79536d36ee6f6ad508b91f1) --- source3/rpc_server/srv_srvsvc_nt.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 39e482dc3c..44821d1432 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1662,7 +1662,6 @@ uint32 _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC psd->dacl->revision = (uint16) NT4_ACL_REVISION; close_file(fsp, True); - file_free(fsp); close_cnum(conn, user.vuid); return r_u->status; @@ -1671,7 +1670,6 @@ uint32 _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC if(fsp) { close_file(fsp, True); - file_free(fsp); } if (conn) -- cgit From ed2fc9622284e928d328c2f91ddf869ca13e0a1e Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 2 Jul 2001 18:37:39 +0000 Subject: Fixed extra file_free calls - my fault :-(. Jeremy. (This used to be commit 2f8b84bda040edc87a7af29c3a281cf335e392cb) --- source3/rpc_server/srv_srvsvc_nt.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 44821d1432..b487eb1c82 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1747,7 +1747,6 @@ uint32 _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ } close_file(fsp, True); - file_free(fsp); close_cnum(conn, user.vuid); return r_u->status; @@ -1755,7 +1754,6 @@ uint32 _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ if(fsp) { close_file(fsp, True); - file_free(fsp); } if (conn) -- cgit From 87fbb7092b8f8b2f0db0f361c3d625e19de57cd9 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 4 Jul 2001 07:15:53 +0000 Subject: The big character set handling changeover! This commit gets rid of all our old codepage handling and replaces it with iconv. All internal strings in Samba are now in "unix" charset, which may be multi-byte. See internals.doc and my posting to samba-technical for a more complete explanation. (This used to be commit debb471267960e56005a741817ebd227ecfc512a) --- source3/rpc_server/srv_srvsvc_nt.c | 5 ----- 1 file changed, 5 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index b487eb1c82..78d9429b43 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1229,9 +1229,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); @@ -1338,7 +1336,6 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S 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) { @@ -1455,7 +1452,6 @@ 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) { @@ -1522,7 +1518,6 @@ uint32 _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S 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) { -- cgit From 996719cce26700c68ff0e456e6a25d20085d091f Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 30 Jul 2001 22:21:31 +0000 Subject: Added "use mmap" for HPUX. Jeremy. (This used to be commit 840802f10677cb0009cb4df4c37c7d01aa5edacd) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 78d9429b43..913b04bca3 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -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, USE_TDB_MMAP_FLAG, 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) )); -- cgit From 047a7c88d7d004f1581f585dd31caea388ab6f0d Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Fri, 10 Aug 2001 05:41:53 +0000 Subject: Replaced the duplicate DOS constants with appropriate ones from doserr.h to emphasise the fact that the spoolss pipe returns DOS error codes instead of 32-bit nt status codes. (This used to be commit 5f5ed41ee872d842e944cd2e84a80de714ad4385) --- source3/rpc_server/srv_srvsvc_nt.c | 50 +++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 25 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 913b04bca3..735a429102 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1264,7 +1264,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); @@ -1274,17 +1274,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)); @@ -1299,7 +1299,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)); @@ -1314,7 +1314,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 ))) @@ -1332,7 +1332,7 @@ 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); @@ -1340,7 +1340,7 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S 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. */ @@ -1394,18 +1394,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)); @@ -1422,14 +1422,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); @@ -1439,7 +1439,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 ))) @@ -1456,7 +1456,7 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S 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) { @@ -1497,7 +1497,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); @@ -1506,15 +1506,15 @@ 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)); @@ -1522,7 +1522,7 @@ uint32 _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S 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. */ @@ -1635,7 +1635,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; } } @@ -1644,7 +1644,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; } @@ -1728,7 +1728,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; } } @@ -1737,7 +1737,7 @@ 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; } @@ -1863,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; } -- cgit From e08ca026319f39683e0e935e2ddc48d33f381e71 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 13 Aug 2001 23:19:16 +0000 Subject: Added Jim McDonough's Win9x take ownership fix. Jeremy. (This used to be commit 800e46ea7e724460be2ba5f71e5baa2f2ddd2d3b) --- source3/rpc_server/srv_srvsvc_nt.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 735a429102..cf65d5119f 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1693,6 +1693,7 @@ 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); @@ -1714,6 +1715,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); @@ -1742,6 +1750,7 @@ uint32 _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ } close_file(fsp, True); + unbecome_user(); close_cnum(conn, user.vuid); return r_u->status; @@ -1751,6 +1760,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); -- cgit From 28b206f16303d69694174d69fdfe2853bcee56c8 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Wed, 22 Aug 2001 16:10:28 +0000 Subject: some %things are not expanded properly in get share info levels (This used to be commit 3e60636f2b7003ea1e915bc7c2d2e8dec5667bbd) --- source3/rpc_server/srv_srvsvc_nt.c | 41 ++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 19 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index cf65d5119f..b5b38b1403 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/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)); @@ -353,7 +353,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 +363,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 +431,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 +469,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 +486,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 +503,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,12 +523,12 @@ 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; } else { @@ -539,7 +542,7 @@ 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; @@ -554,13 +557,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); @@ -1153,7 +1156,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 +1174,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 +1195,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__)); -- cgit From b031af348c7dcc8c74bf49945211c466b8eca079 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 27 Aug 2001 19:46:22 +0000 Subject: converted another bunch of stuff to NTSTATUS (This used to be commit 1d36250e338ae0ff9fbbf86019809205dd97d05e) --- source3/rpc_server/srv_srvsvc_nt.c | 149 +++++++++++++++++++------------------ 1 file changed, 75 insertions(+), 74 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index b5b38b1403..5ba460b607 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -303,7 +303,8 @@ void map_generic_share_sd_bits(SEC_DESC *psd) BOOL share_access_check(connection_struct *conn, int snum, uint16 vuid, uint32 desired_access) { - uint32 granted, status; + uint32 granted; + NTSTATUS status; TALLOC_CTX *mem_ctx = NULL; SEC_DESC *psd = NULL; size_t sd_size; @@ -530,7 +531,7 @@ static void init_srv_r_net_share_enum(pipes_struct *p, SRV_R_NET_SHARE_ENUM *r_n 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; } @@ -545,7 +546,7 @@ static void init_srv_r_net_share_enum(pipes_struct *p, SRV_R_NET_SHARE_ENUM *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; + NTSTATUS status = NT_STATUS_OK; int snum; DEBUG(5,("init_srv_r_net_share_get_info: %d\n", __LINE__)); @@ -577,7 +578,7 @@ static void init_srv_r_net_share_get_info(pipes_struct *p, 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 = NT_STATUS_IS_OK(status) ? 1 : 0; r_n->status = status; } @@ -694,10 +695,10 @@ static void init_srv_sess_info_1(SRV_SESS_INFO_1 *ss1, uint32 *snum, uint32 *sto makes a SRV_R_NET_SESS_ENUM structure. ********************************************************************/ -static uint32 init_srv_sess_info_ctr(SRV_SESS_INFO_CTR *ctr, +static NTSTATUS init_srv_sess_info_ctr(SRV_SESS_INFO_CTR *ctr, int switch_value, uint32 *resume_hnd, uint32 *total_entries) { - uint32 status = NT_STATUS_NOPROBLEMO; + NTSTATUS status = NT_STATUS_OK; DEBUG(5,("init_srv_sess_info_ctr: %d\n", __LINE__)); ctr->switch_value = switch_value; @@ -739,7 +740,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 (NT_STATUS_IS_ERR(r_n->status)) resume_hnd = 0; init_enum_hnd(&r_n->enum_hnd, resume_hnd); @@ -850,10 +851,10 @@ static void init_srv_conn_info_1(SRV_CONN_INFO_1 *ss1, uint32 *snum, uint32 *sto makes a SRV_R_NET_CONN_ENUM structure. ********************************************************************/ -static uint32 init_srv_conn_info_ctr(SRV_CONN_INFO_CTR *ctr, +static NTSTATUS init_srv_conn_info_ctr(SRV_CONN_INFO_CTR *ctr, int switch_value, uint32 *resume_hnd, uint32 *total_entries) { - uint32 status = NT_STATUS_NOPROBLEMO; + NTSTATUS status = NT_STATUS_OK; DEBUG(5,("init_srv_conn_info_ctr: %d\n", __LINE__)); ctr->switch_value = switch_value; @@ -894,7 +895,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 (NT_STATUS_IS_ERR(r_n->status)) resume_hnd = 0; init_enum_hnd(&r_n->enum_hnd, resume_hnd); @@ -950,10 +951,10 @@ static void init_srv_file_info_3(SRV_FILE_INFO_3 *fl3, uint32 *fnum, uint32 *fto makes a SRV_R_NET_FILE_ENUM structure. ********************************************************************/ -static uint32 init_srv_file_info_ctr(SRV_FILE_INFO_CTR *ctr, +static NTSTATUS init_srv_file_info_ctr(SRV_FILE_INFO_CTR *ctr, int switch_value, uint32 *resume_hnd, uint32 *total_entries) { - uint32 status = NT_STATUS_NOPROBLEMO; + NTSTATUS status = NT_STATUS_OK; DEBUG(5,("init_srv_file_info_ctr: %d\n", __LINE__)); ctr->switch_value = switch_value; @@ -990,7 +991,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 (NT_STATUS_IS_ERR(r_n->status)) resume_hnd = 0; init_enum_hnd(&r_n->enum_hnd, resume_hnd); @@ -1000,9 +1001,9 @@ static void init_srv_r_net_file_enum(SRV_R_NET_FILE_ENUM *r_n, 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) +NTSTATUS _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; + NTSTATUS status = NT_STATUS_OK; SRV_INFO_CTR *ctr = (SRV_INFO_CTR *)talloc(p->mem_ctx, sizeof(SRV_INFO_CTR)); if (!ctr) @@ -1054,12 +1055,12 @@ uint32 _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV_R net server set info ********************************************************************/ -uint32 _srv_net_srv_set_info(pipes_struct *p, SRV_Q_NET_SRV_SET_INFO *q_u, SRV_R_NET_SRV_SET_INFO *r_u) +NTSTATUS _srv_net_srv_set_info(pipes_struct *p, SRV_Q_NET_SRV_SET_INFO *q_u, SRV_R_NET_SRV_SET_INFO *r_u) { /* 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; + NTSTATUS status = NT_STATUS_OK; DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__)); @@ -1076,7 +1077,7 @@ uint32 _srv_net_srv_set_info(pipes_struct *p, SRV_Q_NET_SRV_SET_INFO *q_u, SRV_R net file enum ********************************************************************/ -uint32 _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_FILE_ENUM *r_u) +NTSTATUS _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_FILE_ENUM *r_u) { r_u->ctr = (SRV_FILE_INFO_CTR *)talloc(p->mem_ctx, sizeof(SRV_FILE_INFO_CTR)); if (!r_u->ctr) @@ -1101,7 +1102,7 @@ uint32 _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_F net conn enum ********************************************************************/ -uint32 _srv_net_conn_enum(pipes_struct *p, SRV_Q_NET_CONN_ENUM *q_u, SRV_R_NET_CONN_ENUM *r_u) +NTSTATUS _srv_net_conn_enum(pipes_struct *p, SRV_Q_NET_CONN_ENUM *q_u, SRV_R_NET_CONN_ENUM *r_u) { DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__)); @@ -1126,7 +1127,7 @@ uint32 _srv_net_conn_enum(pipes_struct *p, SRV_Q_NET_CONN_ENUM *q_u, SRV_R_NET_C net sess enum ********************************************************************/ -uint32 _srv_net_sess_enum(pipes_struct *p, SRV_Q_NET_SESS_ENUM *q_u, SRV_R_NET_SESS_ENUM *r_u) +NTSTATUS _srv_net_sess_enum(pipes_struct *p, SRV_Q_NET_SESS_ENUM *q_u, SRV_R_NET_SESS_ENUM *r_u) { DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__)); @@ -1151,7 +1152,7 @@ uint32 _srv_net_sess_enum(pipes_struct *p, SRV_Q_NET_SESS_ENUM *q_u, SRV_R_NET_S Net share enum all. ********************************************************************/ -uint32 _srv_net_share_enum_all(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u) +NTSTATUS _srv_net_share_enum_all(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u) { DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__)); @@ -1169,7 +1170,7 @@ uint32 _srv_net_share_enum_all(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R Net share enum. ********************************************************************/ -uint32 _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u) +NTSTATUS _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u) { DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__)); @@ -1187,7 +1188,7 @@ uint32 _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET Net share get info. ********************************************************************/ -uint32 _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, SRV_R_NET_SHARE_GET_INFO *r_u) +NTSTATUS _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, SRV_R_NET_SHARE_GET_INFO *r_u) { fstring share_name; @@ -1247,7 +1248,7 @@ static char *valid_share_pathname(char *dos_pathname) Net share set info. Modify share details. ********************************************************************/ -uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, SRV_R_NET_SHARE_SET_INFO *r_u) +NTSTATUS _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, SRV_R_NET_SHARE_SET_INFO *r_u) { struct current_user user; pstring command; @@ -1267,27 +1268,27 @@ 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 ERRnoaccess; + return NT_STATUS_ACCESS_DENIED; snum = find_service(share_name); /* Does this share exist ? */ if (snum < 0) - return ERRnosuchshare; + return NT_STATUS_BAD_NETWORK_NAME; /* No change to printer shares. */ if (lp_print_ok(snum)) - return ERRnoaccess; + return NT_STATUS_ACCESS_DENIED; get_current_user(&user,p); if (user.uid != 0) - return ERRnoaccess; + return NT_STATUS_ACCESS_DENIED; switch (q_u->info_level) { case 1: /* Not enough info in a level 1 to do anything. */ - return ERRnoaccess; + return NT_STATUS_ACCESS_DENIED; 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)); @@ -1302,7 +1303,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 ERRnoaccess; + return NT_STATUS_ACCESS_DENIED; case 1501: fstrcpy(pathname, lp_pathname(snum)); fstrcpy(comment, lp_comment(snum)); @@ -1317,11 +1318,11 @@ 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 ERRnoaccess; + return NT_STATUS_ACCESS_DENIED; /* Check if the pathname is valid. */ if (!(ptr = valid_share_pathname( pathname ))) - return ERRbadpath; + return NT_STATUS_OBJECT_PATH_INVALID; /* Ensure share name, pathname and comment don't contain '"' characters. */ string_replace(share_name, '"', ' '); @@ -1335,7 +1336,7 @@ 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 ERRnoaccess; + return NT_STATUS_ACCESS_DENIED; slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\"", lp_change_share_cmd(), CONFIGFILE, share_name, ptr, comment); @@ -1343,7 +1344,7 @@ uint32 _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S 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 ERRnoaccess; + return NT_STATUS_ACCESS_DENIED; } /* Tell everyone we updated smb.conf. */ @@ -1369,14 +1370,14 @@ 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; } /******************************************************************* Net share add. Call 'add_share_command "sharename" "pathname" "comment" "read only = xxx"' ********************************************************************/ -uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_SHARE_ADD *r_u) +NTSTATUS _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_SHARE_ADD *r_u) { struct current_user user; pstring command; @@ -1397,18 +1398,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 ERRnoaccess; + return NT_STATUS_ACCESS_DENIED; } if (!lp_add_share_cmd() || !*lp_add_share_cmd()) { DEBUG(10,("_srv_net_share_add: No add share command\n")); - return ERRnoaccess; + return NT_STATUS_ACCESS_DENIED; } switch (q_u->info_level) { case 1: /* Not enough info in a level 1 to do anything. */ - return ERRnoaccess; + return NT_STATUS_ACCESS_DENIED; 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,28 +1426,28 @@ 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 ERRnoaccess; + return NT_STATUS_ACCESS_DENIED; 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 ERRnoaccess; + return NT_STATUS_ACCESS_DENIED; snum = find_service(share_name); /* Share already exists. */ if (snum >= 0) - return ERRfilexists; + return NT_STATUS_OBJECT_NAME_COLLISION; /* We can only add disk shares. */ if (type != STYPE_DISKTREE) - return ERRnoaccess; + return NT_STATUS_ACCESS_DENIED; /* Check if the pathname is valid. */ if (!(ptr = valid_share_pathname( pathname ))) - return ERRbadpath; + return NT_STATUS_OBJECT_PATH_INVALID; /* Ensure share name, pathname and comment don't contain '"' characters. */ string_replace(share_name, '"', ' '); @@ -1459,7 +1460,7 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S 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 ERRnoaccess; + return NT_STATUS_ACCESS_DENIED; } if (psd) { @@ -1479,7 +1480,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; } /******************************************************************* @@ -1487,7 +1488,7 @@ uint32 _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S a parameter. ********************************************************************/ -uint32 _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u) +NTSTATUS _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u) { struct current_user user; pstring command; @@ -1500,24 +1501,24 @@ 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 ERRnoaccess; + return NT_STATUS_ACCESS_DENIED; snum = find_service(share_name); if (snum < 0) - return ERRnosuchshare; + return NT_STATUS_BAD_NETWORK_NAME; /* No change to printer shares. */ if (lp_print_ok(snum)) - return ERRnoaccess; + return NT_STATUS_ACCESS_DENIED; get_current_user(&user,p); if (user.uid != 0) - return ERRnoaccess; + return NT_STATUS_ACCESS_DENIED; if (!lp_delete_share_cmd() || !*lp_delete_share_cmd()) - return ERRnoaccess; + return NT_STATUS_ACCESS_DENIED; slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\"", lp_delete_share_cmd(), CONFIGFILE, lp_servicename(snum)); @@ -1525,7 +1526,7 @@ uint32 _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S 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 ERRnoaccess; + return NT_STATUS_ACCESS_DENIED; } /* Delete the SD in the database. */ @@ -1536,14 +1537,14 @@ 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; } /******************************************************************* time of day ********************************************************************/ -uint32 _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET_REMOTE_TOD *r_u) +NTSTATUS _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET_REMOTE_TOD *r_u) { TIME_OF_DAY_INFO *tod; struct tm *t; @@ -1557,7 +1558,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__)); @@ -1587,7 +1588,7 @@ uint32 _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET Win9x NT tools get security descriptor. ***********************************************************************************/ -uint32 _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC *q_u, +NTSTATUS _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC *q_u, SRV_R_NET_FILE_QUERY_SECDESC *r_u) { SEC_DESC *psd = NULL; @@ -1600,14 +1601,14 @@ uint32 _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC BOOL bad_path; int access_mode; int action; - int ecode; + NTSTATUS ecode; struct current_user user; fstring user_name; connection_struct *conn = NULL; 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)); @@ -1621,7 +1622,7 @@ uint32 _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC if (conn == NULL) { DEBUG(3,("_srv_net_file_query_secdesc: Unable to connect to %s\n", qualname)); - r_u->status = (uint32)ecode; + r_u->status = ecode; goto error_exit; } @@ -1638,7 +1639,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 = ERRnoaccess; + r_u->status = NT_STATUS_ACCESS_DENIED; goto error_exit; } } @@ -1647,7 +1648,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 = ERRnoaccess; + r_u->status = NT_STATUS_ACCESS_DENIED; goto error_exit; } @@ -1680,7 +1681,7 @@ uint32 _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC Win9x NT tools set security descriptor. ***********************************************************************************/ -uint32 _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_u, +NTSTATUS _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_u, SRV_R_NET_FILE_SET_SECDESC *r_u) { BOOL ret; @@ -1692,7 +1693,7 @@ uint32 _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ BOOL bad_path; int access_mode; int action; - int ecode; + NTSTATUS ecode; struct current_user user; fstring user_name; connection_struct *conn = NULL; @@ -1700,7 +1701,7 @@ uint32 _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ 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)); @@ -1714,13 +1715,13 @@ uint32 _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ if (conn == NULL) { DEBUG(3,("_srv_net_file_set_secdesc: Unable to connect to %s\n", qualname)); - r_u->status = (uint32)ecode; + r_u->status = ecode; 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; + r_u->status = NT_STATUS_ACCESS_DENIED; goto error_exit; } became_user = True; @@ -1739,7 +1740,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 = ERRnoaccess; + r_u->status = NT_STATUS_ACCESS_DENIED; goto error_exit; } } @@ -1748,7 +1749,7 @@ 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 = ERRnoaccess; + r_u->status = NT_STATUS_ACCESS_DENIED; goto error_exit; } @@ -1818,13 +1819,13 @@ static const char *next_server_disk_enum(uint32 *resume) return disk; } -uint32 _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_DISK_ENUM *r_u) +NTSTATUS _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_DISK_ENUM *r_u) { uint32 i; 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); @@ -1854,12 +1855,12 @@ uint32 _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_D return r_u->status; } -uint32 _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV_R_NET_NAME_VALIDATE *r_u) +NTSTATUS _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV_R_NET_NAME_VALIDATE *r_u) { int snum; fstring share_name; - r_u->status=NT_STATUS_NOPROBLEMO; + r_u->status=NT_STATUS_OK; switch(q_u->type) { @@ -1878,7 +1879,7 @@ uint32 _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV default: /*unsupported type*/ - r_u->status = ERRunknownlevel; + r_u->status = NT_STATUS_INVALID_LEVEL; break; } -- cgit From 9a9ac2739bbdc993ecdfa78298bdd9c059328378 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 6 Sep 2001 22:08:19 +0000 Subject: got rid of USE_TDB_MMAP_FLAG as its not needed any more (This used to be commit c26e0d3f27a05ecc8bd2390f9aab7f9451524e47) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 5ba460b607..a0ae9050e2 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -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, USE_TDB_MMAP_FLAG, 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) )); -- cgit From 39d7983a470cc3470dd7126de35697d965817cb6 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 12 Sep 2001 03:08:51 +0000 Subject: - enable MSDFS by default, there seems no reason not to have it enabled by default in Samba 3.x - got rid of some unused parameters in Makefile.in - declare DEBUGLEVEL in debug.h rather than in each file (This used to be commit b8651acb9c0d7248a6a2e82c33b1e43633fd83fd) --- source3/rpc_server/srv_srvsvc_nt.c | 3 --- 1 file changed, 3 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index a0ae9050e2..0db06754f4 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -409,11 +409,8 @@ static void init_srv_share_info_1005(SRV_SHARE_INFO_1005* sh1005, int snum) { sh1005->dfs_root_flag = 0; -#ifdef WITH_MSDFS if(lp_host_msdfs() && lp_msdfs_root(snum)) sh1005->dfs_root_flag = 3; -#endif - } /******************************************************************* -- cgit From 7892c494e7321c64b20bf7e1d794a6b6508fe84a Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 15 Sep 2001 12:55:59 +0000 Subject: Kill off the //server/share%user hack in share level security. This should help make much of this code simpiler. Andrew Bartlett (This used to be commit fb0c3629c360fd0c57129500474960e6da6f9ef0) --- source3/rpc_server/srv_srvsvc_nt.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 0db06754f4..9f156a3d95 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1598,7 +1598,7 @@ NTSTATUS _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDE BOOL bad_path; int access_mode; int action; - NTSTATUS ecode; + NTSTATUS nt_status; struct current_user user; fstring user_name; connection_struct *conn = NULL; @@ -1612,14 +1612,11 @@ NTSTATUS _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDE /* Null password is ok - we are already an authenticated user... */ *null_pw = '\0'; - get_current_user(&user, p); - fstrcpy(user_name, uidtoname(user.uid)); - - conn = make_connection(qualname, user_name, null_pw, 0, "A:", user.vuid, &ecode); + conn = make_connection(qualname, null_pw, 0, "A:", user.vuid, &nt_status); if (conn == NULL) { DEBUG(3,("_srv_net_file_query_secdesc: Unable to connect to %s\n", qualname)); - r_u->status = ecode; + r_u->status = nt_status; goto error_exit; } @@ -1690,7 +1687,7 @@ NTSTATUS _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC * BOOL bad_path; int access_mode; int action; - NTSTATUS ecode; + NTSTATUS nt_status; struct current_user user; fstring user_name; connection_struct *conn = NULL; @@ -1705,14 +1702,11 @@ NTSTATUS _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC * /* Null password is ok - we are already an authenticated user... */ *null_pw = '\0'; - get_current_user(&user, p); - fstrcpy(user_name, uidtoname(user.uid)); - - conn = make_connection(qualname, user_name, null_pw, 0, "A:", user.vuid, &ecode); + conn = make_connection(qualname, null_pw, 0, "A:", user.vuid, &nt_status); if (conn == NULL) { DEBUG(3,("_srv_net_file_set_secdesc: Unable to connect to %s\n", qualname)); - r_u->status = ecode; + r_u->status = nt_status; goto error_exit; } -- cgit From 06ccf1e499b170e3e9d97ffdf27a8c896c8cf1cd Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 15 Sep 2001 23:32:19 +0000 Subject: Looks like it missed these. make_connection now no longer takes a 'username' argument. (This used to be commit 0e1322227b0a91226b4b85c8e0ff838ebfd9e962) --- source3/rpc_server/srv_srvsvc_nt.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 9f156a3d95..70c6579f38 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1600,7 +1600,6 @@ NTSTATUS _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDE int action; NTSTATUS nt_status; struct current_user user; - fstring user_name; connection_struct *conn = NULL; ZERO_STRUCT(st); @@ -1689,7 +1688,6 @@ NTSTATUS _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC * int action; NTSTATUS nt_status; struct current_user user; - fstring user_name; connection_struct *conn = NULL; BOOL became_user = False; -- cgit From 36939fcd248529efff9fbccdc45942c9b4454b93 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 19 Sep 2001 02:28:15 +0000 Subject: Reverse some of the breakage I commited a day or two ago, as we need to fill out the user_info struct (otherwise we don't have a vuid for make_connection()). Also add a become_user() call, becouse it really looks like it was missing (we must pass it anyway to finish make_connection()). Is there any reason not to be the user when reading an ACL? Finally, fix up some formatting to show that the two functions are almost identical. Andrew Bartlett (This used to be commit 00c667c0ad922a1bf388b8a2b8c6137fc7f0acaa) --- source3/rpc_server/srv_srvsvc_nt.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 70c6579f38..8de20d4abf 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1601,6 +1601,7 @@ NTSTATUS _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDE NTSTATUS nt_status; struct current_user user; connection_struct *conn = NULL; + BOOL became_user = False; ZERO_STRUCT(st); @@ -1611,6 +1612,8 @@ NTSTATUS _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDE /* Null password is ok - we are already an authenticated user... */ *null_pw = '\0'; + get_current_user(&user, p); + conn = make_connection(qualname, null_pw, 0, "A:", user.vuid, &nt_status); if (conn == NULL) { @@ -1619,16 +1622,24 @@ NTSTATUS _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDE 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 = NT_STATUS_ACCESS_DENIED; + 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); + fsp = open_file_shared(conn, filename, &st, SET_OPEN_MODE(DOS_OPEN_RDONLY), - (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, 0, &access_mode, &action); + (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, 0, &access_mode, &action); if (!fsp) { /* Perhaps it is a directory */ if (errno == EISDIR) fsp = open_directory(conn, filename, &st, - (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, &action); + (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, &action); if (!fsp) { DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", filename)); @@ -1664,6 +1675,9 @@ NTSTATUS _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDE close_file(fsp, True); } + if (became_user) + unbecome_user(); + if (conn) close_cnum(conn, user.vuid); @@ -1678,9 +1692,9 @@ NTSTATUS _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC * SRV_R_NET_FILE_SET_SECDESC *r_u) { BOOL ret; + fstring null_pw; pstring filename; pstring qualname; - fstring null_pw; files_struct *fsp = NULL; SMB_STRUCT_STAT st; BOOL bad_path; @@ -1700,6 +1714,8 @@ NTSTATUS _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC * /* Null password is ok - we are already an authenticated user... */ *null_pw = '\0'; + get_current_user(&user, p); + conn = make_connection(qualname, null_pw, 0, "A:", user.vuid, &nt_status); if (conn == NULL) { @@ -1719,13 +1735,13 @@ NTSTATUS _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC * unix_convert(filename, conn, NULL, &bad_path, &st); fsp = open_file_shared(conn, filename, &st, SET_OPEN_MODE(DOS_OPEN_RDWR), - (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, 0, &access_mode, &action); + (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, 0, &access_mode, &action); if (!fsp) { /* Perhaps it is a directory */ if (errno == EISDIR) fsp = open_directory(conn, filename, &st, - (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, &action); + (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, &action); if (!fsp) { DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", filename)); -- cgit From 01529e340c607f5ef6acf164283d7f3ee5b05569 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 19 Sep 2001 02:53:14 +0000 Subject: fix debug (This used to be commit d103371e8028efb6eec3c4b917b68734832f5844) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 8de20d4abf..7bc94c5575 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1623,7 +1623,7 @@ NTSTATUS _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDE } if (!become_user(conn, conn->vuid)) { - DEBUG(0,("_srv_net_file_set_secdesc: Can't become connected user!\n")); + DEBUG(0,("_srv_net_file_query_secdesc: Can't become connected user!\n")); r_u->status = NT_STATUS_ACCESS_DENIED; goto error_exit; } -- cgit From 0f4281b9b4a4056e9e087deb15e60ea482af7a74 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 26 Sep 2001 00:05:03 +0000 Subject: Added Elrond patch to make se_access_check use NT datastructures, not Samba. Jeremy. (This used to be commit bca6419447e926e51aeecf3e484228f640cecb84) --- source3/rpc_server/srv_srvsvc_nt.c | 27 ++++++--------------------- 1 file changed, 6 insertions(+), 21 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 7bc94c5575..2877b7af05 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -308,8 +308,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; @@ -322,26 +321,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: -- cgit From dc1fc3ee8ec2199bc73bb5d7ec711c6800f61d65 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Tue, 2 Oct 2001 04:29:50 +0000 Subject: Removed 'extern int DEBUGLEVEL' as it is now in the smb.h header. (This used to be commit 2d0922b0eabfdc0aaf1d0797482fef47ed7fde8e) --- source3/rpc_server/srv_srvsvc_nt.c | 1 - 1 file changed, 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 2877b7af05..7e82599f28 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -26,7 +26,6 @@ #include "includes.h" -extern int DEBUGLEVEL; extern pstring global_myname; /******************************************************************* -- cgit From a2272cb71f2c48ffeb9a89ce79b3cdbdef7cc249 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 9 Oct 2001 21:22:33 +0000 Subject: Fix bug where removing root from a share SD stops further edit access. Jeremy. (This used to be commit 4d57c7520fa106ef6c29c0678584e1726ded961f) --- source3/rpc_server/srv_srvsvc_nt.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 7e82599f28..f1dabd64a9 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -225,7 +225,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; } @@ -310,6 +310,7 @@ BOOL share_access_check(connection_struct *conn, int snum, uint16 vuid, uint32 d NT_USER_TOKEN *token = NULL; user_struct *vuser = get_valid_user_struct(vuid); BOOL ret = True; + BOOL is_root = False; mem_ctx = talloc_init(); if (mem_ctx == NULL) @@ -320,12 +321,24 @@ BOOL share_access_check(connection_struct *conn, int snum, uint16 vuid, uint32 d if (!psd) goto out; - if (vuser) + if (vuser) { token = vuser->nt_user_token; - else + if (vuser->uid == (uid_t)0) + is_root = True; + } else { token = conn->nt_user_token; + if (conn->uid == (uid_t)0) + is_root = True; + } - ret = se_access_check(psd, token, desired_access, &granted, &status); + /* + * Root gets a free pass. + */ + + if (is_root) + ret = True; + else + ret = se_access_check(psd, token, desired_access, &granted, &status); out: -- cgit From de2ece0543bbd0b013310667ebdf33abe78a0ac4 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 10 Oct 2001 19:36:53 +0000 Subject: Back-out the share acl fix. Not needed (Gerald has been telling porkies again :-) :-). Jeremy. (This used to be commit 3b56239c51da3bb24d9ac1ee1442717f597c682a) --- source3/rpc_server/srv_srvsvc_nt.c | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index f1dabd64a9..2ae4a73874 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -310,7 +310,6 @@ BOOL share_access_check(connection_struct *conn, int snum, uint16 vuid, uint32 d NT_USER_TOKEN *token = NULL; user_struct *vuser = get_valid_user_struct(vuid); BOOL ret = True; - BOOL is_root = False; mem_ctx = talloc_init(); if (mem_ctx == NULL) @@ -321,24 +320,12 @@ BOOL share_access_check(connection_struct *conn, int snum, uint16 vuid, uint32 d if (!psd) goto out; - if (vuser) { + if (vuser) token = vuser->nt_user_token; - if (vuser->uid == (uid_t)0) - is_root = True; - } else { + else token = conn->nt_user_token; - if (conn->uid == (uid_t)0) - is_root = True; - } - /* - * Root gets a free pass. - */ - - if (is_root) - ret = True; - else - ret = se_access_check(psd, token, desired_access, &granted, &status); + ret = se_access_check(psd, token, desired_access, &granted, &status); out: -- cgit From c416ff851b4ecc7a44aee9d00d07dd481d8ae2a7 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 18 Oct 2001 20:15:12 +0000 Subject: Merge the become_XXX -> change_to_XXX fixes from 2.2.2 to HEAD. Ensure make_conection() can only be called as root. Jeremy. (This used to be commit 8d23a7441b4687458ee021bfe8880558506eddba) --- source3/rpc_server/srv_srvsvc_nt.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 2ae4a73874..44e44cfa3a 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1598,7 +1598,9 @@ NTSTATUS _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDE get_current_user(&user, p); + become_root(); conn = make_connection(qualname, null_pw, 0, "A:", user.vuid, &nt_status); + unbecome_root(); if (conn == NULL) { DEBUG(3,("_srv_net_file_query_secdesc: Unable to connect to %s\n", qualname)); @@ -1649,7 +1651,7 @@ NTSTATUS _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDE psd->dacl->revision = (uint16) NT4_ACL_REVISION; close_file(fsp, True); - + unbecome_user(); close_cnum(conn, user.vuid); return r_u->status; @@ -1700,7 +1702,9 @@ NTSTATUS _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC * get_current_user(&user, p); + become_root(); conn = make_connection(qualname, null_pw, 0, "A:", user.vuid, &nt_status); + unbecome_root(); if (conn == NULL) { DEBUG(3,("_srv_net_file_set_secdesc: Unable to connect to %s\n", qualname)); -- cgit From 60f0627afb167faad57385d44f0b587186a7ac2b Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 31 Oct 2001 10:46:25 +0000 Subject: This is a farily large patch (3300 lines) and reworks most of the AuthRewrite code. In particular this assists tpot in some of his work, becouse it provides the connection between the authenticaion and the vuid generation. Major Changes: - Fully malloc'ed structures. - Massive rework of the code so that all structures are made and destroyed using malloc and free, rather than hanging around on the stack. - SAM_ACCOUNT unix uids and gids are now pointers to the same, to allow them to be declared 'invalid' without the chance that people might get ROOT by default. - kill off some of the "DOMAIN\user" lookups. These can be readded at a more appropriate place (probably domain_client_validate.c) in the future. They don't belong in session setups. - Massive introduction of DATA_BLOB structures, particularly for passwords. - Use NTLMSSP flags to tell the backend what its getting, rather than magic lenghths. - Fix winbind back up again, but tpot is redoing this soon anyway. - Abstract much of the work in srv_netlog_nt back into auth helper functions. This is a LARGE change, and any assistance is testing it is appriciated. Domain logons are still broken (as far as I can tell) but other functionality seems intact. Needs testing with a wide variety of MS clients. Andrew Bartlett (This used to be commit f70fb819b2f57bd57232b51808345e2319d52f6c) --- source3/rpc_server/srv_srvsvc_nt.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 44e44cfa3a..7369c9d37d 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1574,7 +1574,7 @@ NTSTATUS _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDE { SEC_DESC *psd = NULL; size_t sd_size; - fstring null_pw; + DATA_BLOB null_pw; pstring filename; pstring qualname; files_struct *fsp = NULL; @@ -1594,12 +1594,12 @@ NTSTATUS _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDE unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname)); /* Null password is ok - we are already an authenticated user... */ - *null_pw = '\0'; + null_pw = data_blob(NULL, 0); get_current_user(&user, p); become_root(); - conn = make_connection(qualname, null_pw, 0, "A:", user.vuid, &nt_status); + conn = make_connection(qualname, null_pw, "A:", user.vuid, &nt_status); unbecome_root(); if (conn == NULL) { @@ -1678,7 +1678,7 @@ NTSTATUS _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC * SRV_R_NET_FILE_SET_SECDESC *r_u) { BOOL ret; - fstring null_pw; + DATA_BLOB null_pw; pstring filename; pstring qualname; files_struct *fsp = NULL; @@ -1698,12 +1698,12 @@ NTSTATUS _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC * unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname)); /* Null password is ok - we are already an authenticated user... */ - *null_pw = '\0'; + null_pw = data_blob(NULL, 0); get_current_user(&user, p); become_root(); - conn = make_connection(qualname, null_pw, 0, "A:", user.vuid, &nt_status); + conn = make_connection(qualname, null_pw, "A:", user.vuid, &nt_status); unbecome_root(); if (conn == NULL) { -- cgit From f741f656737f4ec46cd318e986b6bf412ed309d2 Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Mon, 19 Nov 2001 02:49:53 +0000 Subject: Store some path names in global variables initialized to configure default, rather than in preprocessor macros. (This used to be commit 79ec88f0da40faebe1e587f1b3e87b5f2b184f58) --- source3/rpc_server/srv_srvsvc_nt.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 7369c9d37d..5d7ac29aed 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1320,7 +1320,7 @@ NTSTATUS _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, return NT_STATUS_ACCESS_DENIED; slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\"", - lp_change_share_cmd(), CONFIGFILE, share_name, ptr, comment); + lp_change_share_cmd(), dyn_CONFIGFILE, share_name, ptr, comment); DEBUG(10,("_srv_net_share_set_info: Running [%s]\n", command )); if ((ret = smbrun(command, NULL)) != 0) { @@ -1436,7 +1436,7 @@ NTSTATUS _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET string_replace(comment, '"', ' '); slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\"", - lp_add_share_cmd(), CONFIGFILE, share_name, ptr, comment); + lp_add_share_cmd(), dyn_CONFIGFILE, share_name, ptr, comment); DEBUG(10,("_srv_net_share_add: Running [%s]\n", command )); if ((ret = smbrun(command, NULL)) != 0) { @@ -1502,7 +1502,7 @@ NTSTATUS _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET return NT_STATUS_ACCESS_DENIED; slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\"", - lp_delete_share_cmd(), CONFIGFILE, lp_servicename(snum)); + lp_delete_share_cmd(), dyn_CONFIGFILE, lp_servicename(snum)); DEBUG(10,("_srv_net_share_del: Running [%s]\n", command )); if ((ret = smbrun(command, NULL)) != 0) { -- cgit From b9a82592f6fe23e5a7342f3174d5d402e3be759d Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 23 Nov 2001 19:07:35 +0000 Subject: Sorry. I broke the build, missed on open_directory call. Jeremy. (This used to be commit fe288b14cc7f2bc6b8427438da672e7dd7812027) --- source3/rpc_server/srv_srvsvc_nt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 5d7ac29aed..9fadba17dd 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1624,7 +1624,7 @@ NTSTATUS _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDE if (!fsp) { /* Perhaps it is a directory */ if (errno == EISDIR) - fsp = open_directory(conn, filename, &st, + fsp = open_directory(conn, filename, &st,0, (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, &action); if (!fsp) { @@ -1728,7 +1728,7 @@ NTSTATUS _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC * if (!fsp) { /* Perhaps it is a directory */ if (errno == EISDIR) - fsp = open_directory(conn, filename, &st, + fsp = open_directory(conn, filename, &st,0, (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, &action); if (!fsp) { -- cgit From bf65820af242786bd66d814fc3e9d89920a49f8e Mon Sep 17 00:00:00 2001 From: Martin Pool Date: Fri, 21 Dec 2001 00:37:49 +0000 Subject: Add an output parameter to message_send_all that says how many messages were sent, so you know how many replies to expect. Const and doc religion. (This used to be commit 22e510ea0d69356be4fd2fa5ad9e9f4e84f62337) --- source3/rpc_server/srv_srvsvc_nt.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 9fadba17dd..06cbbaa2dc 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1329,7 +1329,8 @@ NTSTATUS _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, } /* Tell everyone we updated smb.conf. */ - message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False); + message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, + 0, False, NULL); } else { DEBUG(10,("_srv_net_share_set_info: No change to share name (%s)\n", share_name )); @@ -1451,7 +1452,8 @@ NTSTATUS _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET } /* Tell everyone we updated smb.conf. */ - message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False); + message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, + NULL); /* * We don't call reload_services() here, the message will @@ -1514,7 +1516,8 @@ NTSTATUS _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET delete_share_security(snum); /* Tell everyone we updated smb.conf. */ - message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False); + message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, + NULL); lp_killservice(snum); -- cgit From eb4e10115310b6ed23b92abac2e79454c80930b1 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 31 Dec 2001 13:46:26 +0000 Subject: - portablitity fixes for cc -64 on irix - fixed gid* bug in rpc_server (This used to be commit 48aa90c48c5f0e3054c4acdc49668e222e7c0d36) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 06cbbaa2dc..57757e28b5 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1827,7 +1827,7 @@ NTSTATUS _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET r_u->disk_enum_ctr.unknown = 0; - r_u->disk_enum_ctr.disk_info_ptr = (uint32) r_u->disk_enum_ctr.disk_info; + r_u->disk_enum_ctr.disk_info_ptr = r_u->disk_enum_ctr.disk_info? 1 : 0; /*allow one DISK_INFO for null terminator*/ -- cgit From eca99f5c226f9518d1ab5c0ba3e586e3d59564d7 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 3 Jan 2002 22:48:48 +0000 Subject: Fixed nasty cast of tdb_delete in traversals. Jeremy. (This used to be commit a0cdec3acc82d1ce0292fadd4b8dac23638450f3) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 57757e28b5..f37096fec3 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -136,7 +136,7 @@ BOOL share_info_db_init(void) /* handle a Samba upgrade */ tdb_lock_bystring(share_tdb, vstring); if (tdb_fetch_int(share_tdb, vstring) != SHARE_DATABASE_VERSION) { - tdb_traverse(share_tdb, (tdb_traverse_func)tdb_delete, NULL); + tdb_traverse(share_tdb, tdb_traverse_delete_fn, NULL); tdb_store_int(share_tdb, vstring, SHARE_DATABASE_VERSION); } tdb_unlock_bystring(share_tdb, vstring); -- cgit From 91536cc901088232074ad8dd7ae16e0f6026f25e Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 9 Jan 2002 04:13:30 +0000 Subject: Fixed all uses of tdb_fetch/store/_int to use explicit int32 little endian in tdb's. All except winbindd_idmap.... Hmmmmmm. Jeremy. (This used to be commit ec71f1732b6b27bd2d65b250a6f3720a235dc38d) --- source3/rpc_server/srv_srvsvc_nt.c | 47 +++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 18 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index f37096fec3..57013829c5 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -120,30 +120,41 @@ static TDB_CONTEXT *share_tdb; /* used for share security descriptors */ BOOL share_info_db_init(void) { - static pid_t local_pid; - char *vstring = "INFO/version"; + static pid_t local_pid; + char *vstring = "INFO/version"; + int32 vers_id; - if (share_tdb && local_pid == sys_getpid()) return True; - 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) )); - return False; - } + if (share_tdb && local_pid == sys_getpid()) + return True; + 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) )); + return False; + } - local_pid = sys_getpid(); + local_pid = sys_getpid(); - /* handle a Samba upgrade */ - tdb_lock_bystring(share_tdb, vstring); - if (tdb_fetch_int(share_tdb, vstring) != SHARE_DATABASE_VERSION) { - tdb_traverse(share_tdb, tdb_traverse_delete_fn, NULL); - tdb_store_int(share_tdb, vstring, SHARE_DATABASE_VERSION); - } - tdb_unlock_bystring(share_tdb, vstring); + /* handle a Samba upgrade */ + tdb_lock_bystring(share_tdb, vstring); + + /* Cope with byte-reversed older versions of the db. */ + vers_id = tdb_fetch_int32(share_tdb, vstring); + if ((vers_id != SHARE_DATABASE_VERSION) && (IREV(vers_id) == SHARE_DATABASE_VERSION)) { + /* Written on a bigendian machine with old fetch_int code. Save as le. */ + tdb_store_int32(share_tdb, vstring, SHARE_DATABASE_VERSION); + vers_id = SHARE_DATABASE_VERSION; + } + + if (vers_id != SHARE_DATABASE_VERSION) { + tdb_traverse(share_tdb, tdb_traverse_delete_fn, NULL); + tdb_store_int32(share_tdb, vstring, SHARE_DATABASE_VERSION); + } + tdb_unlock_bystring(share_tdb, vstring); message_register(MSG_SMB_CONF_UPDATED, smb_conf_updated); - return True; + return True; } /******************************************************************* -- cgit From a842a3d4582b556c77fcfb593af193b4d1225751 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 9 Jan 2002 05:24:07 +0000 Subject: When re-writing tdb version numbers as little endian int32, we must change the version number also. Jeremy. (This used to be commit 3dec9cf99a82bd15626eb99e7d937ff00183cc05) --- source3/rpc_server/srv_srvsvc_nt.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 57013829c5..67442a7761 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -116,7 +116,8 @@ static void smb_conf_updated(int msg_type, pid_t src, void *buf, size_t len) ********************************************************************/ static TDB_CONTEXT *share_tdb; /* used for share security descriptors */ -#define SHARE_DATABASE_VERSION 1 +#define SHARE_DATABASE_VERSION_V1 1 +#define SHARE_DATABASE_VERSION_V2 2 /* version id in little endian. */ BOOL share_info_db_init(void) { @@ -140,15 +141,15 @@ BOOL share_info_db_init(void) /* Cope with byte-reversed older versions of the db. */ vers_id = tdb_fetch_int32(share_tdb, vstring); - if ((vers_id != SHARE_DATABASE_VERSION) && (IREV(vers_id) == SHARE_DATABASE_VERSION)) { + if ((vers_id == SHARE_DATABASE_VERSION_V1) || (IREV(vers_id) == SHARE_DATABASE_VERSION_V1)) { /* Written on a bigendian machine with old fetch_int code. Save as le. */ - tdb_store_int32(share_tdb, vstring, SHARE_DATABASE_VERSION); - vers_id = SHARE_DATABASE_VERSION; + tdb_store_int32(share_tdb, vstring, SHARE_DATABASE_VERSION_V2); + vers_id = SHARE_DATABASE_VERSION_V2; } - if (vers_id != SHARE_DATABASE_VERSION) { + if (vers_id != SHARE_DATABASE_VERSION_V2) { tdb_traverse(share_tdb, tdb_traverse_delete_fn, NULL); - tdb_store_int32(share_tdb, vstring, SHARE_DATABASE_VERSION); + tdb_store_int32(share_tdb, vstring, SHARE_DATABASE_VERSION_V2); } tdb_unlock_bystring(share_tdb, vstring); -- cgit From cd68afe31256ad60748b34f7318a180cfc2127cc Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Wed, 30 Jan 2002 06:08:46 +0000 Subject: Removed version number from file header. Changed "SMB/Netbios" to "SMB/CIFS" in file header. (This used to be commit 6a58c9bd06d0d7502a24bf5ce5a2faf0a146edfa) --- source3/rpc_server/srv_srvsvc_nt.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 67442a7761..148bcb4d1e 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1,6 +1,5 @@ /* - * Unix SMB/Netbios implementation. - * Version 1.9. + * Unix SMB/CIFS implementation. * RPC Pipe client / server routines * Copyright (C) Andrew Tridgell 1992-1997, * Copyright (C) Luke Kenneth Casson Leighton 1996-1997, -- cgit From aa785249438587f32e129972c82096839f7ed798 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 5 Mar 2002 02:12:00 +0000 Subject: Fix the NTSTATUS -> WERROR for srvsvc pipe. Jeremy. (This used to be commit 2b85d3570c2b149049482c3878c50cf8f5bfca61) --- source3/rpc_server/srv_srvsvc_nt.c | 265 ++++++++++++++++++------------------- 1 file changed, 128 insertions(+), 137 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 148bcb4d1e..09f33b9a88 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1,9 +1,7 @@ /* - * Unix SMB/CIFS implementation. + * Unix SMB/Netbios implementation. * RPC Pipe client / server routines * Copyright (C) Andrew Tridgell 1992-1997, - * Copyright (C) Luke Kenneth Casson Leighton 1996-1997, - * Copyright (C) Paul Ashton 1997. * Copyright (C) Jeremy Allison 2001. * * This program is free software; you can redistribute it and/or modify @@ -173,8 +171,8 @@ static SEC_DESC *get_share_security_default( TALLOC_CTX *ctx, int snum, size_t * se_map_generic(&def_access, &file_generic_mapping); - init_sec_access(&sa, GENERIC_ALL_ACCESS | def_access ); - init_sec_ace(&ace, &global_sid_World, SEC_ACE_TYPE_ACCESS_ALLOWED, sa, 0); + init_sec_access(&sa, GENERIC_ALL_ACCESS | def_access ); + init_sec_ace(&ace, &global_sid_World, SEC_ACE_TYPE_ACCESS_ALLOWED, sa, 0); if ((psa = make_sec_acl(ctx, NT4_ACL_REVISION, 1, &ace)) != NULL) { psd = make_sec_desc(ctx, SEC_DESC_REVISION, NULL, NULL, NULL, psa, psize); @@ -204,13 +202,13 @@ static SEC_DESC *get_share_security( TALLOC_CTX *ctx, int snum, size_t *psize) slprintf(key, sizeof(key)-1, "SECDESC/%s", lp_servicename(snum)); - if (tdb_prs_fetch(share_tdb, key, &ps, ctx)!=0 || - !sec_io_desc("get_share_security", &psd, &ps, 1)) { + if (tdb_prs_fetch(share_tdb, key, &ps, ctx)!=0 || + !sec_io_desc("get_share_security", &psd, &ps, 1)) { - DEBUG(4,("get_share_security: using default secdesc for %s\n", lp_servicename(snum) )); + DEBUG(4,("get_share_security: using default secdesc for %s\n", lp_servicename(snum) )); - return get_share_security_default(ctx, snum, psize); - } + return get_share_security_default(ctx, snum, psize); + } if (psd) *psize = sec_desc_size(psd); @@ -236,27 +234,26 @@ 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("share_security", &psd, &ps, 1)) { - goto out; - } + if (!sec_io_desc("share_security", &psd, &ps, 1)) + goto out; slprintf(key, sizeof(key)-1, "SECDESC/%s", share_name); - if (tdb_prs_store(share_tdb, key, &ps)==0) { - ret = True; - DEBUG(5,("set_share_security: stored secdesc for %s\n", share_name )); - } else { - DEBUG(1,("set_share_security: Failed to store secdesc for %s\n", share_name )); - } - - /* Free malloc'ed memory */ + if (tdb_prs_store(share_tdb, key, &ps)==0) { + ret = True; + DEBUG(5,("set_share_security: stored secdesc for %s\n", share_name )); + } else { + DEBUG(1,("set_share_security: Failed to store secdesc for %s\n", share_name )); + } + + /* Free malloc'ed memory */ out: - prs_mem_free(&ps); - if (mem_ctx) - talloc_destroy(mem_ctx); - return ret; + prs_mem_free(&ps); + if (mem_ctx) + talloc_destroy(mem_ctx); + return ret; } /******************************************************************* @@ -523,9 +520,9 @@ static void init_srv_r_net_share_enum(pipes_struct *p, SRV_R_NET_SHARE_ENUM *r_n if (init_srv_share_info_ctr(p, &r_n->ctr, info_level, &resume_hnd, &r_n->total_entries, all)) { - r_n->status = NT_STATUS_OK; + r_n->status = WERR_OK; } else { - r_n->status = NT_STATUS_INVALID_INFO_CLASS; + r_n->status = WERR_UNKNOWN_LEVEL; } init_enum_hnd(&r_n->enum_hnd, resume_hnd); @@ -538,7 +535,7 @@ static void init_srv_r_net_share_enum(pipes_struct *p, SRV_R_NET_SHARE_ENUM *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) { - NTSTATUS status = NT_STATUS_OK; + WERROR status = WERR_OK; int snum; DEBUG(5,("init_srv_r_net_share_get_info: %d\n", __LINE__)); @@ -563,14 +560,14 @@ static void init_srv_r_net_share_get_info(pipes_struct *p, SRV_R_NET_SHARE_GET_I break; default: DEBUG(5,("init_srv_net_share_get_info: unsupported switch value %d\n", info_level)); - status = NT_STATUS_INVALID_INFO_CLASS; + status = WERR_UNKNOWN_LEVEL; break; } } else { - status = NT_STATUS_BAD_NETWORK_NAME; + status = WERR_INVALID_NAME; } - r_n->info.ptr_share_ctr = NT_STATUS_IS_OK(status) ? 1 : 0; + r_n->info.ptr_share_ctr = W_ERROR_IS_OK(status) ? 1 : 0; r_n->status = status; } @@ -687,10 +684,10 @@ static void init_srv_sess_info_1(SRV_SESS_INFO_1 *ss1, uint32 *snum, uint32 *sto makes a SRV_R_NET_SESS_ENUM structure. ********************************************************************/ -static NTSTATUS init_srv_sess_info_ctr(SRV_SESS_INFO_CTR *ctr, +static WERROR init_srv_sess_info_ctr(SRV_SESS_INFO_CTR *ctr, int switch_value, uint32 *resume_hnd, uint32 *total_entries) { - NTSTATUS status = NT_STATUS_OK; + WERROR status = WERR_OK; DEBUG(5,("init_srv_sess_info_ctr: %d\n", __LINE__)); ctr->switch_value = switch_value; @@ -709,7 +706,7 @@ static NTSTATUS init_srv_sess_info_ctr(SRV_SESS_INFO_CTR *ctr, (*resume_hnd) = 0; (*total_entries) = 0; ctr->ptr_sess_ctr = 0; - status = NT_STATUS_INVALID_INFO_CLASS; + status = WERR_UNKNOWN_LEVEL; break; } @@ -728,11 +725,11 @@ static void init_srv_r_net_sess_enum(SRV_R_NET_SESS_ENUM *r_n, r_n->sess_level = sess_level; if (sess_level == -1) - r_n->status = NT_STATUS_INVALID_INFO_CLASS; + r_n->status = WERR_UNKNOWN_LEVEL; else r_n->status = init_srv_sess_info_ctr(r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries); - if (NT_STATUS_IS_ERR(r_n->status)) + if (!W_ERROR_IS_OK(r_n->status)) resume_hnd = 0; init_enum_hnd(&r_n->enum_hnd, resume_hnd); @@ -843,10 +840,10 @@ static void init_srv_conn_info_1(SRV_CONN_INFO_1 *ss1, uint32 *snum, uint32 *sto makes a SRV_R_NET_CONN_ENUM structure. ********************************************************************/ -static NTSTATUS init_srv_conn_info_ctr(SRV_CONN_INFO_CTR *ctr, +static WERROR init_srv_conn_info_ctr(SRV_CONN_INFO_CTR *ctr, int switch_value, uint32 *resume_hnd, uint32 *total_entries) { - NTSTATUS status = NT_STATUS_OK; + WERROR status = WERR_OK; DEBUG(5,("init_srv_conn_info_ctr: %d\n", __LINE__)); ctr->switch_value = switch_value; @@ -865,7 +862,7 @@ static NTSTATUS init_srv_conn_info_ctr(SRV_CONN_INFO_CTR *ctr, (*resume_hnd = 0); (*total_entries) = 0; ctr->ptr_conn_ctr = 0; - status = NT_STATUS_INVALID_INFO_CLASS; + status = WERR_UNKNOWN_LEVEL; break; } @@ -883,11 +880,11 @@ static void init_srv_r_net_conn_enum(SRV_R_NET_CONN_ENUM *r_n, r_n->conn_level = conn_level; if (conn_level == -1) - r_n->status = NT_STATUS_INVALID_INFO_CLASS; + r_n->status = WERR_UNKNOWN_LEVEL; else r_n->status = init_srv_conn_info_ctr(r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries); - if (NT_STATUS_IS_ERR(r_n->status)) + if (!W_ERROR_IS_OK(r_n->status)) resume_hnd = 0; init_enum_hnd(&r_n->enum_hnd, resume_hnd); @@ -943,10 +940,10 @@ static void init_srv_file_info_3(SRV_FILE_INFO_3 *fl3, uint32 *fnum, uint32 *fto makes a SRV_R_NET_FILE_ENUM structure. ********************************************************************/ -static NTSTATUS init_srv_file_info_ctr(SRV_FILE_INFO_CTR *ctr, +static WERROR init_srv_file_info_ctr(SRV_FILE_INFO_CTR *ctr, int switch_value, uint32 *resume_hnd, uint32 *total_entries) { - NTSTATUS status = NT_STATUS_OK; + WERROR status = WERR_OK; DEBUG(5,("init_srv_file_info_ctr: %d\n", __LINE__)); ctr->switch_value = switch_value; @@ -961,7 +958,7 @@ static NTSTATUS init_srv_file_info_ctr(SRV_FILE_INFO_CTR *ctr, (*resume_hnd = 0); (*total_entries) = 0; ctr->ptr_file_ctr = 0; - status = NT_STATUS_INVALID_INFO_CLASS; + status = WERR_UNKNOWN_LEVEL; break; } @@ -979,11 +976,11 @@ static void init_srv_r_net_file_enum(SRV_R_NET_FILE_ENUM *r_n, r_n->file_level = file_level; if (file_level == 0) - r_n->status = NT_STATUS_INVALID_INFO_CLASS; + r_n->status = WERR_UNKNOWN_LEVEL; else r_n->status = init_srv_file_info_ctr(r_n->ctr, switch_value, &resume_hnd, &(r_n->total_entries)); - if (NT_STATUS_IS_ERR(r_n->status)) + if (!W_ERROR_IS_OK(r_n->status)) resume_hnd = 0; init_enum_hnd(&r_n->enum_hnd, resume_hnd); @@ -993,13 +990,13 @@ static void init_srv_r_net_file_enum(SRV_R_NET_FILE_ENUM *r_n, net server get info ********************************************************************/ -NTSTATUS _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV_R_NET_SRV_GET_INFO *r_u) +WERROR _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV_R_NET_SRV_GET_INFO *r_u) { - NTSTATUS status = NT_STATUS_OK; + WERROR status = WERR_OK; SRV_INFO_CTR *ctr = (SRV_INFO_CTR *)talloc(p->mem_ctx, sizeof(SRV_INFO_CTR)); if (!ctr) - return NT_STATUS_NO_MEMORY; + return WERR_NOMEM; ZERO_STRUCTP(ctr); @@ -1031,7 +1028,7 @@ NTSTATUS _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV init_srv_info_100(&ctr->srv.sv100, 500, global_myname); break; default: - status = NT_STATUS_INVALID_INFO_CLASS; + status = WERR_UNKNOWN_LEVEL; break; } @@ -1047,12 +1044,9 @@ NTSTATUS _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV net server set info ********************************************************************/ -NTSTATUS _srv_net_srv_set_info(pipes_struct *p, SRV_Q_NET_SRV_SET_INFO *q_u, SRV_R_NET_SRV_SET_INFO *r_u) +WERROR _srv_net_srv_set_info(pipes_struct *p, SRV_Q_NET_SRV_SET_INFO *q_u, SRV_R_NET_SRV_SET_INFO *r_u) { - /* NT gives "Windows NT error 0xc00000022" if we return - NT_STATUS_ACCESS_DENIED here so just pretend everything is OK. */ - - NTSTATUS status = NT_STATUS_OK; + WERROR status = WERR_OK; DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__)); @@ -1069,11 +1063,11 @@ NTSTATUS _srv_net_srv_set_info(pipes_struct *p, SRV_Q_NET_SRV_SET_INFO *q_u, SRV net file enum ********************************************************************/ -NTSTATUS _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_FILE_ENUM *r_u) +WERROR _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_FILE_ENUM *r_u) { r_u->ctr = (SRV_FILE_INFO_CTR *)talloc(p->mem_ctx, sizeof(SRV_FILE_INFO_CTR)); if (!r_u->ctr) - return NT_STATUS_NO_MEMORY; + return WERR_NOMEM; ZERO_STRUCTP(r_u->ctr); @@ -1094,13 +1088,13 @@ NTSTATUS _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET net conn enum ********************************************************************/ -NTSTATUS _srv_net_conn_enum(pipes_struct *p, SRV_Q_NET_CONN_ENUM *q_u, SRV_R_NET_CONN_ENUM *r_u) +WERROR _srv_net_conn_enum(pipes_struct *p, SRV_Q_NET_CONN_ENUM *q_u, SRV_R_NET_CONN_ENUM *r_u) { DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__)); r_u->ctr = (SRV_CONN_INFO_CTR *)talloc(p->mem_ctx, sizeof(SRV_CONN_INFO_CTR)); if (!r_u->ctr) - return NT_STATUS_NO_MEMORY; + return WERR_NOMEM; ZERO_STRUCTP(r_u->ctr); @@ -1119,13 +1113,13 @@ NTSTATUS _srv_net_conn_enum(pipes_struct *p, SRV_Q_NET_CONN_ENUM *q_u, SRV_R_NET net sess enum ********************************************************************/ -NTSTATUS _srv_net_sess_enum(pipes_struct *p, SRV_Q_NET_SESS_ENUM *q_u, SRV_R_NET_SESS_ENUM *r_u) +WERROR _srv_net_sess_enum(pipes_struct *p, SRV_Q_NET_SESS_ENUM *q_u, SRV_R_NET_SESS_ENUM *r_u) { DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__)); r_u->ctr = (SRV_SESS_INFO_CTR *)talloc(p->mem_ctx, sizeof(SRV_SESS_INFO_CTR)); if (!r_u->ctr) - return NT_STATUS_NO_MEMORY; + return WERR_NOMEM; ZERO_STRUCTP(r_u->ctr); @@ -1144,7 +1138,7 @@ NTSTATUS _srv_net_sess_enum(pipes_struct *p, SRV_Q_NET_SESS_ENUM *q_u, SRV_R_NET Net share enum all. ********************************************************************/ -NTSTATUS _srv_net_share_enum_all(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u) +WERROR _srv_net_share_enum_all(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u) { DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__)); @@ -1162,7 +1156,7 @@ NTSTATUS _srv_net_share_enum_all(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV Net share enum. ********************************************************************/ -NTSTATUS _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u) +WERROR _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u) { DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__)); @@ -1180,7 +1174,7 @@ NTSTATUS _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_N Net share get info. ********************************************************************/ -NTSTATUS _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, SRV_R_NET_SHARE_GET_INFO *r_u) +WERROR _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, SRV_R_NET_SHARE_GET_INFO *r_u) { fstring share_name; @@ -1240,7 +1234,7 @@ static char *valid_share_pathname(char *dos_pathname) Net share set info. Modify share details. ********************************************************************/ -NTSTATUS _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, SRV_R_NET_SHARE_SET_INFO *r_u) +WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, SRV_R_NET_SHARE_SET_INFO *r_u) { struct current_user user; pstring command; @@ -1260,27 +1254,27 @@ NTSTATUS _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, r_u->switch_value = 0; if (strequal(share_name,"IPC$") || strequal(share_name,"ADMIN$") || strequal(share_name,"global")) - return NT_STATUS_ACCESS_DENIED; + return WERR_ACCESS_DENIED; snum = find_service(share_name); /* Does this share exist ? */ if (snum < 0) - return NT_STATUS_BAD_NETWORK_NAME; + return WERR_INVALID_NAME; /* No change to printer shares. */ if (lp_print_ok(snum)) - return NT_STATUS_ACCESS_DENIED; + return WERR_ACCESS_DENIED; get_current_user(&user,p); if (user.uid != 0) - return NT_STATUS_ACCESS_DENIED; + return WERR_ACCESS_DENIED; switch (q_u->info_level) { case 1: /* Not enough info in a level 1 to do anything. */ - return NT_STATUS_ACCESS_DENIED; + return WERR_ACCESS_DENIED; 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)); @@ -1295,7 +1289,7 @@ NTSTATUS _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, map_generic_share_sd_bits(psd); break; case 1005: - return NT_STATUS_ACCESS_DENIED; + return WERR_ACCESS_DENIED; case 1501: fstrcpy(pathname, lp_pathname(snum)); fstrcpy(comment, lp_comment(snum)); @@ -1305,16 +1299,16 @@ NTSTATUS _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, break; default: DEBUG(5,("_srv_net_share_set_info: unsupported switch value %d\n", q_u->info_level)); - return NT_STATUS_INVALID_INFO_CLASS; + return WERR_UNKNOWN_LEVEL; } /* We can only modify disk shares. */ if (type != STYPE_DISKTREE) - return NT_STATUS_ACCESS_DENIED; + return WERR_ACCESS_DENIED; /* Check if the pathname is valid. */ if (!(ptr = valid_share_pathname( pathname ))) - return NT_STATUS_OBJECT_PATH_INVALID; + return WERR_OBJECT_PATH_INVALID; /* Ensure share name, pathname and comment don't contain '"' characters. */ string_replace(share_name, '"', ' '); @@ -1328,7 +1322,7 @@ NTSTATUS _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, if (strcmp(ptr, lp_pathname(snum)) || strcmp(comment, lp_comment(snum)) ) { if (!lp_change_share_cmd() || !*lp_change_share_cmd()) - return NT_STATUS_ACCESS_DENIED; + return WERR_ACCESS_DENIED; slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\"", lp_change_share_cmd(), dyn_CONFIGFILE, share_name, ptr, comment); @@ -1336,12 +1330,11 @@ NTSTATUS _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, 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 NT_STATUS_ACCESS_DENIED; + return WERR_ACCESS_DENIED; } /* Tell everyone we updated smb.conf. */ - message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, - 0, False, NULL); + message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL); } else { DEBUG(10,("_srv_net_share_set_info: No change to share name (%s)\n", share_name )); @@ -1363,14 +1356,14 @@ NTSTATUS _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); - return NT_STATUS_OK; + return WERR_OK; } /******************************************************************* Net share add. Call 'add_share_command "sharename" "pathname" "comment" "read only = xxx"' ********************************************************************/ -NTSTATUS _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_SHARE_ADD *r_u) +WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_SHARE_ADD *r_u) { struct current_user user; pstring command; @@ -1391,18 +1384,18 @@ NTSTATUS _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET if (user.uid != 0) { DEBUG(10,("_srv_net_share_add: uid != 0. Access denied.\n")); - return NT_STATUS_ACCESS_DENIED; + return WERR_ACCESS_DENIED; } if (!lp_add_share_cmd() || !*lp_add_share_cmd()) { DEBUG(10,("_srv_net_share_add: No add share command\n")); - return NT_STATUS_ACCESS_DENIED; + return WERR_ACCESS_DENIED; } switch (q_u->info_level) { case 1: /* Not enough info in a level 1 to do anything. */ - return NT_STATUS_ACCESS_DENIED; + return WERR_ACCESS_DENIED; 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)); @@ -1419,28 +1412,28 @@ NTSTATUS _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET break; case 1005: /* DFS only level. */ - return NT_STATUS_ACCESS_DENIED; + return WERR_ACCESS_DENIED; default: DEBUG(5,("_srv_net_share_add: unsupported switch value %d\n", q_u->info_level)); - return NT_STATUS_INVALID_INFO_CLASS; + return WERR_UNKNOWN_LEVEL; } if (strequal(share_name,"IPC$") || strequal(share_name,"ADMIN$") || strequal(share_name,"global")) - return NT_STATUS_ACCESS_DENIED; + return WERR_ACCESS_DENIED; snum = find_service(share_name); /* Share already exists. */ if (snum >= 0) - return NT_STATUS_OBJECT_NAME_COLLISION; + return WERR_ALREADY_EXISTS; /* We can only add disk shares. */ if (type != STYPE_DISKTREE) - return NT_STATUS_ACCESS_DENIED; + return WERR_ACCESS_DENIED; /* Check if the pathname is valid. */ if (!(ptr = valid_share_pathname( pathname ))) - return NT_STATUS_OBJECT_PATH_INVALID; + return WERR_OBJECT_PATH_INVALID; /* Ensure share name, pathname and comment don't contain '"' characters. */ string_replace(share_name, '"', ' '); @@ -1453,7 +1446,7 @@ NTSTATUS _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET 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 NT_STATUS_ACCESS_DENIED; + return WERR_ACCESS_DENIED; } if (psd) { @@ -1463,8 +1456,7 @@ NTSTATUS _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET } /* Tell everyone we updated smb.conf. */ - message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, - NULL); + message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL); /* * We don't call reload_services() here, the message will @@ -1474,7 +1466,7 @@ NTSTATUS _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET DEBUG(5,("_srv_net_share_add: %d\n", __LINE__)); - return NT_STATUS_OK; + return WERR_OK; } /******************************************************************* @@ -1482,7 +1474,7 @@ NTSTATUS _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET a parameter. ********************************************************************/ -NTSTATUS _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u) +WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u) { struct current_user user; pstring command; @@ -1495,24 +1487,24 @@ NTSTATUS _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET 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 NT_STATUS_ACCESS_DENIED; + return WERR_ACCESS_DENIED; snum = find_service(share_name); if (snum < 0) - return NT_STATUS_BAD_NETWORK_NAME; + return WERR_NO_SUCH_SHARE; /* No change to printer shares. */ if (lp_print_ok(snum)) - return NT_STATUS_ACCESS_DENIED; + return WERR_ACCESS_DENIED; get_current_user(&user,p); if (user.uid != 0) - return NT_STATUS_ACCESS_DENIED; + return WERR_ACCESS_DENIED; if (!lp_delete_share_cmd() || !*lp_delete_share_cmd()) - return NT_STATUS_ACCESS_DENIED; + return WERR_ACCESS_DENIED; slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\"", lp_delete_share_cmd(), dyn_CONFIGFILE, lp_servicename(snum)); @@ -1520,26 +1512,25 @@ NTSTATUS _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET 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 NT_STATUS_ACCESS_DENIED; + return WERR_ACCESS_DENIED; } /* Delete the SD in the database. */ delete_share_security(snum); /* Tell everyone we updated smb.conf. */ - message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, - NULL); + message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL); lp_killservice(snum); - return NT_STATUS_OK; + return WERR_OK; } /******************************************************************* time of day ********************************************************************/ -NTSTATUS _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET_REMOTE_TOD *r_u) +WERROR _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET_REMOTE_TOD *r_u) { TIME_OF_DAY_INFO *tod; struct tm *t; @@ -1547,13 +1538,13 @@ NTSTATUS _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_N tod = (TIME_OF_DAY_INFO *)talloc(p->mem_ctx, sizeof(TIME_OF_DAY_INFO)); if (!tod) - return NT_STATUS_NO_MEMORY; + return WERR_NOMEM; ZERO_STRUCTP(tod); r_u->tod = tod; r_u->ptr_srv_tod = 0x1; - r_u->status = NT_STATUS_OK; + r_u->status = WERR_OK; DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__)); @@ -1583,7 +1574,7 @@ NTSTATUS _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_N Win9x NT tools get security descriptor. ***********************************************************************************/ -NTSTATUS _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC *q_u, +WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC *q_u, SRV_R_NET_FILE_QUERY_SECDESC *r_u) { SEC_DESC *psd = NULL; @@ -1599,51 +1590,50 @@ NTSTATUS _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDE NTSTATUS nt_status; struct current_user user; connection_struct *conn = NULL; - BOOL became_user = False; + BOOL became_user = False; ZERO_STRUCT(st); - r_u->status = NT_STATUS_OK; + r_u->status = WERR_OK; unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname)); /* Null password is ok - we are already an authenticated user... */ null_pw = data_blob(NULL, 0); - get_current_user(&user, p); - + get_current_user(&user, p); + become_root(); conn = make_connection(qualname, null_pw, "A:", user.vuid, &nt_status); unbecome_root(); if (conn == NULL) { DEBUG(3,("_srv_net_file_query_secdesc: Unable to connect to %s\n", qualname)); - r_u->status = nt_status; + r_u->status = ntstatus_to_werror(nt_status); goto error_exit; } if (!become_user(conn, conn->vuid)) { DEBUG(0,("_srv_net_file_query_secdesc: Can't become connected user!\n")); - r_u->status = NT_STATUS_ACCESS_DENIED; + r_u->status = WERR_ACCESS_DENIED; goto error_exit; } - became_user = True; + became_user = True; unistr2_to_ascii(filename, &q_u->uni_file_name, sizeof(filename)); unix_convert(filename, conn, NULL, &bad_path, &st); - fsp = open_file_shared(conn, filename, &st, SET_OPEN_MODE(DOS_OPEN_RDONLY), - (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, 0, &access_mode, &action); + (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, 0, &access_mode, &action); if (!fsp) { /* Perhaps it is a directory */ if (errno == EISDIR) fsp = open_directory(conn, filename, &st,0, - (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, &action); + (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, &action); if (!fsp) { DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", filename)); - r_u->status = NT_STATUS_ACCESS_DENIED; + r_u->status = WERR_ACCESS_DENIED; goto error_exit; } } @@ -1652,7 +1642,7 @@ NTSTATUS _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDE if (sd_size == 0) { DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", filename)); - r_u->status = NT_STATUS_ACCESS_DENIED; + r_u->status = WERR_ACCESS_DENIED; goto error_exit; } @@ -1688,13 +1678,13 @@ NTSTATUS _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDE Win9x NT tools set security descriptor. ***********************************************************************************/ -NTSTATUS _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_u, +WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_u, SRV_R_NET_FILE_SET_SECDESC *r_u) { BOOL ret; - DATA_BLOB null_pw; pstring filename; pstring qualname; + DATA_BLOB null_pw; files_struct *fsp = NULL; SMB_STRUCT_STAT st; BOOL bad_path; @@ -1702,33 +1692,34 @@ NTSTATUS _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC * int action; NTSTATUS nt_status; struct current_user user; + fstring user_name; connection_struct *conn = NULL; BOOL became_user = False; ZERO_STRUCT(st); - r_u->status = NT_STATUS_OK; + r_u->status = WERR_OK; unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname)); /* Null password is ok - we are already an authenticated user... */ null_pw = data_blob(NULL, 0); - get_current_user(&user, p); - + get_current_user(&user, p); + become_root(); conn = make_connection(qualname, null_pw, "A:", user.vuid, &nt_status); unbecome_root(); if (conn == NULL) { DEBUG(3,("_srv_net_file_set_secdesc: Unable to connect to %s\n", qualname)); - r_u->status = nt_status; + r_u->status = ntstatus_to_werror(nt_status); 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 = NT_STATUS_ACCESS_DENIED; + r_u->status = WERR_ACCESS_DENIED; goto error_exit; } became_user = True; @@ -1737,17 +1728,17 @@ NTSTATUS _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC * unix_convert(filename, conn, NULL, &bad_path, &st); fsp = open_file_shared(conn, filename, &st, SET_OPEN_MODE(DOS_OPEN_RDWR), - (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, 0, &access_mode, &action); + (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, 0, &access_mode, &action); if (!fsp) { /* Perhaps it is a directory */ if (errno == EISDIR) fsp = open_directory(conn, filename, &st,0, - (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, &action); + (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, &action); if (!fsp) { DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", filename)); - r_u->status = NT_STATUS_ACCESS_DENIED; + r_u->status = WERR_ACCESS_DENIED; goto error_exit; } } @@ -1756,7 +1747,7 @@ NTSTATUS _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC * if (ret == False) { DEBUG(3,("_srv_net_file_set_secdesc: Unable to set NT ACL on file %s\n", filename)); - r_u->status = NT_STATUS_ACCESS_DENIED; + r_u->status = WERR_ACCESS_DENIED; goto error_exit; } @@ -1826,19 +1817,19 @@ static const char *next_server_disk_enum(uint32 *resume) return disk; } -NTSTATUS _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_DISK_ENUM *r_u) +WERROR _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_DISK_ENUM *r_u) { uint32 i; const char *disk_name; uint32 resume=get_enum_hnd(&q_u->enum_hnd); - r_u->status=NT_STATUS_OK; + r_u->status=WERR_OK; r_u->total_entries = init_server_disk_enum(&resume); r_u->disk_enum_ctr.unknown = 0; - r_u->disk_enum_ctr.disk_info_ptr = r_u->disk_enum_ctr.disk_info? 1 : 0; + r_u->disk_enum_ctr.disk_info_ptr = r_u->disk_enum_ctr.disk_info ? 1 : 0; /*allow one DISK_INFO for null terminator*/ @@ -1862,12 +1853,12 @@ NTSTATUS _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET return r_u->status; } -NTSTATUS _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV_R_NET_NAME_VALIDATE *r_u) +WERROR _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV_R_NET_NAME_VALIDATE *r_u) { int snum; fstring share_name; - r_u->status=NT_STATUS_OK; + r_u->status=WERR_OK; switch(q_u->type) { @@ -1881,12 +1872,12 @@ NTSTATUS _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, S /* Share already exists. */ if (snum >= 0) - r_u->status = NT_STATUS_OBJECT_NAME_INVALID; + r_u->status = WERR_ALREADY_EXISTS; break; default: /*unsupported type*/ - r_u->status = NT_STATUS_INVALID_LEVEL; + r_u->status = WERR_UNKNOWN_LEVEL; break; } -- cgit From ce236d1dbf2673e2ff921683554cee41fca33249 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Fri, 22 Mar 2002 06:24:38 +0000 Subject: Stomped on some header file version numbers that have crept back in. (This used to be commit e66bdf1229ba84f64c19e817e2c4081dbbf0bee8) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 09f33b9a88..db94b8dc94 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1,5 +1,5 @@ /* - * Unix SMB/Netbios implementation. + * Unix SMB/CIFS implementation. * RPC Pipe client / server routines * Copyright (C) Andrew Tridgell 1992-1997, * Copyright (C) Jeremy Allison 2001. -- cgit From c90cd26e9430b2fc065f620bdb6aaf4be0372fcc Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Sat, 23 Mar 2002 02:57:44 +0000 Subject: Fix the mp3 rename bug - also tidy up our open code and remove the special cases for rename and unlink. Had to add desired_access into the share mode record. Jeremy. (This used to be commit 3b1b8ac43535fb0839c5474fa55bf7150f6cde31) --- source3/rpc_server/srv_srvsvc_nt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index db94b8dc94..cfd4a0bf1f 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1628,7 +1628,7 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC if (!fsp) { /* Perhaps it is a directory */ if (errno == EISDIR) - fsp = open_directory(conn, filename, &st,0, + fsp = open_directory(conn, filename, &st,FILE_READ_ATTRIBUTES,0, (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, &action); if (!fsp) { @@ -1733,7 +1733,7 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ if (!fsp) { /* Perhaps it is a directory */ if (errno == EISDIR) - fsp = open_directory(conn, filename, &st,0, + fsp = open_directory(conn, filename, &st,FILE_READ_ATTRIBUTES,0, (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, &action); if (!fsp) { -- cgit From 510d470e1e9cc30a71ac9df556420308635370c4 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Sun, 31 Mar 2002 06:00:37 +0000 Subject: Removed unused variable. (This used to be commit 3e58e9dbabc4e4a1289ff6a43ddbb5de37b02515) --- source3/rpc_server/srv_srvsvc_nt.c | 1 - 1 file changed, 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index cfd4a0bf1f..295c733ab5 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1692,7 +1692,6 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ int action; NTSTATUS nt_status; struct current_user user; - fstring user_name; connection_struct *conn = NULL; BOOL became_user = False; -- cgit From 4ad0ff29bf44e2506311f672bf912e7a2d39048a Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 10 Apr 2002 01:04:13 +0000 Subject: Added Shirish's client side caching policy change. Jeremy. (This used to be commit 16015c07eab2e57fa3771051e3e08fde21757cfa) --- source3/rpc_server/srv_srvsvc_nt.c | 52 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 295c733ab5..6416cfc4ac 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -342,6 +342,38 @@ BOOL share_access_check(connection_struct *conn, int snum, uint16 vuid, uint32 d return ret; } +/******************************************************************* + Fill in a share info level 501 structure. +********************************************************************/ + +static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501, int snum) +{ + int len_net_name; + pstring net_name; + pstring remark; + uint32 type; + uint32 csc_policy; + + pstrcpy(net_name, lp_servicename(snum)); + pstrcpy(remark, lp_comment(snum)); + standard_sub_conn(p->conn, remark); + + len_net_name = strlen(net_name); + + /* work out the share type */ + type = STYPE_DISKTREE; + + if (lp_print_ok(snum)) + type = STYPE_PRINTQ; + if (strequal("IPC$", net_name) || strequal("ADMIN$", net_name)) + type = STYPE_IPC; + if (net_name[len_net_name] == '$') + type |= STYPE_HIDDEN; + + init_srv_share_info501(&sh501->info_501, net_name, type, remark, (lp_csc_policy(snum) << 4)); + init_srv_share_info501_str(&sh501->info_501_str, net_name, remark); +} + /******************************************************************* Fill in a share info level 502 structure. ********************************************************************/ @@ -484,6 +516,23 @@ static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, break; } + case 501: + { + SRV_SHARE_INFO_501 *info501; + int i = 0; + + info501 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_501)); + + 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_501(p, &info501[i++], snum); + } + } + + ctr->share.info501 = info501; + break; + } + case 502: { SRV_SHARE_INFO_502 *info502; @@ -552,6 +601,9 @@ static void init_srv_r_net_share_get_info(pipes_struct *p, SRV_R_NET_SHARE_GET_I case 2: init_srv_share_info_2(p, &r_n->info.share.info2, snum); break; + case 501: + init_srv_share_info_501(p, &r_n->info.share.info501, snum); + break; case 502: init_srv_share_info_502(p, &r_n->info.share.info502, snum); break; -- cgit From ed72efbd3bb492b18552cd27860ebac4bf29f47d Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Thu, 11 Apr 2002 02:08:36 +0000 Subject: merge from 2.2 (This used to be commit 7db47c6647d764739e395948699cf115c4da4c8d) --- source3/rpc_server/srv_srvsvc_nt.c | 1 - 1 file changed, 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 6416cfc4ac..1f3b1945e3 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -352,7 +352,6 @@ static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501, pstring net_name; pstring remark; uint32 type; - uint32 csc_policy; pstrcpy(net_name, lp_servicename(snum)); pstrcpy(remark, lp_comment(snum)); -- cgit From e90b65284812aaa5ff9e9935ce9bbad7791cbbcd Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 15 Jul 2002 10:35:28 +0000 Subject: updated the 3.0 branch from the head branch - ready for alpha18 (This used to be commit 03ac082dcb375b6f3ca3d810a6a6367542bc23ce) --- source3/rpc_server/srv_srvsvc_nt.c | 143 ++++++++++++++++++------------------- 1 file changed, 69 insertions(+), 74 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 1f3b1945e3..b5f6bd2f07 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -23,6 +23,9 @@ #include "includes.h" +#undef DBGC_CLASS +#define DBGC_CLASS DBGC_RPC_SRV + extern pstring global_myname; /******************************************************************* @@ -38,7 +41,7 @@ static void init_srv_share_info_1(pipes_struct *p, SRV_SHARE_INFO_1 *sh1, int sn pstrcpy(net_name, lp_servicename(snum)); pstrcpy(remark, lp_comment(snum)); - standard_sub_conn(p->conn, remark); + standard_sub_conn(p->conn, remark,sizeof(remark)); len_net_name = strlen(net_name); /* work out the share type */ @@ -70,7 +73,7 @@ static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2, int sn pstrcpy(net_name, lp_servicename(snum)); pstrcpy(remark, lp_comment(snum)); - standard_sub_conn(p->conn, remark); + standard_sub_conn(p->conn, remark,sizeof(remark)); pstrcpy(path, "C:"); pstrcat(path, lp_pathname(snum)); @@ -308,7 +311,7 @@ void map_generic_share_sd_bits(SEC_DESC *psd) Can this user access with share with the required permissions ? ********************************************************************/ -BOOL share_access_check(connection_struct *conn, int snum, uint16 vuid, uint32 desired_access) +BOOL share_access_check(connection_struct *conn, int snum, user_struct *vuser, uint32 desired_access) { uint32 granted; NTSTATUS status; @@ -316,7 +319,6 @@ BOOL share_access_check(connection_struct *conn, int snum, uint16 vuid, uint32 d SEC_DESC *psd = NULL; size_t sd_size; NT_USER_TOKEN *token = NULL; - user_struct *vuser = get_valid_user_struct(vuid); BOOL ret = True; mem_ctx = talloc_init(); @@ -355,7 +357,7 @@ static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501, pstrcpy(net_name, lp_servicename(snum)); pstrcpy(remark, lp_comment(snum)); - standard_sub_conn(p->conn, remark); + standard_sub_conn(p->conn, remark, sizeof(remark)); len_net_name = strlen(net_name); @@ -394,7 +396,7 @@ static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, pstrcpy(net_name, lp_servicename(snum)); pstrcpy(remark, lp_comment(snum)); - standard_sub_conn(p->conn, remark); + standard_sub_conn(p->conn, remark,sizeof(remark)); pstrcpy(path, "C:"); pstrcat(path, lp_pathname(snum)); @@ -638,11 +640,13 @@ static void init_srv_sess_0_info(SESS_INFO_0 *se0, SESS_INFO_0_STR *str0, char * static void init_srv_sess_info_0(SRV_SESS_INFO_0 *ss0, uint32 *snum, uint32 *stot) { + struct sessionid *session_list; uint32 num_entries = 0; - (*stot) = 1; + (*stot) = list_sessions(&session_list); if (ss0 == NULL) { (*snum) = 0; + SAFE_FREE(session_list); return; } @@ -651,7 +655,7 @@ static void init_srv_sess_info_0(SRV_SESS_INFO_0 *ss0, uint32 *snum, uint32 *sto if (snum) { for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) { init_srv_sess_0_info(&ss0->info_0[num_entries], - &ss0->info_0_str[num_entries], "MACHINE"); + &ss0->info_0_str[num_entries], session_list[(*snum)].remote_machine); /* move on to creating next session */ /* move on to creating next sess */ @@ -671,6 +675,7 @@ static void init_srv_sess_info_0(SRV_SESS_INFO_0 *ss0, uint32 *snum, uint32 *sto ss0->ptr_sess_info = 0; ss0->num_entries_read2 = 0; } + SAFE_FREE(session_list); } /******************************************************************* @@ -693,11 +698,13 @@ static void init_srv_sess_1_info(SESS_INFO_1 *se1, SESS_INFO_1_STR *str1, static void init_srv_sess_info_1(SRV_SESS_INFO_1 *ss1, uint32 *snum, uint32 *stot) { + struct sessionid *session_list; uint32 num_entries = 0; - (*stot) = 1; + (*stot) = list_sessions(&session_list); if (ss1 == NULL) { (*snum) = 0; + SAFE_FREE(session_list); return; } @@ -706,8 +713,10 @@ static void init_srv_sess_info_1(SRV_SESS_INFO_1 *ss1, uint32 *snum, uint32 *sto if (snum) { for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) { init_srv_sess_1_info(&ss1->info_1[num_entries], - &ss1->info_1_str[num_entries], - "MACHINE", "dummy_user", 1, 10, 5, 0); + &ss1->info_1_str[num_entries], + session_list[*snum].remote_machine, + session_list[*snum].username, + 1, 10, 5, 0); /* move on to creating next session */ /* move on to creating next sess */ @@ -941,74 +950,46 @@ static void init_srv_r_net_conn_enum(SRV_R_NET_CONN_ENUM *r_n, init_enum_hnd(&r_n->enum_hnd, resume_hnd); } -/******************************************************************* - fill in a file info level 3 structure. - ********************************************************************/ - -static void init_srv_file_3_info(FILE_INFO_3 *fl3, FILE_INFO_3_STR *str3, - uint32 fnum, uint32 perms, uint32 num_locks, - char *path_name, char *user_name) -{ - init_srv_file_info3(fl3 , fnum, perms, num_locks, path_name, user_name); - init_srv_file_info3_str(str3, path_name, user_name); -} - -/******************************************************************* - fill in a file info level 3 structure. - ********************************************************************/ - -static void init_srv_file_info_3(SRV_FILE_INFO_3 *fl3, uint32 *fnum, uint32 *ftot) -{ - uint32 num_entries = 0; - (*ftot) = 1; - - if (fl3 == NULL) { - (*fnum) = 0; - return; - } - - DEBUG(5,("init_srv_file_3_fl3\n")); - - for (; (*fnum) < (*ftot) && num_entries < MAX_FILE_ENTRIES; (*fnum)++) { - init_srv_file_3_info(&fl3->info_3[num_entries], - &fl3->info_3_str[num_entries], - (*fnum), 0x35, 0, "\\PIPE\\samr", "dummy user"); - - /* move on to creating next file */ - num_entries++; - } - - fl3->num_entries_read = num_entries; - fl3->ptr_file_info = num_entries > 0 ? 1 : 0; - fl3->num_entries_read2 = num_entries; - - if ((*fnum) >= (*ftot)) { - (*fnum) = 0; - } -} - /******************************************************************* makes a SRV_R_NET_FILE_ENUM structure. ********************************************************************/ -static WERROR init_srv_file_info_ctr(SRV_FILE_INFO_CTR *ctr, +static WERROR init_srv_file_info_ctr(pipes_struct *p, SRV_FILE_INFO_CTR *ctr, int switch_value, uint32 *resume_hnd, uint32 *total_entries) { WERROR status = WERR_OK; + TALLOC_CTX *ctx = p->mem_ctx; DEBUG(5,("init_srv_file_info_ctr: %d\n", __LINE__)); + *total_entries = 1; /* dummy entries only, for */ ctr->switch_value = switch_value; + ctr->num_entries = *total_entries - *resume_hnd; + if (ctr->num_entries < 0) + ctr->num_entries = 0; + ctr->num_entries2 = ctr->num_entries; switch (switch_value) { - case 3: - init_srv_file_info_3(&ctr->file.info3, resume_hnd, total_entries); - ctr->ptr_file_ctr = 1; + case 3: { + int i; + if (*total_entries > 0) { + ctr->ptr_entries = 1; + ctr->file.info3 = talloc(ctx, ctr->num_entries * + sizeof(SRV_FILE_INFO_3)); + } + for (i=0 ;inum_entries;i++) { + init_srv_file_info3(&ctr->file.info3[i].info_3, i+*resume_hnd, 0x35, 0, "\\PIPE\\samr", "dummy user"); + init_srv_file_info3_str(&ctr->file.info3[i].info_3_str, "\\PIPE\\samr", "dummy user"); + + } + ctr->ptr_file_info = 1; + *resume_hnd = 0; break; + } default: DEBUG(5,("init_srv_file_info_ctr: unsupported switch value %d\n", switch_value)); (*resume_hnd = 0); (*total_entries) = 0; - ctr->ptr_file_ctr = 0; + ctr->ptr_entries = 0; status = WERR_UNKNOWN_LEVEL; break; } @@ -1020,7 +1001,7 @@ static WERROR init_srv_file_info_ctr(SRV_FILE_INFO_CTR *ctr, makes a SRV_R_NET_FILE_ENUM structure. ********************************************************************/ -static void init_srv_r_net_file_enum(SRV_R_NET_FILE_ENUM *r_n, +static void init_srv_r_net_file_enum(pipes_struct *p, SRV_R_NET_FILE_ENUM *r_n, uint32 resume_hnd, int file_level, int switch_value) { DEBUG(5,("init_srv_r_net_file_enum: %d\n", __LINE__)); @@ -1029,7 +1010,7 @@ static void init_srv_r_net_file_enum(SRV_R_NET_FILE_ENUM *r_n, if (file_level == 0) r_n->status = WERR_UNKNOWN_LEVEL; else - r_n->status = init_srv_file_info_ctr(r_n->ctr, switch_value, &resume_hnd, &(r_n->total_entries)); + r_n->status = init_srv_file_info_ctr(p, &r_n->ctr, switch_value, &resume_hnd, &(r_n->total_entries)); if (!W_ERROR_IS_OK(r_n->status)) resume_hnd = 0; @@ -1053,11 +1034,21 @@ WERROR _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV_R DEBUG(5,("srv_net_srv_get_info: %d\n", __LINE__)); + if (!pipe_access_check(p)) { + DEBUG(3, ("access denied to srv_net_srv_get_info\n")); + return WERR_ACCESS_DENIED; + } + switch (q_u->switch_value) { + + /* Technically level 102 should only be available to + Administrators but there isn't anything super-secret + here, as most of it is made up. */ + case 102: init_srv_info_102(&ctr->srv.sv102, 500, global_myname, - string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH), + string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH), lp_major_announce_version(), lp_minor_announce_version(), lp_default_server_announce(), 0xffffffff, /* users */ @@ -1116,19 +1107,13 @@ net file enum WERROR _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_FILE_ENUM *r_u) { - r_u->ctr = (SRV_FILE_INFO_CTR *)talloc(p->mem_ctx, sizeof(SRV_FILE_INFO_CTR)); - if (!r_u->ctr) - return WERR_NOMEM; - - ZERO_STRUCTP(r_u->ctr); - DEBUG(5,("srv_net_file_enum: %d\n", __LINE__)); /* set up the */ - init_srv_r_net_file_enum(r_u, + init_srv_r_net_file_enum(p, r_u, get_enum_hnd(&q_u->enum_hnd), q_u->file_level, - q_u->ctr->switch_value); + q_u->ctr.switch_value); DEBUG(5,("srv_net_file_enum: %d\n", __LINE__)); @@ -1193,6 +1178,11 @@ WERROR _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__)); + if (!pipe_access_check(p)) { + DEBUG(3, ("access denied to srv_net_share_enum_all\n")); + return WERR_ACCESS_DENIED; + } + /* Create the list of shares for the response. */ init_srv_r_net_share_enum(p, r_u, q_u->ctr.info_level, @@ -1211,6 +1201,11 @@ WERROR _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__)); + if (!pipe_access_check(p)) { + DEBUG(3, ("access denied to srv_net_share_enum\n")); + return WERR_ACCESS_DENIED; + } + /* Create the list of shares for the response. */ init_srv_r_net_share_enum(p, r_u, q_u->ctr.info_level, @@ -1829,7 +1824,7 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ "Nigel Williams" . ***********************************************************************************/ -const char *server_disks[] = {"C:"}; +static const char *server_disks[] = {"C:"}; static uint32 get_server_disk_count(void) { -- cgit From b0b28531c8cd76d3fcd95da08389d8a4d2e631a3 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 15 Jul 2002 11:16:26 +0000 Subject: more bug updates from head (This used to be commit 8b769bf5bbbe54b1a39fd85cc24db09c1ab7faab) --- source3/rpc_server/srv_srvsvc_nt.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index b5f6bd2f07..202e869d35 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -964,8 +964,6 @@ static WERROR init_srv_file_info_ctr(pipes_struct *p, SRV_FILE_INFO_CTR *ctr, ctr->switch_value = switch_value; ctr->num_entries = *total_entries - *resume_hnd; - if (ctr->num_entries < 0) - ctr->num_entries = 0; ctr->num_entries2 = ctr->num_entries; switch (switch_value) { -- cgit From 8c53b214da14e7fbfeee3ccf28bddedb55592ab8 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 17 Aug 2002 15:34:15 +0000 Subject: Sync 3.0 branch with HEAD (This used to be commit e01596853e3eea533baa08c33f26ded75f33fdd4) --- source3/rpc_server/srv_srvsvc_nt.c | 394 +++++++++++++++++++++++++++++-------- 1 file changed, 307 insertions(+), 87 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 202e869d35..5c1038949b 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -3,6 +3,7 @@ * RPC Pipe client / server routines * Copyright (C) Andrew Tridgell 1992-1997, * Copyright (C) Jeremy Allison 2001. + * Copyright (C) Nigel Williams 2001. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,33 +29,54 @@ extern pstring global_myname; +/******************************************************************* + Utility function to get the 'type' of a share from an snum. + ********************************************************************/ +static uint32 get_share_type(int snum) +{ + char *net_name = lp_servicename(snum); + int len_net_name = strlen(net_name); + + /* work out the share type */ + uint32 type = STYPE_DISKTREE; + + if (lp_print_ok(snum)) + type = STYPE_PRINTQ; + if (strequal(lp_fstype(snum), "IPC")) + type = STYPE_IPC; + if (net_name[len_net_name] == '$') + type |= STYPE_HIDDEN; + + return type; +} + +/******************************************************************* + Fill in a share info level 0 structure. + ********************************************************************/ + +static void init_srv_share_info_0(pipes_struct *p, SRV_SHARE_INFO_0 *sh0, int snum) +{ + pstring net_name; + + pstrcpy(net_name, lp_servicename(snum)); + + init_srv_share_info0(&sh0->info_0, net_name); + init_srv_share_info0_str(&sh0->info_0_str, net_name); +} + /******************************************************************* Fill in a share info level 1 structure. ********************************************************************/ static void init_srv_share_info_1(pipes_struct *p, SRV_SHARE_INFO_1 *sh1, int snum) { - int len_net_name; - pstring net_name; pstring remark; - uint32 type; - pstrcpy(net_name, lp_servicename(snum)); + char *net_name = lp_servicename(snum); pstrcpy(remark, lp_comment(snum)); standard_sub_conn(p->conn, remark,sizeof(remark)); - len_net_name = strlen(net_name); - - /* work out the share type */ - type = STYPE_DISKTREE; - - if (lp_print_ok(snum)) - type = STYPE_PRINTQ; - if (strequal("IPC$", net_name) || strequal("ADMIN$", net_name)) - type = STYPE_IPC; - if (net_name[len_net_name] == '$') - type |= STYPE_HIDDEN; - init_srv_share_info1(&sh1->info_1, net_name, type, remark); + init_srv_share_info1(&sh1->info_1, net_name, get_share_type(snum), remark); init_srv_share_info1_str(&sh1->info_1_str, net_name, remark); } @@ -64,14 +86,11 @@ static void init_srv_share_info_1(pipes_struct *p, SRV_SHARE_INFO_1 *sh1, int sn static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2, int snum) { - int len_net_name; - pstring net_name; pstring remark; pstring path; pstring passwd; - uint32 type; - pstrcpy(net_name, lp_servicename(snum)); + char *net_name = lp_servicename(snum); pstrcpy(remark, lp_comment(snum)); standard_sub_conn(p->conn, remark,sizeof(remark)); pstrcpy(path, "C:"); @@ -85,19 +104,8 @@ static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2, int sn string_replace(path, '/', '\\'); pstrcpy(passwd, ""); - len_net_name = strlen(net_name); - /* work out the share type */ - type = STYPE_DISKTREE; - - if (lp_print_ok(snum)) - type = STYPE_PRINTQ; - if (strequal("IPC$", net_name) || strequal("ADMIN$", net_name)) - type = STYPE_IPC; - if (net_name[len_net_name] == '$') - type |= STYPE_HIDDEN; - - init_srv_share_info2(&sh2->info_2, net_name, type, remark, 0, 0xffffffff, 1, path, passwd); + init_srv_share_info2(&sh2->info_2, net_name, get_share_type(snum), remark, 0, 0xffffffff, 1, path, passwd); init_srv_share_info2_str(&sh2->info_2_str, net_name, remark, path, passwd); } @@ -251,7 +259,7 @@ static BOOL set_share_security(TALLOC_CTX *ctx, const char *share_name, SEC_DESC /* Free malloc'ed memory */ - out: +out: prs_mem_free(&ps); if (mem_ctx) @@ -337,7 +345,7 @@ BOOL share_access_check(connection_struct *conn, int snum, user_struct *vuser, u ret = se_access_check(psd, token, desired_access, &granted, &status); - out: +out: talloc_destroy(mem_ctx); @@ -351,27 +359,15 @@ BOOL share_access_check(connection_struct *conn, int snum, user_struct *vuser, u static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501, int snum) { int len_net_name; - pstring net_name; pstring remark; - uint32 type; - pstrcpy(net_name, lp_servicename(snum)); + char *net_name = lp_servicename(snum); pstrcpy(remark, lp_comment(snum)); standard_sub_conn(p->conn, remark, sizeof(remark)); len_net_name = strlen(net_name); - /* work out the share type */ - type = STYPE_DISKTREE; - - if (lp_print_ok(snum)) - type = STYPE_PRINTQ; - if (strequal("IPC$", net_name) || strequal("ADMIN$", net_name)) - type = STYPE_IPC; - if (net_name[len_net_name] == '$') - type |= STYPE_HIDDEN; - - init_srv_share_info501(&sh501->info_501, net_name, type, remark, (lp_csc_policy(snum) << 4)); + init_srv_share_info501(&sh501->info_501, net_name, get_share_type(snum), remark, (lp_csc_policy(snum) << 4)); init_srv_share_info501_str(&sh501->info_501_str, net_name, remark); } @@ -386,7 +382,6 @@ static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, pstring remark; pstring path; pstring passwd; - uint32 type; SEC_DESC *sd; size_t sd_size; TALLOC_CTX *ctx = p->mem_ctx; @@ -410,39 +405,86 @@ static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, pstrcpy(passwd, ""); len_net_name = strlen(net_name); - /* work out the share type */ - type = STYPE_DISKTREE; - - if (lp_print_ok(snum)) - type = STYPE_PRINTQ; - if (strequal("IPC$", net_name)) - type = STYPE_IPC; - if (net_name[len_net_name] == '$') - type |= STYPE_HIDDEN; - sd = get_share_security(ctx, snum, &sd_size); - init_srv_share_info502(&sh502->info_502, net_name, type, remark, 0, 0xffffffff, 1, path, passwd, sd, sd_size); - init_srv_share_info502_str(&sh502->info_502_str, &sh502->info_502, net_name, remark, path, passwd, sd, sd_size); + init_srv_share_info502(&sh502->info_502, net_name, get_share_type(snum), remark, 0, 0xffffffff, 1, path, passwd, sd, sd_size); + init_srv_share_info502_str(&sh502->info_502_str, net_name, remark, path, passwd, sd, sd_size); +} + +/*************************************************************************** + Fill in a share info level 1004 structure. + ***************************************************************************/ + +static void init_srv_share_info_1004(pipes_struct *p, SRV_SHARE_INFO_1004* sh1004, int snum) +{ + pstring remark; + + pstrcpy(remark, lp_comment(snum)); + standard_sub_conn(p->conn, remark, sizeof(remark)); + + ZERO_STRUCTP(sh1004); + + init_srv_share_info1004(&sh1004->info_1004, remark); + init_srv_share_info1004_str(&sh1004->info_1004_str, remark); } /*************************************************************************** Fill in a share info level 1005 structure. ***************************************************************************/ -static void init_srv_share_info_1005(SRV_SHARE_INFO_1005* sh1005, int snum) +static void init_srv_share_info_1005(pipes_struct *p, SRV_SHARE_INFO_1005* sh1005, int snum) { sh1005->dfs_root_flag = 0; if(lp_host_msdfs() && lp_msdfs_root(snum)) sh1005->dfs_root_flag = 3; } +/*************************************************************************** + Fill in a share info level 1006 structure. + ***************************************************************************/ + +static void init_srv_share_info_1006(pipes_struct *p, SRV_SHARE_INFO_1006* sh1006, int snum) +{ + sh1006->max_uses = -1; +} + +/*************************************************************************** + Fill in a share info level 1007 structure. + ***************************************************************************/ + +static void init_srv_share_info_1007(pipes_struct *p, SRV_SHARE_INFO_1007* sh1007, int snum) +{ + pstring alternate_directory_name = ""; + uint32 flags = 0; + + ZERO_STRUCTP(sh1007); + + init_srv_share_info1007(&sh1007->info_1007, flags, alternate_directory_name); + init_srv_share_info1007_str(&sh1007->info_1007_str, alternate_directory_name); +} + +/******************************************************************* + Fill in a share info level 1501 structure. + ********************************************************************/ + +static void init_srv_share_info_1501(pipes_struct *p, SRV_SHARE_INFO_1501 *sh1501, int snum) +{ + SEC_DESC *sd; + size_t sd_size; + TALLOC_CTX *ctx = p->mem_ctx; + + ZERO_STRUCTP(sh1501); + + sd = get_share_security(ctx, snum, &sd_size); + + sh1501->sdb = make_sec_desc_buf(p->mem_ctx, sd_size, sd); +} /******************************************************************* True if it ends in '$'. ********************************************************************/ -static BOOL is_admin_share(int snum) +static BOOL is_hidden_share(int snum) { pstring net_name; @@ -471,7 +513,7 @@ static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, /* Count the number of entries. */ for (snum = 0; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_admin_share(snum)) ) + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) num_entries++; } @@ -483,6 +525,24 @@ static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, return True; switch (info_level) { + case 0: + { + SRV_SHARE_INFO_0 *info0; + int i = 0; + + info0 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_0)); + + for (snum = *resume_hnd; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { + init_srv_share_info_0(p, &info0[i++], snum); + } + } + + ctr->share.info0 = info0; + break; + + } + case 1: { SRV_SHARE_INFO_1 *info1; @@ -491,7 +551,7 @@ static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, info1 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_1)); for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_admin_share(snum)) ) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { init_srv_share_info_1(p, &info1[i++], snum); } } @@ -508,7 +568,7 @@ static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, info2 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_2)); for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_admin_share(snum)) ) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { init_srv_share_info_2(p, &info2[i++], snum); } } @@ -525,7 +585,7 @@ static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, info501 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_501)); for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_admin_share(snum)) ) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { init_srv_share_info_501(p, &info501[i++], snum); } } @@ -542,7 +602,7 @@ static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, info502 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_502)); for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_admin_share(snum)) ) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { init_srv_share_info_502(p, &info502[i++], snum); } } @@ -551,6 +611,92 @@ static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, break; } + /* here for completeness but not currently used with enum (1004 - 1501)*/ + + case 1004: + { + SRV_SHARE_INFO_1004 *info1004; + int i = 0; + + info1004 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_1004)); + + for (snum = *resume_hnd; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { + init_srv_share_info_1004(p, &info1004[i++], snum); + } + } + + ctr->share.info1004 = info1004; + break; + } + + case 1005: + { + SRV_SHARE_INFO_1005 *info1005; + int i = 0; + + info1005 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_1005)); + + for (snum = *resume_hnd; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { + init_srv_share_info_1005(p, &info1005[i++], snum); + } + } + + ctr->share.info1005 = info1005; + break; + } + + case 1006: + { + SRV_SHARE_INFO_1006 *info1006; + int i = 0; + + info1006 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_1006)); + + for (snum = *resume_hnd; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { + init_srv_share_info_1006(p, &info1006[i++], snum); + } + } + + ctr->share.info1006 = info1006; + break; + } + + case 1007: + { + SRV_SHARE_INFO_1007 *info1007; + int i = 0; + + info1007 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_1007)); + + for (snum = *resume_hnd; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { + init_srv_share_info_1007(p, &info1007[i++], snum); + } + } + + ctr->share.info1007 = info1007; + break; + } + + case 1501: + { + SRV_SHARE_INFO_1501 *info1501; + int i = 0; + + info1501 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_1501)); + + for (snum = *resume_hnd; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { + init_srv_share_info_1501(p, &info1501[i++], snum); + } + } + + ctr->share.info1501 = info1501; + break; + } default: DEBUG(5,("init_srv_share_info_ctr: unsupported switch value %d\n", info_level)); return False; @@ -596,6 +742,9 @@ static void init_srv_r_net_share_get_info(pipes_struct *p, SRV_R_NET_SHARE_GET_I if (snum >= 0) { switch (info_level) { + case 0: + init_srv_share_info_0(p, &r_n->info.share.info0, snum); + break; case 1: init_srv_share_info_1(p, &r_n->info.share.info1, snum); break; @@ -608,8 +757,24 @@ static void init_srv_r_net_share_get_info(pipes_struct *p, SRV_R_NET_SHARE_GET_I case 502: init_srv_share_info_502(p, &r_n->info.share.info502, snum); break; + + /* here for completeness */ + case 1004: + init_srv_share_info_1004(p, &r_n->info.share.info1004, snum); + break; case 1005: - init_srv_share_info_1005(&r_n->info.share.info1005, snum); + init_srv_share_info_1005(p, &r_n->info.share.info1005, snum); + break; + + /* here for completeness 1006 - 1501 */ + case 1006: + init_srv_share_info_1006(p, &r_n->info.share.info1006, snum); + break; + case 1007: + init_srv_share_info_1007(p, &r_n->info.share.info1007, snum); + break; + case 1501: + init_srv_share_info_1501(p, &r_n->info.share.info1501, snum); break; default: DEBUG(5,("init_srv_net_share_get_info: unsupported switch value %d\n", info_level)); @@ -955,7 +1120,8 @@ static void init_srv_r_net_conn_enum(SRV_R_NET_CONN_ENUM *r_n, ********************************************************************/ static WERROR init_srv_file_info_ctr(pipes_struct *p, SRV_FILE_INFO_CTR *ctr, - int switch_value, uint32 *resume_hnd, uint32 *total_entries) + int switch_value, uint32 *resume_hnd, + uint32 *total_entries) { WERROR status = WERR_OK; TALLOC_CTX *ctx = p->mem_ctx; @@ -1206,8 +1372,8 @@ WERROR _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET /* Create the list of shares for the response. */ init_srv_r_net_share_enum(p, r_u, - q_u->ctr.info_level, - get_enum_hnd(&q_u->enum_hnd), False); + q_u->ctr.info_level, + get_enum_hnd(&q_u->enum_hnd), False); DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__)); @@ -1295,7 +1461,7 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name)); - r_u->switch_value = 0; + r_u->parm_error = 0; if (strequal(share_name,"IPC$") || strequal(share_name,"ADMIN$") || strequal(share_name,"global")) return WERR_ACCESS_DENIED; @@ -1312,28 +1478,47 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S get_current_user(&user,p); - if (user.uid != 0) + if (user.uid != sec_initial_uid()) return WERR_ACCESS_DENIED; switch (q_u->info_level) { case 1: - /* Not enough info in a level 1 to do anything. */ - return WERR_ACCESS_DENIED; + fstrcpy(pathname, lp_pathname(snum)); + unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(comment)); + type = q_u->info.share.info2.info_2.type; + psd = NULL; + break; 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)); + unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(comment)); + unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(pathname)); type = q_u->info.share.info2.info_2.type; psd = NULL; break; +#if 0 + /* not supported on set but here for completeness */ + case 501: + unistr2_to_ascii(comment, &q_u->info.share.info501.info_501_str.uni_remark, sizeof(comment)); + type = q_u->info.share.info501.info_501.type; + psd = NULL; + break; +#endif case 502: - unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(share_name)); - unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(share_name)); + unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(comment)); + unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(pathname)); type = q_u->info.share.info502.info_502.type; psd = q_u->info.share.info502.info_502_str.sd; map_generic_share_sd_bits(psd); break; + case 1004: + fstrcpy(pathname, lp_pathname(snum)); + unistr2_to_ascii(comment, &q_u->info.share.info1004.info_1004_str.uni_remark, sizeof(comment)); + type = STYPE_DISKTREE; + break; case 1005: + case 1006: + case 1007: return WERR_ACCESS_DENIED; + break; case 1501: fstrcpy(pathname, lp_pathname(snum)); fstrcpy(comment, lp_comment(snum)); @@ -1422,12 +1607,12 @@ WERROR _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__)); - r_u->switch_value = 0; + r_u->parm_error = 0; get_current_user(&user,p); - if (user.uid != 0) { - DEBUG(10,("_srv_net_share_add: uid != 0. Access denied.\n")); + if (user.uid != sec_initial_uid()) { + DEBUG(10,("_srv_net_share_add: uid != sec_initial_uid(). Access denied.\n")); return WERR_ACCESS_DENIED; } @@ -1437,6 +1622,9 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S } switch (q_u->info_level) { + case 0: + /* No path. Not enough info in a level 0 to do anything. */ + return WERR_ACCESS_DENIED; case 1: /* Not enough info in a level 1 to do anything. */ return WERR_ACCESS_DENIED; @@ -1446,6 +1634,9 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(share_name)); type = q_u->info.share.info2.info_2.type; break; + case 501: + /* No path. Not enough info in a level 501 to do anything. */ + return WERR_ACCESS_DENIED; case 502: unistr2_to_ascii(share_name, &q_u->info.share.info502.info_502_str.uni_netname, sizeof(share_name)); unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(share_name)); @@ -1454,7 +1645,16 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S psd = q_u->info.share.info502.info_502_str.sd; map_generic_share_sd_bits(psd); break; + + /* none of the following contain share names. NetShareAdd does not have a separate parameter for the share name */ + + case 1004: case 1005: + case 1006: + case 1007: + return WERR_ACCESS_DENIED; + break; + case 1501: /* DFS only level. */ return WERR_ACCESS_DENIED; default: @@ -1544,7 +1744,7 @@ WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S get_current_user(&user,p); - if (user.uid != 0) + if (user.uid != sec_initial_uid()) return WERR_ACCESS_DENIED; if (!lp_delete_share_cmd() || !*lp_delete_share_cmd()) @@ -1570,6 +1770,13 @@ WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S return WERR_OK; } +WERROR _srv_net_share_del_sticky(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u) +{ + DEBUG(5,("_srv_net_share_del_stick: %d\n", __LINE__)); + + return _srv_net_share_del(p, q_u, r_u); +} + /******************************************************************* time of day ********************************************************************/ @@ -1703,7 +1910,7 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC close_cnum(conn, user.vuid); return r_u->status; - error_exit: +error_exit: if(fsp) { close_file(fsp, True); @@ -1799,7 +2006,7 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ close_cnum(conn, user.vuid); return r_u->status; - error_exit: +error_exit: if(fsp) { close_file(fsp, True); @@ -1864,6 +2071,7 @@ WERROR _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_D { uint32 i; const char *disk_name; + TALLOC_CTX *ctx = p->mem_ctx; uint32 resume=get_enum_hnd(&q_u->enum_hnd); r_u->status=WERR_OK; @@ -1872,6 +2080,18 @@ WERROR _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_D r_u->disk_enum_ctr.unknown = 0; + { + DISK_INFO *dinfo; + + int dinfo_size = MAX_SERVER_DISK_ENTRIES * sizeof(*dinfo); + + if(!(dinfo = talloc(ctx, dinfo_size))) { + return WERR_NOMEM; + } + + r_u->disk_enum_ctr.disk_info = dinfo; + } + r_u->disk_enum_ctr.disk_info_ptr = r_u->disk_enum_ctr.disk_info ? 1 : 0; /*allow one DISK_INFO for null terminator*/ @@ -1885,7 +2105,7 @@ WERROR _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_D init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, disk_name); } - /*add a terminating null string. Is this there if there is more data to come?*/ + /* add a terminating null string. Is this there if there is more data to come? */ r_u->disk_enum_ctr.entries_read++; -- cgit From a834a73e341059be154426390304a42e4a011f72 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Wed, 25 Sep 2002 15:19:00 +0000 Subject: sync'ing up for 3.0alpha20 release (This used to be commit 65e7b5273bb58802bf0c389b77f7fcae0a1f6139) --- source3/rpc_server/srv_srvsvc_nt.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 5c1038949b..69945b50b8 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -338,10 +338,10 @@ BOOL share_access_check(connection_struct *conn, int snum, user_struct *vuser, u if (!psd) goto out; - if (vuser) - token = vuser->nt_user_token; - else + if (conn->nt_user_token) token = conn->nt_user_token; + else + token = vuser->nt_user_token; ret = se_access_check(psd, token, desired_access, &granted, &status); -- cgit From 3665777a5bc7ffa92f64ba17daf4cc66c3607198 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 4 Oct 2002 22:53:18 +0000 Subject: Add a timeout to tdb_lock_bystring(). Ensure we never have more than MAX_PRINT_JOBS in a queue. Jeremy. (This used to be commit 9fe3c0b90d4bff2217e3cb5a34b4683ca314c06e) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 69945b50b8..ecde51df9f 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -145,7 +145,7 @@ BOOL share_info_db_init(void) local_pid = sys_getpid(); /* handle a Samba upgrade */ - tdb_lock_bystring(share_tdb, vstring); + tdb_lock_bystring(share_tdb, vstring, 0); /* Cope with byte-reversed older versions of the db. */ vers_id = tdb_fetch_int32(share_tdb, vstring); -- cgit From 2f194322d419350f35a48dff750066894d68eccf Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 12 Nov 2002 23:20:50 +0000 Subject: Removed global_myworkgroup, global_myname, global_myscope. Added liberal dashes of const. This is a rather large check-in, some things may break. It does compile though :-). Jeremy. (This used to be commit f755711df8f74f9b8e8c1a2b0d07d02a931eeb89) --- source3/rpc_server/srv_srvsvc_nt.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index ecde51df9f..0384bb81a3 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -27,8 +27,6 @@ #undef DBGC_CLASS #define DBGC_CLASS DBGC_RPC_SRV -extern pstring global_myname; - /******************************************************************* Utility function to get the 'type' of a share from an snum. ********************************************************************/ @@ -1211,7 +1209,7 @@ WERROR _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV_R case 102: init_srv_info_102(&ctr->srv.sv102, - 500, global_myname, + 500, global_myname(), string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH), lp_major_announce_version(), lp_minor_announce_version(), lp_default_server_announce(), @@ -1225,13 +1223,13 @@ WERROR _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV_R break; case 101: init_srv_info_101(&ctr->srv.sv101, - 500, global_myname, + 500, global_myname(), lp_major_announce_version(), lp_minor_announce_version(), lp_default_server_announce(), string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH)); break; case 100: - init_srv_info_100(&ctr->srv.sv100, 500, global_myname); + init_srv_info_100(&ctr->srv.sv100, 500, global_myname()); break; default: status = WERR_UNKNOWN_LEVEL; -- cgit From ef8bd7c4f7ae8192ea05db070962ecf0ff3615f3 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 20 Dec 2002 20:21:31 +0000 Subject: Forward port the change to talloc_init() to make all talloc contexts named. Ensure we can query them. Jeremy. (This used to be commit 09a218a9f6fb0bd922940467bf8500eb4f1bcf84) --- source3/rpc_server/srv_srvsvc_nt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 0384bb81a3..69f82bb96f 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -237,7 +237,7 @@ static BOOL set_share_security(TALLOC_CTX *ctx, const char *share_name, SEC_DESC fstring key; BOOL ret = False; - mem_ctx = talloc_init(); + mem_ctx = talloc_init("set_share_security"); if (mem_ctx == NULL) return False; @@ -327,7 +327,7 @@ BOOL share_access_check(connection_struct *conn, int snum, user_struct *vuser, u NT_USER_TOKEN *token = NULL; BOOL ret = True; - mem_ctx = talloc_init(); + mem_ctx = talloc_init("share_access_check"); if (mem_ctx == NULL) return False; -- cgit From 634c54310c92c48dd4eceec602e230a021bdcfc5 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Fri, 3 Jan 2003 08:28:12 +0000 Subject: Merge from HEAD - make Samba compile with -Wwrite-strings without additional warnings. (Adds a lot of const). Andrew Bartlett (This used to be commit 3a7458f9472432ef12c43008414925fd1ce8ea0c) --- source3/rpc_server/srv_srvsvc_nt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 69f82bb96f..e0a575f143 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -128,7 +128,7 @@ static TDB_CONTEXT *share_tdb; /* used for share security descriptors */ BOOL share_info_db_init(void) { static pid_t local_pid; - char *vstring = "INFO/version"; + const char *vstring = "INFO/version"; int32 vers_id; if (share_tdb && local_pid == sys_getpid()) @@ -1008,7 +1008,7 @@ static void init_srv_conn_info_0(SRV_CONN_INFO_0 *ss0, uint32 *snum, uint32 *sto static void init_srv_conn_1_info(CONN_INFO_1 *se1, CONN_INFO_1_STR *str1, uint32 id, uint32 type, uint32 num_opens, uint32 num_users, uint32 open_time, - char *usr_name, char *net_name) + const char *usr_name, const char *net_name) { init_srv_conn_info1(se1 , id, type, num_opens, num_users, open_time, usr_name, net_name); init_srv_conn_info1_str(str1, usr_name, net_name); -- cgit From 27b7e51a3cc619f879655a3230611457ac43b9e7 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Tue, 14 Jan 2003 08:53:59 +0000 Subject: Merge from HEAD: - fstring/pstring mixups - the detection code that found them (disabled) - a bit of whitespace - a static Andrew Bartlett (This used to be commit 9b70fa868e7d9481f584c83fc4046174e1dedfd9) --- source3/rpc_server/srv_srvsvc_nt.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index e0a575f143..6d2320d67d 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1481,7 +1481,7 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S switch (q_u->info_level) { case 1: - fstrcpy(pathname, lp_pathname(snum)); + pstrcpy(pathname, lp_pathname(snum)); unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(comment)); type = q_u->info.share.info2.info_2.type; psd = NULL; @@ -1508,7 +1508,7 @@ WERROR _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 1004: - fstrcpy(pathname, lp_pathname(snum)); + pstrcpy(pathname, lp_pathname(snum)); unistr2_to_ascii(comment, &q_u->info.share.info1004.info_1004_str.uni_remark, sizeof(comment)); type = STYPE_DISKTREE; break; @@ -1518,7 +1518,7 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S return WERR_ACCESS_DENIED; break; case 1501: - fstrcpy(pathname, lp_pathname(snum)); + pstrcpy(pathname, lp_pathname(snum)); fstrcpy(comment, lp_comment(snum)); psd = q_u->info.share.info1501.sdb->sec; map_generic_share_sd_bits(psd); -- cgit From 4e8d7b3e8ed045f6a110889c5e31f2c5170b68a7 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 18 Mar 2003 23:49:03 +0000 Subject: Ensure dev in make_connection is const. Jeremy. (This used to be commit 1c6ea31b8f48b93606f4c5b6a0472571dc8a471e) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 6d2320d67d..1a7b64858b 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1867,7 +1867,7 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC r_u->status = WERR_ACCESS_DENIED; goto error_exit; } - became_user = True; + became_user = True; unistr2_to_ascii(filename, &q_u->uni_file_name, sizeof(filename)); unix_convert(filename, conn, NULL, &bad_path, &st); -- cgit From e7c8c15888454043c73967635deb4d3419a489e9 Mon Sep 17 00:00:00 2001 From: Alexander Bokovoy Date: Sun, 11 May 2003 23:34:18 +0000 Subject: Fix VFS layer: 1. Finally work with cascaded modules with private data storage per module 2. Convert VFS API to macro calls to simplify cascading 3. Add quota support to VFS layer (prepare to NT quota support) Patch by Stefan (metze) Metzemacher, with review of Jelmer and me Tested in past few weeks. Documentation to new VFS API for third-party developers to follow (This used to be commit 91984ef5caa2d13c5d52e1f535bd3bbbae1ec978) --- source3/rpc_server/srv_srvsvc_nt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 1a7b64858b..6a6391f6ad 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1887,7 +1887,7 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC } } - sd_size = conn->vfs_ops.get_nt_acl(fsp, fsp->fsp_name, &psd); + sd_size = VFS_GET_NT_ACL(fsp, fsp->fsp_name, &psd); if (sd_size == 0) { DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", filename)); @@ -1991,7 +1991,7 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ } } - ret = conn->vfs_ops.set_nt_acl(fsp, fsp->fsp_name, q_u->sec_info, q_u->sec_desc); + ret = VFS_SET_NT_ACL(fsp, fsp->fsp_name, q_u->sec_info, q_u->sec_desc); if (ret == False) { DEBUG(3,("_srv_net_file_set_secdesc: Unable to set NT ACL on file %s\n", filename)); -- cgit From bc2a3748e9caa8f60f7c2387e7eecd7fb3fae899 Mon Sep 17 00:00:00 2001 From: Alexander Bokovoy Date: Wed, 14 May 2003 10:59:01 +0000 Subject: Prefix VFS API macros with SMB_ for consistency and to avoid problems with VFS_ macros at system side. We currently have one clash with AIX and its VFS_LOCK. Compiled and tested -- no new functionality or code, just plain rename of macros for yet-unreleased VFS API version. Needs to be done before a24 is out (This used to be commit c2689ed118b490e49497a76ed6a2251262018769) --- source3/rpc_server/srv_srvsvc_nt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 6a6391f6ad..154376dd33 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1887,7 +1887,7 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC } } - sd_size = VFS_GET_NT_ACL(fsp, fsp->fsp_name, &psd); + sd_size = SMB_VFS_GET_NT_ACL(fsp, fsp->fsp_name, &psd); if (sd_size == 0) { DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", filename)); @@ -1991,7 +1991,7 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ } } - ret = VFS_SET_NT_ACL(fsp, fsp->fsp_name, q_u->sec_info, q_u->sec_desc); + ret = SMB_VFS_SET_NT_ACL(fsp, fsp->fsp_name, q_u->sec_info, q_u->sec_desc); if (ret == False) { DEBUG(3,("_srv_net_file_set_secdesc: Unable to set NT ACL on file %s\n", filename)); -- cgit From 545e8d499947fec55832352d741e8a904122d564 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 29 May 2003 23:49:31 +0000 Subject: Change get_nt_acl() to include security_info wanted. Only return this. This gets us closer to W2k+ in what we return for file ACLs. Fix horribly broken make_sec_desc() that screwed up the size when given a SD with no owner or group (how did it get this bad... ?). Jeremy. (This used to be commit 183c9ed4052ab14e269ed1234ca557053f77e77a) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 154376dd33..57ba055aef 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1887,7 +1887,7 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC } } - sd_size = SMB_VFS_GET_NT_ACL(fsp, fsp->fsp_name, &psd); + sd_size = SMB_VFS_GET_NT_ACL(fsp, fsp->fsp_name, (OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION|DACL_SECURITY_INFORMATION), &psd); if (sd_size == 0) { DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", filename)); -- cgit From 58fca5074216891bcc9b0c1674b221646af79841 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 1 Jul 2003 21:47:13 +0000 Subject: Adding jcmd's share ACL on XP patch. Thanks Jim ! Jeremy. (This used to be commit 7ed1118ae61a13de2c781a94fc2394090efd1f9b) --- source3/rpc_server/srv_srvsvc_nt.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 57ba055aef..ea66a7d38b 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -432,10 +432,13 @@ static void init_srv_share_info_1004(pipes_struct *p, SRV_SHARE_INFO_1004* sh100 static void init_srv_share_info_1005(pipes_struct *p, SRV_SHARE_INFO_1005* sh1005, int snum) { - sh1005->dfs_root_flag = 0; + sh1005->share_info_flags = 0; if(lp_host_msdfs() && lp_msdfs_root(snum)) - sh1005->dfs_root_flag = 3; + sh1005->share_info_flags |= + SHARE_1005_IN_DFS | SHARE_1005_DFS_ROOT; + sh1005->share_info_flags |= + lp_csc_policy(snum) << SHARE_1005_CSC_POLICY_SHIFT; } /*************************************************************************** Fill in a share info level 1006 structure. @@ -1513,6 +1516,19 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S type = STYPE_DISKTREE; break; case 1005: + /* XP re-sets the csc policy even if it wasn't changed by the + user, so we must compare it to see if it's what is set in + smb.conf, so that we can contine other ops like setting + ACLs on a share */ + if (((q_u->info.share.info1005.share_info_flags & + SHARE_1005_CSC_POLICY_MASK) >> + SHARE_1005_CSC_POLICY_SHIFT) == lp_csc_policy(snum)) + return WERR_OK; + else { + DEBUG(3, ("_srv_net_share_set_info: client is trying to change csc policy from the network; must be done with smb.conf\n")); + return WERR_ACCESS_DENIED; + } + break; case 1006: case 1007: return WERR_ACCESS_DENIED; -- cgit From 0551426657167c676f1b88443602f9268d21784e Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 19 Sep 2003 21:57:43 +0000 Subject: Ensure that dup_sec_desc copies the 'type' field correctly. This caused me to expose a type arguement to make_sec_desc(). We weren't copying the SE_DESC_DACL_AUTO_INHERITED flag which could cause errors on auto inherited checks. Jeremy. (This used to be commit 28b315a7501f42928d73efaa75f74146ba95cf2d) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index ea66a7d38b..4d1cf9bddc 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -184,7 +184,7 @@ static SEC_DESC *get_share_security_default( TALLOC_CTX *ctx, int snum, size_t * init_sec_ace(&ace, &global_sid_World, SEC_ACE_TYPE_ACCESS_ALLOWED, sa, 0); if ((psa = make_sec_acl(ctx, NT4_ACL_REVISION, 1, &ace)) != NULL) { - psd = make_sec_desc(ctx, SEC_DESC_REVISION, NULL, NULL, NULL, psa, psize); + psd = make_sec_desc(ctx, SEC_DESC_REVISION, SEC_DESC_SELF_RELATIVE, NULL, NULL, NULL, psa, psize); } if (!psd) { -- cgit From 5139e4a1a929e1491702de3f1953a835024f6fe3 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 19 Nov 2003 00:18:45 +0000 Subject: Correct fix for checking of '$' name termination. Jeremy. (This used to be commit ec2339645283c9e489659a8892c317bb9f7610f0) --- source3/rpc_server/srv_srvsvc_nt.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 4d1cf9bddc..40d3a43bef 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -487,10 +487,9 @@ static void init_srv_share_info_1501(pipes_struct *p, SRV_SHARE_INFO_1501 *sh150 static BOOL is_hidden_share(int snum) { - pstring net_name; + const char *net_name = lp_servicename(snum); - pstrcpy(net_name, lp_servicename(snum)); - return (net_name[strlen(net_name)] == '$') ? True : False; + return (net_name[strlen(net_name) - 1] == '$') ? True : False; } /******************************************************************* -- cgit From 722aa118c66b020c2b9f2b595e1af50429f13986 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 2 Apr 2004 18:46:19 +0000 Subject: Added per-share parameter "store dos attributes". When set, will store dos attributes in an EA. Based on an original patch from tridge, but modified somewhat to cover all cases. Jeremy. (This used to be commit ed653cd468213e0be901bc654aa3748ce5837947) --- source3/rpc_server/srv_srvsvc_nt.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 40d3a43bef..77b9be9966 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1887,13 +1887,13 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC unistr2_to_ascii(filename, &q_u->uni_file_name, sizeof(filename)); unix_convert(filename, conn, NULL, &bad_path, &st); fsp = open_file_shared(conn, filename, &st, SET_OPEN_MODE(DOS_OPEN_RDONLY), - (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, 0, &access_mode, &action); + (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), FILE_ATTRIBUTE_NORMAL, 0, &access_mode, &action); if (!fsp) { /* Perhaps it is a directory */ if (errno == EISDIR) fsp = open_directory(conn, filename, &st,FILE_READ_ATTRIBUTES,0, - (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, &action); + (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), &action); if (!fsp) { DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", filename)); @@ -1991,13 +1991,13 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ unix_convert(filename, conn, NULL, &bad_path, &st); fsp = open_file_shared(conn, filename, &st, SET_OPEN_MODE(DOS_OPEN_RDWR), - (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, 0, &access_mode, &action); + (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), FILE_ATTRIBUTE_NORMAL, 0, &access_mode, &action); if (!fsp) { /* Perhaps it is a directory */ if (errno == EISDIR) fsp = open_directory(conn, filename, &st,FILE_READ_ATTRIBUTES,0, - (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), 0, &action); + (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), &action); if (!fsp) { DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", filename)); -- cgit From 2fc57c9a2ce3a266534dd20e6fed4883e052c557 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 8 Jun 2004 16:14:31 +0000 Subject: r1085: Now it's had some proper user testing, merge in the deferred open fix. I'm still doing more testing, but it fixes a behaviour that we've been wrong on ever since the start of Samba. Jeremy. (This used to be commit 894cc6d16296b934c112786eec896846156aee5d) --- source3/rpc_server/srv_srvsvc_nt.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 77b9be9966..087c50451e 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1886,8 +1886,9 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC unistr2_to_ascii(filename, &q_u->uni_file_name, sizeof(filename)); unix_convert(filename, conn, NULL, &bad_path, &st); - fsp = open_file_shared(conn, filename, &st, SET_OPEN_MODE(DOS_OPEN_RDONLY), - (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), FILE_ATTRIBUTE_NORMAL, 0, &access_mode, &action); + fsp = open_file_shared(conn, filename, &st, SET_DENY_MODE(DENY_NONE)|SET_OPEN_MODE(DOS_OPEN_RDONLY), + (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), FILE_ATTRIBUTE_NORMAL, INTERNAL_OPEN_ONLY, + &access_mode, &action); if (!fsp) { /* Perhaps it is a directory */ @@ -1990,8 +1991,9 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ unistr2_to_ascii(filename, &q_u->uni_file_name, sizeof(filename)); unix_convert(filename, conn, NULL, &bad_path, &st); - fsp = open_file_shared(conn, filename, &st, SET_OPEN_MODE(DOS_OPEN_RDWR), - (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), FILE_ATTRIBUTE_NORMAL, 0, &access_mode, &action); + fsp = open_file_shared(conn, filename, &st, SET_DENY_MODE(DENY_NONE)|SET_OPEN_MODE(DOS_OPEN_RDWR), + (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), FILE_ATTRIBUTE_NORMAL, INTERNAL_OPEN_ONLY, + &access_mode, &action); if (!fsp) { /* Perhaps it is a directory */ -- cgit From fddef6fc201ed127eaac737e725d1c2dd8c6926e Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 11 Jun 2004 17:54:23 +0000 Subject: r1115: Fix for #1427. Catch bad path errors at the right point. Ensure all our pathname parsing is consistent. Jeremy. (This used to be commit 5e8237e306f0bb0e492f10fb6487938132899384) --- source3/rpc_server/srv_srvsvc_nt.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 087c50451e..54cc0d6161 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1886,6 +1886,18 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC unistr2_to_ascii(filename, &q_u->uni_file_name, sizeof(filename)); unix_convert(filename, conn, NULL, &bad_path, &st); + if (bad_path) { + DEBUG(3,("_srv_net_file_query_secdesc: bad pathname %s\n", filename)); + r_u->status = WERR_ACCESS_DENIED; + goto error_exit; + } + + if (!check_name(filename,conn)) { + DEBUG(3,("_srv_net_file_query_secdesc: can't access %s\n", filename)); + r_u->status = WERR_ACCESS_DENIED; + goto error_exit; + } + fsp = open_file_shared(conn, filename, &st, SET_DENY_MODE(DENY_NONE)|SET_OPEN_MODE(DOS_OPEN_RDONLY), (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), FILE_ATTRIBUTE_NORMAL, INTERNAL_OPEN_ONLY, &access_mode, &action); @@ -1990,6 +2002,18 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ unistr2_to_ascii(filename, &q_u->uni_file_name, sizeof(filename)); unix_convert(filename, conn, NULL, &bad_path, &st); + if (bad_path) { + DEBUG(3,("_srv_net_file_set_secdesc: bad pathname %s\n", filename)); + r_u->status = WERR_ACCESS_DENIED; + goto error_exit; + } + + if (!check_name(filename,conn)) { + DEBUG(3,("_srv_net_file_set_secdesc: can't access %s\n", filename)); + r_u->status = WERR_ACCESS_DENIED; + goto error_exit; + } + fsp = open_file_shared(conn, filename, &st, SET_DENY_MODE(DENY_NONE)|SET_OPEN_MODE(DOS_OPEN_RDWR), (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), FILE_ATTRIBUTE_NORMAL, INTERNAL_OPEN_ONLY, -- cgit From b321a8a9ad5d2b8e276c97a4a057c5fbef8b5ff7 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 23 Nov 2004 23:13:48 +0000 Subject: r3929: Dead code elimination fix for bug #2075 from jason@ncac.gwu.edu. Jeremy. (This used to be commit 9d367ac636d7d88cd4756531bd8412f8d6d16d14) --- source3/rpc_server/srv_srvsvc_nt.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 54cc0d6161..9837ea2a97 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -356,15 +356,12 @@ out: static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501, int snum) { - int len_net_name; pstring remark; - char *net_name = lp_servicename(snum); + const char *net_name = lp_servicename(snum); pstrcpy(remark, lp_comment(snum)); standard_sub_conn(p->conn, remark, sizeof(remark)); - len_net_name = strlen(net_name); - init_srv_share_info501(&sh501->info_501, net_name, get_share_type(snum), remark, (lp_csc_policy(snum) << 4)); init_srv_share_info501_str(&sh501->info_501_str, net_name, remark); } @@ -375,7 +372,6 @@ static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501, static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, int snum) { - int len_net_name; pstring net_name; pstring remark; pstring path; @@ -401,7 +397,6 @@ static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, string_replace(path, '/', '\\'); pstrcpy(passwd, ""); - len_net_name = strlen(net_name); sd = get_share_security(ctx, snum, &sd_size); -- cgit From acf9d61421faa6c0055d57fdee7db300dc5431aa Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 7 Dec 2004 18:25:53 +0000 Subject: r4088: Get medieval on our ass about malloc.... :-). Take control of all our allocation functions so we can funnel through some well known functions. Should help greatly with malloc checking. HEAD patch to follow. Jeremy. (This used to be commit 620f2e608f70ba92f032720c031283d295c5c06a) --- source3/rpc_server/srv_srvsvc_nt.c | 83 +++++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 36 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 9837ea2a97..af4c94800a 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -522,10 +522,12 @@ static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, switch (info_level) { case 0: { - SRV_SHARE_INFO_0 *info0; + SRV_SHARE_INFO_0 *info0 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_0, num_entries); int i = 0; - info0 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_0)); + if (!info0) { + return False; + } for (snum = *resume_hnd; snum < num_services; snum++) { if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { @@ -540,10 +542,12 @@ static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, case 1: { - SRV_SHARE_INFO_1 *info1; + SRV_SHARE_INFO_1 *info1 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1, num_entries); int i = 0; - info1 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_1)); + if (!info1) { + return False; + } for (snum = *resume_hnd; snum < num_services; snum++) { if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { @@ -557,10 +561,12 @@ static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, case 2: { - SRV_SHARE_INFO_2 *info2; + SRV_SHARE_INFO_2 *info2 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_2, num_entries); int i = 0; - info2 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_2)); + if (!info2) { + return False; + } for (snum = *resume_hnd; snum < num_services; snum++) { if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { @@ -574,10 +580,12 @@ static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, case 501: { - SRV_SHARE_INFO_501 *info501; + SRV_SHARE_INFO_501 *info501 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_501, num_entries); int i = 0; - info501 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_501)); + if (!info501) { + return False; + } for (snum = *resume_hnd; snum < num_services; snum++) { if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { @@ -591,10 +599,12 @@ static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, case 502: { - SRV_SHARE_INFO_502 *info502; + SRV_SHARE_INFO_502 *info502 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_502, num_entries); int i = 0; - info502 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_502)); + if (!info502) { + return False; + } for (snum = *resume_hnd; snum < num_services; snum++) { if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { @@ -610,10 +620,12 @@ static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, case 1004: { - SRV_SHARE_INFO_1004 *info1004; + SRV_SHARE_INFO_1004 *info1004 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1004, num_entries); int i = 0; - info1004 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_1004)); + if (!info1004) { + return False; + } for (snum = *resume_hnd; snum < num_services; snum++) { if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { @@ -627,10 +639,12 @@ static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, case 1005: { - SRV_SHARE_INFO_1005 *info1005; + SRV_SHARE_INFO_1005 *info1005 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1005, num_entries); int i = 0; - info1005 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_1005)); + if (!info1005) { + return False; + } for (snum = *resume_hnd; snum < num_services; snum++) { if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { @@ -644,10 +658,12 @@ static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, case 1006: { - SRV_SHARE_INFO_1006 *info1006; + SRV_SHARE_INFO_1006 *info1006 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1006, num_entries); int i = 0; - info1006 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_1006)); + if (!info1006) { + return False; + } for (snum = *resume_hnd; snum < num_services; snum++) { if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { @@ -661,10 +677,12 @@ static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, case 1007: { - SRV_SHARE_INFO_1007 *info1007; + SRV_SHARE_INFO_1007 *info1007 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1007, num_entries); int i = 0; - info1007 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_1007)); + if (!info1007) { + return False; + } for (snum = *resume_hnd; snum < num_services; snum++) { if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { @@ -678,10 +696,12 @@ static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, case 1501: { - SRV_SHARE_INFO_1501 *info1501; + SRV_SHARE_INFO_1501 *info1501 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1501, num_entries); int i = 0; - info1501 = talloc(ctx, num_entries * sizeof(SRV_SHARE_INFO_1501)); + if (!info1501) { + return False; + } for (snum = *resume_hnd; snum < num_services; snum++) { if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { @@ -1132,8 +1152,7 @@ static WERROR init_srv_file_info_ctr(pipes_struct *p, SRV_FILE_INFO_CTR *ctr, int i; if (*total_entries > 0) { ctr->ptr_entries = 1; - ctr->file.info3 = talloc(ctx, ctr->num_entries * - sizeof(SRV_FILE_INFO_3)); + ctr->file.info3 = TALLOC_ARRAY(ctx, SRV_FILE_INFO_3, ctr->num_entries); } for (i=0 ;inum_entries;i++) { init_srv_file_info3(&ctr->file.info3[i].info_3, i+*resume_hnd, 0x35, 0, "\\PIPE\\samr", "dummy user"); @@ -1184,7 +1203,7 @@ net server get info WERROR _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV_R_NET_SRV_GET_INFO *r_u) { WERROR status = WERR_OK; - SRV_INFO_CTR *ctr = (SRV_INFO_CTR *)talloc(p->mem_ctx, sizeof(SRV_INFO_CTR)); + SRV_INFO_CTR *ctr = TALLOC_P(p->mem_ctx, SRV_INFO_CTR); if (!ctr) return WERR_NOMEM; @@ -1287,7 +1306,7 @@ WERROR _srv_net_conn_enum(pipes_struct *p, SRV_Q_NET_CONN_ENUM *q_u, SRV_R_NET_C { DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__)); - r_u->ctr = (SRV_CONN_INFO_CTR *)talloc(p->mem_ctx, sizeof(SRV_CONN_INFO_CTR)); + r_u->ctr = TALLOC_P(p->mem_ctx, SRV_CONN_INFO_CTR); if (!r_u->ctr) return WERR_NOMEM; @@ -1312,7 +1331,7 @@ WERROR _srv_net_sess_enum(pipes_struct *p, SRV_Q_NET_SESS_ENUM *q_u, SRV_R_NET_S { DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__)); - r_u->ctr = (SRV_SESS_INFO_CTR *)talloc(p->mem_ctx, sizeof(SRV_SESS_INFO_CTR)); + r_u->ctr = TALLOC_P(p->mem_ctx, SRV_SESS_INFO_CTR); if (!r_u->ctr) return WERR_NOMEM; @@ -1795,7 +1814,7 @@ WERROR _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET struct tm *t; time_t unixdate = time(NULL); - tod = (TIME_OF_DAY_INFO *)talloc(p->mem_ctx, sizeof(TIME_OF_DAY_INFO)); + tod = TALLOC_P(p->mem_ctx, TIME_OF_DAY_INFO); if (!tod) return WERR_NOMEM; @@ -2114,16 +2133,8 @@ WERROR _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_D r_u->disk_enum_ctr.unknown = 0; - { - DISK_INFO *dinfo; - - int dinfo_size = MAX_SERVER_DISK_ENTRIES * sizeof(*dinfo); - - if(!(dinfo = talloc(ctx, dinfo_size))) { - return WERR_NOMEM; - } - - r_u->disk_enum_ctr.disk_info = dinfo; + if(!(r_u->disk_enum_ctr.disk_info = TALLOC_ARRAY(ctx, DISK_INFO, MAX_SERVER_DISK_ENTRIES))) { + return WERR_NOMEM; } r_u->disk_enum_ctr.disk_info_ptr = r_u->disk_enum_ctr.disk_info ? 1 : 0; -- cgit From 10861a6160fb1ead19e23ff58f3590813600fc7b Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Tue, 18 Jan 2005 19:51:36 +0000 Subject: r4825: Printing changes ---------------- * bracket the add/delete/set printer scripts with checks for se_print_op * slight change to the add/set printer script semantics. smbd no longer relies on output from the script (on stdout) to re-read smb.conf * remove SIGHUP from set/add/delete printin script code and now just use MSG_SMB_CONF_UPDATED * bracket the add/delete/set share scripts with checks for se_print_op (this includes setting share ACLs) (This used to be commit 8ab8113d2e1bec6a1dbf464882ad724c7c591be4) --- source3/rpc_server/srv_srvsvc_nt.c | 107 +++++++++++++++++++++++++++---------- 1 file changed, 79 insertions(+), 28 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index af4c94800a..382941d361 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1470,6 +1470,8 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S int ret; char *ptr; SEC_DESC *psd = NULL; + SE_PRIV se_diskop = SE_DISK_OPERATOR; + BOOL is_disk_op; DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); @@ -1492,7 +1494,11 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S get_current_user(&user,p); - if (user.uid != sec_initial_uid()) + is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); + + /* fail out now if you are not root and not a disk op */ + + if ( user.uid != sec_initial_uid() && !is_disk_op ) return WERR_ACCESS_DENIED; switch (q_u->info_level) { @@ -1575,23 +1581,36 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S lp_change_share_cmd() ? lp_change_share_cmd() : "NULL" )); /* Only call modify function if something changed. */ - - if (strcmp(ptr, lp_pathname(snum)) || strcmp(comment, lp_comment(snum)) ) { - if (!lp_change_share_cmd() || !*lp_change_share_cmd()) + + if (strcmp(ptr, lp_pathname(snum)) || strcmp(comment, lp_comment(snum)) ) + { + if (!lp_change_share_cmd() || !*lp_change_share_cmd()) return WERR_ACCESS_DENIED; slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\"", lp_change_share_cmd(), dyn_CONFIGFILE, share_name, ptr, comment); 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 )); + + /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/ + + if ( is_disk_op ) + become_root(); + + ret = smbrun(command, NULL); + + if ( is_disk_op ) + unbecome_root(); + + /********* END SeDiskOperatorPrivilege BLOCK *********/ + + DEBUG(3,("_srv_net_share_set_info: Running [%s] returned (%d)\n", command, ret )); + + if ( ret != 0 ) return WERR_ACCESS_DENIED; - } /* Tell everyone we updated smb.conf. */ message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL); - } else { DEBUG(10,("_srv_net_share_set_info: No change to share name (%s)\n", share_name )); } @@ -1609,7 +1628,7 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S share_name )); } } - + DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); return WERR_OK; @@ -1631,6 +1650,8 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S int ret; char *ptr; SEC_DESC *psd = NULL; + SE_PRIV se_diskop = SE_DISK_OPERATOR; + BOOL is_disk_op; DEBUG(5,("_srv_net_share_add: %d\n", __LINE__)); @@ -1638,16 +1659,16 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S get_current_user(&user,p); - if (user.uid != sec_initial_uid()) { - DEBUG(10,("_srv_net_share_add: uid != sec_initial_uid(). Access denied.\n")); + is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); + + if (user.uid != sec_initial_uid() && !is_disk_op ) return WERR_ACCESS_DENIED; - } if (!lp_add_share_cmd() || !*lp_add_share_cmd()) { DEBUG(10,("_srv_net_share_add: No add share command\n")); return WERR_ACCESS_DENIED; } - + switch (q_u->info_level) { case 0: /* No path. Not enough info in a level 0 to do anything. */ @@ -1713,12 +1734,28 @@ WERROR _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(), dyn_CONFIGFILE, share_name, ptr, comment); - + 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 )); + + /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/ + + if ( is_disk_op ) + become_root(); + + ret = smbrun(command, NULL); + + if ( is_disk_op ) + unbecome_root(); + + /********* END SeDiskOperatorPrivilege BLOCK *********/ + + DEBUG(3,("_srv_net_share_add: Running [%s] returned (%d)\n", command, ret )); + + if ( ret != 0 ) return WERR_ACCESS_DENIED; - } + + /* Tell everyone we updated smb.conf. */ + message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL); if (psd) { if (!set_share_security(p->mem_ctx, share_name, psd)) @@ -1726,9 +1763,6 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S share_name )); } - /* Tell everyone we updated smb.conf. */ - message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL); - /* * We don't call reload_services() here, the message will * cause this to be done before the next packet is read @@ -1752,6 +1786,8 @@ WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S fstring share_name; int ret; int snum; + SE_PRIV se_diskop = SE_DISK_OPERATOR; + BOOL is_disk_op; DEBUG(5,("_srv_net_share_del: %d\n", __LINE__)); @@ -1771,27 +1807,42 @@ WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S get_current_user(&user,p); - if (user.uid != sec_initial_uid()) + is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); + + if (user.uid != sec_initial_uid() && !is_disk_op ) return WERR_ACCESS_DENIED; if (!lp_delete_share_cmd() || !*lp_delete_share_cmd()) return WERR_ACCESS_DENIED; - + slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\"", lp_delete_share_cmd(), dyn_CONFIGFILE, lp_servicename(snum)); 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 WERR_ACCESS_DENIED; - } - /* Delete the SD in the database. */ - delete_share_security(snum); + /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/ + + if ( is_disk_op ) + become_root(); + + ret = smbrun(command, NULL); + + if ( is_disk_op ) + unbecome_root(); + + /********* END SeDiskOperatorPrivilege BLOCK *********/ + + DEBUG(3,("_srv_net_share_del: Running [%s] returned (%d)\n", command, ret )); + + if ( ret != 0 ) + return WERR_ACCESS_DENIED; /* Tell everyone we updated smb.conf. */ message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL); + /* Delete the SD in the database. */ + delete_share_security(snum); + lp_killservice(snum); return WERR_OK; -- cgit From 415ea1dfd33904bdf70ea993b0b93e1c852ab0cb Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Wed, 19 Jan 2005 18:28:55 +0000 Subject: r4852: merge simo changes to srv_srvsvc_nt.c from trunk that allows the add/change share command to create the directory passed in as an arguement and not require that it pre-exist. Also finish testing of SeDiskOperatorPrivilege via srvmgr.exe (This used to be commit 9af83a7d70324846e6a2660c73589ee68340b4aa) --- source3/rpc_server/srv_srvsvc_nt.c | 43 ++++++++++++-------------------------- 1 file changed, 13 insertions(+), 30 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 382941d361..529b4c198d 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1419,10 +1419,7 @@ WERROR _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, S static char *valid_share_pathname(char *dos_pathname) { - pstring saved_pathname; - pstring unix_pathname; char *ptr; - int ret; /* Convert any '\' paths to '/' */ unix_format(dos_pathname); @@ -1437,21 +1434,7 @@ static char *valid_share_pathname(char *dos_pathname) if (*ptr != '/') return NULL; - /* Can we cd to it ? */ - - /* First save our current directory. */ - if (getcwd(saved_pathname, sizeof(saved_pathname)) == NULL) - return False; - - pstrcpy(unix_pathname, ptr); - - ret = chdir(unix_pathname); - - /* We *MUST* be able to chdir back. Abort if we can't. */ - if (chdir(saved_pathname) == -1) - smb_panic("valid_share_pathname: Unable to restore current directory.\n"); - - return (ret != -1) ? ptr : NULL; + return ptr; } /******************************************************************* @@ -1468,7 +1451,7 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S int type; int snum; int ret; - char *ptr; + char *path; SEC_DESC *psd = NULL; SE_PRIV se_diskop = SE_DISK_OPERATOR; BOOL is_disk_op; @@ -1569,12 +1552,12 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S return WERR_ACCESS_DENIED; /* Check if the pathname is valid. */ - if (!(ptr = valid_share_pathname( pathname ))) + if (!(path = valid_share_pathname( pathname ))) return WERR_OBJECT_PATH_INVALID; /* Ensure share name, pathname and comment don't contain '"' characters. */ string_replace(share_name, '"', ' '); - string_replace(ptr, '"', ' '); + string_replace(path, '"', ' '); string_replace(comment, '"', ' '); DEBUG(10,("_srv_net_share_set_info: change share command = %s\n", @@ -1582,13 +1565,13 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S /* Only call modify function if something changed. */ - if (strcmp(ptr, lp_pathname(snum)) || strcmp(comment, lp_comment(snum)) ) + if (strcmp(path, lp_pathname(snum)) || strcmp(comment, lp_comment(snum)) ) { if (!lp_change_share_cmd() || !*lp_change_share_cmd()) return WERR_ACCESS_DENIED; slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\"", - lp_change_share_cmd(), dyn_CONFIGFILE, share_name, ptr, comment); + lp_change_share_cmd(), dyn_CONFIGFILE, share_name, path, comment); DEBUG(10,("_srv_net_share_set_info: Running [%s]\n", command )); @@ -1648,7 +1631,7 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S int type; int snum; int ret; - char *ptr; + char *path; SEC_DESC *psd = NULL; SE_PRIV se_diskop = SE_DISK_OPERATOR; BOOL is_disk_op; @@ -1724,16 +1707,16 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S return WERR_ACCESS_DENIED; /* Check if the pathname is valid. */ - if (!(ptr = valid_share_pathname( pathname ))) + if (!(path = valid_share_pathname( pathname ))) return WERR_OBJECT_PATH_INVALID; /* Ensure share name, pathname and comment don't contain '"' characters. */ string_replace(share_name, '"', ' '); - string_replace(ptr, '"', ' '); + string_replace(path, '"', ' '); string_replace(comment, '"', ' '); slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\"", - lp_add_share_cmd(), dyn_CONFIGFILE, share_name, ptr, comment); + lp_add_share_cmd(), dyn_CONFIGFILE, share_name, path, comment); DEBUG(10,("_srv_net_share_add: Running [%s]\n", command )); @@ -1758,9 +1741,9 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL); if (psd) { - if (!set_share_security(p->mem_ctx, share_name, psd)) - DEBUG(0,("_srv_net_share_add: Failed to add security info to share %s.\n", - share_name )); + if (!set_share_security(p->mem_ctx, share_name, psd)) { + DEBUG(0,("_srv_net_share_add: Failed to add security info to share %s.\n", share_name )); + } } /* -- cgit From 372440f207d88e058af76cf7ce4c5901ba7a7547 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Wed, 19 Jan 2005 21:10:56 +0000 Subject: r4856: after testing a simple add printer script, i realized that you still have to be root to send the message to all smbds that the config file has been updated (This used to be commit 6409de1a1ef34bb41c3efeebfabdf13be5e08613) --- source3/rpc_server/srv_srvsvc_nt.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 529b4c198d..13e1971925 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1580,7 +1580,10 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S if ( is_disk_op ) become_root(); - ret = smbrun(command, NULL); + if ( (ret = smbrun(command, NULL)) == 0 ) { + /* Tell everyone we updated smb.conf. */ + message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL); + } if ( is_disk_op ) unbecome_root(); @@ -1591,9 +1594,6 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S if ( ret != 0 ) return WERR_ACCESS_DENIED; - - /* Tell everyone we updated smb.conf. */ - message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL); } else { DEBUG(10,("_srv_net_share_set_info: No change to share name (%s)\n", share_name )); } @@ -1725,7 +1725,10 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S if ( is_disk_op ) become_root(); - ret = smbrun(command, NULL); + if ( (ret = smbrun(command, NULL)) == 0 ) { + /* Tell everyone we updated smb.conf. */ + message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL); + } if ( is_disk_op ) unbecome_root(); @@ -1737,9 +1740,6 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S if ( ret != 0 ) return WERR_ACCESS_DENIED; - /* Tell everyone we updated smb.conf. */ - message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL); - if (psd) { if (!set_share_security(p->mem_ctx, share_name, psd)) { DEBUG(0,("_srv_net_share_add: Failed to add security info to share %s.\n", share_name )); @@ -1808,7 +1808,10 @@ WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S if ( is_disk_op ) become_root(); - ret = smbrun(command, NULL); + if ( (ret = smbrun(command, NULL)) == 0 ) { + /* Tell everyone we updated smb.conf. */ + message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL); + } if ( is_disk_op ) unbecome_root(); @@ -1820,9 +1823,6 @@ WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S if ( ret != 0 ) return WERR_ACCESS_DENIED; - /* Tell everyone we updated smb.conf. */ - message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL); - /* Delete the SD in the database. */ delete_share_security(snum); -- cgit From bece9417d2e232e5b13ea340c79430bb9680eb8a Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Wed, 23 Mar 2005 20:57:03 +0000 Subject: r6004: Let's make server manager able to kill a user session. This will send a shutdown command to the right process by pid read from the sessions list. (This used to be commit 5d3d025db757f7d48f241142a60a93214f2b47ea) --- source3/rpc_server/srv_srvsvc_nt.c | 43 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 13e1971925..8bcb5c82ac 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1348,6 +1348,49 @@ WERROR _srv_net_sess_enum(pipes_struct *p, SRV_Q_NET_SESS_ENUM *q_u, SRV_R_NET_S return r_u->status; } +/******************************************************************* +net sess del +********************************************************************/ + +WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SESS_DEL *r_u) +{ + struct sessionid *session_list; + int num_sessions, snum, ret; + fstring username; + fstring machine; + + rpcstr_pull_unistr2_fstring(username, &q_u->uni_user_name); + rpcstr_pull_unistr2_fstring(machine, &q_u->uni_cli_name); + + /* strip leading backslashes if any */ + while (machine[0] == '\\') { + memmove(machine, &machine[1], strlen(machine)); + } + + num_sessions = list_sessions(&session_list); + + DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__)); + + r_u->status = WERR_ACCESS_DENIED; + + for (snum = 0; snum < num_sessions; snum++) { + + if ((StrCaseCmp(session_list[snum].username, username) == 0 || username[0] == '\0' ) && + StrCaseCmp(session_list[snum].remote_machine, machine) == 0) { + + if ((ret = message_send_pid(session_list[snum].pid, MSG_SHUTDOWN, NULL, 0, False))) { + r_u->status = WERR_OK; + } else { + r_u->status = WERR_ACCESS_DENIED; + } + } + } + + DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__)); + + return r_u->status; +} + /******************************************************************* Net share enum all. ********************************************************************/ -- cgit From 920745f0df024741f28e8557c52187a8db01c5d1 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 23 Mar 2005 21:46:09 +0000 Subject: r6009: Add privillage check for SE_DISK_OP (is this the right privilage?) before allowing users to shut down any sessions. Simo - please check security before allowing state changes. Please review this change. Jeremy. (This used to be commit 51beba71d4d5d3d259e567b65b1694d862814fe9) --- source3/rpc_server/srv_srvsvc_nt.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 8bcb5c82ac..a00409afc8 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1354,10 +1354,13 @@ net sess del WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SESS_DEL *r_u) { + struct current_user user; struct sessionid *session_list; int num_sessions, snum, ret; fstring username; fstring machine; + SE_PRIV se_diskop = SE_DISK_OPERATOR; /* Is disk op appropriate here ? JRA. */ + BOOL is_disk_op = False; rpcstr_pull_unistr2_fstring(username, &q_u->uni_user_name); rpcstr_pull_unistr2_fstring(machine, &q_u->uni_cli_name); @@ -1371,12 +1374,21 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__)); + get_current_user(&user,p); + + is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); + + /* fail out now if you are not root and not a disk op */ + + if ( user.uid != sec_initial_uid() && !is_disk_op ) + return WERR_ACCESS_DENIED; + r_u->status = WERR_ACCESS_DENIED; for (snum = 0; snum < num_sessions; snum++) { - if ((StrCaseCmp(session_list[snum].username, username) == 0 || username[0] == '\0' ) && - StrCaseCmp(session_list[snum].remote_machine, machine) == 0) { + if ((strequal(session_list[snum].username, username) || username[0] == '\0' ) && + strequal(session_list[snum].remote_machine, machine)) { if ((ret = message_send_pid(session_list[snum].pid, MSG_SHUTDOWN, NULL, 0, False))) { r_u->status = WERR_OK; @@ -1497,7 +1509,7 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S char *path; SEC_DESC *psd = NULL; SE_PRIV se_diskop = SE_DISK_OPERATOR; - BOOL is_disk_op; + BOOL is_disk_op = False; DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); -- cgit From 899ade0e62ebbfd6994101c45bb56d20357535af Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Thu, 24 Mar 2005 00:01:56 +0000 Subject: r6016: Give access only to root and Domain Users (This used to be commit d3557ed4b7c4d58a50cc6041c06cc4eff5ef659a) --- source3/rpc_server/srv_srvsvc_nt.c | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index a00409afc8..5dd2e6e47f 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1354,13 +1354,13 @@ net sess del WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SESS_DEL *r_u) { - struct current_user user; struct sessionid *session_list; + struct current_user user; int num_sessions, snum, ret; fstring username; fstring machine; - SE_PRIV se_diskop = SE_DISK_OPERATOR; /* Is disk op appropriate here ? JRA. */ - BOOL is_disk_op = False; + /* SE_PRIV se_diskop = SE_DISK_OPERATOR; / * Is disk op appropriate here ? JRA. * / + BOOL is_disk_op = False; / * No. SSS. :) */ rpcstr_pull_unistr2_fstring(username, &q_u->uni_user_name); rpcstr_pull_unistr2_fstring(machine, &q_u->uni_cli_name); @@ -1374,32 +1374,44 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__)); - get_current_user(&user,p); - - is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); - - /* fail out now if you are not root and not a disk op */ + /* is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); */ - if ( user.uid != sec_initial_uid() && !is_disk_op ) - return WERR_ACCESS_DENIED; - r_u->status = WERR_ACCESS_DENIED; + get_current_user(&user, p); + /* fail out now if you are not root */ + /* or at least domain admins */ + if ((user.uid != sec_initial_uid()) && + ( ! nt_token_check_domain_rid(p->pipe_user.nt_user_token, DOMAIN_GROUP_RID_ADMINS))) { + + goto done; + } + for (snum = 0; snum < num_sessions; snum++) { if ((strequal(session_list[snum].username, username) || username[0] == '\0' ) && strequal(session_list[snum].remote_machine, machine)) { + if (user.uid != sec_initial_uid()) { + become_root(); + } if ((ret = message_send_pid(session_list[snum].pid, MSG_SHUTDOWN, NULL, 0, False))) { r_u->status = WERR_OK; } else { r_u->status = WERR_ACCESS_DENIED; } + if (user.uid != sec_initial_uid()) { + unbecome_root(); + } } } DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__)); + +done: + SAFE_FREE(session_list); + return r_u->status; } -- cgit From 91e6894031406d23093b3da05263a0e85219b5f3 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Thu, 24 Mar 2005 08:36:00 +0000 Subject: r6034: Check only once (This used to be commit 5a4274371cdbbd278d8aaa922f3e5f51a3cb5aec) --- source3/rpc_server/srv_srvsvc_nt.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 5dd2e6e47f..ed08f185f7 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1359,6 +1359,7 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES int num_sessions, snum, ret; fstring username; fstring machine; + BOOL not_root = False; /* SE_PRIV se_diskop = SE_DISK_OPERATOR; / * Is disk op appropriate here ? JRA. * / BOOL is_disk_op = False; / * No. SSS. :) */ @@ -1393,6 +1394,7 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES strequal(session_list[snum].remote_machine, machine)) { if (user.uid != sec_initial_uid()) { + not_root = True; become_root(); } if ((ret = message_send_pid(session_list[snum].pid, MSG_SHUTDOWN, NULL, 0, False))) { @@ -1400,7 +1402,7 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES } else { r_u->status = WERR_ACCESS_DENIED; } - if (user.uid != sec_initial_uid()) { + if (not_root) { unbecome_root(); } } -- cgit From 987fd2ed97b91804646b8d93fff37d7f2efa6bab Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Thu, 24 Mar 2005 14:40:35 +0000 Subject: r6037: little cleanup of unused vars and unnecessary codepaths (This used to be commit 167f7d3caa84e612cf3af0095536734dc7c3ad29) --- source3/rpc_server/srv_srvsvc_nt.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index ed08f185f7..a71f0f1c29 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1360,8 +1360,6 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES fstring username; fstring machine; BOOL not_root = False; - /* SE_PRIV se_diskop = SE_DISK_OPERATOR; / * Is disk op appropriate here ? JRA. * / - BOOL is_disk_op = False; / * No. SSS. :) */ rpcstr_pull_unistr2_fstring(username, &q_u->uni_user_name); rpcstr_pull_unistr2_fstring(machine, &q_u->uni_cli_name); @@ -1375,13 +1373,12 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__)); - /* is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); */ - r_u->status = WERR_ACCESS_DENIED; get_current_user(&user, p); - /* fail out now if you are not root */ - /* or at least domain admins */ + + /* fail out now if you are not root or not a domain admin */ + if ((user.uid != sec_initial_uid()) && ( ! nt_token_check_domain_rid(p->pipe_user.nt_user_token, DOMAIN_GROUP_RID_ADMINS))) { @@ -1397,14 +1394,12 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES not_root = True; become_root(); } - if ((ret = message_send_pid(session_list[snum].pid, MSG_SHUTDOWN, NULL, 0, False))) { + + if ((ret = message_send_pid(session_list[snum].pid, MSG_SHUTDOWN, NULL, 0, False))) r_u->status = WERR_OK; - } else { - r_u->status = WERR_ACCESS_DENIED; - } - if (not_root) { + + if (not_root) unbecome_root(); - } } } -- cgit From 978ca8486031e43754a3c23757f361bf3a85f335 Mon Sep 17 00:00:00 2001 From: Herb Lewis Date: Wed, 6 Apr 2005 16:28:04 +0000 Subject: r6225: get rid of warnings from my compiler about nested externs (This used to be commit efea76ac71412f8622cd233912309e91b9ea52da) --- source3/rpc_server/srv_srvsvc_nt.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index a71f0f1c29..d806dcdc5a 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -24,6 +24,9 @@ #include "includes.h" +extern DOM_SID global_sid_World; +extern struct generic_mapping file_generic_mapping; + #undef DBGC_CLASS #define DBGC_CLASS DBGC_RPC_SRV @@ -170,8 +173,6 @@ BOOL share_info_db_init(void) static SEC_DESC *get_share_security_default( TALLOC_CTX *ctx, int snum, size_t *psize) { - extern DOM_SID global_sid_World; - extern struct generic_mapping file_generic_mapping; SEC_ACCESS sa; SEC_ACE ace; SEC_ACL *psa = NULL; @@ -293,7 +294,6 @@ static BOOL delete_share_security(int snum) void map_generic_share_sd_bits(SEC_DESC *psd) { - extern struct generic_mapping file_generic_mapping; int i; SEC_ACL *ps_dacl = NULL; -- cgit From 83e11ba86c2401ece3c845fd10c22b84e6be7811 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sat, 9 Apr 2005 11:46:40 +0000 Subject: r6263: Get rid of generate_wellknown_sids, they are const static and initializable statically. Volker (This used to be commit 3493d9f383567d286e69c0e60c0708ed400a04d9) --- source3/rpc_server/srv_srvsvc_nt.c | 1 - 1 file changed, 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index d806dcdc5a..b5768a09af 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -24,7 +24,6 @@ #include "includes.h" -extern DOM_SID global_sid_World; extern struct generic_mapping file_generic_mapping; #undef DBGC_CLASS -- cgit From f0c650a38286c07b9f3e83139c15bfbadc70ad5f Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Mon, 23 May 2005 16:25:31 +0000 Subject: r6942: * merging the registry changes back to the 3.0 tree * removing the testprns tool (This used to be commit 81ffb0dbbbd244623507880c323a3c37e2b8dc4d) --- source3/rpc_server/srv_srvsvc_nt.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index b5768a09af..0e699d922b 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1480,7 +1480,7 @@ WERROR _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, S Check a given DOS pathname is valid for a share. ********************************************************************/ -static char *valid_share_pathname(char *dos_pathname) +char *valid_share_pathname(char *dos_pathname) { char *ptr; @@ -1493,7 +1493,7 @@ static char *valid_share_pathname(char *dos_pathname) if (strlen(dos_pathname) > 2 && ptr[1] == ':' && ptr[0] != '/') ptr += 2; - /* Only abolute paths allowed. */ + /* Only absolute paths allowed. */ if (*ptr != '/') return NULL; @@ -1525,8 +1525,12 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S r_u->parm_error = 0; - if (strequal(share_name,"IPC$") || strequal(share_name,"ADMIN$") || strequal(share_name,"global")) + if ( strequal(share_name,"IPC$") + || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) + || strequal(share_name,"global") ) + { return WERR_ACCESS_DENIED; + } snum = find_service(share_name); @@ -1756,8 +1760,12 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S return WERR_UNKNOWN_LEVEL; } - if (strequal(share_name,"IPC$") || strequal(share_name,"ADMIN$") || strequal(share_name,"global")) + if ( strequal(share_name,"IPC$") + || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) + || strequal(share_name,"global") ) + { return WERR_ACCESS_DENIED; + } snum = find_service(share_name); @@ -1839,8 +1847,12 @@ WERROR _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")) + if ( strequal(share_name,"IPC$") + || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) + || strequal(share_name,"global") ) + { return WERR_ACCESS_DENIED; + } snum = find_service(share_name); -- cgit From 3f657f41cc7a71b3d5b769b31be030ebf543a645 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Wed, 15 Jun 2005 12:43:36 +0000 Subject: r7606: add WERR_NET_NAME_NOT_FOUND. This is what windows returns when trying to manipulate non-existing shares. Guenther (This used to be commit 2e5cb531ab8a8babbc425b22d17a39c18f602d4f) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 0e699d922b..91f0cefa98 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1536,7 +1536,7 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S /* Does this share exist ? */ if (snum < 0) - return WERR_INVALID_NAME; + return WERR_NET_NAME_NOT_FOUND; /* No change to printer shares. */ if (lp_print_ok(snum)) -- cgit From d966feb9bcb744881ce8ee687ecb2a01be808dbf Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 30 Jun 2005 15:19:54 +0000 Subject: r8019: Better give a hint that we are failing share-manipulation due to missing scripts. Guenther (This used to be commit 1f17b4f45e966cba83f6ad48e5017cbaa5b58bdf) --- source3/rpc_server/srv_srvsvc_nt.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 91f0cefa98..f8124031ce 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1634,8 +1634,10 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S if (strcmp(path, lp_pathname(snum)) || strcmp(comment, lp_comment(snum)) ) { - if (!lp_change_share_cmd() || !*lp_change_share_cmd()) + if (!lp_change_share_cmd() || !*lp_change_share_cmd()) { + DEBUG(10,("_srv_net_share_set_info: No change share command\n")); return WERR_ACCESS_DENIED; + } slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\"", lp_change_share_cmd(), dyn_CONFIGFILE, share_name, path, comment); @@ -1870,8 +1872,10 @@ WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S if (user.uid != sec_initial_uid() && !is_disk_op ) return WERR_ACCESS_DENIED; - if (!lp_delete_share_cmd() || !*lp_delete_share_cmd()) + if (!lp_delete_share_cmd() || !*lp_delete_share_cmd()) { + DEBUG(10,("_srv_net_share_del: No delete share command\n")); return WERR_ACCESS_DENIED; + } slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\"", lp_delete_share_cmd(), dyn_CONFIGFILE, lp_servicename(snum)); -- cgit From af8a691db11a5072865f8b03fd1cbd3aab5cb6d7 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 8 Jul 2005 04:51:27 +0000 Subject: r8219: Merge the new open code from HEAD to 3.0. Haven't yet run the torture tests on this as it's very late NY time (just wanted to get this work into the tree). I'll test this over the weekend.... Jerry - in looking at the difference between the two trees there seem to be some printing/ntprinting.c and registry changes we might want to examine to try keep in sync. Jeremy. (This used to be commit c7fe18761e2c753afbffd3a78abff46472a9b8eb) --- source3/rpc_server/srv_srvsvc_nt.c | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index f8124031ce..c3fd53a384 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1976,8 +1976,6 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC files_struct *fsp = NULL; SMB_STRUCT_STAT st; BOOL bad_path; - int access_mode; - int action; NTSTATUS nt_status; struct current_user user; connection_struct *conn = NULL; @@ -2025,15 +2023,16 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC goto error_exit; } - fsp = open_file_shared(conn, filename, &st, SET_DENY_MODE(DENY_NONE)|SET_OPEN_MODE(DOS_OPEN_RDONLY), - (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), FILE_ATTRIBUTE_NORMAL, INTERNAL_OPEN_ONLY, - &access_mode, &action); - + fsp = open_file_stat(conn, filename, &st); if (!fsp) { /* Perhaps it is a directory */ if (errno == EISDIR) - fsp = open_directory(conn, filename, &st,FILE_READ_ATTRIBUTES,0, - (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), &action); + fsp = open_directory(conn, filename, &st, + READ_CONTROL_ACCESS, + FILE_SHARE_READ|FILE_SHARE_WRITE, + FILE_OPEN, + 0, + NULL); if (!fsp) { DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", filename)); @@ -2092,8 +2091,6 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ files_struct *fsp = NULL; SMB_STRUCT_STAT st; BOOL bad_path; - int access_mode; - int action; NTSTATUS nt_status; struct current_user user; connection_struct *conn = NULL; @@ -2142,15 +2139,17 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ } - fsp = open_file_shared(conn, filename, &st, SET_DENY_MODE(DENY_NONE)|SET_OPEN_MODE(DOS_OPEN_RDWR), - (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), FILE_ATTRIBUTE_NORMAL, INTERNAL_OPEN_ONLY, - &access_mode, &action); + fsp = open_file_stat(conn, filename, &st); if (!fsp) { /* Perhaps it is a directory */ if (errno == EISDIR) - fsp = open_directory(conn, filename, &st,FILE_READ_ATTRIBUTES,0, - (FILE_FAIL_IF_NOT_EXIST|FILE_EXISTS_OPEN), &action); + fsp = open_directory(conn, filename, &st, + FILE_READ_ATTRIBUTES, + FILE_SHARE_READ|FILE_SHARE_WRITE, + FILE_OPEN, + 0, + NULL); if (!fsp) { DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", filename)); @@ -2178,11 +2177,13 @@ error_exit: close_file(fsp, True); } - if (became_user) + if (became_user) { unbecome_user(); + } - if (conn) + if (conn) { close_cnum(conn, user.vuid); + } return r_u->status; } -- cgit From 99478cd59bc89c82248652ca8a7a326f0e8cad39 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Tue, 19 Jul 2005 03:54:01 +0000 Subject: r8573: Fix set but not used warning in srvsvc server-side code. Another bugzilla (#2891) from Jason Mader. (This used to be commit ae6b4df7fed2516c5236755f75300ec0d95c35b3) --- source3/rpc_server/srv_srvsvc_nt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index c3fd53a384..b607d32e54 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1355,7 +1355,7 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES { struct sessionid *session_list; struct current_user user; - int num_sessions, snum, ret; + int num_sessions, snum; fstring username; fstring machine; BOOL not_root = False; @@ -1394,7 +1394,7 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES become_root(); } - if ((ret = message_send_pid(session_list[snum].pid, MSG_SHUTDOWN, NULL, 0, False))) + if (message_send_pid(session_list[snum].pid, MSG_SHUTDOWN, NULL, 0, False)) r_u->status = WERR_OK; if (not_root) -- cgit From 8c072021efba737539b46e993df0c21a6438a82a Mon Sep 17 00:00:00 2001 From: James Peach Date: Tue, 30 Aug 2005 06:41:32 +0000 Subject: r9780: Clean up a bunch of compiler warnings. (This used to be commit 623d2e69319ffead31a780a4d6156dae45f386d7) --- source3/rpc_server/srv_srvsvc_nt.c | 3 --- 1 file changed, 3 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index b607d32e54..e9dd015421 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1597,11 +1597,9 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S DEBUG(3, ("_srv_net_share_set_info: client is trying to change csc policy from the network; must be done with smb.conf\n")); return WERR_ACCESS_DENIED; } - break; case 1006: case 1007: return WERR_ACCESS_DENIED; - break; case 1501: pstrcpy(pathname, lp_pathname(snum)); fstrcpy(comment, lp_comment(snum)); @@ -1753,7 +1751,6 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S case 1006: case 1007: return WERR_ACCESS_DENIED; - break; case 1501: /* DFS only level. */ return WERR_ACCESS_DENIED; -- cgit From 54abd2aa66069e6baf7769c496f46d9dba18db39 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Fri, 30 Sep 2005 17:13:37 +0000 Subject: r10656: BIG merge from trunk. Features not copied over * \PIPE\unixinfo * winbindd's {group,alias}membership new functions * winbindd's lookupsids() functionality * swat (trunk changes to be reverted as per discussion with Deryck) (This used to be commit 939c3cb5d78e3a2236209b296aa8aba8bdce32d3) --- source3/rpc_server/srv_srvsvc_nt.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index e9dd015421..9643b2a724 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -113,7 +113,8 @@ static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2, int sn What to do when smb.conf is updated. ********************************************************************/ -static void smb_conf_updated(int msg_type, pid_t src, void *buf, size_t len) +static void smb_conf_updated(int msg_type, struct process_id src, + void *buf, size_t len) { DEBUG(10,("smb_conf_updated: Got message saying smb.conf was updated. Reloading.\n")); reload_services(False); @@ -1394,7 +1395,7 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES become_root(); } - if (message_send_pid(session_list[snum].pid, MSG_SHUTDOWN, NULL, 0, False)) + if (message_send_pid(pid_to_procid(session_list[snum].pid), MSG_SHUTDOWN, NULL, 0, False)) r_u->status = WERR_OK; if (not_root) -- cgit From b9ae4455fd0be70c6c7b08807425066e0dd91242 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Fri, 14 Oct 2005 14:51:48 +0000 Subject: r11054: patch from Brian Moran; fix error code return in _srv_net_name_validate() (This used to be commit b4e78520ccb8c896a52e3f3e7a52e19e3b2c33bf) --- source3/rpc_server/srv_srvsvc_nt.c | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 9643b2a724..1022cb960d 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2275,31 +2275,18 @@ WERROR _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_D WERROR _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV_R_NET_NAME_VALIDATE *r_u) { - int snum; fstring share_name; - r_u->status=WERR_OK; - - switch(q_u->type) { - + switch ( q_u->type ) { case 0x9: - - /*check if share name is ok*/ - /*also check if we already have a share with this name*/ + /* check if share name is ok. + TODO: check for invalid characters in name? */ unistr2_to_ascii(share_name, &q_u->uni_name, sizeof(share_name)); - snum = find_service(share_name); - - /* Share already exists. */ - if (snum >= 0) - r_u->status = WERR_ALREADY_EXISTS; break; - default: - /*unsupported type*/ - r_u->status = WERR_UNKNOWN_LEVEL; - break; + return WERR_UNKNOWN_LEVEL; } - return r_u->status; + return WERR_OK; } -- cgit From 6d5757395a0e54245543794d0d6d6d6a32cd857a Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Sat, 5 Nov 2005 04:21:55 +0000 Subject: r11511: A classic "friday night check-in" :-). This moves much of the Samba4 timezone handling code back into Samba3. Gets rid of "kludge-gmt" and removes the effectiveness of the parameter "time offset" (I can add this back in very easily if needed) - it's no longer being looked at. I'm hoping this will fix the problems people have been having with DST transitions. I'll start comprehensive testing tomorrow, but for now all modifications are done. Splits time get/set functions into srv_XXX and cli_XXX as they need to look at different timezone offsets. Get rid of much of the "efficiency" cruft that was added to Samba back in the day when the C library timezone handling functions were slow. Jeremy. (This used to be commit 414303bc0272f207046b471a0364fa296b67c1f8) --- source3/rpc_server/srv_srvsvc_nt.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 1022cb960d..a7162c929d 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1,5 +1,5 @@ -/* - * Unix SMB/CIFS implementation. + /* + * Unix SMB/CIFS implementation. * RPC Pipe client / server routines * Copyright (C) Andrew Tridgell 1992-1997, * Copyright (C) Jeremy Allison 2001. @@ -1947,7 +1947,7 @@ WERROR _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET t->tm_min, t->tm_sec, 0, - TimeDiff(unixdate)/60, + get_time_zone(unixdate)/60, 10000, t->tm_mday, t->tm_mon + 1, -- cgit From add7cff52095b53646cf6907a557b4d1f17cb050 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Sun, 27 Nov 2005 21:51:46 +0000 Subject: r11936: Fix bug in returning remote time found by Thomas Bork . get_time_zone() was overwriting static buffer returned by gmtime(). Lars - this is a mandatory fix for the next patch... Jeremy. (This used to be commit 68d03a7a74738ce62e7531127aa4533147217e6d) --- source3/rpc_server/srv_srvsvc_nt.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index a7162c929d..0e7ded39f5 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1924,6 +1924,9 @@ WERROR _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET TIME_OF_DAY_INFO *tod; struct tm *t; time_t unixdate = time(NULL); + /* We do this call first as if we do it *after* the gmtime call + it overwrites the pointed-to values. JRA */ + uint32 zone = get_time_zone(unixdate)/60; tod = TALLOC_P(p->mem_ctx, TIME_OF_DAY_INFO); if (!tod) @@ -1947,7 +1950,7 @@ WERROR _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET t->tm_min, t->tm_sec, 0, - get_time_zone(unixdate)/60, + zone, 10000, t->tm_mday, t->tm_mon + 1, -- cgit From 2c0114d2116488de195ca99a0f1d46d79a7bdbd6 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Sun, 11 Dec 2005 05:06:35 +0000 Subject: r12177: last of outstanding patches in my queue to deal with MMC. Validate the share name and fail when trying to creating a share with bad characters. (This used to be commit 174fe494f9cbec3386ed687007e137fa7064373d) --- source3/rpc_server/srv_srvsvc_nt.c | 46 +++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 0e7ded39f5..1d574d82fb 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -29,6 +29,26 @@ extern struct generic_mapping file_generic_mapping; #undef DBGC_CLASS #define DBGC_CLASS DBGC_RPC_SRV +#define INVALID_SHARENAME_CHARS "<>*?|" + +/******************************************************************** + Check a string for any occurrences of a specified list of invalid + characters. +********************************************************************/ + +static BOOL validate_net_name( const char *name, const char *invalid_chars, int max_len ) +{ + int i; + + for ( i=0; istatus; } +/******************************************************************** +********************************************************************/ + WERROR _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV_R_NET_NAME_VALIDATE *r_u) { - fstring share_name; + fstring sharename; switch ( q_u->type ) { case 0x9: - /* check if share name is ok. - TODO: check for invalid characters in name? */ - - unistr2_to_ascii(share_name, &q_u->uni_name, sizeof(share_name)); + /* Run the name through alpha_strcpy() to remove any unsafe + shell characters. Compare the copied string with the original + and fail if the strings don't match */ + + unistr2_to_ascii(sharename, &q_u->uni_name, sizeof(sharename)); + if ( !validate_net_name( sharename, INVALID_SHARENAME_CHARS, sizeof(sharename) ) ) { + DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", sharename)); + return WERR_INVALID_NAME; + } break; + default: return WERR_UNKNOWN_LEVEL; } -- cgit From 728e527d2c73b1db69f03bcf6015af6843315408 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Wed, 14 Dec 2005 01:09:46 +0000 Subject: r12224: adding more characters to the invalid share name string (This used to be commit e461143639889da78cd4de47df40ac59a5a758a4) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 1d574d82fb..090aa4c9ff 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -29,7 +29,7 @@ extern struct generic_mapping file_generic_mapping; #undef DBGC_CLASS #define DBGC_CLASS DBGC_RPC_SRV -#define INVALID_SHARENAME_CHARS "<>*?|" +#define INVALID_SHARENAME_CHARS "<>*?|/\\+=;:\"," /******************************************************************** Check a string for any occurrences of a specified list of invalid -- cgit From 005c88054f526d9a14d748b665cd6b4853e60a35 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Fri, 13 Jan 2006 21:22:25 +0000 Subject: r12916: use rpcstr_pull() instead of unistr_to_ascii() when validating share names (This used to be commit c08bc30698eac2f3f5dd8257b4fd7c3e23e6de39) --- source3/rpc_server/srv_srvsvc_nt.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 090aa4c9ff..230f062662 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1,5 +1,5 @@ - /* - * Unix SMB/CIFS implementation. +/* + * Unix SMB/CIFS implementation. * RPC Pipe client / server routines * Copyright (C) Andrew Tridgell 1992-1997, * Copyright (C) Jeremy Allison 2001. @@ -2312,11 +2312,7 @@ WERROR _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV switch ( q_u->type ) { case 0x9: - /* Run the name through alpha_strcpy() to remove any unsafe - shell characters. Compare the copied string with the original - and fail if the strings don't match */ - - unistr2_to_ascii(sharename, &q_u->uni_name, sizeof(sharename)); + rpcstr_pull(sharename, q_u->uni_name.buffer, sizeof(sharename), q_u->uni_name.uni_str_len*2, 0); if ( !validate_net_name( sharename, INVALID_SHARENAME_CHARS, sizeof(sharename) ) ) { DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", sharename)); return WERR_INVALID_NAME; -- cgit From e95e6044b06fa225b016f20ab53ee4082a8f5ae0 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Mon, 23 Jan 2006 14:02:17 +0000 Subject: r13081: correct fix for the segv in nmbd caused by a double free on namerec. (This used to be commit c908dbc4b260bac72cbc6d25f4728359a6ec8259) --- source3/rpc_server/srv_srvsvc_nt.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 230f062662..b0e8111f62 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2,8 +2,8 @@ * Unix SMB/CIFS implementation. * RPC Pipe client / server routines * Copyright (C) Andrew Tridgell 1992-1997, - * Copyright (C) Jeremy Allison 2001. - * Copyright (C) Nigel Williams 2001. + * Copyright (C) Jeremy Allison 2001. + * Copyright (C) Nigel Williams 2001. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -1539,6 +1539,7 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S SEC_DESC *psd = NULL; SE_PRIV se_diskop = SE_DISK_OPERATOR; BOOL is_disk_op = False; + int max_connections = 0; DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); @@ -1583,6 +1584,7 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(comment)); unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(pathname)); type = q_u->info.share.info2.info_2.type; + max_connections = (q_u->info.share.info2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.max_uses; psd = NULL; break; #if 0 @@ -1658,8 +1660,8 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S return WERR_ACCESS_DENIED; } - slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\"", - lp_change_share_cmd(), dyn_CONFIGFILE, share_name, path, comment); + slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d", + lp_change_share_cmd(), dyn_CONFIGFILE, share_name, path, comment, max_connections ); DEBUG(10,("_srv_net_share_set_info: Running [%s]\n", command )); @@ -1951,16 +1953,17 @@ WERROR _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET TIME_OF_DAY_INFO *tod; struct tm *t; time_t unixdate = time(NULL); + /* We do this call first as if we do it *after* the gmtime call it overwrites the pointed-to values. JRA */ + uint32 zone = get_time_zone(unixdate)/60; - tod = TALLOC_P(p->mem_ctx, TIME_OF_DAY_INFO); - if (!tod) + DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__)); + + if ( !(tod = TALLOC_ZERO_P(p->mem_ctx, TIME_OF_DAY_INFO)) ) return WERR_NOMEM; - ZERO_STRUCTP(tod); - r_u->tod = tod; r_u->ptr_srv_tod = 0x1; r_u->status = WERR_OK; -- cgit From 0773e797610f01729b434335614bf267618b8aac Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Mon, 23 Jan 2006 14:04:40 +0000 Subject: r13082: revert an accidentally commited patch (still in progress) (This used to be commit e43775fb3156bf29e4e412f01ad2d731aa866323) --- source3/rpc_server/srv_srvsvc_nt.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index b0e8111f62..230f062662 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2,8 +2,8 @@ * Unix SMB/CIFS implementation. * RPC Pipe client / server routines * Copyright (C) Andrew Tridgell 1992-1997, - * Copyright (C) Jeremy Allison 2001. - * Copyright (C) Nigel Williams 2001. + * Copyright (C) Jeremy Allison 2001. + * Copyright (C) Nigel Williams 2001. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -1539,7 +1539,6 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S SEC_DESC *psd = NULL; SE_PRIV se_diskop = SE_DISK_OPERATOR; BOOL is_disk_op = False; - int max_connections = 0; DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); @@ -1584,7 +1583,6 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(comment)); unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(pathname)); type = q_u->info.share.info2.info_2.type; - max_connections = (q_u->info.share.info2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.max_uses; psd = NULL; break; #if 0 @@ -1660,8 +1658,8 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S return WERR_ACCESS_DENIED; } - slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d", - lp_change_share_cmd(), dyn_CONFIGFILE, share_name, path, comment, max_connections ); + slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\"", + lp_change_share_cmd(), dyn_CONFIGFILE, share_name, path, comment); DEBUG(10,("_srv_net_share_set_info: Running [%s]\n", command )); @@ -1953,17 +1951,16 @@ WERROR _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET TIME_OF_DAY_INFO *tod; struct tm *t; time_t unixdate = time(NULL); - /* We do this call first as if we do it *after* the gmtime call it overwrites the pointed-to values. JRA */ - uint32 zone = get_time_zone(unixdate)/60; - DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__)); - - if ( !(tod = TALLOC_ZERO_P(p->mem_ctx, TIME_OF_DAY_INFO)) ) + tod = TALLOC_P(p->mem_ctx, TIME_OF_DAY_INFO); + if (!tod) return WERR_NOMEM; + ZERO_STRUCTP(tod); + r_u->tod = tod; r_u->ptr_srv_tod = 0x1; r_u->status = WERR_OK; -- cgit From 9ededd3151a259a37b17a0082e82ee6864c57045 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Mon, 23 Jan 2006 14:34:26 +0000 Subject: r13085: hook the max connections spin box in the share properties MMC plugin dialog to the 'max connections' smb.conf parameter. Also added the max uses int from the SHARE_INFO_2 structure to the 'modify share command' (This used to be commit af68748baae6d2e5ef850c16622d5424fd303ee7) --- source3/rpc_server/srv_srvsvc_nt.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 230f062662..b3af4b7168 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2,8 +2,8 @@ * Unix SMB/CIFS implementation. * RPC Pipe client / server routines * Copyright (C) Andrew Tridgell 1992-1997, - * Copyright (C) Jeremy Allison 2001. - * Copyright (C) Nigel Williams 2001. + * Copyright (C) Jeremy Allison 2001. + * Copyright (C) Nigel Williams 2001. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -109,6 +109,8 @@ static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2, int sn pstring remark; pstring path; pstring passwd; + int max_connections = lp_max_connections(snum); + uint32 max_uses = max_connections!=0 ? max_connections : 0xffffffff; char *net_name = lp_servicename(snum); pstrcpy(remark, lp_comment(snum)); @@ -125,7 +127,7 @@ static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2, int sn pstrcpy(passwd, ""); - init_srv_share_info2(&sh2->info_2, net_name, get_share_type(snum), remark, 0, 0xffffffff, 1, path, passwd); + init_srv_share_info2(&sh2->info_2, net_name, get_share_type(snum), remark, 0, max_uses, 1, path, passwd); init_srv_share_info2_str(&sh2->info_2_str, net_name, remark, path, passwd); } @@ -1539,6 +1541,7 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S SEC_DESC *psd = NULL; SE_PRIV se_diskop = SE_DISK_OPERATOR; BOOL is_disk_op = False; + int max_connections = 0; DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); @@ -1583,6 +1586,7 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(comment)); unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(pathname)); type = q_u->info.share.info2.info_2.type; + max_connections = (q_u->info.share.info2.info_2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.info_2.max_uses; psd = NULL; break; #if 0 @@ -1651,15 +1655,16 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S /* Only call modify function if something changed. */ - if (strcmp(path, lp_pathname(snum)) || strcmp(comment, lp_comment(snum)) ) + if (strcmp(path, lp_pathname(snum)) || strcmp(comment, lp_comment(snum)) + || (lp_max_connections(snum) != max_connections) ) { if (!lp_change_share_cmd() || !*lp_change_share_cmd()) { DEBUG(10,("_srv_net_share_set_info: No change share command\n")); return WERR_ACCESS_DENIED; } - slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\"", - lp_change_share_cmd(), dyn_CONFIGFILE, share_name, path, comment); + slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d", + lp_change_share_cmd(), dyn_CONFIGFILE, share_name, path, comment, max_connections ); DEBUG(10,("_srv_net_share_set_info: Running [%s]\n", command )); @@ -1951,16 +1956,17 @@ WERROR _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET TIME_OF_DAY_INFO *tod; struct tm *t; time_t unixdate = time(NULL); + /* We do this call first as if we do it *after* the gmtime call it overwrites the pointed-to values. JRA */ + uint32 zone = get_time_zone(unixdate)/60; - tod = TALLOC_P(p->mem_ctx, TIME_OF_DAY_INFO); - if (!tod) + DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__)); + + if ( !(tod = TALLOC_ZERO_P(p->mem_ctx, TIME_OF_DAY_INFO)) ) return WERR_NOMEM; - ZERO_STRUCTP(tod); - r_u->tod = tod; r_u->ptr_srv_tod = 0x1; r_u->status = WERR_OK; -- cgit From e5d1583c5977964366e450f4e9379399c5720217 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Mon, 23 Jan 2006 14:47:55 +0000 Subject: r13086: hooking max connections into 'add share' as well (although the WinXP UI doesn't give you a way to set the value on add (This used to be commit e6afdf1df568921c82ce85fdce9456674c3a9a75) --- source3/rpc_server/srv_srvsvc_nt.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index b3af4b7168..65e0504e67 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1711,7 +1711,8 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S } /******************************************************************* - Net share add. Call 'add_share_command "sharename" "pathname" "comment" "read only = xxx"' + Net share add. Call 'add_share_command "sharename" "pathname" + "comment" "max connections = " ********************************************************************/ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_SHARE_ADD *r_u) @@ -1728,6 +1729,7 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S SEC_DESC *psd = NULL; SE_PRIV se_diskop = SE_DISK_OPERATOR; BOOL is_disk_op; + int max_connections = 0; DEBUG(5,("_srv_net_share_add: %d\n", __LINE__)); @@ -1756,6 +1758,7 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S 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)); unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(share_name)); + max_connections = (q_u->info.share.info2.info_2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.info_2.max_uses; type = q_u->info.share.info2.info_2.type; break; case 501: @@ -1792,9 +1795,8 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S return WERR_INVALID_NAME; } - if ( strequal(share_name,"IPC$") - || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) - || strequal(share_name,"global") ) + if ( strequal(share_name,"IPC$") || strequal(share_name,"global") + || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) ) { return WERR_ACCESS_DENIED; } @@ -1818,8 +1820,13 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S string_replace(path, '"', ' '); string_replace(comment, '"', ' '); - slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\"", - lp_add_share_cmd(), dyn_CONFIGFILE, share_name, path, comment); + slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d", + lp_add_share_cmd(), + dyn_CONFIGFILE, + share_name, + path, + comment, + max_connections); DEBUG(10,("_srv_net_share_add: Running [%s]\n", command )); -- cgit From d14af63e6ab600eb3ac705f2f425c860e927553a Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 2 Feb 2006 20:44:50 +0000 Subject: r13293: Rather a big patch I'm afraid, but this should fix bug #3347 by saving the UNIX token used to set a delete on close flag, and using it when doing the delete. libsmbsharemodes.so still needs updating to cope with this change. Samba4 torture tests to follow. Jeremy. (This used to be commit 23f16cbc2e8cde97c486831e26bcafd4ab4a9654) --- source3/rpc_server/srv_srvsvc_nt.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 65e0504e67..8150a8bf69 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1401,7 +1401,7 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES /* fail out now if you are not root or not a domain admin */ - if ((user.uid != sec_initial_uid()) && + if ((user.ut.uid != sec_initial_uid()) && ( ! nt_token_check_domain_rid(p->pipe_user.nt_user_token, DOMAIN_GROUP_RID_ADMINS))) { goto done; @@ -1412,7 +1412,7 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES if ((strequal(session_list[snum].username, username) || username[0] == '\0' ) && strequal(session_list[snum].remote_machine, machine)) { - if (user.uid != sec_initial_uid()) { + if (user.ut.uid != sec_initial_uid()) { not_root = True; become_root(); } @@ -1572,7 +1572,7 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S /* fail out now if you are not root and not a disk op */ - if ( user.uid != sec_initial_uid() && !is_disk_op ) + if ( user.ut.uid != sec_initial_uid() && !is_disk_op ) return WERR_ACCESS_DENIED; switch (q_u->info_level) { @@ -1739,7 +1739,7 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); - if (user.uid != sec_initial_uid() && !is_disk_op ) + if (user.ut.uid != sec_initial_uid() && !is_disk_op ) return WERR_ACCESS_DENIED; if (!lp_add_share_cmd() || !*lp_add_share_cmd()) { @@ -1906,7 +1906,7 @@ WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); - if (user.uid != sec_initial_uid() && !is_disk_op ) + if (user.ut.uid != sec_initial_uid() && !is_disk_op ) return WERR_ACCESS_DENIED; if (!lp_delete_share_cmd() || !*lp_delete_share_cmd()) { @@ -2098,7 +2098,7 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC psd->dacl->revision = (uint16) NT4_ACL_REVISION; - close_file(fsp, True); + close_file(fsp, NORMAL_CLOSE); unbecome_user(); close_cnum(conn, user.vuid); return r_u->status; @@ -2106,7 +2106,7 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC error_exit: if(fsp) { - close_file(fsp, True); + close_file(fsp, NORMAL_CLOSE); } if (became_user) @@ -2207,7 +2207,7 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ goto error_exit; } - close_file(fsp, True); + close_file(fsp, NORMAL_CLOSE); unbecome_user(); close_cnum(conn, user.vuid); return r_u->status; @@ -2215,7 +2215,7 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ error_exit: if(fsp) { - close_file(fsp, True); + close_file(fsp, NORMAL_CLOSE); } if (became_user) { -- cgit From 0af1500fc0bafe61019f1b2ab1d9e1d369221240 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Fri, 3 Feb 2006 22:19:41 +0000 Subject: r13316: Let the carnage begin.... Sync with trunk as off r13315 (This used to be commit 17e63ac4ed8325c0d44fe62b2442449f3298559f) --- source3/rpc_server/srv_srvsvc_nt.c | 208 ++----------------------------------- 1 file changed, 7 insertions(+), 201 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 8150a8bf69..f279c98c31 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -29,26 +29,6 @@ extern struct generic_mapping file_generic_mapping; #undef DBGC_CLASS #define DBGC_CLASS DBGC_RPC_SRV -#define INVALID_SHARENAME_CHARS "<>*?|/\\+=;:\"," - -/******************************************************************** - Check a string for any occurrences of a specified list of invalid - characters. -********************************************************************/ - -static BOOL validate_net_name( const char *name, const char *invalid_chars, int max_len ) -{ - int i; - - for ( i=0; iinfo_2_str, net_name, remark, path, passwd); } -/******************************************************************* - What to do when smb.conf is updated. - ********************************************************************/ - -static void smb_conf_updated(int msg_type, struct process_id src, - void *buf, size_t len) -{ - DEBUG(10,("smb_conf_updated: Got message saying smb.conf was updated. Reloading.\n")); - reload_services(False); -} - -/******************************************************************* - Create the share security tdb. - ********************************************************************/ - -static TDB_CONTEXT *share_tdb; /* used for share security descriptors */ -#define SHARE_DATABASE_VERSION_V1 1 -#define SHARE_DATABASE_VERSION_V2 2 /* version id in little endian. */ - -BOOL share_info_db_init(void) -{ - static pid_t local_pid; - const char *vstring = "INFO/version"; - int32 vers_id; - - if (share_tdb && local_pid == sys_getpid()) - return True; - 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) )); - return False; - } - - local_pid = sys_getpid(); - - /* handle a Samba upgrade */ - tdb_lock_bystring(share_tdb, vstring, 0); - - /* Cope with byte-reversed older versions of the db. */ - vers_id = tdb_fetch_int32(share_tdb, vstring); - if ((vers_id == SHARE_DATABASE_VERSION_V1) || (IREV(vers_id) == SHARE_DATABASE_VERSION_V1)) { - /* Written on a bigendian machine with old fetch_int code. Save as le. */ - tdb_store_int32(share_tdb, vstring, SHARE_DATABASE_VERSION_V2); - vers_id = SHARE_DATABASE_VERSION_V2; - } - - if (vers_id != SHARE_DATABASE_VERSION_V2) { - tdb_traverse(share_tdb, tdb_traverse_delete_fn, NULL); - tdb_store_int32(share_tdb, vstring, SHARE_DATABASE_VERSION_V2); - } - tdb_unlock_bystring(share_tdb, vstring); - - message_register(MSG_SMB_CONF_UPDATED, smb_conf_updated); - - return True; -} - -/******************************************************************* - Fake up a Everyone, full access as a default. - ********************************************************************/ - -static SEC_DESC *get_share_security_default( TALLOC_CTX *ctx, int snum, size_t *psize) -{ - SEC_ACCESS sa; - SEC_ACE ace; - SEC_ACL *psa = NULL; - SEC_DESC *psd = NULL; - uint32 def_access = GENERIC_ALL_ACCESS; - - se_map_generic(&def_access, &file_generic_mapping); - - init_sec_access(&sa, GENERIC_ALL_ACCESS | def_access ); - init_sec_ace(&ace, &global_sid_World, SEC_ACE_TYPE_ACCESS_ALLOWED, sa, 0); - - if ((psa = make_sec_acl(ctx, NT4_ACL_REVISION, 1, &ace)) != NULL) { - psd = make_sec_desc(ctx, SEC_DESC_REVISION, SEC_DESC_SELF_RELATIVE, NULL, NULL, NULL, psa, psize); - } - - if (!psd) { - DEBUG(0,("get_share_security: Failed to make SEC_DESC.\n")); - return NULL; - } - - return psd; -} - -/******************************************************************* - Pull a security descriptor from the share tdb. - ********************************************************************/ - -static SEC_DESC *get_share_security( TALLOC_CTX *ctx, int snum, size_t *psize) -{ - prs_struct ps; - fstring key; - SEC_DESC *psd = NULL; - - *psize = 0; - - /* Fetch security descriptor from tdb */ - - slprintf(key, sizeof(key)-1, "SECDESC/%s", lp_servicename(snum)); - - if (tdb_prs_fetch(share_tdb, key, &ps, ctx)!=0 || - !sec_io_desc("get_share_security", &psd, &ps, 1)) { - - DEBUG(4,("get_share_security: using default secdesc for %s\n", lp_servicename(snum) )); - - return get_share_security_default(ctx, snum, psize); - } - - if (psd) - *psize = sec_desc_size(psd); - - prs_mem_free(&ps); - return psd; -} - -/******************************************************************* - Store a security descriptor in the share db. - ********************************************************************/ - -static BOOL set_share_security(TALLOC_CTX *ctx, const char *share_name, SEC_DESC *psd) -{ - prs_struct ps; - TALLOC_CTX *mem_ctx = NULL; - fstring key; - BOOL ret = False; - - mem_ctx = talloc_init("set_share_security"); - if (mem_ctx == NULL) - return False; - - prs_init(&ps, (uint32)sec_desc_size(psd), mem_ctx, MARSHALL); - - if (!sec_io_desc("share_security", &psd, &ps, 1)) - goto out; - - slprintf(key, sizeof(key)-1, "SECDESC/%s", share_name); - - if (tdb_prs_store(share_tdb, key, &ps)==0) { - ret = True; - DEBUG(5,("set_share_security: stored secdesc for %s\n", share_name )); - } else { - DEBUG(1,("set_share_security: Failed to store secdesc for %s\n", share_name )); - } - - /* Free malloc'ed memory */ - -out: - - prs_mem_free(&ps); - if (mem_ctx) - talloc_destroy(mem_ctx); - return ret; -} - -/******************************************************************* - Delete a security descriptor. -********************************************************************/ - -static BOOL delete_share_security(int snum) -{ - TDB_DATA kbuf; - fstring key; - - slprintf(key, sizeof(key)-1, "SECDESC/%s", lp_servicename(snum)); - kbuf.dptr = key; - kbuf.dsize = strlen(key)+1; - - if (tdb_delete(share_tdb, kbuf) != 0) { - DEBUG(0,("delete_share_security: Failed to delete entry for share %s\n", - lp_servicename(snum) )); - return False; - } - - return True; -} - /******************************************************************* Map any generic bits to file specific bits. ********************************************************************/ -void map_generic_share_sd_bits(SEC_DESC *psd) +static void map_generic_share_sd_bits(SEC_DESC *psd) { int i; SEC_ACL *ps_dacl = NULL; @@ -517,7 +318,7 @@ 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 num_services = 0; int snum; TALLOC_CTX *ctx = p->mem_ctx; @@ -528,6 +329,11 @@ static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, ctr->info_level = ctr->switch_value = info_level; *resume_hnd = 0; + /* Ensure all the usershares are loaded. */ + become_root(); + num_services = load_usershare_shares(); + unbecome_root(); + /* Count the number of entries. */ for (snum = 0; snum < num_services; snum++) { if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) -- cgit From eb41bfb91ba754458bfb9bd68bf38992995c0d01 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Fri, 16 Jun 2006 21:10:19 +0000 Subject: r16301: Fix a memleak (This used to be commit 21aaede518503e6722ba5ccfdb2c77007d12ddee) --- source3/rpc_server/srv_srvsvc_nt.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index f279c98c31..a936ef5870 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -746,6 +746,8 @@ static void init_srv_sess_info_1(SRV_SESS_INFO_1 *ss1, uint32 *snum, uint32 *sto (*stot) = 0; } + + SAFE_FREE(session_list); } /******************************************************************* -- cgit From fbdcf2663b56007a438ac4f0d8d82436b1bfe688 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 11 Jul 2006 18:01:26 +0000 Subject: r16945: Sync trunk -> 3.0 for 3.0.24 code. Still need to do the upper layer directories but this is what everyone is waiting for.... Jeremy. (This used to be commit 9dafb7f48ca3e7af956b0a7d1720c2546fc4cfb8) --- source3/rpc_server/srv_srvsvc_nt.c | 520 +++++++++++++++++++++++++------------ 1 file changed, 349 insertions(+), 171 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index a936ef5870..12a86ce9f3 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -4,6 +4,7 @@ * Copyright (C) Andrew Tridgell 1992-1997, * Copyright (C) Jeremy Allison 2001. * Copyright (C) Nigel Williams 2001. + * Copyright (C) Gerald (Jerry) Carter 2006. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,10 +26,179 @@ #include "includes.h" extern struct generic_mapping file_generic_mapping; +extern userdom_struct current_user_info; #undef DBGC_CLASS #define DBGC_CLASS DBGC_RPC_SRV +/* Use for enumerating connections, pipes, & files */ + +struct file_enum_count { + TALLOC_CTX *ctx; + int count; + FILE_INFO_3 *info; +}; + +struct sess_file_count { + pid_t pid; + uid_t uid; + int count; +}; + +/**************************************************************************** + Count the entries belonging to a service in the connection db. +****************************************************************************/ + +static int pipe_enum_fn( TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *p) +{ + struct pipe_open_rec prec; + struct file_enum_count *fenum = (struct file_enum_count *)p; + + if (dbuf.dsize != sizeof(struct pipe_open_rec)) + return 0; + + memcpy(&prec, dbuf.dptr, sizeof(struct pipe_open_rec)); + + if ( process_exists(prec.pid) ) { + FILE_INFO_3 *f; + int i = fenum->count; + pstring fullpath; + + snprintf( fullpath, sizeof(fullpath), "\\PIPE\\%s", prec.name ); + + f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 ); + if ( !f ) { + DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1)); + return 1; + } + fenum->info = f; + + + init_srv_file_info3( &fenum->info[i], + (uint32)((procid_to_pid(&prec.pid)<<16) & prec.pnum), + (FILE_READ_DATA|FILE_WRITE_DATA), + 0, + uidtoname( prec.uid ), + fullpath ); + + fenum->count++; + } + + return 0; +} + +/******************************************************************* +********************************************************************/ + +static WERROR net_enum_pipes( TALLOC_CTX *ctx, FILE_INFO_3 **info, + uint32 *count, uint32 resume ) +{ + struct file_enum_count fenum; + TDB_CONTEXT *conn_tdb = conn_tdb_ctx(); + + if ( !conn_tdb ) { + DEBUG(0,("net_enum_pipes: Failed to retrieve the connections tdb handle!\n")); + return WERR_ACCESS_DENIED; + } + + fenum.ctx = ctx; + fenum.count = *count; + fenum.info = *info; + + if (tdb_traverse(conn_tdb, pipe_enum_fn, &fenum) == -1) { + DEBUG(0,("net_enum_pipes: traverse of connections.tdb failed with error %s.\n", + tdb_errorstr(conn_tdb) )); + return WERR_NOMEM; + } + + *info = fenum.info; + *count = fenum.count; + + return WERR_OK;} + +/******************************************************************* +********************************************************************/ + +/* global needed to make use of the share_mode_forall() callback */ +static struct file_enum_count f_enum_cnt; + +static void enum_file_fn( const struct share_mode_entry *e, + const char *sharepath, const char *fname ) +{ + struct file_enum_count *fenum = &f_enum_cnt; + + /* If the pid was not found delete the entry from connections.tdb */ + + if ( process_exists(e->pid) ) { + FILE_INFO_3 *f; + int i = fenum->count; + files_struct fsp; + struct byte_range_lock *brl; + int num_locks = 0; + pstring fullpath; + uint32 permissions; + + f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 ); + if ( !f ) { + DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1)); + return; + } + fenum->info = f; + + /* need to count the number of locks on a file */ + + ZERO_STRUCT( fsp ); + fsp.dev = e->dev; + fsp.inode = e->inode; + + if ( (brl = brl_get_locks(NULL,&fsp)) != NULL ) { + num_locks = brl->num_locks; + TALLOC_FREE( brl ); + } + + if ( strcmp( fname, "." ) == 0 ) { + pstr_sprintf( fullpath, "C:%s", sharepath ); + } else { + pstr_sprintf( fullpath, "C:%s/%s", sharepath, fname ); + } + string_replace( fullpath, '/', '\\' ); + + /* mask out create (what ever that is) */ + permissions = e->share_access & (FILE_READ_DATA|FILE_WRITE_DATA); + + /* now fill in the FILE_INFO_3 struct */ + init_srv_file_info3( &fenum->info[i], + e->share_file_id, + permissions, + num_locks, + uidtoname(e->uid), + fullpath ); + + fenum->count++; + } + + return; + +} + +/******************************************************************* +********************************************************************/ + +static WERROR net_enum_files( TALLOC_CTX *ctx, FILE_INFO_3 **info, + uint32 *count, uint32 resume ) +{ + f_enum_cnt.ctx = ctx; + f_enum_cnt.count = *count; + f_enum_cnt.info = *info; + + share_mode_forall( enum_file_fn ); + + *info = f_enum_cnt.info; + *count = f_enum_cnt.count; + + return WERR_OK; +} + /******************************************************************* Utility function to get the 'type' of a share from an snum. ********************************************************************/ @@ -70,11 +240,16 @@ static void init_srv_share_info_0(pipes_struct *p, SRV_SHARE_INFO_0 *sh0, int sn static void init_srv_share_info_1(pipes_struct *p, SRV_SHARE_INFO_1 *sh1, int snum) { + connection_struct *conn = p->conn; pstring remark; char *net_name = lp_servicename(snum); pstrcpy(remark, lp_comment(snum)); - standard_sub_conn(p->conn, remark,sizeof(remark)); + standard_sub_advanced(lp_servicename(SNUM(conn)), conn->user, + conn->connectpath, conn->gid, + get_current_username(), + current_user_info.domain, + remark, sizeof(remark)); init_srv_share_info1(&sh1->info_1, net_name, get_share_type(snum), remark); init_srv_share_info1_str(&sh1->info_1_str, net_name, remark); @@ -86,15 +261,21 @@ static void init_srv_share_info_1(pipes_struct *p, SRV_SHARE_INFO_1 *sh1, int sn static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2, int snum) { + connection_struct *conn = p->conn; pstring remark; pstring path; pstring passwd; int max_connections = lp_max_connections(snum); uint32 max_uses = max_connections!=0 ? max_connections : 0xffffffff; - + int count = 0; char *net_name = lp_servicename(snum); + pstrcpy(remark, lp_comment(snum)); - standard_sub_conn(p->conn, remark,sizeof(remark)); + standard_sub_advanced(lp_servicename(SNUM(conn)), conn->user, + conn->connectpath, conn->gid, + get_current_username(), + current_user_info.domain, + remark, sizeof(remark)); pstrcpy(path, "C:"); pstrcat(path, lp_pathname(snum)); @@ -107,7 +288,10 @@ static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2, int sn pstrcpy(passwd, ""); - init_srv_share_info2(&sh2->info_2, net_name, get_share_type(snum), remark, 0, max_uses, 1, path, passwd); + count = count_current_connections( net_name, False ); + init_srv_share_info2(&sh2->info_2, net_name, get_share_type(snum), + remark, 0, max_uses, count, path, passwd); + init_srv_share_info2_str(&sh2->info_2_str, net_name, remark, path, passwd); } @@ -179,11 +363,16 @@ out: static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501, int snum) { + connection_struct *conn = p->conn; pstring remark; const char *net_name = lp_servicename(snum); pstrcpy(remark, lp_comment(snum)); - standard_sub_conn(p->conn, remark, sizeof(remark)); + standard_sub_advanced(lp_servicename(SNUM(conn)), conn->user, + conn->connectpath, conn->gid, + get_current_username(), + current_user_info.domain, + remark, sizeof(remark)); init_srv_share_info501(&sh501->info_501, net_name, get_share_type(snum), remark, (lp_csc_policy(snum) << 4)); init_srv_share_info501_str(&sh501->info_501_str, net_name, remark); @@ -195,6 +384,7 @@ static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501, static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, int snum) { + connection_struct *conn = p->conn; pstring net_name; pstring remark; pstring path; @@ -208,7 +398,11 @@ static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, pstrcpy(net_name, lp_servicename(snum)); pstrcpy(remark, lp_comment(snum)); - standard_sub_conn(p->conn, remark,sizeof(remark)); + standard_sub_advanced(lp_servicename(SNUM(conn)), conn->user, + conn->connectpath, conn->gid, + get_current_username(), + current_user_info.domain, + remark, sizeof(remark)); pstrcpy(path, "C:"); pstrcat(path, lp_pathname(snum)); @@ -233,10 +427,15 @@ static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, static void init_srv_share_info_1004(pipes_struct *p, SRV_SHARE_INFO_1004* sh1004, int snum) { + connection_struct *conn = p->conn; pstring remark; pstrcpy(remark, lp_comment(snum)); - standard_sub_conn(p->conn, remark, sizeof(remark)); + standard_sub_advanced(lp_servicename(SNUM(conn)), conn->user, + conn->connectpath, conn->gid, + get_current_username(), + current_user_info.domain, + remark, sizeof(remark)); ZERO_STRUCTP(sh1004); @@ -632,16 +831,6 @@ static void init_srv_r_net_share_get_info(pipes_struct *p, SRV_R_NET_SHARE_GET_I r_n->status = status; } -/******************************************************************* - fill in a sess info level 1 structure. - ********************************************************************/ - -static void init_srv_sess_0_info(SESS_INFO_0 *se0, SESS_INFO_0_STR *str0, char *name) -{ - init_srv_sess_info0(se0, name); - init_srv_sess_info0_str(str0, name); -} - /******************************************************************* fill in a sess info level 0 structure. ********************************************************************/ @@ -662,11 +851,7 @@ static void init_srv_sess_info_0(SRV_SESS_INFO_0 *ss0, uint32 *snum, uint32 *sto if (snum) { for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) { - init_srv_sess_0_info(&ss0->info_0[num_entries], - &ss0->info_0_str[num_entries], session_list[(*snum)].remote_machine); - - /* move on to creating next session */ - /* move on to creating next sess */ + init_srv_sess_info0( &ss0->info_0[num_entries], session_list[(*snum)].remote_machine); num_entries++; } @@ -687,17 +872,35 @@ static void init_srv_sess_info_0(SRV_SESS_INFO_0 *ss0, uint32 *snum, uint32 *sto } /******************************************************************* - fill in a sess info level 1 structure. - ********************************************************************/ +********************************************************************/ -static void init_srv_sess_1_info(SESS_INFO_1 *se1, SESS_INFO_1_STR *str1, - char *name, char *user, - uint32 num_opens, - uint32 open_time, uint32 idle_time, - uint32 usr_flgs) +/* global needed to make use of the share_mode_forall() callback */ +static struct sess_file_count s_file_cnt; + +static void sess_file_fn( const struct share_mode_entry *e, + const char *sharepath, const char *fname ) { - init_srv_sess_info1(se1 , name, user, num_opens, open_time, idle_time, usr_flgs); - init_srv_sess_info1_str(str1, name, user); + struct sess_file_count *sess = &s_file_cnt; + + if ( (procid_to_pid(&e->pid) == sess->pid) && (sess->uid == e->uid) ) { + sess->count++; + } + + return; +} + +/******************************************************************* +********************************************************************/ + +static int net_count_files( uid_t uid, pid_t pid ) +{ + s_file_cnt.count = 0; + s_file_cnt.uid = uid; + s_file_cnt.pid = pid; + + share_mode_forall( sess_file_fn ); + + return s_file_cnt.count; } /******************************************************************* @@ -708,43 +911,58 @@ static void init_srv_sess_info_1(SRV_SESS_INFO_1 *ss1, uint32 *snum, uint32 *sto { struct sessionid *session_list; uint32 num_entries = 0; - (*stot) = list_sessions(&session_list); + time_t now = time(NULL); + if ( !snum ) { + ss1->num_entries_read = 0; + ss1->ptr_sess_info = 0; + ss1->num_entries_read2 = 0; + + (*stot) = 0; + + return; + } + if (ss1 == NULL) { (*snum) = 0; - SAFE_FREE(session_list); return; } - DEBUG(5,("init_srv_sess_1_ss1\n")); - - if (snum) { - for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) { - init_srv_sess_1_info(&ss1->info_1[num_entries], - &ss1->info_1_str[num_entries], - session_list[*snum].remote_machine, - session_list[*snum].username, - 1, 10, 5, 0); - - /* move on to creating next session */ - /* move on to creating next sess */ - num_entries++; - } + (*stot) = list_sessions(&session_list); + - ss1->num_entries_read = num_entries; - ss1->ptr_sess_info = num_entries > 0 ? 1 : 0; - ss1->num_entries_read2 = num_entries; - - if ((*snum) >= (*stot)) { - (*snum) = 0; + for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) { + uint32 num_files; + uint32 connect_time; + struct passwd *pw = sys_getpwnam(session_list[*snum].username); + BOOL guest; + + if ( !pw ) { + DEBUG(10,("init_srv_sess_info_1: failed to find owner: %s\n", + session_list[*snum].username)); + continue; } - - } else { - ss1->num_entries_read = 0; - ss1->ptr_sess_info = 0; - ss1->num_entries_read2 = 0; - - (*stot) = 0; + + connect_time = (uint32)(now - session_list[*snum].connect_start); + num_files = net_count_files(pw->pw_uid, session_list[*snum].pid); + guest = strequal( session_list[*snum].username, lp_guestaccount() ); + + init_srv_sess_info1( &ss1->info_1[num_entries], + session_list[*snum].remote_machine, + session_list[*snum].username, + num_files, + connect_time, + 0, + guest); + num_entries++; + } + + ss1->num_entries_read = num_entries; + ss1->ptr_sess_info = num_entries > 0 ? 1 : 0; + ss1->num_entries_read2 = num_entries; + + if ((*snum) >= (*stot)) { + (*snum) = 0; } SAFE_FREE(session_list); @@ -964,66 +1182,53 @@ static void init_srv_r_net_conn_enum(SRV_R_NET_CONN_ENUM *r_n, makes a SRV_R_NET_FILE_ENUM structure. ********************************************************************/ -static WERROR init_srv_file_info_ctr(pipes_struct *p, SRV_FILE_INFO_CTR *ctr, - int switch_value, uint32 *resume_hnd, - uint32 *total_entries) +static WERROR net_file_enum_3( SRV_R_NET_FILE_ENUM *r, uint32 resume_hnd ) { - WERROR status = WERR_OK; - TALLOC_CTX *ctx = p->mem_ctx; - DEBUG(5,("init_srv_file_info_ctr: %d\n", __LINE__)); - *total_entries = 1; /* dummy entries only, for */ + TALLOC_CTX *ctx = get_talloc_ctx(); + SRV_FILE_INFO_CTR *ctr = &r->ctr; - ctr->switch_value = switch_value; - ctr->num_entries = *total_entries - *resume_hnd; + /* TODO -- Windows enumerates + (b) active pipes + (c) open directories and files */ + + r->status = net_enum_files( ctx, &ctr->file.info3, &ctr->num_entries, resume_hnd ); + if ( !W_ERROR_IS_OK(r->status)) + goto done; + + r->status = net_enum_pipes( ctx, &ctr->file.info3, &ctr->num_entries, resume_hnd ); + if ( !W_ERROR_IS_OK(r->status)) + goto done; + + r->level = ctr->level = 3; + r->total_entries = ctr->num_entries; + /* ctr->num_entries = r->total_entries - resume_hnd; */ ctr->num_entries2 = ctr->num_entries; + ctr->ptr_file_info = 1; - switch (switch_value) { - case 3: { - int i; - if (*total_entries > 0) { - ctr->ptr_entries = 1; - ctr->file.info3 = TALLOC_ARRAY(ctx, SRV_FILE_INFO_3, ctr->num_entries); - } - for (i=0 ;inum_entries;i++) { - init_srv_file_info3(&ctr->file.info3[i].info_3, i+*resume_hnd, 0x35, 0, "\\PIPE\\samr", "dummy user"); - init_srv_file_info3_str(&ctr->file.info3[i].info_3_str, "\\PIPE\\samr", "dummy user"); - - } - ctr->ptr_file_info = 1; - *resume_hnd = 0; - break; - } - default: - DEBUG(5,("init_srv_file_info_ctr: unsupported switch value %d\n", switch_value)); - (*resume_hnd = 0); - (*total_entries) = 0; - ctr->ptr_entries = 0; - status = WERR_UNKNOWN_LEVEL; - break; - } + r->status = WERR_OK; - return status; +done: + if ( ctr->num_entries > 0 ) + ctr->ptr_entries = 1; + + init_enum_hnd(&r->enum_hnd, 0); + + return r->status; } /******************************************************************* - makes a SRV_R_NET_FILE_ENUM structure. -********************************************************************/ +*******************************************************************/ -static void init_srv_r_net_file_enum(pipes_struct *p, SRV_R_NET_FILE_ENUM *r_n, - uint32 resume_hnd, int file_level, int switch_value) +WERROR _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_FILE_ENUM *r_u) { - DEBUG(5,("init_srv_r_net_file_enum: %d\n", __LINE__)); - - r_n->file_level = file_level; - if (file_level == 0) - r_n->status = WERR_UNKNOWN_LEVEL; - else - r_n->status = init_srv_file_info_ctr(p, &r_n->ctr, switch_value, &resume_hnd, &(r_n->total_entries)); - - if (!W_ERROR_IS_OK(r_n->status)) - resume_hnd = 0; - - init_enum_hnd(&r_n->enum_hnd, resume_hnd); + switch ( q_u->level ) { + case 3: + return net_file_enum_3( r_u, get_enum_hnd(&q_u->enum_hnd) ); + default: + return WERR_UNKNOWN_LEVEL; + } + + return WERR_OK; } /******************************************************************* @@ -1109,25 +1314,6 @@ WERROR _srv_net_srv_set_info(pipes_struct *p, SRV_Q_NET_SRV_SET_INFO *q_u, SRV_R return r_u->status; } -/******************************************************************* -net file enum -********************************************************************/ - -WERROR _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_FILE_ENUM *r_u) -{ - DEBUG(5,("srv_net_file_enum: %d\n", __LINE__)); - - /* set up the */ - init_srv_r_net_file_enum(p, r_u, - get_enum_hnd(&q_u->enum_hnd), - q_u->file_level, - q_u->ctr.switch_value); - - DEBUG(5,("srv_net_file_enum: %d\n", __LINE__)); - - return r_u->status; -} - /******************************************************************* net conn enum ********************************************************************/ @@ -1185,7 +1371,6 @@ net sess del WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SESS_DEL *r_u) { struct sessionid *session_list; - struct current_user user; int num_sessions, snum; fstring username; fstring machine; @@ -1205,11 +1390,9 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES r_u->status = WERR_ACCESS_DENIED; - get_current_user(&user, p); - /* fail out now if you are not root or not a domain admin */ - if ((user.ut.uid != sec_initial_uid()) && + if ((p->pipe_user.ut.uid != sec_initial_uid()) && ( ! nt_token_check_domain_rid(p->pipe_user.nt_user_token, DOMAIN_GROUP_RID_ADMINS))) { goto done; @@ -1220,7 +1403,7 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES if ((strequal(session_list[snum].username, username) || username[0] == '\0' ) && strequal(session_list[snum].remote_machine, machine)) { - if (user.ut.uid != sec_initial_uid()) { + if (p->pipe_user.ut.uid != sec_initial_uid()) { not_root = True; become_root(); } @@ -1337,7 +1520,6 @@ char *valid_share_pathname(char *dos_pathname) WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, SRV_R_NET_SHARE_SET_INFO *r_u) { - struct current_user user; pstring command; fstring share_name; fstring comment; @@ -1374,13 +1556,11 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S if (lp_print_ok(snum)) return WERR_ACCESS_DENIED; - get_current_user(&user,p); - is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); /* fail out now if you are not root and not a disk op */ - if ( user.ut.uid != sec_initial_uid() && !is_disk_op ) + if ( p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op ) return WERR_ACCESS_DENIED; switch (q_u->info_level) { @@ -1525,7 +1705,6 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_SHARE_ADD *r_u) { - struct current_user user; pstring command; fstring share_name; fstring comment; @@ -1543,11 +1722,9 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S r_u->parm_error = 0; - get_current_user(&user,p); - is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); - if (user.ut.uid != sec_initial_uid() && !is_disk_op ) + if (p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op ) return WERR_ACCESS_DENIED; if (!lp_add_share_cmd() || !*lp_add_share_cmd()) { @@ -1682,7 +1859,6 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u) { - struct current_user user; pstring command; fstring share_name; int ret; @@ -1710,11 +1886,9 @@ WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S if (lp_print_ok(snum)) return WERR_ACCESS_DENIED; - get_current_user(&user,p); - is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); - if (user.ut.uid != sec_initial_uid() && !is_disk_op ) + if (p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op ) return WERR_ACCESS_DENIED; if (!lp_delete_share_cmd() || !*lp_delete_share_cmd()) { @@ -1826,7 +2000,6 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC SMB_STRUCT_STAT st; BOOL bad_path; NTSTATUS nt_status; - struct current_user user; connection_struct *conn = NULL; BOOL became_user = False; @@ -1839,10 +2012,8 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC /* Null password is ok - we are already an authenticated user... */ null_pw = data_blob(NULL, 0); - get_current_user(&user, p); - become_root(); - conn = make_connection(qualname, null_pw, "A:", user.vuid, &nt_status); + conn = make_connection(qualname, null_pw, "A:", p->pipe_user.vuid, &nt_status); unbecome_root(); if (conn == NULL) { @@ -1872,18 +2043,18 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC goto error_exit; } - fsp = open_file_stat(conn, filename, &st); - if (!fsp) { + nt_status = open_file_stat(conn, filename, &st, &fsp); + if (!NT_STATUS_IS_OK(nt_status)) { /* Perhaps it is a directory */ - if (errno == EISDIR) - fsp = open_directory(conn, filename, &st, + if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY)) + nt_status = open_directory(conn, filename, &st, READ_CONTROL_ACCESS, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, 0, - NULL); + NULL, &fsp); - if (!fsp) { + if (!NT_STATUS_IS_OK(nt_status)) { DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", filename)); r_u->status = WERR_ACCESS_DENIED; goto error_exit; @@ -1908,7 +2079,7 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC close_file(fsp, NORMAL_CLOSE); unbecome_user(); - close_cnum(conn, user.vuid); + close_cnum(conn, p->pipe_user.vuid); return r_u->status; error_exit: @@ -1921,7 +2092,7 @@ error_exit: unbecome_user(); if (conn) - close_cnum(conn, user.vuid); + close_cnum(conn, p->pipe_user.vuid); return r_u->status; } @@ -1941,7 +2112,6 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ SMB_STRUCT_STAT st; BOOL bad_path; NTSTATUS nt_status; - struct current_user user; connection_struct *conn = NULL; BOOL became_user = False; @@ -1954,10 +2124,8 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ /* Null password is ok - we are already an authenticated user... */ null_pw = data_blob(NULL, 0); - get_current_user(&user, p); - become_root(); - conn = make_connection(qualname, null_pw, "A:", user.vuid, &nt_status); + conn = make_connection(qualname, null_pw, "A:", p->pipe_user.vuid, &nt_status); unbecome_root(); if (conn == NULL) { @@ -1988,19 +2156,19 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ } - fsp = open_file_stat(conn, filename, &st); + nt_status = open_file_stat(conn, filename, &st, &fsp); - if (!fsp) { + if (!NT_STATUS_IS_OK(nt_status)) { /* Perhaps it is a directory */ - if (errno == EISDIR) - fsp = open_directory(conn, filename, &st, + if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY)) + nt_status = open_directory(conn, filename, &st, FILE_READ_ATTRIBUTES, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, 0, - NULL); + NULL, &fsp); - if (!fsp) { + if (!NT_STATUS_IS_OK(nt_status)) { DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", filename)); r_u->status = WERR_ACCESS_DENIED; goto error_exit; @@ -2017,7 +2185,7 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ close_file(fsp, NORMAL_CLOSE); unbecome_user(); - close_cnum(conn, user.vuid); + close_cnum(conn, p->pipe_user.vuid); return r_u->status; error_exit: @@ -2031,7 +2199,7 @@ error_exit: } if (conn) { - close_cnum(conn, user.vuid); + close_cnum(conn, p->pipe_user.vuid); } return r_u->status; @@ -2133,7 +2301,7 @@ WERROR _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV switch ( q_u->type ) { case 0x9: - rpcstr_pull(sharename, q_u->uni_name.buffer, sizeof(sharename), q_u->uni_name.uni_str_len*2, 0); + rpcstr_pull(sharename, q_u->sharename.buffer, sizeof(sharename), q_u->sharename.uni_str_len*2, 0); if ( !validate_net_name( sharename, INVALID_SHARENAME_CHARS, sizeof(sharename) ) ) { DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", sharename)); return WERR_INVALID_NAME; @@ -2146,3 +2314,13 @@ WERROR _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV return WERR_OK; } + + +/******************************************************************** +********************************************************************/ + +WERROR _srv_net_file_close(pipes_struct *p, SRV_Q_NET_FILE_CLOSE *q_u, SRV_R_NET_FILE_CLOSE *r_u) +{ + return WERR_ACCESS_DENIED; +} + -- cgit From 1f2419d9f8be0efcf2e43ecf97ea59d501e62fe8 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Fri, 14 Jul 2006 17:46:06 +0000 Subject: r17032: I thought I had already merged this from trunk: > r16959 | vlendec | 2006-07-11 23:10:44 +0200 (Di, 11 Jul 2006) | 1 line > > get_share_security does not need snum, activate RPC-SAMBA3-SRVSVC Volker (This used to be commit c89471e15766fcdbfa4f40701e12c19f95c2d8ef) --- source3/rpc_server/srv_srvsvc_nt.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 12a86ce9f3..a313bbb881 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -338,7 +338,7 @@ BOOL share_access_check(connection_struct *conn, int snum, user_struct *vuser, u if (mem_ctx == NULL) return False; - psd = get_share_security(mem_ctx, snum, &sd_size); + psd = get_share_security(mem_ctx, lp_servicename(snum), &sd_size); if (!psd) goto out; @@ -415,7 +415,7 @@ static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, pstrcpy(passwd, ""); - sd = get_share_security(ctx, snum, &sd_size); + sd = get_share_security(ctx, lp_servicename(snum), &sd_size); init_srv_share_info502(&sh502->info_502, net_name, get_share_type(snum), remark, 0, 0xffffffff, 1, path, passwd, sd, sd_size); init_srv_share_info502_str(&sh502->info_502_str, net_name, remark, path, passwd, sd, sd_size); @@ -493,7 +493,7 @@ static void init_srv_share_info_1501(pipes_struct *p, SRV_SHARE_INFO_1501 *sh150 ZERO_STRUCTP(sh1501); - sd = get_share_security(ctx, snum, &sd_size); + sd = get_share_security(ctx, lp_servicename(snum), &sd_size); sh1501->sdb = make_sec_desc_buf(p->mem_ctx, sd_size, sd); } @@ -1684,7 +1684,8 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S SEC_DESC *old_sd; size_t sd_size; - old_sd = get_share_security(p->mem_ctx, snum, &sd_size); + old_sd = get_share_security(p->mem_ctx, lp_servicename(snum), + &sd_size); if (old_sd && !sec_desc_equal(old_sd, psd)) { if (!set_share_security(p->mem_ctx, share_name, psd)) -- cgit From 5b474afa74697321a24e952c63e60bcb1e84dced Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Fri, 14 Jul 2006 17:53:45 +0000 Subject: r17033: Restructure init_srv_share_info_ctr so that there's only one loop, not a dozen or so. Next step will be to eliminate the explicit snum reference. Volker (This used to be commit 6e98f8d6c6cc126b0d27ac574c128be96e50abf3) --- source3/rpc_server/srv_srvsvc_nt.c | 304 +++++++++++++++---------------------- 1 file changed, 119 insertions(+), 185 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index a313bbb881..9e1556b618 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -513,8 +513,10 @@ static BOOL is_hidden_share(int snum) Fill in a share info structure. ********************************************************************/ -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) +static WERROR 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 = 0; @@ -523,7 +525,7 @@ static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, DEBUG(5,("init_srv_share_info_ctr\n")); - ZERO_STRUCTPN(ctr); + ZERO_STRUCT(ctr->share); ctr->info_level = ctr->switch_value = info_level; *resume_hnd = 0; @@ -533,218 +535,153 @@ static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, num_services = load_usershare_shares(); unbecome_root(); - /* Count the number of entries. */ - for (snum = 0; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) - num_entries++; - } - - *total_entries = num_entries; - ctr->num_entries2 = ctr->num_entries = num_entries; - ctr->ptr_share_info = ctr->ptr_entries = 1; - - if (!num_entries) - return True; - - switch (info_level) { - case 0: - { - SRV_SHARE_INFO_0 *info0 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_0, num_entries); - int i = 0; + num_entries = 0; - if (!info0) { - return False; - } + ZERO_STRUCT(ctr->share); - for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { - init_srv_share_info_0(p, &info0[i++], snum); - } + for (snum = *resume_hnd; snum < num_services; snum++) { + if (!lp_snum_ok(snum) || !lp_browseable(snum)) { + continue; } - - ctr->share.info0 = info0; - break; - - } - - case 1: - { - SRV_SHARE_INFO_1 *info1 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1, num_entries); - int i = 0; - - if (!info1) { - return False; + if (!all_shares && is_hidden_share(snum)) { + continue; } - for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { - init_srv_share_info_1(p, &info1[i++], snum); + switch (info_level) { + case 0: + { + SRV_SHARE_INFO_0 i; + init_srv_share_info_0(p, &i, snum); + ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_0, i, + &ctr->share.info0, &num_entries); + if (ctr->share.info0 == NULL) { + return WERR_NOMEM; } + break; } - ctr->share.info1 = info1; - break; - } - - case 2: - { - SRV_SHARE_INFO_2 *info2 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_2, num_entries); - int i = 0; - - if (!info2) { - return False; - } - - for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { - init_srv_share_info_2(p, &info2[i++], snum); + case 1: + { + SRV_SHARE_INFO_1 i; + init_srv_share_info_1(p, &i, snum); + ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1, i, + &ctr->share.info1, &num_entries); + if (ctr->share.info1 == NULL) { + return WERR_NOMEM; } + break; } - ctr->share.info2 = info2; - break; - } - - case 501: - { - SRV_SHARE_INFO_501 *info501 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_501, num_entries); - int i = 0; - - if (!info501) { - return False; - } - - for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { - init_srv_share_info_501(p, &info501[i++], snum); + case 2: + { + SRV_SHARE_INFO_2 i; + init_srv_share_info_2(p, &i, snum); + ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_2, i, + &ctr->share.info2, &num_entries); + if (ctr->share.info2 == NULL) { + return WERR_NOMEM; } + break; } - - ctr->share.info501 = info501; - break; - } - - case 502: - { - SRV_SHARE_INFO_502 *info502 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_502, num_entries); - int i = 0; - if (!info502) { - return False; + case 501: + { + SRV_SHARE_INFO_501 i; + init_srv_share_info_501(p, &i, snum); + ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_501, i, + &ctr->share.info501, &num_entries); + if (ctr->share.info501 == NULL) { + return WERR_NOMEM; + } + break; } - for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { - init_srv_share_info_502(p, &info502[i++], snum); + case 502: + { + SRV_SHARE_INFO_502 i; + init_srv_share_info_502(p, &i, snum); + ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_502, i, + &ctr->share.info502, &num_entries); + if (ctr->share.info502 == NULL) { + return WERR_NOMEM; } + break; } - ctr->share.info502 = info502; - break; - } - - /* here for completeness but not currently used with enum (1004 - 1501)*/ + /* here for completeness but not currently used with enum + * (1004 - 1501)*/ - case 1004: - { - SRV_SHARE_INFO_1004 *info1004 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1004, num_entries); - int i = 0; - - if (!info1004) { - return False; - } - - for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { - init_srv_share_info_1004(p, &info1004[i++], snum); + case 1004: + { + SRV_SHARE_INFO_1004 i; + init_srv_share_info_1004(p, &i, snum); + ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1004, i, + &ctr->share.info1004, &num_entries); + if (ctr->share.info1004 == NULL) { + return WERR_NOMEM; } + break; } - ctr->share.info1004 = info1004; - break; - } - - case 1005: - { - SRV_SHARE_INFO_1005 *info1005 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1005, num_entries); - int i = 0; - - if (!info1005) { - return False; - } - - for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { - init_srv_share_info_1005(p, &info1005[i++], snum); + case 1005: + { + SRV_SHARE_INFO_1005 i; + init_srv_share_info_1005(p, &i, snum); + ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1005, i, + &ctr->share.info1005, &num_entries); + if (ctr->share.info1005 == NULL) { + return WERR_NOMEM; } + break; } - ctr->share.info1005 = info1005; - break; - } - - case 1006: - { - SRV_SHARE_INFO_1006 *info1006 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1006, num_entries); - int i = 0; - - if (!info1006) { - return False; - } - - for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { - init_srv_share_info_1006(p, &info1006[i++], snum); + case 1006: + { + SRV_SHARE_INFO_1006 i; + init_srv_share_info_1006(p, &i, snum); + ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1006, i, + &ctr->share.info1006, &num_entries); + if (ctr->share.info1006 == NULL) { + return WERR_NOMEM; } + break; } - ctr->share.info1006 = info1006; - break; - } - - case 1007: - { - SRV_SHARE_INFO_1007 *info1007 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1007, num_entries); - int i = 0; - - if (!info1007) { - return False; - } - - for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { - init_srv_share_info_1007(p, &info1007[i++], snum); + case 1007: + { + SRV_SHARE_INFO_1007 i; + init_srv_share_info_1007(p, &i, snum); + ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1007, i, + &ctr->share.info1007, &num_entries); + if (ctr->share.info1007 == NULL) { + return WERR_NOMEM; } + break; } - ctr->share.info1007 = info1007; - break; - } - - case 1501: - { - SRV_SHARE_INFO_1501 *info1501 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1501, num_entries); - int i = 0; - - if (!info1501) { - return False; - } - - for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { - init_srv_share_info_1501(p, &info1501[i++], snum); + case 1501: + { + SRV_SHARE_INFO_1501 i; + init_srv_share_info_1501(p, &i, snum); + ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1501, i, + &ctr->share.info1501, &num_entries); + if (ctr->share.info1501 == NULL) { + return WERR_NOMEM; } + break; + } + default: + DEBUG(5,("init_srv_share_info_ctr: unsupported switch " + "value %d\n", info_level)); + return WERR_UNKNOWN_LEVEL; } - - ctr->share.info1501 = info1501; - break; - } - default: - DEBUG(5,("init_srv_share_info_ctr: unsupported switch value %d\n", info_level)); - return False; } - return True; + *total_entries = num_entries; + ctr->num_entries2 = ctr->num_entries = num_entries; + ctr->ptr_share_info = ctr->ptr_entries = 1; + + return WERR_OK; } /******************************************************************* @@ -756,12 +693,9 @@ static void init_srv_r_net_share_enum(pipes_struct *p, SRV_R_NET_SHARE_ENUM *r_n { DEBUG(5,("init_srv_r_net_share_enum: %d\n", __LINE__)); - if (init_srv_share_info_ctr(p, &r_n->ctr, info_level, - &resume_hnd, &r_n->total_entries, all)) { - r_n->status = WERR_OK; - } else { - r_n->status = WERR_UNKNOWN_LEVEL; - } + r_n->status = init_srv_share_info_ctr(p, &r_n->ctr, info_level, + &resume_hnd, + &r_n->total_entries, all); init_enum_hnd(&r_n->enum_hnd, resume_hnd); } -- cgit From 2203228c791761bcab07961da725488636bee8df Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Fri, 14 Jul 2006 22:06:38 +0000 Subject: r17039: Eliminate snum from enumshares and getshareinfo. Get rid of some pstrings. Volker (This used to be commit c5e393d5eda4e13a844171d9ff319d1f1bac3d84) --- source3/rpc_server/srv_srvsvc_nt.c | 279 ++++++++++++++++++++----------------- 1 file changed, 155 insertions(+), 124 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 9e1556b618..50df99901b 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -200,19 +200,19 @@ static WERROR net_enum_files( TALLOC_CTX *ctx, FILE_INFO_3 **info, } /******************************************************************* - Utility function to get the 'type' of a share from an snum. + Utility function to get the 'type' of a share from a share definition. ********************************************************************/ -static uint32 get_share_type(int snum) +static uint32 get_share_type(const struct share_params *params) { - char *net_name = lp_servicename(snum); + char *net_name = lp_servicename(params->service); int len_net_name = strlen(net_name); /* work out the share type */ uint32 type = STYPE_DISKTREE; - if (lp_print_ok(snum)) + if (lp_print_ok(params->service)) type = STYPE_PRINTQ; - if (strequal(lp_fstype(snum), "IPC")) + if (strequal(lp_fstype(params->service), "IPC")) type = STYPE_IPC; if (net_name[len_net_name] == '$') type |= STYPE_HIDDEN; @@ -224,12 +224,10 @@ static uint32 get_share_type(int snum) Fill in a share info level 0 structure. ********************************************************************/ -static void init_srv_share_info_0(pipes_struct *p, SRV_SHARE_INFO_0 *sh0, int snum) +static void init_srv_share_info_0(pipes_struct *p, SRV_SHARE_INFO_0 *sh0, + const struct share_params *params) { - pstring net_name; - - pstrcpy(net_name, lp_servicename(snum)); - + char *net_name = lp_servicename(params->service); init_srv_share_info0(&sh0->info_0, net_name); init_srv_share_info0_str(&sh0->info_0_str, net_name); } @@ -238,20 +236,21 @@ static void init_srv_share_info_0(pipes_struct *p, SRV_SHARE_INFO_0 *sh0, int sn Fill in a share info level 1 structure. ********************************************************************/ -static void init_srv_share_info_1(pipes_struct *p, SRV_SHARE_INFO_1 *sh1, int snum) +static void init_srv_share_info_1(pipes_struct *p, SRV_SHARE_INFO_1 *sh1, + const struct share_params *params) { connection_struct *conn = p->conn; - pstring remark; + char *net_name = lp_servicename(params->service); + char *remark; - char *net_name = lp_servicename(snum); - pstrcpy(remark, lp_comment(snum)); - standard_sub_advanced(lp_servicename(SNUM(conn)), conn->user, - conn->connectpath, conn->gid, - get_current_username(), - current_user_info.domain, - remark, sizeof(remark)); + remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)), + conn->user, conn->connectpath, conn->gid, + get_current_username(), + current_user_info.domain, + lp_comment(params->service)); - init_srv_share_info1(&sh1->info_1, net_name, get_share_type(snum), remark); + init_srv_share_info1(&sh1->info_1, net_name, get_share_type(params), + remark); init_srv_share_info1_str(&sh1->info_1_str, net_name, remark); } @@ -259,40 +258,37 @@ static void init_srv_share_info_1(pipes_struct *p, SRV_SHARE_INFO_1 *sh1, int sn Fill in a share info level 2 structure. ********************************************************************/ -static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2, int snum) +static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2, + const struct share_params *params) { connection_struct *conn = p->conn; - pstring remark; - pstring path; - pstring passwd; - int max_connections = lp_max_connections(snum); + char *remark; + char *path; + int max_connections = lp_max_connections(params->service); uint32 max_uses = max_connections!=0 ? max_connections : 0xffffffff; int count = 0; - char *net_name = lp_servicename(snum); + char *net_name = lp_servicename(params->service); - pstrcpy(remark, lp_comment(snum)); - standard_sub_advanced(lp_servicename(SNUM(conn)), conn->user, - conn->connectpath, conn->gid, - get_current_username(), - current_user_info.domain, - remark, sizeof(remark)); - pstrcpy(path, "C:"); - pstrcat(path, lp_pathname(snum)); + remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)), + conn->user, conn->connectpath, conn->gid, + get_current_username(), + current_user_info.domain, + lp_comment(params->service)); + path = talloc_asprintf(p->mem_ctx, "C:%s", + lp_pathname(params->service)); /* - * Change / to \\ so that win2k will see it as a valid path. This was added to - * enable use of browsing in win2k add share dialog. + * Change / to \\ so that win2k will see it as a valid path. This was + * added to enable use of browsing in win2k add share dialog. */ string_replace(path, '/', '\\'); - pstrcpy(passwd, ""); - count = count_current_connections( net_name, False ); - init_srv_share_info2(&sh2->info_2, net_name, get_share_type(snum), - remark, 0, max_uses, count, path, passwd); + init_srv_share_info2(&sh2->info_2, net_name, get_share_type(params), + remark, 0, max_uses, count, path, ""); - init_srv_share_info2_str(&sh2->info_2_str, net_name, remark, path, passwd); + init_srv_share_info2_str(&sh2->info_2_str, net_name, remark, path, ""); } /******************************************************************* @@ -361,20 +357,22 @@ out: Fill in a share info level 501 structure. ********************************************************************/ -static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501, int snum) +static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501, + const struct share_params *params) { connection_struct *conn = p->conn; - pstring remark; - - const char *net_name = lp_servicename(snum); - pstrcpy(remark, lp_comment(snum)); - standard_sub_advanced(lp_servicename(SNUM(conn)), conn->user, - conn->connectpath, conn->gid, - get_current_username(), - current_user_info.domain, - remark, sizeof(remark)); - - init_srv_share_info501(&sh501->info_501, net_name, get_share_type(snum), remark, (lp_csc_policy(snum) << 4)); + char *remark; + const char *net_name = lp_servicename(params->service); + + remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)), + conn->user, conn->connectpath, conn->gid, + get_current_username(), + current_user_info.domain, + lp_comment(params->service)); + + init_srv_share_info501(&sh501->info_501, net_name, + get_share_type(params), remark, + (lp_csc_policy(params->service) << 4)); init_srv_share_info501_str(&sh501->info_501_str, net_name, remark); } @@ -382,13 +380,13 @@ static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501, Fill in a share info level 502 structure. ********************************************************************/ -static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, int snum) +static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, + const struct share_params *params) { connection_struct *conn = p->conn; - pstring net_name; - pstring remark; - pstring path; - pstring passwd; + char *net_name; + char *remark; + char *path; SEC_DESC *sd; size_t sd_size; TALLOC_CTX *ctx = p->mem_ctx; @@ -396,46 +394,50 @@ static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, ZERO_STRUCTP(sh502); - pstrcpy(net_name, lp_servicename(snum)); - pstrcpy(remark, lp_comment(snum)); - standard_sub_advanced(lp_servicename(SNUM(conn)), conn->user, - conn->connectpath, conn->gid, - get_current_username(), - current_user_info.domain, - remark, sizeof(remark)); - pstrcpy(path, "C:"); - pstrcat(path, lp_pathname(snum)); + net_name = lp_servicename(params->service); + + remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)), + conn->user, conn->connectpath, conn->gid, + get_current_username(), + current_user_info.domain, + lp_comment(params->service)); + + path = talloc_asprintf(p->mem_ctx, "C:%s", + lp_pathname(params->service)); /* - * Change / to \\ so that win2k will see it as a valid path. This was added to - * enable use of browsing in win2k add share dialog. + * Change / to \\ so that win2k will see it as a valid path. This was + * added to enable use of browsing in win2k add share dialog. */ string_replace(path, '/', '\\'); - pstrcpy(passwd, ""); - - sd = get_share_security(ctx, lp_servicename(snum), &sd_size); + sd = get_share_security(ctx, lp_servicename(params->service), + &sd_size); - init_srv_share_info502(&sh502->info_502, net_name, get_share_type(snum), remark, 0, 0xffffffff, 1, path, passwd, sd, sd_size); - init_srv_share_info502_str(&sh502->info_502_str, net_name, remark, path, passwd, sd, sd_size); + init_srv_share_info502(&sh502->info_502, net_name, + get_share_type(params), remark, 0, 0xffffffff, + 1, path, "", sd, sd_size); + init_srv_share_info502_str(&sh502->info_502_str, net_name, remark, + path, "", sd, sd_size); } /*************************************************************************** Fill in a share info level 1004 structure. ***************************************************************************/ -static void init_srv_share_info_1004(pipes_struct *p, SRV_SHARE_INFO_1004* sh1004, int snum) +static void init_srv_share_info_1004(pipes_struct *p, + SRV_SHARE_INFO_1004* sh1004, + const struct share_params *params) { connection_struct *conn = p->conn; - pstring remark; + char *remark; - pstrcpy(remark, lp_comment(snum)); - standard_sub_advanced(lp_servicename(SNUM(conn)), conn->user, - conn->connectpath, conn->gid, - get_current_username(), - current_user_info.domain, - remark, sizeof(remark)); + remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)), + conn->user, conn->connectpath, conn->gid, + get_current_username(), + current_user_info.domain, + lp_comment(params->service)); ZERO_STRUCTP(sh1004); @@ -447,21 +449,25 @@ static void init_srv_share_info_1004(pipes_struct *p, SRV_SHARE_INFO_1004* sh100 Fill in a share info level 1005 structure. ***************************************************************************/ -static void init_srv_share_info_1005(pipes_struct *p, SRV_SHARE_INFO_1005* sh1005, int snum) +static void init_srv_share_info_1005(pipes_struct *p, + SRV_SHARE_INFO_1005* sh1005, + const struct share_params *params) { sh1005->share_info_flags = 0; - if(lp_host_msdfs() && lp_msdfs_root(snum)) + if(lp_host_msdfs() && lp_msdfs_root(params->service)) sh1005->share_info_flags |= SHARE_1005_IN_DFS | SHARE_1005_DFS_ROOT; sh1005->share_info_flags |= - lp_csc_policy(snum) << SHARE_1005_CSC_POLICY_SHIFT; + lp_csc_policy(params->service) << SHARE_1005_CSC_POLICY_SHIFT; } /*************************************************************************** Fill in a share info level 1006 structure. ***************************************************************************/ -static void init_srv_share_info_1006(pipes_struct *p, SRV_SHARE_INFO_1006* sh1006, int snum) +static void init_srv_share_info_1006(pipes_struct *p, + SRV_SHARE_INFO_1006* sh1006, + const struct share_params *params) { sh1006->max_uses = -1; } @@ -470,22 +476,28 @@ static void init_srv_share_info_1006(pipes_struct *p, SRV_SHARE_INFO_1006* sh100 Fill in a share info level 1007 structure. ***************************************************************************/ -static void init_srv_share_info_1007(pipes_struct *p, SRV_SHARE_INFO_1007* sh1007, int snum) +static void init_srv_share_info_1007(pipes_struct *p, + SRV_SHARE_INFO_1007* sh1007, + const struct share_params *params) { pstring alternate_directory_name = ""; uint32 flags = 0; ZERO_STRUCTP(sh1007); - init_srv_share_info1007(&sh1007->info_1007, flags, alternate_directory_name); - init_srv_share_info1007_str(&sh1007->info_1007_str, alternate_directory_name); + init_srv_share_info1007(&sh1007->info_1007, flags, + alternate_directory_name); + init_srv_share_info1007_str(&sh1007->info_1007_str, + alternate_directory_name); } /******************************************************************* Fill in a share info level 1501 structure. ********************************************************************/ -static void init_srv_share_info_1501(pipes_struct *p, SRV_SHARE_INFO_1501 *sh1501, int snum) +static void init_srv_share_info_1501(pipes_struct *p, + SRV_SHARE_INFO_1501 *sh1501, + const struct share_params *params) { SEC_DESC *sd; size_t sd_size; @@ -493,7 +505,8 @@ static void init_srv_share_info_1501(pipes_struct *p, SRV_SHARE_INFO_1501 *sh150 ZERO_STRUCTP(sh1501); - sd = get_share_security(ctx, lp_servicename(snum), &sd_size); + sd = get_share_security(ctx, lp_servicename(params->service), + &sd_size); sh1501->sdb = make_sec_desc_buf(p->mem_ctx, sd_size, sd); } @@ -502,11 +515,11 @@ static void init_srv_share_info_1501(pipes_struct *p, SRV_SHARE_INFO_1501 *sh150 True if it ends in '$'. ********************************************************************/ -static BOOL is_hidden_share(int snum) +static BOOL is_hidden_share(const struct share_params *params) { - const char *net_name = lp_servicename(snum); + const char *net_name = lp_servicename(params->service); - return (net_name[strlen(net_name) - 1] == '$') ? True : False; + return (net_name[strlen(net_name) - 1] == '$'); } /******************************************************************* @@ -519,9 +532,9 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, uint32 *total_entries, BOOL all_shares) { int num_entries = 0; - int num_services = 0; - int snum; TALLOC_CTX *ctx = p->mem_ctx; + struct share_iterator *shares; + struct share_params *share; DEBUG(5,("init_srv_share_info_ctr\n")); @@ -532,18 +545,23 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, /* Ensure all the usershares are loaded. */ become_root(); - num_services = load_usershare_shares(); + load_usershare_shares(); unbecome_root(); num_entries = 0; ZERO_STRUCT(ctr->share); - for (snum = *resume_hnd; snum < num_services; snum++) { - if (!lp_snum_ok(snum) || !lp_browseable(snum)) { + if (!(shares = share_list_all(ctx))) { + DEBUG(5, ("Could not list shares\n")); + return WERR_ACCESS_DENIED; + } + + while ((share = next_share(shares)) != NULL) { + if (!lp_browseable(share->service)) { continue; } - if (!all_shares && is_hidden_share(snum)) { + if (!all_shares && is_hidden_share(share)) { continue; } @@ -551,7 +569,7 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, case 0: { SRV_SHARE_INFO_0 i; - init_srv_share_info_0(p, &i, snum); + init_srv_share_info_0(p, &i, share); ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_0, i, &ctr->share.info0, &num_entries); if (ctr->share.info0 == NULL) { @@ -563,7 +581,7 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, case 1: { SRV_SHARE_INFO_1 i; - init_srv_share_info_1(p, &i, snum); + init_srv_share_info_1(p, &i, share); ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1, i, &ctr->share.info1, &num_entries); if (ctr->share.info1 == NULL) { @@ -575,7 +593,7 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, case 2: { SRV_SHARE_INFO_2 i; - init_srv_share_info_2(p, &i, snum); + init_srv_share_info_2(p, &i, share); ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_2, i, &ctr->share.info2, &num_entries); if (ctr->share.info2 == NULL) { @@ -587,7 +605,7 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, case 501: { SRV_SHARE_INFO_501 i; - init_srv_share_info_501(p, &i, snum); + init_srv_share_info_501(p, &i, share); ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_501, i, &ctr->share.info501, &num_entries); if (ctr->share.info501 == NULL) { @@ -599,7 +617,7 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, case 502: { SRV_SHARE_INFO_502 i; - init_srv_share_info_502(p, &i, snum); + init_srv_share_info_502(p, &i, share); ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_502, i, &ctr->share.info502, &num_entries); if (ctr->share.info502 == NULL) { @@ -614,7 +632,7 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, case 1004: { SRV_SHARE_INFO_1004 i; - init_srv_share_info_1004(p, &i, snum); + init_srv_share_info_1004(p, &i, share); ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1004, i, &ctr->share.info1004, &num_entries); if (ctr->share.info1004 == NULL) { @@ -626,7 +644,7 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, case 1005: { SRV_SHARE_INFO_1005 i; - init_srv_share_info_1005(p, &i, snum); + init_srv_share_info_1005(p, &i, share); ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1005, i, &ctr->share.info1005, &num_entries); if (ctr->share.info1005 == NULL) { @@ -638,7 +656,7 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, case 1006: { SRV_SHARE_INFO_1006 i; - init_srv_share_info_1006(p, &i, snum); + init_srv_share_info_1006(p, &i, share); ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1006, i, &ctr->share.info1006, &num_entries); if (ctr->share.info1006 == NULL) { @@ -650,7 +668,7 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, case 1007: { SRV_SHARE_INFO_1007 i; - init_srv_share_info_1007(p, &i, snum); + init_srv_share_info_1007(p, &i, share); ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1007, i, &ctr->share.info1007, &num_entries); if (ctr->share.info1007 == NULL) { @@ -662,7 +680,7 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, case 1501: { SRV_SHARE_INFO_1501 i; - init_srv_share_info_1501(p, &i, snum); + init_srv_share_info_1501(p, &i, share); ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1501, i, &ctr->share.info1501, &num_entries); if (ctr->share.info1501 == NULL) { @@ -675,6 +693,8 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, "value %d\n", info_level)); return WERR_UNKNOWN_LEVEL; } + + TALLOC_FREE(share); } *total_entries = num_entries; @@ -708,52 +728,63 @@ static void init_srv_r_net_share_get_info(pipes_struct *p, SRV_R_NET_SHARE_GET_I char *share_name, uint32 info_level) { WERROR status = WERR_OK; - int snum; + const struct share_params *params; DEBUG(5,("init_srv_r_net_share_get_info: %d\n", __LINE__)); r_n->info.switch_value = info_level; - snum = find_service(share_name); + params = get_share_params(p->mem_ctx, share_name); - if (snum >= 0) { + if (params != NULL) { switch (info_level) { case 0: - init_srv_share_info_0(p, &r_n->info.share.info0, snum); + init_srv_share_info_0(p, &r_n->info.share.info0, + params); break; case 1: - init_srv_share_info_1(p, &r_n->info.share.info1, snum); + init_srv_share_info_1(p, &r_n->info.share.info1, + params); break; case 2: - init_srv_share_info_2(p, &r_n->info.share.info2, snum); + init_srv_share_info_2(p, &r_n->info.share.info2, + params); break; case 501: - init_srv_share_info_501(p, &r_n->info.share.info501, snum); + init_srv_share_info_501(p, &r_n->info.share.info501, + params); break; case 502: - init_srv_share_info_502(p, &r_n->info.share.info502, snum); + init_srv_share_info_502(p, &r_n->info.share.info502, + params); break; /* here for completeness */ case 1004: - init_srv_share_info_1004(p, &r_n->info.share.info1004, snum); + init_srv_share_info_1004(p, &r_n->info.share.info1004, + params); break; case 1005: - init_srv_share_info_1005(p, &r_n->info.share.info1005, snum); + init_srv_share_info_1005(p, &r_n->info.share.info1005, + params); break; /* here for completeness 1006 - 1501 */ case 1006: - init_srv_share_info_1006(p, &r_n->info.share.info1006, snum); + init_srv_share_info_1006(p, &r_n->info.share.info1006, + params); break; case 1007: - init_srv_share_info_1007(p, &r_n->info.share.info1007, snum); + init_srv_share_info_1007(p, &r_n->info.share.info1007, + params); break; case 1501: - init_srv_share_info_1501(p, &r_n->info.share.info1501, snum); + init_srv_share_info_1501(p, &r_n->info.share.info1501, + params); break; default: - DEBUG(5,("init_srv_net_share_get_info: unsupported switch value %d\n", info_level)); + DEBUG(5,("init_srv_net_share_get_info: unsupported " + "switch value %d\n", info_level)); status = WERR_UNKNOWN_LEVEL; break; } -- cgit From 283b74fce595642fb2e2a2fad87c2de9c3bc5403 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 17 Jul 2006 19:50:59 +0000 Subject: r17096: Simplify share_access_check a bit: It takes the sharename instead of the snum, and the decision which token to use (conn or vuser) does not really belong here, it is better done in the two places where this is called. Volker (This used to be commit 0a138888adf7a0f04a38cd911e797e1a379e908b) --- source3/rpc_server/srv_srvsvc_nt.c | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 50df99901b..19099b931e 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -320,36 +320,30 @@ static void map_generic_share_sd_bits(SEC_DESC *psd) Can this user access with share with the required permissions ? ********************************************************************/ -BOOL share_access_check(connection_struct *conn, int snum, user_struct *vuser, uint32 desired_access) +BOOL share_access_check(const NT_USER_TOKEN *token, const char *sharename, + uint32 desired_access) { uint32 granted; NTSTATUS status; TALLOC_CTX *mem_ctx = NULL; SEC_DESC *psd = NULL; size_t sd_size; - NT_USER_TOKEN *token = NULL; BOOL ret = True; - mem_ctx = talloc_init("share_access_check"); - if (mem_ctx == NULL) + if (!(mem_ctx = talloc_init("share_access_check"))) { return False; + } - psd = get_share_security(mem_ctx, lp_servicename(snum), &sd_size); - - if (!psd) - goto out; + psd = get_share_security(mem_ctx, sharename, &sd_size); - if (conn->nt_user_token) - token = conn->nt_user_token; - else - token = vuser->nt_user_token; + if (!psd) { + TALLOC_FREE(mem_ctx); + return True; + } ret = se_access_check(psd, token, desired_access, &granted, &status); -out: - talloc_destroy(mem_ctx); - return ret; } -- cgit From 4c713703d046f756989e7eb901e884829825593c Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 17 Jul 2006 19:53:15 +0000 Subject: r17097: Move share_access_check from rpc_server/srv_srvsvc_nt.c to lib/sharesec.c (This used to be commit 220dd4333032aea238066e3fbec9fca51ed16ddf) --- source3/rpc_server/srv_srvsvc_nt.c | 31 ------------------------------- 1 file changed, 31 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 19099b931e..be4c51c0d2 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -316,37 +316,6 @@ static void map_generic_share_sd_bits(SEC_DESC *psd) } } -/******************************************************************* - Can this user access with share with the required permissions ? -********************************************************************/ - -BOOL share_access_check(const NT_USER_TOKEN *token, const char *sharename, - uint32 desired_access) -{ - uint32 granted; - NTSTATUS status; - TALLOC_CTX *mem_ctx = NULL; - SEC_DESC *psd = NULL; - size_t sd_size; - BOOL ret = True; - - if (!(mem_ctx = talloc_init("share_access_check"))) { - return False; - } - - psd = get_share_security(mem_ctx, sharename, &sd_size); - - if (!psd) { - TALLOC_FREE(mem_ctx); - return True; - } - - ret = se_access_check(psd, token, desired_access, &granted, &status); - - talloc_destroy(mem_ctx); - return ret; -} - /******************************************************************* Fill in a share info level 501 structure. ********************************************************************/ -- cgit From e0c68d0a1d591e4285746a8af70040448752a735 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Fri, 21 Jul 2006 14:13:30 +0000 Subject: r17177: Get rid of a global variable by adding a private data pointer to share_mode_forall(). Volker (This used to be commit f97f6cedffdc4d10afcac90a163b93a801acf514) --- source3/rpc_server/srv_srvsvc_nt.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index be4c51c0d2..e4e5bde215 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -123,7 +123,8 @@ static WERROR net_enum_pipes( TALLOC_CTX *ctx, FILE_INFO_3 **info, static struct file_enum_count f_enum_cnt; static void enum_file_fn( const struct share_mode_entry *e, - const char *sharepath, const char *fname ) + const char *sharepath, const char *fname, + void *dummy ) { struct file_enum_count *fenum = &f_enum_cnt; @@ -191,7 +192,7 @@ static WERROR net_enum_files( TALLOC_CTX *ctx, FILE_INFO_3 **info, f_enum_cnt.count = *count; f_enum_cnt.info = *info; - share_mode_forall( enum_file_fn ); + share_mode_forall( enum_file_fn, NULL ); *info = f_enum_cnt.info; *count = f_enum_cnt.count; @@ -802,13 +803,11 @@ static void init_srv_sess_info_0(SRV_SESS_INFO_0 *ss0, uint32 *snum, uint32 *sto /******************************************************************* ********************************************************************/ -/* global needed to make use of the share_mode_forall() callback */ -static struct sess_file_count s_file_cnt; - static void sess_file_fn( const struct share_mode_entry *e, - const char *sharepath, const char *fname ) + const char *sharepath, const char *fname, + void *private_data ) { - struct sess_file_count *sess = &s_file_cnt; + struct sess_file_count *sess = (struct sess_file_count *)private_data; if ( (procid_to_pid(&e->pid) == sess->pid) && (sess->uid == e->uid) ) { sess->count++; @@ -822,11 +821,13 @@ static void sess_file_fn( const struct share_mode_entry *e, static int net_count_files( uid_t uid, pid_t pid ) { + struct sess_file_count s_file_cnt; + s_file_cnt.count = 0; s_file_cnt.uid = uid; s_file_cnt.pid = pid; - share_mode_forall( sess_file_fn ); + share_mode_forall( sess_file_fn, (void *)&s_file_cnt ); return s_file_cnt.count; } -- cgit From a093a76dc14303fd1c42fb2c0b87faf3748815e4 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 28 Jul 2006 22:42:39 +0000 Subject: r17293: After the results from the cluster tests in Germany, fix the messaging code to call the efficient calls : save_re_uid() set_effective_uid(0); messaging_op restore_re_uid(); instead of using heavyweight become_root()/unbecome_root() pairs around all messaging code. Fixup the messaging code to ensure sec_init() is called (only once) so that non-root processes still work when sending messages. This is a lighter weight solution to become_root()/unbecome_root() (which swaps all the supplemental groups) and should be more efficient. I will migrate all server code over to using this (a similar technique should be used in the passdb backend where needed). Jeremy. (This used to be commit 4ace291278d9a44f5c577bdd3b282c1231e543df) --- source3/rpc_server/srv_srvsvc_nt.c | 9 --------- 1 file changed, 9 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index e4e5bde215..de3148aae8 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1303,7 +1303,6 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES int num_sessions, snum; fstring username; fstring machine; - BOOL not_root = False; rpcstr_pull_unistr2_fstring(username, &q_u->uni_user_name); rpcstr_pull_unistr2_fstring(machine, &q_u->uni_cli_name); @@ -1332,16 +1331,8 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES if ((strequal(session_list[snum].username, username) || username[0] == '\0' ) && strequal(session_list[snum].remote_machine, machine)) { - if (p->pipe_user.ut.uid != sec_initial_uid()) { - not_root = True; - become_root(); - } - if (message_send_pid(pid_to_procid(session_list[snum].pid), MSG_SHUTDOWN, NULL, 0, False)) r_u->status = WERR_OK; - - if (not_root) - unbecome_root(); } } -- cgit From 49001a5b1b07e9a24e5f7efa0dfd880772bdb435 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 31 Jul 2006 20:58:02 +0000 Subject: r17346: Add optimisation vl needs for the cluster code where we don't get the chainlock when getting the byte range lock record read-only. Jeremy. (This used to be commit fcd798ca0c1b76adb2bcda4a99c40c7aacb0addb) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index de3148aae8..609c819a7d 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -152,7 +152,7 @@ static void enum_file_fn( const struct share_mode_entry *e, fsp.dev = e->dev; fsp.inode = e->inode; - if ( (brl = brl_get_locks(NULL,&fsp)) != NULL ) { + if ( (brl = brl_get_locks_readonly(NULL,&fsp)) != NULL ) { num_locks = brl->num_locks; TALLOC_FREE( brl ); } -- cgit From b65eb11a2ec568c9caa0510918cefaad3fa22703 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 28 Aug 2006 04:52:36 +0000 Subject: r17872: Fix possible null deref found by the Stanford checker. Jeremy. (This used to be commit ac06fc42cb9b1e2304d44653614aeaa7c537f34b) --- source3/rpc_server/srv_srvsvc_nt.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 609c819a7d..3e79b420a9 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -771,7 +771,9 @@ static void init_srv_sess_info_0(SRV_SESS_INFO_0 *ss0, uint32 *snum, uint32 *sto (*stot) = list_sessions(&session_list); if (ss0 == NULL) { - (*snum) = 0; + if (snum) { + (*snum) = 0; + } SAFE_FREE(session_list); return; } -- cgit From 62c78742c48c90d3a0256305a9e8c1c92b94c648 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Tue, 12 Sep 2006 02:26:32 +0000 Subject: r18413: Based on the new torture test I added in samba4 it turns out the flags determines what kind of share is this. I suppose 0x80000000 means something like (legacy) as it will fail for any share name longer then 13 chars (same size accepted for old RAP calls that come from pre NT OSs. Jerry, let me know if you want me to commit this to 3_0_23 Simo. (This used to be commit f09f8b2d820b10679f3e9cf80749da0a35f5ce6a) --- source3/rpc_server/srv_srvsvc_nt.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 3e79b420a9..c65401f1c4 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2221,11 +2221,28 @@ WERROR _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_D WERROR _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV_R_NET_NAME_VALIDATE *r_u) { fstring sharename; + int len; + + if ((q_u->flags != 0x0) && (q_u->flags != 0x80000000)) { + return WERR_INVALID_PARAM; + } switch ( q_u->type ) { case 0x9: rpcstr_pull(sharename, q_u->sharename.buffer, sizeof(sharename), q_u->sharename.uni_str_len*2, 0); - if ( !validate_net_name( sharename, INVALID_SHARENAME_CHARS, sizeof(sharename) ) ) { + + len = strlen_m(sharename); + + if ((q_u->flags == 0x0) && (len > 81)) { + DEBUG(5,("_srv_net_name_validate: share name too long (%s > 81 chars)\n", sharename)); + return WERR_INVALID_NAME; + } + if ((q_u->flags == 0x80000000) && (len > 13)) { + DEBUG(5,("_srv_net_name_validate: share name too long (%s > 13 chars)\n", sharename)); + return WERR_INVALID_NAME; + } + + if ( ! validate_net_name( sharename, INVALID_SHARENAME_CHARS, sizeof(sharename) ) ) { DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", sharename)); return WERR_INVALID_NAME; } -- cgit From 4db7642caa99c1b054322a8971c4b673556487ce Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 20 Sep 2006 22:23:12 +0000 Subject: r18745: Use the Samba4 data structures for security descriptors and security descriptor buffers. Make security access masks simply a uint32 rather than a structure with a uint32 in it. (This used to be commit b41c52b9db5fc4a553b20a7a5a051a4afced9366) --- source3/rpc_server/srv_srvsvc_nt.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index c65401f1c4..21032a4ed9 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -309,11 +309,11 @@ static void map_generic_share_sd_bits(SEC_DESC *psd) return; for (i = 0; i < ps_dacl->num_aces; i++) { - SEC_ACE *psa = &ps_dacl->ace[i]; - uint32 orig_mask = psa->info.mask; + SEC_ACE *psa = &ps_dacl->aces[i]; + uint32 orig_mask = psa->access_mask; - se_map_generic(&psa->info.mask, &file_generic_mapping); - psa->info.mask |= orig_mask; + se_map_generic(&psa->access_mask, &file_generic_mapping); + psa->access_mask |= orig_mask; } } @@ -1538,7 +1538,7 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S case 1501: pstrcpy(pathname, lp_pathname(snum)); fstrcpy(comment, lp_comment(snum)); - psd = q_u->info.share.info1501.sdb->sec; + psd = q_u->info.share.info1501.sdb->sd; map_generic_share_sd_bits(psd); type = STYPE_DISKTREE; break; -- cgit From 7ba2554d88a187ca1f4f40014363fdf9de2223a0 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 21 Sep 2006 23:57:32 +0000 Subject: r18802: Use the pidl-generated code for the srvsvc interface, both client and server code. This has had some basic testing. I'll do more during the next couple of days and hopefully also make RPC-SRVSVC from Samba4 pass against it. (This used to be commit ef10672399c4b82700dc431b4d93431ffdd42d98) --- source3/rpc_server/srv_srvsvc_nt.c | 1295 ++++++++++++++++++------------------ 1 file changed, 665 insertions(+), 630 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 21032a4ed9..ecb907e72d 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -5,6 +5,7 @@ * Copyright (C) Jeremy Allison 2001. * Copyright (C) Nigel Williams 2001. * Copyright (C) Gerald (Jerry) Carter 2006. + * Copyright (C) Jelmer Vernooij 2006. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,6 +26,8 @@ #include "includes.h" +#define MAX_SERVER_DISK_ENTRIES 15 + extern struct generic_mapping file_generic_mapping; extern userdom_struct current_user_info; @@ -35,8 +38,8 @@ extern userdom_struct current_user_info; struct file_enum_count { TALLOC_CTX *ctx; - int count; - FILE_INFO_3 *info; + uint32 count; + struct srvsvc_NetFileInfo3 *info; }; struct sess_file_count { @@ -60,26 +63,25 @@ static int pipe_enum_fn( TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, voi memcpy(&prec, dbuf.dptr, sizeof(struct pipe_open_rec)); if ( process_exists(prec.pid) ) { - FILE_INFO_3 *f; + struct srvsvc_NetFileInfo3 *f; int i = fenum->count; pstring fullpath; snprintf( fullpath, sizeof(fullpath), "\\PIPE\\%s", prec.name ); - f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 ); + f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, struct srvsvc_NetFileInfo3, i+1 ); if ( !f ) { DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1)); return 1; } + fenum->info = f; - - init_srv_file_info3( &fenum->info[i], - (uint32)((procid_to_pid(&prec.pid)<<16) & prec.pnum), - (FILE_READ_DATA|FILE_WRITE_DATA), - 0, - uidtoname( prec.uid ), - fullpath ); + fenum->info[i].fid = (uint32)((procid_to_pid(&prec.pid)<<16) & prec.pnum); + fenum->info[i].permissions = (FILE_READ_DATA|FILE_WRITE_DATA); + fenum->info[i].num_locks = 0; + fenum->info[i].user = uidtoname( prec.uid ); + fenum->info[i].path = fullpath; fenum->count++; } @@ -90,8 +92,8 @@ static int pipe_enum_fn( TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, voi /******************************************************************* ********************************************************************/ -static WERROR net_enum_pipes( TALLOC_CTX *ctx, FILE_INFO_3 **info, - uint32 *count, uint32 resume ) +static WERROR net_enum_pipes( TALLOC_CTX *ctx, struct srvsvc_NetFileInfo3 **info, + uint32 *count, uint32 *resume ) { struct file_enum_count fenum; TDB_CONTEXT *conn_tdb = conn_tdb_ctx(); @@ -102,8 +104,8 @@ static WERROR net_enum_pipes( TALLOC_CTX *ctx, FILE_INFO_3 **info, } fenum.ctx = ctx; - fenum.count = *count; fenum.info = *info; + fenum.count = *count; if (tdb_traverse(conn_tdb, pipe_enum_fn, &fenum) == -1) { DEBUG(0,("net_enum_pipes: traverse of connections.tdb failed with error %s.\n", @@ -131,7 +133,7 @@ static void enum_file_fn( const struct share_mode_entry *e, /* If the pid was not found delete the entry from connections.tdb */ if ( process_exists(e->pid) ) { - FILE_INFO_3 *f; + struct srvsvc_NetFileInfo3 *f; int i = fenum->count; files_struct fsp; struct byte_range_lock *brl; @@ -139,7 +141,7 @@ static void enum_file_fn( const struct share_mode_entry *e, pstring fullpath; uint32 permissions; - f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 ); + f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, struct srvsvc_NetFileInfo3, i+1 ); if ( !f ) { DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1)); return; @@ -167,13 +169,11 @@ static void enum_file_fn( const struct share_mode_entry *e, /* mask out create (what ever that is) */ permissions = e->share_access & (FILE_READ_DATA|FILE_WRITE_DATA); - /* now fill in the FILE_INFO_3 struct */ - init_srv_file_info3( &fenum->info[i], - e->share_file_id, - permissions, - num_locks, - uidtoname(e->uid), - fullpath ); + fenum->info[i].fid = e->share_file_id; + fenum->info[i].permissions = permissions; + fenum->info[i].num_locks = num_locks; + fenum->info[i].user = uidtoname(e->uid); + fenum->info[i].path = fullpath; fenum->count++; } @@ -185,8 +185,8 @@ static void enum_file_fn( const struct share_mode_entry *e, /******************************************************************* ********************************************************************/ -static WERROR net_enum_files( TALLOC_CTX *ctx, FILE_INFO_3 **info, - uint32 *count, uint32 resume ) +static WERROR net_enum_files( TALLOC_CTX *ctx, struct srvsvc_NetFileInfo3 **info, + uint32 *count, uint32 *resume ) { f_enum_cnt.ctx = ctx; f_enum_cnt.count = *count; @@ -225,41 +225,36 @@ static uint32 get_share_type(const struct share_params *params) Fill in a share info level 0 structure. ********************************************************************/ -static void init_srv_share_info_0(pipes_struct *p, SRV_SHARE_INFO_0 *sh0, +static void init_srv_share_info_0(pipes_struct *p, struct srvsvc_NetShareInfo0 *sh0, const struct share_params *params) { - char *net_name = lp_servicename(params->service); - init_srv_share_info0(&sh0->info_0, net_name); - init_srv_share_info0_str(&sh0->info_0_str, net_name); + sh0->name = lp_servicename(params->service); } /******************************************************************* Fill in a share info level 1 structure. ********************************************************************/ -static void init_srv_share_info_1(pipes_struct *p, SRV_SHARE_INFO_1 *sh1, +static void init_srv_share_info_1(pipes_struct *p, struct srvsvc_NetShareInfo1 *sh1, const struct share_params *params) { connection_struct *conn = p->conn; - char *net_name = lp_servicename(params->service); - char *remark; - remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)), + sh1->comment = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)), conn->user, conn->connectpath, conn->gid, get_current_username(), current_user_info.domain, lp_comment(params->service)); - init_srv_share_info1(&sh1->info_1, net_name, get_share_type(params), - remark); - init_srv_share_info1_str(&sh1->info_1_str, net_name, remark); + sh1->name = lp_servicename(params->service); + sh1->type = get_share_type(params); } /******************************************************************* Fill in a share info level 2 structure. ********************************************************************/ -static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2, +static void init_srv_share_info_2(pipes_struct *p, struct srvsvc_NetShareInfo2 *sh2, const struct share_params *params) { connection_struct *conn = p->conn; @@ -286,10 +281,14 @@ static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2, string_replace(path, '/', '\\'); count = count_current_connections( net_name, False ); - init_srv_share_info2(&sh2->info_2, net_name, get_share_type(params), - remark, 0, max_uses, count, path, ""); - - init_srv_share_info2_str(&sh2->info_2_str, net_name, remark, path, ""); + sh2->name = net_name; + sh2->type = get_share_type(params); + sh2->comment = remark; + sh2->permissions = 0; + sh2->max_users = max_uses; + sh2->current_users = count; + sh2->path = path; + sh2->password = ""; } /******************************************************************* @@ -321,7 +320,7 @@ static void map_generic_share_sd_bits(SEC_DESC *psd) Fill in a share info level 501 structure. ********************************************************************/ -static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501, +static void init_srv_share_info_501(pipes_struct *p, struct srvsvc_NetShareInfo501 *sh501, const struct share_params *params) { connection_struct *conn = p->conn; @@ -334,20 +333,24 @@ static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501, current_user_info.domain, lp_comment(params->service)); - init_srv_share_info501(&sh501->info_501, net_name, - get_share_type(params), remark, - (lp_csc_policy(params->service) << 4)); - init_srv_share_info501_str(&sh501->info_501_str, net_name, remark); + + sh501->name = net_name; + sh501->type = get_share_type(params); + sh501->comment = remark; + sh501->csc_policy = (lp_csc_policy(params->service) << 4); } /******************************************************************* Fill in a share info level 502 structure. ********************************************************************/ -static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, +static void init_srv_share_info_502(pipes_struct *p, struct srvsvc_NetShareInfo502 *sh502, const struct share_params *params) { + int max_connections = lp_max_connections(params->service); + uint32 max_uses = max_connections!=0 ? max_connections : 0xffffffff; connection_struct *conn = p->conn; + int count; char *net_name; char *remark; char *path; @@ -359,7 +362,8 @@ static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, ZERO_STRUCTP(sh502); net_name = lp_servicename(params->service); - + count = count_current_connections( net_name, False ); + remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)), conn->user, conn->connectpath, conn->gid, get_current_username(), @@ -379,11 +383,16 @@ static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, sd = get_share_security(ctx, lp_servicename(params->service), &sd_size); - init_srv_share_info502(&sh502->info_502, net_name, - get_share_type(params), remark, 0, 0xffffffff, - 1, path, "", sd, sd_size); - init_srv_share_info502_str(&sh502->info_502_str, net_name, remark, - path, "", sd, sd_size); + sh502->name = net_name; + sh502->type = get_share_type(params); + sh502->comment = remark; + sh502->path = path; + sh502->password = ""; + sh502->sd = sd; + sh502->permissions = 0; + sh502->max_users = max_uses; + sh502->current_users = count; + sh502->unknown = 1; } /*************************************************************************** @@ -391,7 +400,7 @@ static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, ***************************************************************************/ static void init_srv_share_info_1004(pipes_struct *p, - SRV_SHARE_INFO_1004* sh1004, + struct srvsvc_NetShareInfo1004* sh1004, const struct share_params *params) { connection_struct *conn = p->conn; @@ -404,9 +413,8 @@ static void init_srv_share_info_1004(pipes_struct *p, lp_comment(params->service)); ZERO_STRUCTP(sh1004); - - init_srv_share_info1004(&sh1004->info_1004, remark); - init_srv_share_info1004_str(&sh1004->info_1004_str, remark); + + sh1004->comment = remark; } /*************************************************************************** @@ -414,15 +422,15 @@ static void init_srv_share_info_1004(pipes_struct *p, ***************************************************************************/ static void init_srv_share_info_1005(pipes_struct *p, - SRV_SHARE_INFO_1005* sh1005, + struct srvsvc_NetShareInfo1005* sh1005, const struct share_params *params) { - sh1005->share_info_flags = 0; + sh1005->dfs_flags = 0; if(lp_host_msdfs() && lp_msdfs_root(params->service)) - sh1005->share_info_flags |= + sh1005->dfs_flags |= SHARE_1005_IN_DFS | SHARE_1005_DFS_ROOT; - sh1005->share_info_flags |= + sh1005->dfs_flags |= lp_csc_policy(params->service) << SHARE_1005_CSC_POLICY_SHIFT; } /*************************************************************************** @@ -430,10 +438,10 @@ static void init_srv_share_info_1005(pipes_struct *p, ***************************************************************************/ static void init_srv_share_info_1006(pipes_struct *p, - SRV_SHARE_INFO_1006* sh1006, + struct srvsvc_NetShareInfo1006* sh1006, const struct share_params *params) { - sh1006->max_uses = -1; + sh1006->max_users = -1; } /*************************************************************************** @@ -441,18 +449,15 @@ static void init_srv_share_info_1006(pipes_struct *p, ***************************************************************************/ static void init_srv_share_info_1007(pipes_struct *p, - SRV_SHARE_INFO_1007* sh1007, + struct srvsvc_NetShareInfo1007* sh1007, const struct share_params *params) { - pstring alternate_directory_name = ""; uint32 flags = 0; ZERO_STRUCTP(sh1007); - init_srv_share_info1007(&sh1007->info_1007, flags, - alternate_directory_name); - init_srv_share_info1007_str(&sh1007->info_1007_str, - alternate_directory_name); + sh1007->flags = flags; + sh1007->alternate_directory_name = ""; } /******************************************************************* @@ -460,7 +465,7 @@ static void init_srv_share_info_1007(pipes_struct *p, ********************************************************************/ static void init_srv_share_info_1501(pipes_struct *p, - SRV_SHARE_INFO_1501 *sh1501, + struct sec_desc_buf *sh1501, const struct share_params *params) { SEC_DESC *sd; @@ -472,7 +477,7 @@ static void init_srv_share_info_1501(pipes_struct *p, sd = get_share_security(ctx, lp_servicename(params->service), &sd_size); - sh1501->sdb = make_sec_desc_buf(p->mem_ctx, sd_size, sd); + sh1501->sd = sd; } /******************************************************************* @@ -491,20 +496,18 @@ static BOOL is_hidden_share(const struct share_params *params) ********************************************************************/ static WERROR init_srv_share_info_ctr(pipes_struct *p, - SRV_SHARE_INFO_CTR *ctr, + union srvsvc_NetShareCtr *ctr, uint32 info_level, uint32 *resume_hnd, uint32 *total_entries, BOOL all_shares) { - int num_entries = 0; TALLOC_CTX *ctx = p->mem_ctx; struct share_iterator *shares; struct share_params *share; DEBUG(5,("init_srv_share_info_ctr\n")); - ZERO_STRUCT(ctr->share); + ZERO_STRUCTP(ctr); - ctr->info_level = ctr->switch_value = info_level; *resume_hnd = 0; /* Ensure all the usershares are loaded. */ @@ -512,15 +515,50 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, load_usershare_shares(); unbecome_root(); - num_entries = 0; - - ZERO_STRUCT(ctr->share); + *total_entries = 0; if (!(shares = share_list_all(ctx))) { DEBUG(5, ("Could not list shares\n")); return WERR_ACCESS_DENIED; } + switch (info_level) { + case 0: + ctr->ctr0 = talloc_zero(p->mem_ctx, struct srvsvc_NetShareCtr0); + break; + case 1: + ctr->ctr1 = talloc_zero(p->mem_ctx, struct srvsvc_NetShareCtr1); + break; + case 2: + ctr->ctr2 = talloc_zero(p->mem_ctx, struct srvsvc_NetShareCtr2); + break; + case 501: + ctr->ctr501 = talloc_zero(p->mem_ctx, struct srvsvc_NetShareCtr501); + break; + case 502: + ctr->ctr502 = talloc_zero(p->mem_ctx, struct srvsvc_NetShareCtr502); + break; + case 1004: + ctr->ctr1004 = talloc_zero(p->mem_ctx, struct srvsvc_NetShareCtr1004); + break; + case 1005: + ctr->ctr1005 = talloc_zero(p->mem_ctx, struct srvsvc_NetShareCtr1005); + break; + case 1006: + ctr->ctr1006 = talloc_zero(p->mem_ctx, struct srvsvc_NetShareCtr1006); + break; + case 1007: + ctr->ctr1007 = talloc_zero(p->mem_ctx, struct srvsvc_NetShareCtr1007); + break; + case 1501: + ctr->ctr1501 = talloc_zero(p->mem_ctx, struct srvsvc_NetShareCtr1501); + break; + default: + DEBUG(5,("init_srv_share_info_ctr: unsupported switch " + "value %d\n", info_level)); + return WERR_UNKNOWN_LEVEL; + } + while ((share = next_share(shares)) != NULL) { if (!lp_browseable(share->service)) { continue; @@ -532,61 +570,66 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, switch (info_level) { case 0: { - SRV_SHARE_INFO_0 i; + struct srvsvc_NetShareInfo0 i; init_srv_share_info_0(p, &i, share); - ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_0, i, - &ctr->share.info0, &num_entries); - if (ctr->share.info0 == NULL) { + ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo0, i, + &ctr->ctr0->array, &ctr->ctr0->count); + if (ctr->ctr0->array == NULL) { return WERR_NOMEM; } + *total_entries = ctr->ctr0->count; break; } case 1: { - SRV_SHARE_INFO_1 i; + struct srvsvc_NetShareInfo1 i; init_srv_share_info_1(p, &i, share); - ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1, i, - &ctr->share.info1, &num_entries); - if (ctr->share.info1 == NULL) { + ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo1, i, + &ctr->ctr1->array, &ctr->ctr1->count); + if (ctr->ctr1->array == NULL) { return WERR_NOMEM; } + *total_entries = ctr->ctr1->count; break; } case 2: { - SRV_SHARE_INFO_2 i; + struct srvsvc_NetShareInfo2 i; init_srv_share_info_2(p, &i, share); - ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_2, i, - &ctr->share.info2, &num_entries); - if (ctr->share.info2 == NULL) { + ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo2, i, + &ctr->ctr2->array, &ctr->ctr2->count); + if (ctr->ctr2->array == NULL) { return WERR_NOMEM; } + *total_entries = ctr->ctr2->count; break; } case 501: { - SRV_SHARE_INFO_501 i; + struct srvsvc_NetShareInfo501 i; init_srv_share_info_501(p, &i, share); - ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_501, i, - &ctr->share.info501, &num_entries); - if (ctr->share.info501 == NULL) { + ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo501, i, + &ctr->ctr501->array, &ctr->ctr501->count); + if (ctr->ctr501->array == NULL) { return WERR_NOMEM; } + *total_entries = ctr->ctr501->count; break; } case 502: { - SRV_SHARE_INFO_502 i; + struct srvsvc_NetShareInfo502 i; init_srv_share_info_502(p, &i, share); - ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_502, i, - &ctr->share.info502, &num_entries); - if (ctr->share.info502 == NULL) { + ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo502, i, + &ctr->ctr502->array, &ctr->ctr502->count); + if (ctr->ctr502->array == NULL) { return WERR_NOMEM; } + *total_entries = ctr->ctr502->count; break; } @@ -595,176 +638,81 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, case 1004: { - SRV_SHARE_INFO_1004 i; + struct srvsvc_NetShareInfo1004 i; init_srv_share_info_1004(p, &i, share); - ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1004, i, - &ctr->share.info1004, &num_entries); - if (ctr->share.info1004 == NULL) { + ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo1004, i, + &ctr->ctr1004->array, &ctr->ctr1004->count); + if (ctr->ctr1004->array == NULL) { return WERR_NOMEM; } + *total_entries = ctr->ctr1004->count; break; } case 1005: { - SRV_SHARE_INFO_1005 i; + struct srvsvc_NetShareInfo1005 i; init_srv_share_info_1005(p, &i, share); - ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1005, i, - &ctr->share.info1005, &num_entries); - if (ctr->share.info1005 == NULL) { + ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo1005, i, + &ctr->ctr1005->array, &ctr->ctr1005->count); + if (ctr->ctr1005->array == NULL) { return WERR_NOMEM; } + *total_entries = ctr->ctr1005->count; break; } case 1006: { - SRV_SHARE_INFO_1006 i; + struct srvsvc_NetShareInfo1006 i; init_srv_share_info_1006(p, &i, share); - ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1006, i, - &ctr->share.info1006, &num_entries); - if (ctr->share.info1006 == NULL) { + ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo1006, i, + &ctr->ctr1006->array, &ctr->ctr1006->count); + if (ctr->ctr1006->array == NULL) { return WERR_NOMEM; } + *total_entries = ctr->ctr1006->count; break; } case 1007: { - SRV_SHARE_INFO_1007 i; + struct srvsvc_NetShareInfo1007 i; init_srv_share_info_1007(p, &i, share); - ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1007, i, - &ctr->share.info1007, &num_entries); - if (ctr->share.info1007 == NULL) { + ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo1007, i, + &ctr->ctr1007->array, &ctr->ctr1007->count); + if (ctr->ctr1007->array == NULL) { return WERR_NOMEM; } + *total_entries = ctr->ctr1007->count; break; } case 1501: { - SRV_SHARE_INFO_1501 i; + struct sec_desc_buf i; init_srv_share_info_1501(p, &i, share); - ADD_TO_ARRAY(ctx, SRV_SHARE_INFO_1501, i, - &ctr->share.info1501, &num_entries); - if (ctr->share.info1501 == NULL) { + ADD_TO_ARRAY(ctx, struct sec_desc_buf, i, + &ctr->ctr1501->array, &ctr->ctr1501->count); + if (ctr->ctr1501->array == NULL) { return WERR_NOMEM; } + *total_entries = ctr->ctr1501->count; break; } - default: - DEBUG(5,("init_srv_share_info_ctr: unsupported switch " - "value %d\n", info_level)); - return WERR_UNKNOWN_LEVEL; } TALLOC_FREE(share); } - *total_entries = num_entries; - ctr->num_entries2 = ctr->num_entries = num_entries; - ctr->ptr_share_info = ctr->ptr_entries = 1; - return WERR_OK; } -/******************************************************************* - Inits a SRV_R_NET_SHARE_ENUM structure. -********************************************************************/ - -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__)); - - r_n->status = init_srv_share_info_ctr(p, &r_n->ctr, info_level, - &resume_hnd, - &r_n->total_entries, all); - - init_enum_hnd(&r_n->enum_hnd, resume_hnd); -} - -/******************************************************************* - Inits a SRV_R_NET_SHARE_GET_INFO structure. -********************************************************************/ - -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) -{ - WERROR status = WERR_OK; - const struct share_params *params; - - DEBUG(5,("init_srv_r_net_share_get_info: %d\n", __LINE__)); - - r_n->info.switch_value = info_level; - - params = get_share_params(p->mem_ctx, share_name); - - if (params != NULL) { - switch (info_level) { - case 0: - init_srv_share_info_0(p, &r_n->info.share.info0, - params); - break; - case 1: - init_srv_share_info_1(p, &r_n->info.share.info1, - params); - break; - case 2: - init_srv_share_info_2(p, &r_n->info.share.info2, - params); - break; - case 501: - init_srv_share_info_501(p, &r_n->info.share.info501, - params); - break; - case 502: - init_srv_share_info_502(p, &r_n->info.share.info502, - params); - break; - - /* here for completeness */ - case 1004: - init_srv_share_info_1004(p, &r_n->info.share.info1004, - params); - break; - case 1005: - init_srv_share_info_1005(p, &r_n->info.share.info1005, - params); - break; - - /* here for completeness 1006 - 1501 */ - case 1006: - init_srv_share_info_1006(p, &r_n->info.share.info1006, - params); - break; - case 1007: - init_srv_share_info_1007(p, &r_n->info.share.info1007, - params); - break; - case 1501: - init_srv_share_info_1501(p, &r_n->info.share.info1501, - params); - break; - default: - DEBUG(5,("init_srv_net_share_get_info: unsupported " - "switch value %d\n", info_level)); - status = WERR_UNKNOWN_LEVEL; - break; - } - } else { - status = WERR_INVALID_NAME; - } - - r_n->info.ptr_share_ctr = W_ERROR_IS_OK(status) ? 1 : 0; - r_n->status = status; -} - /******************************************************************* fill in a sess info level 0 structure. ********************************************************************/ -static void init_srv_sess_info_0(SRV_SESS_INFO_0 *ss0, uint32 *snum, uint32 *stot) +static void init_srv_sess_info_0(pipes_struct *p, struct srvsvc_NetSessCtr0 *ss0, uint32 *snum, uint32 *stot) { struct sessionid *session_list; uint32 num_entries = 0; @@ -780,24 +728,23 @@ static void init_srv_sess_info_0(SRV_SESS_INFO_0 *ss0, uint32 *snum, uint32 *sto DEBUG(5,("init_srv_sess_0_ss0\n")); + ss0->array = talloc_array(p->mem_ctx, struct srvsvc_NetSessInfo0, *stot); + if (snum) { - for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) { - init_srv_sess_info0( &ss0->info_0[num_entries], session_list[(*snum)].remote_machine); + for (; (*snum) < (*stot); (*snum)++) { + ss0->array[num_entries].client = session_list[(*snum)].remote_machine; num_entries++; } - ss0->num_entries_read = num_entries; - ss0->ptr_sess_info = num_entries > 0 ? 1 : 0; - ss0->num_entries_read2 = num_entries; + ss0->count = num_entries; if ((*snum) >= (*stot)) { (*snum) = 0; } } else { - ss0->num_entries_read = 0; - ss0->ptr_sess_info = 0; - ss0->num_entries_read2 = 0; + ss0->array = NULL; + ss0->count = 0; } SAFE_FREE(session_list); } @@ -838,16 +785,15 @@ static int net_count_files( uid_t uid, pid_t pid ) fill in a sess info level 1 structure. ********************************************************************/ -static void init_srv_sess_info_1(SRV_SESS_INFO_1 *ss1, uint32 *snum, uint32 *stot) +static void init_srv_sess_info_1(pipes_struct *p, struct srvsvc_NetSessCtr1 *ss1, uint32 *snum, uint32 *stot) { struct sessionid *session_list; uint32 num_entries = 0; time_t now = time(NULL); if ( !snum ) { - ss1->num_entries_read = 0; - ss1->ptr_sess_info = 0; - ss1->num_entries_read2 = 0; + ss1->count = 0; + ss1->array = NULL; (*stot) = 0; @@ -860,9 +806,10 @@ static void init_srv_sess_info_1(SRV_SESS_INFO_1 *ss1, uint32 *snum, uint32 *sto } (*stot) = list_sessions(&session_list); - - for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) { + ss1->array = talloc_array(p->mem_ctx, struct srvsvc_NetSessInfo1, *stot); + + for (; (*snum) < (*stot); (*snum)++) { uint32 num_files; uint32 connect_time; struct passwd *pw = sys_getpwnam(session_list[*snum].username); @@ -878,19 +825,17 @@ static void init_srv_sess_info_1(SRV_SESS_INFO_1 *ss1, uint32 *snum, uint32 *sto num_files = net_count_files(pw->pw_uid, session_list[*snum].pid); guest = strequal( session_list[*snum].username, lp_guestaccount() ); - init_srv_sess_info1( &ss1->info_1[num_entries], - session_list[*snum].remote_machine, - session_list[*snum].username, - num_files, - connect_time, - 0, - guest); + ss1->array[num_entries].client = session_list[*snum].remote_machine; + ss1->array[num_entries].user = session_list[*snum].username; + ss1->array[num_entries].num_open = num_files; + ss1->array[num_entries].time = connect_time; + ss1->array[num_entries].idle_time = 0; + ss1->array[num_entries].user_flags = guest; + num_entries++; } - ss1->num_entries_read = num_entries; - ss1->ptr_sess_info = num_entries > 0 ? 1 : 0; - ss1->num_entries_read2 = num_entries; + ss1->count = num_entries; if ((*snum) >= (*stot)) { (*snum) = 0; @@ -903,28 +848,26 @@ static void init_srv_sess_info_1(SRV_SESS_INFO_1 *ss1, uint32 *snum, uint32 *sto makes a SRV_R_NET_SESS_ENUM structure. ********************************************************************/ -static WERROR init_srv_sess_info_ctr(SRV_SESS_INFO_CTR *ctr, +static WERROR init_srv_sess_info_ctr(pipes_struct *p, union srvsvc_NetSessCtr *ctr, int switch_value, uint32 *resume_hnd, uint32 *total_entries) { WERROR status = WERR_OK; DEBUG(5,("init_srv_sess_info_ctr: %d\n", __LINE__)); - ctr->switch_value = switch_value; - switch (switch_value) { case 0: - init_srv_sess_info_0(&(ctr->sess.info0), resume_hnd, total_entries); - ctr->ptr_sess_ctr = 1; + ctr->ctr0 = talloc(p->mem_ctx, struct srvsvc_NetSessCtr0); + init_srv_sess_info_0(p, ctr->ctr0, resume_hnd, total_entries); break; case 1: - init_srv_sess_info_1(&(ctr->sess.info1), resume_hnd, total_entries); - ctr->ptr_sess_ctr = 1; + ctr->ctr1 = talloc(p->mem_ctx, struct srvsvc_NetSessCtr1); + init_srv_sess_info_1(p, ctr->ctr1, resume_hnd, total_entries); break; default: DEBUG(5,("init_srv_sess_info_ctr: unsupported switch value %d\n", switch_value)); (*resume_hnd) = 0; (*total_entries) = 0; - ctr->ptr_sess_ctr = 0; + ctr->ctr0 = NULL; status = WERR_UNKNOWN_LEVEL; break; } @@ -932,33 +875,11 @@ static WERROR init_srv_sess_info_ctr(SRV_SESS_INFO_CTR *ctr, return status; } -/******************************************************************* - makes a SRV_R_NET_SESS_ENUM structure. -********************************************************************/ - -static void init_srv_r_net_sess_enum(SRV_R_NET_SESS_ENUM *r_n, - uint32 resume_hnd, int sess_level, int switch_value) -{ - DEBUG(5,("init_srv_r_net_sess_enum: %d\n", __LINE__)); - - r_n->sess_level = sess_level; - - if (sess_level == -1) - r_n->status = WERR_UNKNOWN_LEVEL; - else - r_n->status = init_srv_sess_info_ctr(r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries); - - if (!W_ERROR_IS_OK(r_n->status)) - resume_hnd = 0; - - init_enum_hnd(&r_n->enum_hnd, resume_hnd); -} - /******************************************************************* fill in a conn info level 0 structure. ********************************************************************/ -static void init_srv_conn_info_0(SRV_CONN_INFO_0 *ss0, uint32 *snum, uint32 *stot) +static void init_srv_conn_info_0(pipes_struct *p, struct srvsvc_NetConnCtr0 *ss0, uint32 *snum, uint32 *stot) { uint32 num_entries = 0; (*stot) = 1; @@ -971,27 +892,25 @@ static void init_srv_conn_info_0(SRV_CONN_INFO_0 *ss0, uint32 *snum, uint32 *sto DEBUG(5,("init_srv_conn_0_ss0\n")); if (snum) { - for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) { + ss0->array = talloc_array(p->mem_ctx, struct srvsvc_NetConnInfo0, *stot); + for (; (*snum) < (*stot); (*snum)++) { - init_srv_conn_info0(&ss0->info_0[num_entries], (*stot)); + ss0->array[num_entries].conn_id = (*stot); /* move on to creating next connection */ /* move on to creating next conn */ num_entries++; } - ss0->num_entries_read = num_entries; - ss0->ptr_conn_info = num_entries > 0 ? 1 : 0; - ss0->num_entries_read2 = num_entries; + ss0->count = num_entries; if ((*snum) >= (*stot)) { (*snum) = 0; } } else { - ss0->num_entries_read = 0; - ss0->ptr_conn_info = 0; - ss0->num_entries_read2 = 0; + ss0->array = NULL; + ss0->count = 0; (*stot) = 0; } @@ -1001,20 +920,7 @@ static void init_srv_conn_info_0(SRV_CONN_INFO_0 *ss0, uint32 *snum, uint32 *sto fill in a conn info level 1 structure. ********************************************************************/ -static void init_srv_conn_1_info(CONN_INFO_1 *se1, CONN_INFO_1_STR *str1, - uint32 id, uint32 type, - uint32 num_opens, uint32 num_users, uint32 open_time, - const char *usr_name, const char *net_name) -{ - init_srv_conn_info1(se1 , id, type, num_opens, num_users, open_time, usr_name, net_name); - init_srv_conn_info1_str(str1, usr_name, net_name); -} - -/******************************************************************* - fill in a conn info level 1 structure. - ********************************************************************/ - -static void init_srv_conn_info_1(SRV_CONN_INFO_1 *ss1, uint32 *snum, uint32 *stot) +static void init_srv_conn_info_1(pipes_struct *p, struct srvsvc_NetConnCtr1 *ss1, uint32 *snum, uint32 *stot) { uint32 num_entries = 0; (*stot) = 1; @@ -1027,29 +933,30 @@ static void init_srv_conn_info_1(SRV_CONN_INFO_1 *ss1, uint32 *snum, uint32 *sto DEBUG(5,("init_srv_conn_1_ss1\n")); if (snum) { - for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) { - init_srv_conn_1_info(&ss1->info_1[num_entries], - &ss1->info_1_str[num_entries], - (*stot), 0x3, 1, 1, 3,"dummy_user", "IPC$"); + ss1->array = talloc_array(p->mem_ctx, struct srvsvc_NetConnInfo1, *stot); + for (; (*snum) < (*stot); (*snum)++) { + ss1->array[num_entries].conn_id = (*stot); + ss1->array[num_entries].conn_type = 0x3; + ss1->array[num_entries].num_open = 1; + ss1->array[num_entries].num_users = 1; + ss1->array[num_entries].conn_time = 3; + ss1->array[num_entries].user = "dummy_user"; + ss1->array[num_entries].share = "IPC$"; /* move on to creating next connection */ /* move on to creating next conn */ num_entries++; } - ss1->num_entries_read = num_entries; - ss1->ptr_conn_info = num_entries > 0 ? 1 : 0; - ss1->num_entries_read2 = num_entries; - + ss1->count = num_entries; if ((*snum) >= (*stot)) { (*snum) = 0; } } else { - ss1->num_entries_read = 0; - ss1->ptr_conn_info = 0; - ss1->num_entries_read2 = 0; + ss1->count = 0; + ss1->array = NULL; (*stot) = 0; } @@ -1059,28 +966,24 @@ static void init_srv_conn_info_1(SRV_CONN_INFO_1 *ss1, uint32 *snum, uint32 *sto makes a SRV_R_NET_CONN_ENUM structure. ********************************************************************/ -static WERROR init_srv_conn_info_ctr(SRV_CONN_INFO_CTR *ctr, +static WERROR init_srv_conn_info_ctr(pipes_struct *p, union srvsvc_NetConnCtr *ctr, int switch_value, uint32 *resume_hnd, uint32 *total_entries) { WERROR status = WERR_OK; DEBUG(5,("init_srv_conn_info_ctr: %d\n", __LINE__)); - ctr->switch_value = switch_value; - switch (switch_value) { case 0: - init_srv_conn_info_0(&ctr->conn.info0, resume_hnd, total_entries); - ctr->ptr_conn_ctr = 1; + init_srv_conn_info_0(p, ctr->ctr0, resume_hnd, total_entries); break; case 1: - init_srv_conn_info_1(&ctr->conn.info1, resume_hnd, total_entries); - ctr->ptr_conn_ctr = 1; + init_srv_conn_info_1(p, ctr->ctr1, resume_hnd, total_entries); break; default: DEBUG(5,("init_srv_conn_info_ctr: unsupported switch value %d\n", switch_value)); - (*resume_hnd = 0); + ctr->ctr0 = NULL; + (*resume_hnd) = 0; (*total_entries) = 0; - ctr->ptr_conn_ctr = 0; status = WERR_UNKNOWN_LEVEL; break; } @@ -1088,73 +991,42 @@ static WERROR init_srv_conn_info_ctr(SRV_CONN_INFO_CTR *ctr, return status; } -/******************************************************************* - makes a SRV_R_NET_CONN_ENUM structure. -********************************************************************/ - -static void init_srv_r_net_conn_enum(SRV_R_NET_CONN_ENUM *r_n, - uint32 resume_hnd, int conn_level, int switch_value) -{ - DEBUG(5,("init_srv_r_net_conn_enum: %d\n", __LINE__)); - - r_n->conn_level = conn_level; - if (conn_level == -1) - r_n->status = WERR_UNKNOWN_LEVEL; - else - r_n->status = init_srv_conn_info_ctr(r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries); - - if (!W_ERROR_IS_OK(r_n->status)) - resume_hnd = 0; - - init_enum_hnd(&r_n->enum_hnd, resume_hnd); -} - /******************************************************************* makes a SRV_R_NET_FILE_ENUM structure. ********************************************************************/ -static WERROR net_file_enum_3( SRV_R_NET_FILE_ENUM *r, uint32 resume_hnd ) +static WERROR net_file_enum_3(pipes_struct *p, union srvsvc_NetFileCtr *ctr, uint32 *resume_hnd, uint32 *num_entries ) { TALLOC_CTX *ctx = get_talloc_ctx(); - SRV_FILE_INFO_CTR *ctr = &r->ctr; + WERROR status; /* TODO -- Windows enumerates (b) active pipes (c) open directories and files */ - r->status = net_enum_files( ctx, &ctr->file.info3, &ctr->num_entries, resume_hnd ); - if ( !W_ERROR_IS_OK(r->status)) - goto done; - - r->status = net_enum_pipes( ctx, &ctr->file.info3, &ctr->num_entries, resume_hnd ); - if ( !W_ERROR_IS_OK(r->status)) - goto done; + ctr->ctr3 = talloc_zero(p->mem_ctx, struct srvsvc_NetFileCtr3); - r->level = ctr->level = 3; - r->total_entries = ctr->num_entries; - /* ctr->num_entries = r->total_entries - resume_hnd; */ - ctr->num_entries2 = ctr->num_entries; - ctr->ptr_file_info = 1; - - r->status = WERR_OK; - -done: - if ( ctr->num_entries > 0 ) - ctr->ptr_entries = 1; - - init_enum_hnd(&r->enum_hnd, 0); + status = net_enum_files( ctx, &ctr->ctr3->array, num_entries, resume_hnd ); + if ( !W_ERROR_IS_OK(status)) + return status; + + status = net_enum_pipes( ctx, &ctr->ctr3->array, num_entries, resume_hnd ); + if ( !W_ERROR_IS_OK(status)) + return status; - return r->status; + ctr->ctr3->count = *num_entries; + + return WERR_OK; } /******************************************************************* *******************************************************************/ -WERROR _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_FILE_ENUM *r_u) +WERROR _srvsvc_NetFileEnum(pipes_struct *p, const char *server_unc, const char *path, const char *user, uint32_t *level, union srvsvc_NetFileCtr *ctr, uint32_t max_buffer, uint32_t *totalentries, uint32_t *resume_handle) { - switch ( q_u->level ) { + switch ( *level ) { case 3: - return net_file_enum_3( r_u, get_enum_hnd(&q_u->enum_hnd) ); + return net_file_enum_3(p, ctr, resume_handle, totalentries ); default: return WERR_UNKNOWN_LEVEL; } @@ -1166,15 +1038,11 @@ WERROR _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_F net server get info ********************************************************************/ -WERROR _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV_R_NET_SRV_GET_INFO *r_u) +WERROR _srvsvc_NetSrvGetInfo(pipes_struct *p, const char *server_unc, uint32_t level, union srvsvc_NetSrvInfo *info) { WERROR status = WERR_OK; - SRV_INFO_CTR *ctr = TALLOC_P(p->mem_ctx, SRV_INFO_CTR); - if (!ctr) - return WERR_NOMEM; - - ZERO_STRUCTP(ctr); + ZERO_STRUCTP(info); DEBUG(5,("srv_net_srv_get_info: %d\n", __LINE__)); @@ -1183,131 +1051,106 @@ WERROR _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV_R return WERR_ACCESS_DENIED; } - switch (q_u->switch_value) { + switch (level) { /* Technically level 102 should only be available to Administrators but there isn't anything super-secret here, as most of it is made up. */ case 102: - init_srv_info_102(&ctr->srv.sv102, - 500, global_myname(), - string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH), - lp_major_announce_version(), lp_minor_announce_version(), - lp_default_server_announce(), - 0xffffffff, /* users */ - 0xf, /* disc */ - 0, /* hidden */ - 240, /* announce */ - 3000, /* announce delta */ - 100000, /* licenses */ - "c:\\"); /* user path */ + info->info102 = talloc_zero(p->mem_ctx, struct srvsvc_NetSrvInfo102); + + info->info102->platform_id = 500; + info->info102->version_major = lp_major_announce_version(); + info->info102->version_minor = lp_minor_announce_version(); + info->info102->server_name = global_myname(); + info->info102->server_type = lp_default_server_announce(); + info->info102->userpath = "C:\\"; + info->info102->licenses = 10000; + info->info102->anndelta = 3000; + info->info102->disc = 0xf; + info->info102->users = 0xffffffff; + info->info102->hidden = 0; + info->info102->announce = 240; + info->info102->comment = lp_serverstring(); break; case 101: - init_srv_info_101(&ctr->srv.sv101, - 500, global_myname(), - lp_major_announce_version(), lp_minor_announce_version(), - lp_default_server_announce(), - string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH)); + info->info101 = talloc_zero(p->mem_ctx, struct srvsvc_NetSrvInfo101); + info->info101->platform_id = 500; + info->info101->server_name = global_myname(); + info->info101->version_major = lp_major_announce_version(); + info->info101->version_minor = lp_minor_announce_version(); + info->info101->server_type = lp_default_server_announce(); + info->info101->comment = lp_serverstring(); break; case 100: - init_srv_info_100(&ctr->srv.sv100, 500, global_myname()); + info->info100 = talloc_zero(p->mem_ctx, struct srvsvc_NetSrvInfo100); + info->info100->platform_id = 500; + info->info100->server_name = global_myname(); break; default: - status = WERR_UNKNOWN_LEVEL; + return WERR_UNKNOWN_LEVEL; break; } - /* set up the net server get info structure */ - init_srv_r_net_srv_get_info(r_u, q_u->switch_value, ctr, status); - DEBUG(5,("srv_net_srv_get_info: %d\n", __LINE__)); - return r_u->status; + return status; } /******************************************************************* net server set info ********************************************************************/ -WERROR _srv_net_srv_set_info(pipes_struct *p, SRV_Q_NET_SRV_SET_INFO *q_u, SRV_R_NET_SRV_SET_INFO *r_u) +WERROR _srvsvc_NetSrvSetInfo(pipes_struct *p, const char *server_unc, uint32_t level, union srvsvc_NetSrvInfo info, uint32_t *parm_error) { - WERROR status = WERR_OK; - - DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__)); - /* Set up the net server set info structure. */ - - init_srv_r_net_srv_set_info(r_u, 0x0, status); - - DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__)); - - return r_u->status; + *parm_error = 0; + return WERR_OK; } /******************************************************************* net conn enum ********************************************************************/ -WERROR _srv_net_conn_enum(pipes_struct *p, SRV_Q_NET_CONN_ENUM *q_u, SRV_R_NET_CONN_ENUM *r_u) +WERROR _srvsvc_NetConnEnum(pipes_struct *p, const char *server_unc, const char *path, uint32_t *level, union srvsvc_NetConnCtr *ctr, uint32_t max_buffer, uint32_t *totalentries, uint32_t *resume_handle) { DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__)); - r_u->ctr = TALLOC_P(p->mem_ctx, SRV_CONN_INFO_CTR); - if (!r_u->ctr) - return WERR_NOMEM; - - ZERO_STRUCTP(r_u->ctr); + ZERO_STRUCTP(ctr); /* set up the */ - init_srv_r_net_conn_enum(r_u, - get_enum_hnd(&q_u->enum_hnd), - q_u->conn_level, - q_u->ctr->switch_value); - - DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__)); - - return r_u->status; + return init_srv_conn_info_ctr(p, ctr, *level, resume_handle, totalentries); } /******************************************************************* net sess enum ********************************************************************/ -WERROR _srv_net_sess_enum(pipes_struct *p, SRV_Q_NET_SESS_ENUM *q_u, SRV_R_NET_SESS_ENUM *r_u) +WERROR _srvsvc_NetSessEnum(pipes_struct *p, const char *server_unc, const char *client, const char *user, uint32_t *level, union srvsvc_NetSessCtr *ctr, uint32_t max_buffer, uint32_t *totalentries, uint32_t *resume_handle) { DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__)); - r_u->ctr = TALLOC_P(p->mem_ctx, SRV_SESS_INFO_CTR); - if (!r_u->ctr) - return WERR_NOMEM; - - ZERO_STRUCTP(r_u->ctr); + ZERO_STRUCTP(ctr); /* set up the */ - init_srv_r_net_sess_enum(r_u, - get_enum_hnd(&q_u->enum_hnd), - q_u->sess_level, - q_u->ctr->switch_value); - - DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__)); - - return r_u->status; + return init_srv_sess_info_ctr(p, ctr, + *level, + resume_handle, + totalentries); } /******************************************************************* net sess del ********************************************************************/ -WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SESS_DEL *r_u) +WERROR _srvsvc_NetSessDel(pipes_struct *p, const char *server_unc, const char *client, const char *user) { struct sessionid *session_list; int num_sessions, snum; - fstring username; - fstring machine; + WERROR status; - rpcstr_pull_unistr2_fstring(username, &q_u->uni_user_name); - rpcstr_pull_unistr2_fstring(machine, &q_u->uni_cli_name); + char *machine = talloc_strdup(p->mem_ctx, server_unc); /* strip leading backslashes if any */ while (machine[0] == '\\') { @@ -1318,7 +1161,7 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__)); - r_u->status = WERR_ACCESS_DENIED; + status = WERR_ACCESS_DENIED; /* fail out now if you are not root or not a domain admin */ @@ -1330,11 +1173,11 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES for (snum = 0; snum < num_sessions; snum++) { - if ((strequal(session_list[snum].username, username) || username[0] == '\0' ) && + if ((strequal(session_list[snum].username, user) || user[0] == '\0' ) && strequal(session_list[snum].remote_machine, machine)) { if (message_send_pid(pid_to_procid(session_list[snum].pid), MSG_SHUTDOWN, NULL, 0, False)) - r_u->status = WERR_OK; + status = WERR_OK; } } @@ -1344,14 +1187,14 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES done: SAFE_FREE(session_list); - return r_u->status; + return status; } /******************************************************************* Net share enum all. ********************************************************************/ -WERROR _srv_net_share_enum_all(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u) +WERROR _srvsvc_NetShareEnumAll(pipes_struct *p, const char *server_unc, uint32_t *level, union srvsvc_NetShareCtr *ctr, uint32_t max_buffer, uint32_t *totalentries, uint32_t *resume_handle) { DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__)); @@ -1361,20 +1204,15 @@ WERROR _srv_net_share_enum_all(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R } /* Create the list of shares for the response. */ - init_srv_r_net_share_enum(p, r_u, - q_u->ctr.info_level, - get_enum_hnd(&q_u->enum_hnd), True); - - DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__)); - - return r_u->status; + return init_srv_share_info_ctr(p, ctr, *level, + resume_handle, totalentries, True); } /******************************************************************* Net share enum. ********************************************************************/ -WERROR _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u) +WERROR _srvsvc_NetShareEnum(pipes_struct *p, const char *server_unc, uint32_t *level, union srvsvc_NetShareCtr *ctr, uint32_t max_buffer, uint32_t *totalentries, uint32_t *resume_handle) { DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__)); @@ -1384,32 +1222,87 @@ WERROR _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET } /* Create the list of shares for the response. */ - init_srv_r_net_share_enum(p, r_u, - q_u->ctr.info_level, - get_enum_hnd(&q_u->enum_hnd), False); - - DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__)); - - return r_u->status; + return init_srv_share_info_ctr(p, ctr, *level, + resume_handle, totalentries, False); } /******************************************************************* Net share get info. ********************************************************************/ -WERROR _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, SRV_R_NET_SHARE_GET_INFO *r_u) +WERROR _srvsvc_NetShareGetInfo(pipes_struct *p, const char *server_unc, const char *share_name, uint32_t level, union srvsvc_NetShareInfo *info) { - fstring share_name; + const struct share_params *params; - DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__)); + params = get_share_params(p->mem_ctx, share_name); - /* 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, r_u, share_name, q_u->info_level); + if (params != NULL) { + switch (level) { + case 0: + info->info0 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo0); + init_srv_share_info_0(p, info->info0, + params); + break; + case 1: + info->info1 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1); + init_srv_share_info_1(p, info->info1, + params); + break; + case 2: + info->info2 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo2); + init_srv_share_info_2(p, info->info2, + params); + break; + case 501: + info->info501 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo501); + init_srv_share_info_501(p, info->info501, + params); + break; + case 502: + info->info502 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo502); + init_srv_share_info_502(p, info->info502, + params); + break; + + /* here for completeness */ + case 1004: + info->info1004 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1004); + init_srv_share_info_1004(p, info->info1004, + params); + break; + case 1005: + info->info1005 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1005); + init_srv_share_info_1005(p, info->info1005, + params); + break; - DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__)); + /* here for completeness 1006 - 1501 */ + case 1006: + info->info1006 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1006); + init_srv_share_info_1006(p, info->info1006, + params); + break; + case 1007: + info->info1007 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1007); + init_srv_share_info_1007(p, info->info1007, + params); + break; + case 1501: + info->info1501 = talloc(p->mem_ctx, struct sec_desc_buf); + init_srv_share_info_1501(p, info->info1501, + params); + break; + default: + DEBUG(5,("init_srv_net_share_get_info: unsupported " + "switch value %d\n", level)); + return WERR_UNKNOWN_LEVEL; + break; + } + } else { + return WERR_INVALID_NAME; + } - return r_u->status; + return WERR_OK; } /******************************************************************* @@ -1440,11 +1333,10 @@ char *valid_share_pathname(char *dos_pathname) Net share set info. Modify share details. ********************************************************************/ -WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, SRV_R_NET_SHARE_SET_INFO *r_u) +WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, const char *server_unc, const char *share_name, uint32_t level, union srvsvc_NetShareInfo info, uint32_t *parm_error) { pstring command; - fstring share_name; - fstring comment; + pstring comment; pstring pathname; int type; int snum; @@ -1454,12 +1346,11 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S SE_PRIV se_diskop = SE_DISK_OPERATOR; BOOL is_disk_op = False; int max_connections = 0; + fstring tmp_share_name; DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); - unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name)); - - r_u->parm_error = 0; + *parm_error = 0; if ( strequal(share_name,"IPC$") || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) @@ -1468,7 +1359,8 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S return WERR_ACCESS_DENIED; } - snum = find_service(share_name); + fstrcpy(tmp_share_name, share_name); + snum = find_service(tmp_share_name); /* Does this share exist ? */ if (snum < 0) @@ -1485,18 +1377,18 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S if ( p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op ) return WERR_ACCESS_DENIED; - switch (q_u->info_level) { + switch (level) { case 1: pstrcpy(pathname, lp_pathname(snum)); - unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(comment)); - type = q_u->info.share.info2.info_2.type; + pstrcpy(comment, info.info1->comment); + type = info.info1->type; psd = NULL; break; case 2: - unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(comment)); - unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(pathname)); - type = q_u->info.share.info2.info_2.type; - max_connections = (q_u->info.share.info2.info_2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.info_2.max_uses; + pstrcpy(comment, info.info2->comment); + pstrcpy(pathname, info.info2->path); + type = info.info2->type; + max_connections = (info.info2->max_users == 0xffffffff) ? 0 : info.info2->max_users; psd = NULL; break; #if 0 @@ -1508,15 +1400,15 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S break; #endif case 502: - unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(comment)); - unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(pathname)); - type = q_u->info.share.info502.info_502.type; - psd = q_u->info.share.info502.info_502_str.sd; + pstrcpy(comment, info.info502->comment); + pstrcpy(pathname, info.info502->path); + type = info.info502->type; + psd = info.info502->sd; map_generic_share_sd_bits(psd); break; case 1004: pstrcpy(pathname, lp_pathname(snum)); - unistr2_to_ascii(comment, &q_u->info.share.info1004.info_1004_str.uni_remark, sizeof(comment)); + pstrcpy(comment, info.info1004->comment); type = STYPE_DISKTREE; break; case 1005: @@ -1524,7 +1416,7 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S user, so we must compare it to see if it's what is set in smb.conf, so that we can contine other ops like setting ACLs on a share */ - if (((q_u->info.share.info1005.share_info_flags & + if (((info.info1005->dfs_flags & SHARE_1005_CSC_POLICY_MASK) >> SHARE_1005_CSC_POLICY_SHIFT) == lp_csc_policy(snum)) return WERR_OK; @@ -1537,13 +1429,13 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S return WERR_ACCESS_DENIED; case 1501: pstrcpy(pathname, lp_pathname(snum)); - fstrcpy(comment, lp_comment(snum)); - psd = q_u->info.share.info1501.sdb->sd; + pstrcpy(comment, lp_comment(snum)); + psd = info.info1501->sd; map_generic_share_sd_bits(psd); type = STYPE_DISKTREE; break; default: - DEBUG(5,("_srv_net_share_set_info: unsupported switch value %d\n", q_u->info_level)); + DEBUG(5,("_srv_net_share_set_info: unsupported switch value %d\n", level)); return WERR_UNKNOWN_LEVEL; } @@ -1556,7 +1448,7 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S return WERR_OBJECT_PATH_INVALID; /* Ensure share name, pathname and comment don't contain '"' characters. */ - string_replace(share_name, '"', ' '); + string_replace(tmp_share_name, '"', ' '); string_replace(path, '"', ' '); string_replace(comment, '"', ' '); @@ -1626,16 +1518,16 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S "comment" "max connections = " ********************************************************************/ -WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_SHARE_ADD *r_u) +WERROR _srvsvc_NetShareAdd(pipes_struct *p, const char *server_unc, uint32_t level, union srvsvc_NetShareInfo info, uint32_t *parm_error) { pstring command; - fstring share_name; - fstring comment; + pstring share_name; + pstring comment; pstring pathname; + char *path; int type; int snum; int ret; - char *path; SEC_DESC *psd = NULL; SE_PRIV se_diskop = SE_DISK_OPERATOR; BOOL is_disk_op; @@ -1643,7 +1535,7 @@ WERROR _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__)); - r_u->parm_error = 0; + *parm_error = 0; is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); @@ -1655,7 +1547,7 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S return WERR_ACCESS_DENIED; } - switch (q_u->info_level) { + switch (level) { case 0: /* No path. Not enough info in a level 0 to do anything. */ return WERR_ACCESS_DENIED; @@ -1663,21 +1555,21 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S /* Not enough info in a level 1 to do anything. */ return WERR_ACCESS_DENIED; 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)); - unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(share_name)); - max_connections = (q_u->info.share.info2.info_2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.info_2.max_uses; - type = q_u->info.share.info2.info_2.type; + pstrcpy(share_name, info.info2->name); + pstrcpy(comment, info.info2->comment); + pstrcpy(pathname, info.info2->path); + max_connections = (info.info2->max_users == 0xffffffff) ? 0 : info.info2->max_users; + type = info.info2->type; break; case 501: /* No path. Not enough info in a level 501 to do anything. */ return WERR_ACCESS_DENIED; case 502: - unistr2_to_ascii(share_name, &q_u->info.share.info502.info_502_str.uni_netname, sizeof(share_name)); - unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(share_name)); - unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(share_name)); - type = q_u->info.share.info502.info_502.type; - psd = q_u->info.share.info502.info_502_str.sd; + pstrcpy(share_name, info.info502->name); + pstrcpy(comment, info.info502->comment); + pstrcpy(pathname, info.info502->path); + type = info.info502->type; + psd = info.info502->sd; map_generic_share_sd_bits(psd); break; @@ -1692,7 +1584,7 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S /* DFS only level. */ return WERR_ACCESS_DENIED; default: - DEBUG(5,("_srv_net_share_add: unsupported switch value %d\n", q_u->info_level)); + DEBUG(5,("_srv_net_share_add: unsupported switch value %d\n", level)); return WERR_UNKNOWN_LEVEL; } @@ -1780,19 +1672,17 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S a parameter. ********************************************************************/ -WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u) +WERROR _srvsvc_NetShareDel(pipes_struct *p, const char *server_unc, const char *share_name, uint32_t reserved) { pstring command; - fstring share_name; int ret; int snum; SE_PRIV se_diskop = SE_DISK_OPERATOR; BOOL is_disk_op; + fstring tmp_share_name; DEBUG(5,("_srv_net_share_del: %d\n", __LINE__)); - unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name)); - if ( strequal(share_name,"IPC$") || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) || strequal(share_name,"global") ) @@ -1800,7 +1690,8 @@ WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S return WERR_ACCESS_DENIED; } - snum = find_service(share_name); + fstrcpy(tmp_share_name, share_name); + snum = find_service(tmp_share_name); if (snum < 0) return WERR_NO_SUCH_SHARE; @@ -1852,22 +1743,22 @@ WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S return WERR_OK; } -WERROR _srv_net_share_del_sticky(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u) +WERROR _srvsvc_NetShareDelSticky(pipes_struct *p, const char *server_unc, const char *share_name, uint32_t reserved) { DEBUG(5,("_srv_net_share_del_stick: %d\n", __LINE__)); - return _srv_net_share_del(p, q_u, r_u); + return _srvsvc_NetShareDel(p, server_unc, share_name, reserved); } /******************************************************************* time of day ********************************************************************/ -WERROR _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET_REMOTE_TOD *r_u) +WERROR _srvsvc_NetRemoteTOD(pipes_struct *p, const char *server_unc, struct srvsvc_NetRemoteTODInfo *tod) { - TIME_OF_DAY_INFO *tod; struct tm *t; time_t unixdate = time(NULL); + WERROR status = WERR_OK; /* We do this call first as if we do it *after* the gmtime call it overwrites the pointed-to values. JRA */ @@ -1876,101 +1767,87 @@ WERROR _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__)); - if ( !(tod = TALLOC_ZERO_P(p->mem_ctx, TIME_OF_DAY_INFO)) ) - return WERR_NOMEM; - - r_u->tod = tod; - r_u->ptr_srv_tod = 0x1; - r_u->status = WERR_OK; - - DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__)); - t = gmtime(&unixdate); /* set up the */ - init_time_of_day_info(tod, - unixdate, - 0, - t->tm_hour, - t->tm_min, - t->tm_sec, - 0, - zone, - 10000, - t->tm_mday, - t->tm_mon + 1, - 1900+t->tm_year, - t->tm_wday); + tod->elapsed = unixdate; + tod->msecs = 0; + tod->hours = t->tm_hour; + tod->mins = t->tm_min; + tod->secs = t->tm_sec; + tod->hunds = 0; + tod->timezone = zone; + tod->tinterval = 10000; + tod->day = t->tm_mday; + tod->month = t->tm_mon + 1; + tod->year = 1900+t->tm_year; + tod->weekday = t->tm_wday; DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__)); - return r_u->status; + return status; } /*********************************************************************************** Win9x NT tools get security descriptor. ***********************************************************************************/ -WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC *q_u, - SRV_R_NET_FILE_QUERY_SECDESC *r_u) +WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, const char *server_unc, const char *share, const char *file, uint32_t securityinformation, struct sec_desc_buf *sd_buf) { SEC_DESC *psd = NULL; size_t sd_size; DATA_BLOB null_pw; - pstring filename; - pstring qualname; files_struct *fsp = NULL; SMB_STRUCT_STAT st; BOOL bad_path; NTSTATUS nt_status; connection_struct *conn = NULL; BOOL became_user = False; + WERROR status = WERR_OK; + pstring tmp_file; ZERO_STRUCT(st); - r_u->status = WERR_OK; - - unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname)); /* Null password is ok - we are already an authenticated user... */ null_pw = data_blob(NULL, 0); become_root(); - conn = make_connection(qualname, null_pw, "A:", p->pipe_user.vuid, &nt_status); + conn = make_connection(share, null_pw, "A:", p->pipe_user.vuid, &nt_status); unbecome_root(); if (conn == NULL) { - DEBUG(3,("_srv_net_file_query_secdesc: Unable to connect to %s\n", qualname)); - r_u->status = ntstatus_to_werror(nt_status); + DEBUG(3,("_srv_net_file_query_secdesc: Unable to connect to %s\n", share)); + status = ntstatus_to_werror(nt_status); goto error_exit; } if (!become_user(conn, conn->vuid)) { DEBUG(0,("_srv_net_file_query_secdesc: Can't become connected user!\n")); - r_u->status = WERR_ACCESS_DENIED; + status = WERR_ACCESS_DENIED; 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); + pstrcpy(tmp_file, file); + unix_convert(tmp_file, conn, NULL, &bad_path, &st); if (bad_path) { - DEBUG(3,("_srv_net_file_query_secdesc: bad pathname %s\n", filename)); - r_u->status = WERR_ACCESS_DENIED; + DEBUG(3,("_srv_net_file_query_secdesc: bad pathname %s\n", file)); + status = WERR_ACCESS_DENIED; goto error_exit; } - if (!check_name(filename,conn)) { - DEBUG(3,("_srv_net_file_query_secdesc: can't access %s\n", filename)); - r_u->status = WERR_ACCESS_DENIED; + if (!check_name(file,conn)) { + DEBUG(3,("_srv_net_file_query_secdesc: can't access %s\n", file)); + status = WERR_ACCESS_DENIED; goto error_exit; } - nt_status = open_file_stat(conn, filename, &st, &fsp); + nt_status = open_file_stat(conn, file, &st, &fsp); if (!NT_STATUS_IS_OK(nt_status)) { /* Perhaps it is a directory */ if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY)) - nt_status = open_directory(conn, filename, &st, + nt_status = open_directory(conn, file, &st, READ_CONTROL_ACCESS, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, @@ -1978,8 +1855,8 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC NULL, &fsp); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", filename)); - r_u->status = WERR_ACCESS_DENIED; + DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", file)); + status = WERR_ACCESS_DENIED; goto error_exit; } } @@ -1987,23 +1864,20 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC sd_size = SMB_VFS_GET_NT_ACL(fsp, fsp->fsp_name, (OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION|DACL_SECURITY_INFORMATION), &psd); if (sd_size == 0) { - DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", filename)); - r_u->status = WERR_ACCESS_DENIED; + DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", file)); + status = WERR_ACCESS_DENIED; goto error_exit; } - r_u->ptr_response = 1; - r_u->size_response = sd_size; - r_u->ptr_secdesc = 1; - r_u->size_secdesc = sd_size; - r_u->sec_desc = psd; + sd_buf->sd_size= sd_size; + sd_buf->sd = psd; psd->dacl->revision = (uint16) NT4_ACL_REVISION; close_file(fsp, NORMAL_CLOSE); unbecome_user(); close_cnum(conn, p->pipe_user.vuid); - return r_u->status; + return status; error_exit: @@ -2017,19 +1891,16 @@ error_exit: if (conn) close_cnum(conn, p->pipe_user.vuid); - return r_u->status; + return status; } /*********************************************************************************** Win9x NT tools set security descriptor. ***********************************************************************************/ -WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_u, - SRV_R_NET_FILE_SET_SECDESC *r_u) +WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, const char *server_unc, const char *share, const char *file, uint32_t securityinformation, struct sec_desc_buf sd_buf) { BOOL ret; - pstring filename; - pstring qualname; DATA_BLOB null_pw; files_struct *fsp = NULL; SMB_STRUCT_STAT st; @@ -2037,54 +1908,52 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ NTSTATUS nt_status; connection_struct *conn = NULL; BOOL became_user = False; + WERROR status = WERR_OK; + pstring tmp_file; ZERO_STRUCT(st); - r_u->status = WERR_OK; - - unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname)); - /* Null password is ok - we are already an authenticated user... */ null_pw = data_blob(NULL, 0); become_root(); - conn = make_connection(qualname, null_pw, "A:", p->pipe_user.vuid, &nt_status); + conn = make_connection(share, null_pw, "A:", p->pipe_user.vuid, &nt_status); unbecome_root(); if (conn == NULL) { - DEBUG(3,("_srv_net_file_set_secdesc: Unable to connect to %s\n", qualname)); - r_u->status = ntstatus_to_werror(nt_status); + DEBUG(3,("_srv_net_file_set_secdesc: Unable to connect to %s\n", share)); + status = ntstatus_to_werror(nt_status); 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 = WERR_ACCESS_DENIED; + status = WERR_ACCESS_DENIED; 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); + pstrcpy(tmp_file, file); + unix_convert(tmp_file, conn, NULL, &bad_path, &st); if (bad_path) { - DEBUG(3,("_srv_net_file_set_secdesc: bad pathname %s\n", filename)); - r_u->status = WERR_ACCESS_DENIED; + DEBUG(3,("_srv_net_file_set_secdesc: bad pathname %s\n", file)); + status = WERR_ACCESS_DENIED; goto error_exit; } - if (!check_name(filename,conn)) { - DEBUG(3,("_srv_net_file_set_secdesc: can't access %s\n", filename)); - r_u->status = WERR_ACCESS_DENIED; + if (!check_name(file,conn)) { + DEBUG(3,("_srv_net_file_set_secdesc: can't access %s\n", file)); + status = WERR_ACCESS_DENIED; goto error_exit; } - nt_status = open_file_stat(conn, filename, &st, &fsp); + nt_status = open_file_stat(conn, file, &st, &fsp); if (!NT_STATUS_IS_OK(nt_status)) { /* Perhaps it is a directory */ if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY)) - nt_status = open_directory(conn, filename, &st, + nt_status = open_directory(conn, file, &st, FILE_READ_ATTRIBUTES, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, @@ -2092,24 +1961,24 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ NULL, &fsp); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", filename)); - r_u->status = WERR_ACCESS_DENIED; + DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", file)); + status = WERR_ACCESS_DENIED; goto error_exit; } } - ret = SMB_VFS_SET_NT_ACL(fsp, fsp->fsp_name, q_u->sec_info, q_u->sec_desc); + ret = SMB_VFS_SET_NT_ACL(fsp, fsp->fsp_name, securityinformation, sd_buf.sd); if (ret == False) { - DEBUG(3,("_srv_net_file_set_secdesc: Unable to set NT ACL on file %s\n", filename)); - r_u->status = WERR_ACCESS_DENIED; + DEBUG(3,("_srv_net_file_set_secdesc: Unable to set NT ACL on file %s\n", file)); + status = WERR_ACCESS_DENIED; goto error_exit; } close_file(fsp, NORMAL_CLOSE); unbecome_user(); close_cnum(conn, p->pipe_user.vuid); - return r_u->status; + return status; error_exit: @@ -2125,7 +1994,7 @@ error_exit: close_cnum(conn, p->pipe_user.vuid); } - return r_u->status; + return status; } /*********************************************************************************** @@ -2174,76 +2043,68 @@ static const char *next_server_disk_enum(uint32 *resume) return disk; } -WERROR _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_DISK_ENUM *r_u) +WERROR _srvsvc_NetDiskEnum(pipes_struct *p, const char *server_unc, uint32_t level, struct srvsvc_NetDiskInfo *info, uint32_t maxlen, uint32_t *totalentries, uint32_t *resume_handle) { uint32 i; const char *disk_name; - TALLOC_CTX *ctx = p->mem_ctx; - uint32 resume=get_enum_hnd(&q_u->enum_hnd); - r_u->status=WERR_OK; - - r_u->total_entries = init_server_disk_enum(&resume); + WERROR status = WERR_OK; - r_u->disk_enum_ctr.unknown = 0; + *totalentries = init_server_disk_enum(resume_handle); + info->count = 0; - if(!(r_u->disk_enum_ctr.disk_info = TALLOC_ARRAY(ctx, DISK_INFO, MAX_SERVER_DISK_ENTRIES))) { + if(!(info->disks = TALLOC_ARRAY(p->mem_ctx, struct srvsvc_NetDiskInfo0, MAX_SERVER_DISK_ENTRIES))) { return WERR_NOMEM; } - r_u->disk_enum_ctr.disk_info_ptr = r_u->disk_enum_ctr.disk_info ? 1 : 0; - - /*allow one DISK_INFO for null terminator*/ + /*allow one struct srvsvc_NetDiskInfo0 for null terminator*/ - for(i = 0; i < MAX_SERVER_DISK_ENTRIES -1 && (disk_name = next_server_disk_enum(&resume)); i++) { + for(i = 0; i < MAX_SERVER_DISK_ENTRIES -1 && (disk_name = next_server_disk_enum(resume_handle)); i++) { - r_u->disk_enum_ctr.entries_read++; + info->count++; + (*totalentries)++; /*copy disk name into a unicode string*/ - init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, disk_name); + info->disks[i].disk = disk_name; } /* add a terminating null string. Is this there if there is more data to come? */ - r_u->disk_enum_ctr.entries_read++; + info->count++; + (*totalentries)++; - init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, ""); + info->disks[i].disk = ""; - init_enum_hnd(&r_u->enum_hnd, resume); - - return r_u->status; + return status; } /******************************************************************** ********************************************************************/ -WERROR _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV_R_NET_NAME_VALIDATE *r_u) +WERROR _srvsvc_NetNameValidate(pipes_struct *p, const char *server_unc, const char *name, uint32_t name_type, uint32_t flags) { - fstring sharename; int len; - if ((q_u->flags != 0x0) && (q_u->flags != 0x80000000)) { + if ((flags != 0x0) && (flags != 0x80000000)) { return WERR_INVALID_PARAM; } - switch ( q_u->type ) { + switch ( name_type ) { case 0x9: - rpcstr_pull(sharename, q_u->sharename.buffer, sizeof(sharename), q_u->sharename.uni_str_len*2, 0); - - len = strlen_m(sharename); + len = strlen_m(name); - if ((q_u->flags == 0x0) && (len > 81)) { - DEBUG(5,("_srv_net_name_validate: share name too long (%s > 81 chars)\n", sharename)); + if ((flags == 0x0) && (len > 81)) { + DEBUG(5,("_srv_net_name_validate: share name too long (%s > 81 chars)\n", name)); return WERR_INVALID_NAME; } - if ((q_u->flags == 0x80000000) && (len > 13)) { - DEBUG(5,("_srv_net_name_validate: share name too long (%s > 13 chars)\n", sharename)); + if ((flags == 0x80000000) && (len > 13)) { + DEBUG(5,("_srv_net_name_validate: share name too long (%s > 13 chars)\n", name)); return WERR_INVALID_NAME; } - if ( ! validate_net_name( sharename, INVALID_SHARENAME_CHARS, sizeof(sharename) ) ) { - DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", sharename)); + if ( ! validate_net_name( name, INVALID_SHARENAME_CHARS, sizeof(name) ) ) { + DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", name)); return WERR_INVALID_NAME; } break; @@ -2259,8 +2120,182 @@ WERROR _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV /******************************************************************** ********************************************************************/ -WERROR _srv_net_file_close(pipes_struct *p, SRV_Q_NET_FILE_CLOSE *q_u, SRV_R_NET_FILE_CLOSE *r_u) +WERROR _srvsvc_NetFileClose(pipes_struct *p, const char *server_unc, uint32_t fid) { return WERR_ACCESS_DENIED; } +WERROR _srvsvc_NetCharDevEnum(pipes_struct *p, const char *server_unc, uint32_t *level, union srvsvc_NetCharDevCtr *ctr, uint32_t max_buffer, uint32_t *totalentries, uint32_t *resume_handle) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetCharDevGetInfo(pipes_struct *p, const char *server_unc, const char *device_name, uint32_t level, union srvsvc_NetCharDevInfo *info) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetCharDevControl(pipes_struct *p, const char *server_unc, const char *device_name, uint32_t opcode) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetCharDevQEnum(pipes_struct *p, const char *server_unc, const char *user, uint32_t *level, union srvsvc_NetCharDevQCtr *ctr, uint32_t max_buffer, uint32_t *totalentries, uint32_t *resume_handle) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetCharDevQGetInfo(pipes_struct *p, const char *server_unc, const char *queue_name, const char *user, uint32_t level, union srvsvc_NetCharDevQInfo *info) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetCharDevQSetInfo(pipes_struct *p, const char *server_unc, const char *queue_name, uint32_t level, union srvsvc_NetCharDevQInfo info, uint32_t *parm_error) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetCharDevQPurge(pipes_struct *p, const char *server_unc, const char *queue_name) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetCharDevQPurgeSelf(pipes_struct *p, const char *server_unc, const char *queue_name, const char *computer_name) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetFileGetInfo(pipes_struct *p, const char *server_unc, uint32_t fid, uint32_t level, union srvsvc_NetFileInfo *info) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetShareCheck(pipes_struct *p, const char *server_unc, const char *device_name, enum srvsvc_ShareType *type) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetServerStatisticsGet(pipes_struct *p, const char *server_unc, const char *service, uint32_t level, uint32_t options, struct srvsvc_Statistics *stats) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetTransportAdd(pipes_struct *p, const char *server_unc, uint32_t level, union srvsvc_NetTransportInfo info) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetTransportEnum(pipes_struct *p, const char *server_unc, uint32_t *level, union srvsvc_NetTransportCtr *transports, uint32_t max_buffer, uint32_t *totalentries, uint32_t *resume_handle) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetTransportDel(pipes_struct *p, const char *server_unc, uint32_t unknown, struct srvsvc_NetTransportInfo0 transport) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetSetServiceBits(pipes_struct *p, const char *server_unc, const char *transport, uint32_t servicebits, uint32_t updateimmediately) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetPathType(pipes_struct *p, const char *server_unc, const char *path, uint32_t pathflags, uint32_t *pathtype) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetPathCanonicalize(pipes_struct *p, const char *server_unc, const char *path, uint8_t *can_path, uint32_t maxbuf, const char *prefix, uint32_t *pathtype, uint32_t pathflags) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetPathCompare(pipes_struct *p, const char *server_unc, const char *path1, const char *path2, uint32_t pathtype, uint32_t pathflags) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NETRPRNAMECANONICALIZE(pipes_struct *p) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetPRNameCompare(pipes_struct *p, const char *server_unc, const char *name1, const char *name2, uint32_t name_type, uint32_t flags) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetShareDelStart(pipes_struct *p, const char *server_unc, const char *share, uint32_t reserved, struct policy_handle *hnd) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetShareDelCommit(pipes_struct *p, struct policy_handle *hnd) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetServerTransportAddEx(pipes_struct *p, const char *server_unc, uint32_t level, union srvsvc_NetTransportInfo info) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetServerSetServiceBitsEx(pipes_struct *p, const char *server_unc, const char *emulated_server_unc, const char *transport, uint32_t servicebitsofinterest, uint32_t servicebits, uint32_t updateimmediately) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NETRDFSGETVERSION(pipes_struct *p) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NETRDFSCREATELOCALPARTITION(pipes_struct *p) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NETRDFSDELETELOCALPARTITION(pipes_struct *p) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NETRDFSSETLOCALVOLUMESTATE(pipes_struct *p) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NETRDFSSETSERVERINFO(pipes_struct *p) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NETRDFSCREATEEXITPOINT(pipes_struct *p) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NETRDFSDELETEEXITPOINT(pipes_struct *p) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NETRSERVERTRANSPORTDELEX(pipes_struct *p) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NETRDFSMANAGERREPORTSITEINFO(pipes_struct *p) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NETRDFSMODIFYPREFIX(pipes_struct *p) +{ + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NETRDFSFIXLOCALVOLUME(pipes_struct *p) +{ + return WERR_NOT_SUPPORTED; +} -- cgit From 7239a85f0a8da51c10ca500408e328b3a84a08b1 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 22 Sep 2006 03:41:11 +0000 Subject: r18804: resume_hnd isn't a ref pointer and can be NULL metze (This used to be commit 8736262342611d432d529812bc1f647b8d6cf625) --- source3/rpc_server/srv_srvsvc_nt.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index ecb907e72d..d8eb7a662e 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -508,7 +508,9 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, ZERO_STRUCTP(ctr); - *resume_hnd = 0; + if (resume_hnd) { + *resume_hnd = 0; + } /* Ensure all the usershares are loaded. */ become_root(); -- cgit From 387bfebfcf74e4b56b21a772b0e38b6cdb9dcf25 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Fri, 22 Sep 2006 15:09:08 +0000 Subject: r18823: Fix some errors in the srsvc handling code and start running the RPC-SRVSVC test against samba3. (This used to be commit f0508ecb44f13e9e9e521e2534889e98a31d2372) --- source3/rpc_server/srv_srvsvc_nt.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index d8eb7a662e..737868f375 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -803,7 +803,8 @@ static void init_srv_sess_info_1(pipes_struct *p, struct srvsvc_NetSessCtr1 *ss1 } if (ss1 == NULL) { - (*snum) = 0; + if (snum != NULL) + (*snum) = 0; return; } @@ -867,7 +868,8 @@ static WERROR init_srv_sess_info_ctr(pipes_struct *p, union srvsvc_NetSessCtr *c break; default: DEBUG(5,("init_srv_sess_info_ctr: unsupported switch value %d\n", switch_value)); - (*resume_hnd) = 0; + if (resume_hnd != NULL) + (*resume_hnd) = 0; (*total_entries) = 0; ctr->ctr0 = NULL; status = WERR_UNKNOWN_LEVEL; @@ -887,7 +889,8 @@ static void init_srv_conn_info_0(pipes_struct *p, struct srvsvc_NetConnCtr0 *ss0 (*stot) = 1; if (ss0 == NULL) { - (*snum) = 0; + if (snum != NULL) + (*snum) = 0; return; } @@ -928,7 +931,8 @@ static void init_srv_conn_info_1(pipes_struct *p, struct srvsvc_NetConnCtr1 *ss1 (*stot) = 1; if (ss1 == NULL) { - (*snum) = 0; + if (snum != NULL) + (*snum) = 0; return; } -- cgit From 4980baf2e1f1de2715b1c0243ea7e79668d87501 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 10 Oct 2006 08:39:11 +0000 Subject: r19224: Add setting the rng_fault_state to the already converted pipes. Convert the low-hanging fruit of the LSA server. This provides a sample how the server calls can be converted one by one, see the "proxy_lsa_call" function. Volker (This used to be commit 99e54a213ad3561ea6e8dc44c483847c18c5681e) --- source3/rpc_server/srv_srvsvc_nt.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 737868f375..ec39c2a482 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2133,175 +2133,210 @@ WERROR _srvsvc_NetFileClose(pipes_struct *p, const char *server_unc, uint32_t fi WERROR _srvsvc_NetCharDevEnum(pipes_struct *p, const char *server_unc, uint32_t *level, union srvsvc_NetCharDevCtr *ctr, uint32_t max_buffer, uint32_t *totalentries, uint32_t *resume_handle) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NetCharDevGetInfo(pipes_struct *p, const char *server_unc, const char *device_name, uint32_t level, union srvsvc_NetCharDevInfo *info) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NetCharDevControl(pipes_struct *p, const char *server_unc, const char *device_name, uint32_t opcode) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NetCharDevQEnum(pipes_struct *p, const char *server_unc, const char *user, uint32_t *level, union srvsvc_NetCharDevQCtr *ctr, uint32_t max_buffer, uint32_t *totalentries, uint32_t *resume_handle) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NetCharDevQGetInfo(pipes_struct *p, const char *server_unc, const char *queue_name, const char *user, uint32_t level, union srvsvc_NetCharDevQInfo *info) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NetCharDevQSetInfo(pipes_struct *p, const char *server_unc, const char *queue_name, uint32_t level, union srvsvc_NetCharDevQInfo info, uint32_t *parm_error) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NetCharDevQPurge(pipes_struct *p, const char *server_unc, const char *queue_name) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NetCharDevQPurgeSelf(pipes_struct *p, const char *server_unc, const char *queue_name, const char *computer_name) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NetFileGetInfo(pipes_struct *p, const char *server_unc, uint32_t fid, uint32_t level, union srvsvc_NetFileInfo *info) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NetShareCheck(pipes_struct *p, const char *server_unc, const char *device_name, enum srvsvc_ShareType *type) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NetServerStatisticsGet(pipes_struct *p, const char *server_unc, const char *service, uint32_t level, uint32_t options, struct srvsvc_Statistics *stats) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NetTransportAdd(pipes_struct *p, const char *server_unc, uint32_t level, union srvsvc_NetTransportInfo info) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NetTransportEnum(pipes_struct *p, const char *server_unc, uint32_t *level, union srvsvc_NetTransportCtr *transports, uint32_t max_buffer, uint32_t *totalentries, uint32_t *resume_handle) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NetTransportDel(pipes_struct *p, const char *server_unc, uint32_t unknown, struct srvsvc_NetTransportInfo0 transport) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NetSetServiceBits(pipes_struct *p, const char *server_unc, const char *transport, uint32_t servicebits, uint32_t updateimmediately) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NetPathType(pipes_struct *p, const char *server_unc, const char *path, uint32_t pathflags, uint32_t *pathtype) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NetPathCanonicalize(pipes_struct *p, const char *server_unc, const char *path, uint8_t *can_path, uint32_t maxbuf, const char *prefix, uint32_t *pathtype, uint32_t pathflags) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NetPathCompare(pipes_struct *p, const char *server_unc, const char *path1, const char *path2, uint32_t pathtype, uint32_t pathflags) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NETRPRNAMECANONICALIZE(pipes_struct *p) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NetPRNameCompare(pipes_struct *p, const char *server_unc, const char *name1, const char *name2, uint32_t name_type, uint32_t flags) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NetShareDelStart(pipes_struct *p, const char *server_unc, const char *share, uint32_t reserved, struct policy_handle *hnd) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NetShareDelCommit(pipes_struct *p, struct policy_handle *hnd) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NetServerTransportAddEx(pipes_struct *p, const char *server_unc, uint32_t level, union srvsvc_NetTransportInfo info) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NetServerSetServiceBitsEx(pipes_struct *p, const char *server_unc, const char *emulated_server_unc, const char *transport, uint32_t servicebitsofinterest, uint32_t servicebits, uint32_t updateimmediately) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NETRDFSGETVERSION(pipes_struct *p) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NETRDFSCREATELOCALPARTITION(pipes_struct *p) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NETRDFSDELETELOCALPARTITION(pipes_struct *p) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NETRDFSSETLOCALVOLUMESTATE(pipes_struct *p) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NETRDFSSETSERVERINFO(pipes_struct *p) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NETRDFSCREATEEXITPOINT(pipes_struct *p) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NETRDFSDELETEEXITPOINT(pipes_struct *p) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NETRSERVERTRANSPORTDELEX(pipes_struct *p) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NETRDFSMANAGERREPORTSITEINFO(pipes_struct *p) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NETRDFSMODIFYPREFIX(pipes_struct *p) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } WERROR _srvsvc_NETRDFSFIXLOCALVOLUME(pipes_struct *p) { + p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -- cgit From 2a10d7686553a2c2377165b7f80269d2dcae8847 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sat, 21 Oct 2006 17:00:47 +0000 Subject: r19448: Convert delete_share_security to struct share_params plus some cleanups (This used to be commit c73d0815a3a1f58b951caa62fac601a8f4630894) --- source3/rpc_server/srv_srvsvc_nt.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index ec39c2a482..0e7f749a4e 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1680,12 +1680,11 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, const char *server_unc, uint32_t lev WERROR _srvsvc_NetShareDel(pipes_struct *p, const char *server_unc, const char *share_name, uint32_t reserved) { - pstring command; + char *command; int ret; - int snum; + struct share_params *params; SE_PRIV se_diskop = SE_DISK_OPERATOR; BOOL is_disk_op; - fstring tmp_share_name; DEBUG(5,("_srv_net_share_del: %d\n", __LINE__)); @@ -1696,14 +1695,12 @@ WERROR _srvsvc_NetShareDel(pipes_struct *p, const char *server_unc, const char * return WERR_ACCESS_DENIED; } - fstrcpy(tmp_share_name, share_name); - snum = find_service(tmp_share_name); - - if (snum < 0) + if (!(params = get_share_params(p->mem_ctx, share_name))) { return WERR_NO_SUCH_SHARE; + } /* No change to printer shares. */ - if (lp_print_ok(snum)) + if (lp_print_ok(params->service)) return WERR_ACCESS_DENIED; is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); @@ -1715,9 +1712,12 @@ WERROR _srvsvc_NetShareDel(pipes_struct *p, const char *server_unc, const char * DEBUG(10,("_srv_net_share_del: No delete share command\n")); return WERR_ACCESS_DENIED; } - - slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\"", - lp_delete_share_cmd(), dyn_CONFIGFILE, lp_servicename(snum)); + + if (asprintf(&command, "%s \"%s\" \"%s\"", + lp_delete_share_cmd(), dyn_CONFIGFILE, + lp_servicename(params->service)) == -1) { + return WERR_NOMEM; + } DEBUG(10,("_srv_net_share_del: Running [%s]\n", command )); @@ -1733,6 +1733,8 @@ WERROR _srvsvc_NetShareDel(pipes_struct *p, const char *server_unc, const char * if ( is_disk_op ) unbecome_root(); + + SAFE_FREE(command); /********* END SeDiskOperatorPrivilege BLOCK *********/ @@ -1742,9 +1744,9 @@ WERROR _srvsvc_NetShareDel(pipes_struct *p, const char *server_unc, const char * return WERR_ACCESS_DENIED; /* Delete the SD in the database. */ - delete_share_security(snum); + delete_share_security(params); - lp_killservice(snum); + lp_killservice(params->service); return WERR_OK; } -- cgit From 24f7144930b9235fa2a83e4833853906016ea114 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 23 Oct 2006 20:11:12 +0000 Subject: r19468: Fix some potential NULL dereferences (This used to be commit c8ed4129767d53ba6b7a084ca43b3e22e847ffec) --- source3/rpc_server/srv_srvsvc_nt.c | 62 +++++++++++++++++++++++++++++--------- 1 file changed, 48 insertions(+), 14 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 0e7f749a4e..c4a6c1103e 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -503,6 +503,7 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, TALLOC_CTX *ctx = p->mem_ctx; struct share_iterator *shares; struct share_params *share; + WERROR result = WERR_NOMEM; DEBUG(5,("init_srv_share_info_ctr\n")); @@ -526,39 +527,69 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, switch (info_level) { case 0: - ctr->ctr0 = talloc_zero(p->mem_ctx, struct srvsvc_NetShareCtr0); + if (!(ctr->ctr0 = talloc_zero( + p->mem_ctx, struct srvsvc_NetShareCtr0))) { + goto done; + } break; case 1: - ctr->ctr1 = talloc_zero(p->mem_ctx, struct srvsvc_NetShareCtr1); + if (!(ctr->ctr1 = talloc_zero( + p->mem_ctx, struct srvsvc_NetShareCtr1))) { + goto done; + } break; case 2: - ctr->ctr2 = talloc_zero(p->mem_ctx, struct srvsvc_NetShareCtr2); + if (!(ctr->ctr2 = talloc_zero( + p->mem_ctx, struct srvsvc_NetShareCtr2))) { + goto done; + } break; case 501: - ctr->ctr501 = talloc_zero(p->mem_ctx, struct srvsvc_NetShareCtr501); + if (!(ctr->ctr501 = talloc_zero( + p->mem_ctx, struct srvsvc_NetShareCtr501))) { + goto done; + } break; case 502: - ctr->ctr502 = talloc_zero(p->mem_ctx, struct srvsvc_NetShareCtr502); + if (!(ctr->ctr502 = talloc_zero( + p->mem_ctx, struct srvsvc_NetShareCtr502))) { + goto done; + } break; case 1004: - ctr->ctr1004 = talloc_zero(p->mem_ctx, struct srvsvc_NetShareCtr1004); + if (!(ctr->ctr1004 = talloc_zero( + p->mem_ctx, struct srvsvc_NetShareCtr1004))) { + goto done; + } break; case 1005: - ctr->ctr1005 = talloc_zero(p->mem_ctx, struct srvsvc_NetShareCtr1005); + if (!(ctr->ctr1005 = talloc_zero( + p->mem_ctx, struct srvsvc_NetShareCtr1005))) { + goto done; + } break; case 1006: - ctr->ctr1006 = talloc_zero(p->mem_ctx, struct srvsvc_NetShareCtr1006); + if (!(ctr->ctr1006 = talloc_zero( + p->mem_ctx, struct srvsvc_NetShareCtr1006))) { + goto done; + } break; case 1007: - ctr->ctr1007 = talloc_zero(p->mem_ctx, struct srvsvc_NetShareCtr1007); + if (!(ctr->ctr1007 = talloc_zero( + p->mem_ctx, struct srvsvc_NetShareCtr1007))) { + goto done; + } break; case 1501: - ctr->ctr1501 = talloc_zero(p->mem_ctx, struct srvsvc_NetShareCtr1501); + if (!(ctr->ctr1501 = talloc_zero( + p->mem_ctx, struct srvsvc_NetShareCtr1501))) { + goto done; + } break; default: - DEBUG(5,("init_srv_share_info_ctr: unsupported switch " - "value %d\n", info_level)); - return WERR_UNKNOWN_LEVEL; + DEBUG(5,("init_srv_share_info_ctr: unsupported switch " + "value %d\n", info_level)); + return WERR_UNKNOWN_LEVEL; } while ((share = next_share(shares)) != NULL) { @@ -707,7 +738,10 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, TALLOC_FREE(share); } - return WERR_OK; + result = WERR_OK; + done: + TALLOC_FREE(shares); + return result; } /******************************************************************* -- cgit From bef92ebb257adda6634c559e0240ad4991840212 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sat, 11 Nov 2006 18:07:51 +0000 Subject: r19669: set_share_security does not need a mem_ctx passed (This used to be commit 53eaa603eb84047263c27d57b8c0f5ce8e157189) --- source3/rpc_server/srv_srvsvc_nt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index c4a6c1103e..35938d087e 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1542,7 +1542,7 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, const char *server_unc, const ch &sd_size); if (old_sd && !sec_desc_equal(old_sd, psd)) { - if (!set_share_security(p->mem_ctx, share_name, psd)) + if (!set_share_security(share_name, psd)) DEBUG(0,("_srv_net_share_set_info: Failed to change security info in share %s.\n", share_name )); } @@ -1691,7 +1691,7 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, const char *server_unc, uint32_t lev return WERR_ACCESS_DENIED; if (psd) { - if (!set_share_security(p->mem_ctx, share_name, psd)) { + if (!set_share_security(share_name, psd)) { DEBUG(0,("_srv_net_share_add: Failed to add security info to share %s.\n", share_name )); } } -- cgit From 575845ccbeb2acc5dcb5133b80fd19b1d80169f2 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 30 Nov 2006 07:38:40 +0000 Subject: r19963: Add 'registry shares = yes' and registry key security descriptors. (This used to be commit 6cab254c49e07b11c170511ec613f0f33914c3e6) --- source3/rpc_server/srv_srvsvc_nt.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 35938d087e..ac9a1132e1 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -516,6 +516,7 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, /* Ensure all the usershares are loaded. */ become_root(); load_usershare_shares(); + load_registry_shares(); unbecome_root(); *total_entries = 0; -- cgit From 3f1978c059a126330f66de046f98f25b7f1346f5 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sat, 2 Dec 2006 23:01:34 +0000 Subject: r20012: Reformatting (This used to be commit b32c65cb6243f939247bcfb0f14e4e49dc5ee13e) --- source3/rpc_server/srv_srvsvc_nt.c | 66 +++++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 26 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index ac9a1132e1..2dae3c598f 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1559,7 +1559,9 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, const char *server_unc, const ch "comment" "max connections = " ********************************************************************/ -WERROR _srvsvc_NetShareAdd(pipes_struct *p, const char *server_unc, uint32_t level, union srvsvc_NetShareInfo info, uint32_t *parm_error) +WERROR _srvsvc_NetShareAdd(pipes_struct *p, const char *server_unc, + uint32_t level, union srvsvc_NetShareInfo info, + uint32_t *parm_error) { pstring command; pstring share_name; @@ -1578,7 +1580,8 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, const char *server_unc, uint32_t lev *parm_error = 0; - is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); + is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, + &se_diskop ); if (p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op ) return WERR_ACCESS_DENIED; @@ -1599,7 +1602,8 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, const char *server_unc, uint32_t lev pstrcpy(share_name, info.info2->name); pstrcpy(comment, info.info2->comment); pstrcpy(pathname, info.info2->path); - max_connections = (info.info2->max_users == 0xffffffff) ? 0 : info.info2->max_users; + max_connections = (info.info2->max_users == 0xffffffff) ? + 0 : info.info2->max_users; type = info.info2->type; break; case 501: @@ -1614,7 +1618,8 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, const char *server_unc, uint32_t lev map_generic_share_sd_bits(psd); break; - /* none of the following contain share names. NetShareAdd does not have a separate parameter for the share name */ + /* none of the following contain share names. NetShareAdd + * does not have a separate parameter for the share name */ case 1004: case 1005: @@ -1625,19 +1630,22 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, const char *server_unc, uint32_t lev /* DFS only level. */ return WERR_ACCESS_DENIED; default: - DEBUG(5,("_srv_net_share_add: unsupported switch value %d\n", level)); + DEBUG(5,("_srv_net_share_add: unsupported switch value %d\n", + level)); return WERR_UNKNOWN_LEVEL; } /* check for invalid share names */ - if ( !validate_net_name( share_name, INVALID_SHARENAME_CHARS, sizeof(share_name) ) ) { - DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", share_name)); + if ( !validate_net_name( share_name, INVALID_SHARENAME_CHARS, + sizeof(share_name) ) ) { + DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", + share_name)); return WERR_INVALID_NAME; } if ( strequal(share_name,"IPC$") || strequal(share_name,"global") - || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) ) + || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) ) { return WERR_ACCESS_DENIED; } @@ -1656,18 +1664,16 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, const char *server_unc, uint32_t lev if (!(path = valid_share_pathname( pathname ))) return WERR_OBJECT_PATH_INVALID; - /* Ensure share name, pathname and comment don't contain '"' characters. */ + /* Ensure share name, pathname and comment don't contain '"' + * characters. */ + string_replace(share_name, '"', ' '); string_replace(path, '"', ' '); string_replace(comment, '"', ' '); - slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d", - lp_add_share_cmd(), - dyn_CONFIGFILE, - share_name, - path, - comment, - max_connections); + slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\" " + "%d", lp_add_share_cmd(), dyn_CONFIGFILE, share_name, + path, comment, max_connections); DEBUG(10,("_srv_net_share_add: Running [%s]\n", command )); @@ -1678,7 +1684,8 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, const char *server_unc, uint32_t lev if ( (ret = smbrun(command, NULL)) == 0 ) { /* Tell everyone we updated smb.conf. */ - message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL); + message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, + False, NULL); } if ( is_disk_op ) @@ -1686,14 +1693,16 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, const char *server_unc, uint32_t lev /********* END SeDiskOperatorPrivilege BLOCK *********/ - DEBUG(3,("_srv_net_share_add: Running [%s] returned (%d)\n", command, ret )); + DEBUG(3,("_srv_net_share_add: Running [%s] returned (%d)\n", command, + ret )); if ( ret != 0 ) return WERR_ACCESS_DENIED; if (psd) { if (!set_share_security(share_name, psd)) { - DEBUG(0,("_srv_net_share_add: Failed to add security info to share %s.\n", share_name )); + DEBUG(0,("_srv_net_share_add: Failed to add security " + "info to share %s.\n", share_name )); } } @@ -1713,7 +1722,8 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, const char *server_unc, uint32_t lev a parameter. ********************************************************************/ -WERROR _srvsvc_NetShareDel(pipes_struct *p, const char *server_unc, const char *share_name, uint32_t reserved) +WERROR _srvsvc_NetShareDel(pipes_struct *p, const char *server_unc, + const char *share_name, uint32_t reserved) { char *command; int ret; @@ -1724,8 +1734,8 @@ WERROR _srvsvc_NetShareDel(pipes_struct *p, const char *server_unc, const char * DEBUG(5,("_srv_net_share_del: %d\n", __LINE__)); if ( strequal(share_name,"IPC$") - || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) - || strequal(share_name,"global") ) + || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) + || strequal(share_name,"global") ) { return WERR_ACCESS_DENIED; } @@ -1738,7 +1748,8 @@ WERROR _srvsvc_NetShareDel(pipes_struct *p, const char *server_unc, const char * if (lp_print_ok(params->service)) return WERR_ACCESS_DENIED; - is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); + is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, + &se_diskop ); if (p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op ) return WERR_ACCESS_DENIED; @@ -1763,7 +1774,8 @@ WERROR _srvsvc_NetShareDel(pipes_struct *p, const char *server_unc, const char * if ( (ret = smbrun(command, NULL)) == 0 ) { /* Tell everyone we updated smb.conf. */ - message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL); + message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, + False, NULL); } if ( is_disk_op ) @@ -1773,7 +1785,8 @@ WERROR _srvsvc_NetShareDel(pipes_struct *p, const char *server_unc, const char * /********* END SeDiskOperatorPrivilege BLOCK *********/ - DEBUG(3,("_srv_net_share_del: Running [%s] returned (%d)\n", command, ret )); + DEBUG(3,("_srv_net_share_del: Running [%s] returned (%d)\n", command, + ret )); if ( ret != 0 ) return WERR_ACCESS_DENIED; @@ -1786,7 +1799,8 @@ WERROR _srvsvc_NetShareDel(pipes_struct *p, const char *server_unc, const char * return WERR_OK; } -WERROR _srvsvc_NetShareDelSticky(pipes_struct *p, const char *server_unc, const char *share_name, uint32_t reserved) +WERROR _srvsvc_NetShareDelSticky(pipes_struct *p, const char *server_unc, + const char *share_name, uint32_t reserved) { DEBUG(5,("_srv_net_share_del_stick: %d\n", __LINE__)); -- cgit From c6597384ba1c3db03cc21a771737123f70391fb9 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 3 Dec 2006 10:09:37 +0000 Subject: r20013: Fix segfaults: parm_error is a unique in/out ptr (This used to be commit 0104371dd648204c9e8102cdc399539857be4a63) --- source3/rpc_server/srv_srvsvc_nt.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 2dae3c598f..5b24b3d2b8 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1146,7 +1146,9 @@ net server set info WERROR _srvsvc_NetSrvSetInfo(pipes_struct *p, const char *server_unc, uint32_t level, union srvsvc_NetSrvInfo info, uint32_t *parm_error) { /* Set up the net server set info structure. */ - *parm_error = 0; + if (parm_error) { + *parm_error = 0; + } return WERR_OK; } @@ -1391,7 +1393,9 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, const char *server_unc, const ch DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); - *parm_error = 0; + if (parm_error) { + *parm_error = 0; + } if ( strequal(share_name,"IPC$") || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) @@ -1578,7 +1582,9 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, const char *server_unc, DEBUG(5,("_srv_net_share_add: %d\n", __LINE__)); - *parm_error = 0; + if (parm_error) { + *parm_error = 0; + } is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); -- cgit From b67609792783416e0b89fb31f441bf17828aa5d8 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 3 Dec 2006 16:19:29 +0000 Subject: r20017: Make srvsvc_NetShareAdd & friends take care of registry shares (This used to be commit fc29a283cc9c2458375aa4fe2ecef82e6a3847df) --- source3/rpc_server/srv_srvsvc_nt.c | 424 ++++++++++++++++++++++++++----------- 1 file changed, 299 insertions(+), 125 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 5b24b3d2b8..abfa794518 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1372,18 +1372,273 @@ char *valid_share_pathname(char *dos_pathname) return ptr; } +static void setval_helper(struct registry_key *key, const char *name, + const char *value, WERROR *err) +{ + struct registry_value val; + + if (!W_ERROR_IS_OK(*err)) { + return; + } + + ZERO_STRUCT(val); + val.type = REG_SZ; + val.v.sz.str = CONST_DISCARD(char *, value); + val.v.sz.len = strlen(value)+1; + + *err = reg_setvalue(key, name, &val); +} + +static WERROR add_share(const char *share_name, const char *path, + const char *comment, uint32 max_connections, + const struct nt_user_token *token, + BOOL is_disk_op) +{ + if (lp_add_share_cmd() && *lp_add_share_cmd()) { + char *command; + int ret; + + if (asprintf(&command, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d", + lp_add_share_cmd(), dyn_CONFIGFILE, share_name, + path, comment, max_connections) == -1) { + return WERR_NOMEM; + } + + DEBUG(10,("add_share: Running [%s]\n", command )); + + /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/ + + if ( is_disk_op ) + become_root(); + + if ( (ret = smbrun(command, NULL)) == 0 ) { + /* Tell everyone we updated smb.conf. */ + message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, + NULL, 0, False, NULL); + } + + if ( is_disk_op ) + unbecome_root(); + + /********* END SeDiskOperatorPrivilege BLOCK *********/ + + DEBUG(3,("_srv_net_share_add: Running [%s] returned (%d)\n", + command, ret )); + + /* + * No fallback to registry shares, the user did define a add + * share command, so fail here. + */ + + SAFE_FREE(command); + return (ret == 0) ? WERR_OK : WERR_ACCESS_DENIED; + } + + if (lp_registry_shares()) { + char *keyname; + struct registry_key *key; + enum winreg_CreateAction action; + WERROR err; + TALLOC_CTX *mem_ctx; + + if (!(keyname = talloc_asprintf(NULL, "%s\\%s", KEY_SMBCONF, + share_name))) { + return WERR_NOMEM; + } + + mem_ctx = (TALLOC_CTX *)keyname; + + err = reg_create_path(mem_ctx, keyname, REG_KEY_WRITE, + is_disk_op ? get_root_nt_token():token, + &action, &key); + + if (action != REG_CREATED_NEW_KEY) { + err = WERR_ALREADY_EXISTS; + } + + if (!W_ERROR_IS_OK(err)) { + TALLOC_FREE(mem_ctx); + return err; + } + + setval_helper(key, "path", path, &err); + if ((comment != NULL) && (comment[0] != '\0')) { + setval_helper(key, "comment", comment, &err); + } + if (max_connections != 0) { + char tmp[16]; + snprintf(tmp, sizeof(tmp), "%d", max_connections); + setval_helper(key, "max connections", tmp, &err); + } + + if (!W_ERROR_IS_OK(err)) { + /* + * Hmmmm. We'd need transactions on the registry to + * get this right.... + */ + reg_delete_path(is_disk_op ? get_root_nt_token():token, + keyname); + } + TALLOC_FREE(mem_ctx); + return err; + } + + return WERR_ACCESS_DENIED; +} + +static WERROR delete_share(const char *sharename, + const struct nt_user_token *token, + BOOL is_disk_op) +{ + if (lp_delete_share_cmd() && *lp_delete_share_cmd()) { + char *command; + int ret; + + if (asprintf(&command, "%s \"%s\" \"%s\"", + lp_delete_share_cmd(), dyn_CONFIGFILE, + sharename)) { + return WERR_NOMEM; + } + + DEBUG(10,("delete_share: Running [%s]\n", command )); + + /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/ + + if ( is_disk_op ) + become_root(); + + if ( (ret = smbrun(command, NULL)) == 0 ) { + /* Tell everyone we updated smb.conf. */ + message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, + NULL, 0, False, NULL); + } + + if ( is_disk_op ) + unbecome_root(); + + /********* END SeDiskOperatorPrivilege BLOCK *********/ + + SAFE_FREE(command); + + DEBUG(3,("_srv_net_share_del: Running [%s] returned (%d)\n", + command, ret )); + return (ret == 0) ? WERR_OK : WERR_ACCESS_DENIED; + } + + if (lp_registry_shares()) { + char *keyname; + WERROR err; + + if (asprintf(&keyname, "%s\\%s", KEY_SMBCONF, + sharename) == -1) { + return WERR_NOMEM; + } + + err = reg_delete_path(is_disk_op ? get_root_nt_token():token, + keyname); + SAFE_FREE(keyname); + return err; + } + + return WERR_ACCESS_DENIED; +} + +static WERROR change_share(const char *share_name, const char *path, + const char *comment, uint32 max_connections, + const struct nt_user_token *token, + BOOL is_disk_op) +{ + if (lp_change_share_cmd() && *lp_change_share_cmd()) { + char *command; + int ret; + + if (asprintf(&command, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d", + lp_change_share_cmd(), dyn_CONFIGFILE, share_name, + path, comment, max_connections) == -1) { + return WERR_NOMEM; + } + + DEBUG(10,("_srv_net_share_set_info: Running [%s]\n", command)); + + /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/ + + if ( is_disk_op ) + become_root(); + + if ( (ret = smbrun(command, NULL)) == 0 ) { + /* Tell everyone we updated smb.conf. */ + message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, + NULL, 0, False, NULL); + } + + if ( is_disk_op ) + unbecome_root(); + + /********* END SeDiskOperatorPrivilege BLOCK *********/ + + DEBUG(3,("_srv_net_share_set_info: Running [%s] returned " + "(%d)\n", command, ret )); + + SAFE_FREE(command); + + return (ret == 0) ? WERR_OK : WERR_ACCESS_DENIED; + } + + if (lp_registry_shares()) { + char *keyname; + struct registry_key *key; + WERROR err; + TALLOC_CTX *mem_ctx; + + if (!(keyname = talloc_asprintf(NULL, "%s\\%s", KEY_SMBCONF, + share_name))) { + return WERR_NOMEM; + } + + mem_ctx = (TALLOC_CTX *)keyname; + + err = reg_open_path(mem_ctx, keyname, REG_KEY_WRITE, + is_disk_op ? get_root_nt_token():token, + &key); + if (!W_ERROR_IS_OK(err)) { + TALLOC_FREE(mem_ctx); + return err; + } + + setval_helper(key, "path", path, &err); + + reg_deletevalue(key, "comment"); + if ((comment != NULL) && (comment[0] != '\0')) { + setval_helper(key, "comment", comment, &err); + } + + reg_deletevalue(key, "max connections"); + if (max_connections != 0) { + char tmp[16]; + snprintf(tmp, sizeof(tmp), "%d", max_connections); + setval_helper(key, "max connections", tmp, &err); + } + + TALLOC_FREE(mem_ctx); + return err; + } + + return WERR_ACCESS_DENIED; +} + /******************************************************************* Net share set info. Modify share details. ********************************************************************/ -WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, const char *server_unc, const char *share_name, uint32_t level, union srvsvc_NetShareInfo info, uint32_t *parm_error) +WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, const char *server_unc, + const char *share_name, uint32_t level, + union srvsvc_NetShareInfo info, + uint32_t *parm_error) { - pstring command; pstring comment; pstring pathname; int type; int snum; - int ret; char *path; SEC_DESC *psd = NULL; SE_PRIV se_diskop = SE_DISK_OPERATOR; @@ -1415,7 +1670,8 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, const char *server_unc, const ch if (lp_print_ok(snum)) return WERR_ACCESS_DENIED; - is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); + is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, + &se_diskop ); /* fail out now if you are not root and not a disk op */ @@ -1433,17 +1689,10 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, const char *server_unc, const ch pstrcpy(comment, info.info2->comment); pstrcpy(pathname, info.info2->path); type = info.info2->type; - max_connections = (info.info2->max_users == 0xffffffff) ? 0 : info.info2->max_users; - psd = NULL; - break; -#if 0 - /* not supported on set but here for completeness */ - case 501: - unistr2_to_ascii(comment, &q_u->info.share.info501.info_501_str.uni_remark, sizeof(comment)); - type = q_u->info.share.info501.info_501.type; + max_connections = (info.info2->max_users == 0xffffffff) ? + 0 : info.info2->max_users; psd = NULL; break; -#endif case 502: pstrcpy(comment, info.info502->comment); pstrcpy(pathname, info.info502->path); @@ -1466,7 +1715,9 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, const char *server_unc, const ch SHARE_1005_CSC_POLICY_SHIFT) == lp_csc_policy(snum)) return WERR_OK; else { - DEBUG(3, ("_srv_net_share_set_info: client is trying to change csc policy from the network; must be done with smb.conf\n")); + DEBUG(3, ("_srv_net_share_set_info: client is trying " + "to change csc policy from the network; " + "must be done with smb.conf\n")); return WERR_ACCESS_DENIED; } case 1006: @@ -1480,7 +1731,8 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, const char *server_unc, const ch type = STYPE_DISKTREE; break; default: - DEBUG(5,("_srv_net_share_set_info: unsupported switch value %d\n", level)); + DEBUG(5,("_srv_net_share_set_info: unsupported switch value " + "%d\n", level)); return WERR_UNKNOWN_LEVEL; } @@ -1492,50 +1744,29 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, const char *server_unc, const ch if (!(path = valid_share_pathname( pathname ))) return WERR_OBJECT_PATH_INVALID; - /* Ensure share name, pathname and comment don't contain '"' characters. */ + /* Ensure share name, pathname and comment don't contain '"' + * characters. */ string_replace(tmp_share_name, '"', ' '); string_replace(path, '"', ' '); string_replace(comment, '"', ' '); DEBUG(10,("_srv_net_share_set_info: change share command = %s\n", - lp_change_share_cmd() ? lp_change_share_cmd() : "NULL" )); + lp_change_share_cmd() ? lp_change_share_cmd() : "NULL" )); /* Only call modify function if something changed. */ - if (strcmp(path, lp_pathname(snum)) || strcmp(comment, lp_comment(snum)) - || (lp_max_connections(snum) != max_connections) ) - { - if (!lp_change_share_cmd() || !*lp_change_share_cmd()) { - DEBUG(10,("_srv_net_share_set_info: No change share command\n")); - return WERR_ACCESS_DENIED; - } + if (strcmp(path, lp_pathname(snum)) + || strcmp(comment, lp_comment(snum)) + || (lp_max_connections(snum) != max_connections) ) { + WERROR err; - slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d", - lp_change_share_cmd(), dyn_CONFIGFILE, share_name, path, comment, max_connections ); + err = change_share(tmp_share_name, path, comment, + max_connections, p->pipe_user.nt_user_token, + is_disk_op); - DEBUG(10,("_srv_net_share_set_info: Running [%s]\n", command )); - - /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/ - - if ( is_disk_op ) - become_root(); - - if ( (ret = smbrun(command, NULL)) == 0 ) { - /* Tell everyone we updated smb.conf. */ - message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL); + if (!W_ERROR_IS_OK(err)) { + return err; } - - if ( is_disk_op ) - unbecome_root(); - - /********* END SeDiskOperatorPrivilege BLOCK *********/ - - DEBUG(3,("_srv_net_share_set_info: Running [%s] returned (%d)\n", command, ret )); - - if ( ret != 0 ) - return WERR_ACCESS_DENIED; - } else { - DEBUG(10,("_srv_net_share_set_info: No change to share name (%s)\n", share_name )); } /* Replace SD if changed. */ @@ -1547,9 +1778,11 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, const char *server_unc, const ch &sd_size); if (old_sd && !sec_desc_equal(old_sd, psd)) { - if (!set_share_security(share_name, psd)) - DEBUG(0,("_srv_net_share_set_info: Failed to change security info in share %s.\n", - share_name )); + if (!set_share_security(share_name, psd)) { + DEBUG(0,("_srv_net_share_set_info: Failed to " + "change security info in share %s.\n", + share_name )); + } } } @@ -1558,6 +1791,7 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, const char *server_unc, const ch return WERR_OK; } + /******************************************************************* Net share add. Call 'add_share_command "sharename" "pathname" "comment" "max connections = " @@ -1567,18 +1801,16 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, const char *server_unc, uint32_t level, union srvsvc_NetShareInfo info, uint32_t *parm_error) { - pstring command; pstring share_name; pstring comment; pstring pathname; char *path; int type; - int snum; - int ret; SEC_DESC *psd = NULL; SE_PRIV se_diskop = SE_DISK_OPERATOR; BOOL is_disk_op; - int max_connections = 0; + uint32 max_connections = 0; + WERROR err; DEBUG(5,("_srv_net_share_add: %d\n", __LINE__)); @@ -1592,11 +1824,6 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, const char *server_unc, if (p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op ) return WERR_ACCESS_DENIED; - if (!lp_add_share_cmd() || !*lp_add_share_cmd()) { - DEBUG(10,("_srv_net_share_add: No add share command\n")); - return WERR_ACCESS_DENIED; - } - switch (level) { case 0: /* No path. Not enough info in a level 0 to do anything. */ @@ -1656,11 +1883,10 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, const char *server_unc, return WERR_ACCESS_DENIED; } - snum = find_service(share_name); - - /* Share already exists. */ - if (snum >= 0) + if (get_share_params(p->mem_ctx, share_name) != NULL) { + /* Share already exists. */ return WERR_ALREADY_EXISTS; + } /* We can only add disk shares. */ if (type != STYPE_DISKTREE) @@ -1677,34 +1903,13 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, const char *server_unc, string_replace(path, '"', ' '); string_replace(comment, '"', ' '); - slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\" " - "%d", lp_add_share_cmd(), dyn_CONFIGFILE, share_name, - path, comment, max_connections); - - DEBUG(10,("_srv_net_share_add: Running [%s]\n", command )); - - /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/ - - if ( is_disk_op ) - become_root(); + err = add_share(share_name, path, comment, max_connections, + p->pipe_user.nt_user_token, is_disk_op); - if ( (ret = smbrun(command, NULL)) == 0 ) { - /* Tell everyone we updated smb.conf. */ - message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, - False, NULL); + if (!W_ERROR_IS_OK(err)) { + return err; } - if ( is_disk_op ) - unbecome_root(); - - /********* END SeDiskOperatorPrivilege BLOCK *********/ - - DEBUG(3,("_srv_net_share_add: Running [%s] returned (%d)\n", command, - ret )); - - if ( ret != 0 ) - return WERR_ACCESS_DENIED; - if (psd) { if (!set_share_security(share_name, psd)) { DEBUG(0,("_srv_net_share_add: Failed to add security " @@ -1731,11 +1936,10 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, const char *server_unc, WERROR _srvsvc_NetShareDel(pipes_struct *p, const char *server_unc, const char *share_name, uint32_t reserved) { - char *command; - int ret; struct share_params *params; SE_PRIV se_diskop = SE_DISK_OPERATOR; BOOL is_disk_op; + WERROR err; DEBUG(5,("_srv_net_share_del: %d\n", __LINE__)); @@ -1760,43 +1964,13 @@ WERROR _srvsvc_NetShareDel(pipes_struct *p, const char *server_unc, if (p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op ) return WERR_ACCESS_DENIED; - if (!lp_delete_share_cmd() || !*lp_delete_share_cmd()) { - DEBUG(10,("_srv_net_share_del: No delete share command\n")); - return WERR_ACCESS_DENIED; - } - - if (asprintf(&command, "%s \"%s\" \"%s\"", - lp_delete_share_cmd(), dyn_CONFIGFILE, - lp_servicename(params->service)) == -1) { - return WERR_NOMEM; - } - - DEBUG(10,("_srv_net_share_del: Running [%s]\n", command )); + err = delete_share(lp_servicename(params->service), + p->pipe_user.nt_user_token, is_disk_op); - /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/ - - if ( is_disk_op ) - become_root(); - - if ( (ret = smbrun(command, NULL)) == 0 ) { - /* Tell everyone we updated smb.conf. */ - message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, - False, NULL); + if (!W_ERROR_IS_OK(err)) { + return err; } - if ( is_disk_op ) - unbecome_root(); - - SAFE_FREE(command); - - /********* END SeDiskOperatorPrivilege BLOCK *********/ - - DEBUG(3,("_srv_net_share_del: Running [%s] returned (%d)\n", command, - ret )); - - if ( ret != 0 ) - return WERR_ACCESS_DENIED; - /* Delete the SD in the database. */ delete_share_security(params); -- cgit From 61bd0c8e450b3638c38bc60eb31fc6a4488f3121 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 3 Dec 2006 17:16:45 +0000 Subject: r20019: Replace one set of tricky code by calls to another set of tricky code: Initializing the reg_db now uses reg_createkey and reg_setvalue. Volker (This used to be commit cab5ccbbe484795f13531726d68b978073262e33) --- source3/rpc_server/srv_srvsvc_nt.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index abfa794518..1b86fa349f 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1375,18 +1375,10 @@ char *valid_share_pathname(char *dos_pathname) static void setval_helper(struct registry_key *key, const char *name, const char *value, WERROR *err) { - struct registry_value val; - if (!W_ERROR_IS_OK(*err)) { return; } - - ZERO_STRUCT(val); - val.type = REG_SZ; - val.v.sz.str = CONST_DISCARD(char *, value); - val.v.sz.len = strlen(value)+1; - - *err = reg_setvalue(key, name, &val); + *err = reg_set_sz(key, name, value); } static WERROR add_share(const char *share_name, const char *path, -- cgit From 2494868ffba14d425531df98651d777a13d3be28 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 3 Dec 2006 17:34:11 +0000 Subject: r20020: Arglll... eventlogadm links against reg_db but not the rest of the registry stuff. Revert the last change. This needs better fixing. Volker (This used to be commit ad1e00430bf5c4130023d30e9c8266ecdc640d2b) --- source3/rpc_server/srv_srvsvc_nt.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 1b86fa349f..abfa794518 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1375,10 +1375,18 @@ char *valid_share_pathname(char *dos_pathname) static void setval_helper(struct registry_key *key, const char *name, const char *value, WERROR *err) { + struct registry_value val; + if (!W_ERROR_IS_OK(*err)) { return; } - *err = reg_set_sz(key, name, value); + + ZERO_STRUCT(val); + val.type = REG_SZ; + val.v.sz.str = CONST_DISCARD(char *, value); + val.v.sz.len = strlen(value)+1; + + *err = reg_setvalue(key, name, &val); } static WERROR add_share(const char *share_name, const char *path, -- cgit From db0ad252a0622dfac17d44ca646168df4c1c22e5 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 12 Jan 2007 23:47:16 +0000 Subject: r20718: Sync up the filename path parsing changes from SAMBA_3_0_24. The only difference between the two trees now w.r.t file serving are the changes to smbd/open.c in this branch I need to review. Jeremy. (This used to be commit f4474edf6a0c71001dbd01429ef70bafad6abd74) --- source3/rpc_server/srv_srvsvc_nt.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index abfa794518..646a414cda 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2036,7 +2036,6 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, const char *server_unc, const DATA_BLOB null_pw; files_struct *fsp = NULL; SMB_STRUCT_STAT st; - BOOL bad_path; NTSTATUS nt_status; connection_struct *conn = NULL; BOOL became_user = False; @@ -2067,8 +2066,8 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, const char *server_unc, const became_user = True; pstrcpy(tmp_file, file); - unix_convert(tmp_file, conn, NULL, &bad_path, &st); - if (bad_path) { + nt_status = unix_convert(conn, tmp_file, False, NULL, &st); + if (!NT_STATUS_IS_OK(nt_status)) { DEBUG(3,("_srv_net_file_query_secdesc: bad pathname %s\n", file)); status = WERR_ACCESS_DENIED; goto error_exit; @@ -2141,7 +2140,6 @@ WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, const char *server_unc, const DATA_BLOB null_pw; files_struct *fsp = NULL; SMB_STRUCT_STAT st; - BOOL bad_path; NTSTATUS nt_status; connection_struct *conn = NULL; BOOL became_user = False; @@ -2171,8 +2169,8 @@ WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, const char *server_unc, const became_user = True; pstrcpy(tmp_file, file); - unix_convert(tmp_file, conn, NULL, &bad_path, &st); - if (bad_path) { + nt_status = unix_convert(conn, tmp_file, False, NULL, &st); + if (!NT_STATUS_IS_OK(nt_status)) { DEBUG(3,("_srv_net_file_set_secdesc: bad pathname %s\n", file)); status = WERR_ACCESS_DENIED; goto error_exit; -- cgit From 83eb0d1d6d90d182e8eee8496695113c89f8dba1 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 17 Jan 2007 02:09:37 +0000 Subject: r20844: Somewhat radical change - this may break the build (I will watch carefully - so I'm doing it in one transaction so I can roll back). Change check_name(), reduce_name() and dptr_create() to return NTSTATUS. This helps a lot in error path processing and especially in reduce_name() allows us to ditch the flaky and error-prone saving of errno and return errors directly. Jeremy. (This used to be commit 6133a694aa429d638320e39ffe1c49d172583ccf) --- source3/rpc_server/srv_srvsvc_nt.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 646a414cda..a9adaf3200 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2073,7 +2073,8 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, const char *server_unc, const goto error_exit; } - if (!check_name(file,conn)) { + nt_status = check_name(conn, file); + if (!NT_STATUS_IS_OK(nt_status)) { DEBUG(3,("_srv_net_file_query_secdesc: can't access %s\n", file)); status = WERR_ACCESS_DENIED; goto error_exit; @@ -2176,7 +2177,8 @@ WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, const char *server_unc, const goto error_exit; } - if (!check_name(file,conn)) { + nt_status = check_name(conn, file); + if (!NT_STATUS_IS_OK(nt_status)) { DEBUG(3,("_srv_net_file_set_secdesc: can't access %s\n", file)); status = WERR_ACCESS_DENIED; goto error_exit; -- cgit From d6b3fce078869de35334c0805ff141dc8bcf5f65 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 18 Jan 2007 10:18:59 +0000 Subject: r20875: Pass DCE/RPC server call arguments as a struct rather than as separate arguments. This makes it a bit more similar to the Samba4 code. (This used to be commit 0596badb410a58e7a715e2b17bc0bef0489a2448) --- source3/rpc_server/srv_srvsvc_nt.c | 460 ++++++++++++++++++------------------- 1 file changed, 226 insertions(+), 234 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index a9adaf3200..06c84b60e9 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1063,11 +1063,11 @@ static WERROR net_file_enum_3(pipes_struct *p, union srvsvc_NetFileCtr *ctr, uin /******************************************************************* *******************************************************************/ -WERROR _srvsvc_NetFileEnum(pipes_struct *p, const char *server_unc, const char *path, const char *user, uint32_t *level, union srvsvc_NetFileCtr *ctr, uint32_t max_buffer, uint32_t *totalentries, uint32_t *resume_handle) +WERROR _srvsvc_NetFileEnum(pipes_struct *p, struct srvsvc_NetFileEnum *r) { - switch ( *level ) { + switch ( *r->in.level ) { case 3: - return net_file_enum_3(p, ctr, resume_handle, totalentries ); + return net_file_enum_3(p, r->in.ctr, r->in.resume_handle, r->out.totalentries ); default: return WERR_UNKNOWN_LEVEL; } @@ -1079,11 +1079,11 @@ WERROR _srvsvc_NetFileEnum(pipes_struct *p, const char *server_unc, const char * net server get info ********************************************************************/ -WERROR _srvsvc_NetSrvGetInfo(pipes_struct *p, const char *server_unc, uint32_t level, union srvsvc_NetSrvInfo *info) +WERROR _srvsvc_NetSrvGetInfo(pipes_struct *p, struct srvsvc_NetSrvGetInfo *r) { WERROR status = WERR_OK; - ZERO_STRUCTP(info); + ZERO_STRUCTP(r->out.info); DEBUG(5,("srv_net_srv_get_info: %d\n", __LINE__)); @@ -1092,42 +1092,42 @@ WERROR _srvsvc_NetSrvGetInfo(pipes_struct *p, const char *server_unc, uint32_t l return WERR_ACCESS_DENIED; } - switch (level) { + switch (r->in.level) { /* Technically level 102 should only be available to Administrators but there isn't anything super-secret here, as most of it is made up. */ case 102: - info->info102 = talloc_zero(p->mem_ctx, struct srvsvc_NetSrvInfo102); - - info->info102->platform_id = 500; - info->info102->version_major = lp_major_announce_version(); - info->info102->version_minor = lp_minor_announce_version(); - info->info102->server_name = global_myname(); - info->info102->server_type = lp_default_server_announce(); - info->info102->userpath = "C:\\"; - info->info102->licenses = 10000; - info->info102->anndelta = 3000; - info->info102->disc = 0xf; - info->info102->users = 0xffffffff; - info->info102->hidden = 0; - info->info102->announce = 240; - info->info102->comment = lp_serverstring(); + r->out.info->info102 = talloc_zero(p->mem_ctx, struct srvsvc_NetSrvInfo102); + + r->out.info->info102->platform_id = 500; + r->out.info->info102->version_major = lp_major_announce_version(); + r->out.info->info102->version_minor = lp_minor_announce_version(); + r->out.info->info102->server_name = global_myname(); + r->out.info->info102->server_type = lp_default_server_announce(); + r->out.info->info102->userpath = "C:\\"; + r->out.info->info102->licenses = 10000; + r->out.info->info102->anndelta = 3000; + r->out.info->info102->disc = 0xf; + r->out.info->info102->users = 0xffffffff; + r->out.info->info102->hidden = 0; + r->out.info->info102->announce = 240; + r->out.info->info102->comment = lp_serverstring(); break; case 101: - info->info101 = talloc_zero(p->mem_ctx, struct srvsvc_NetSrvInfo101); - info->info101->platform_id = 500; - info->info101->server_name = global_myname(); - info->info101->version_major = lp_major_announce_version(); - info->info101->version_minor = lp_minor_announce_version(); - info->info101->server_type = lp_default_server_announce(); - info->info101->comment = lp_serverstring(); + r->out.info->info101 = talloc_zero(p->mem_ctx, struct srvsvc_NetSrvInfo101); + r->out.info->info101->platform_id = 500; + r->out.info->info101->server_name = global_myname(); + r->out.info->info101->version_major = lp_major_announce_version(); + r->out.info->info101->version_minor = lp_minor_announce_version(); + r->out.info->info101->server_type = lp_default_server_announce(); + r->out.info->info101->comment = lp_serverstring(); break; case 100: - info->info100 = talloc_zero(p->mem_ctx, struct srvsvc_NetSrvInfo100); - info->info100->platform_id = 500; - info->info100->server_name = global_myname(); + r->out.info->info100 = talloc_zero(p->mem_ctx, struct srvsvc_NetSrvInfo100); + r->out.info->info100->platform_id = 500; + r->out.info->info100->server_name = global_myname(); break; default: return WERR_UNKNOWN_LEVEL; @@ -1143,11 +1143,11 @@ WERROR _srvsvc_NetSrvGetInfo(pipes_struct *p, const char *server_unc, uint32_t l net server set info ********************************************************************/ -WERROR _srvsvc_NetSrvSetInfo(pipes_struct *p, const char *server_unc, uint32_t level, union srvsvc_NetSrvInfo info, uint32_t *parm_error) +WERROR _srvsvc_NetSrvSetInfo(pipes_struct *p, struct srvsvc_NetSrvSetInfo *r) { /* Set up the net server set info structure. */ - if (parm_error) { - *parm_error = 0; + if (r->out.parm_error) { + *r->out.parm_error = 0; } return WERR_OK; } @@ -1156,44 +1156,44 @@ WERROR _srvsvc_NetSrvSetInfo(pipes_struct *p, const char *server_unc, uint32_t l net conn enum ********************************************************************/ -WERROR _srvsvc_NetConnEnum(pipes_struct *p, const char *server_unc, const char *path, uint32_t *level, union srvsvc_NetConnCtr *ctr, uint32_t max_buffer, uint32_t *totalentries, uint32_t *resume_handle) +WERROR _srvsvc_NetConnEnum(pipes_struct *p, struct srvsvc_NetConnEnum *r) { DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__)); - ZERO_STRUCTP(ctr); + ZERO_STRUCTP(r->out.ctr); /* set up the */ - return init_srv_conn_info_ctr(p, ctr, *level, resume_handle, totalentries); + return init_srv_conn_info_ctr(p, r->out.ctr, *r->in.level, r->in.resume_handle, r->out.totalentries); } /******************************************************************* net sess enum ********************************************************************/ -WERROR _srvsvc_NetSessEnum(pipes_struct *p, const char *server_unc, const char *client, const char *user, uint32_t *level, union srvsvc_NetSessCtr *ctr, uint32_t max_buffer, uint32_t *totalentries, uint32_t *resume_handle) +WERROR _srvsvc_NetSessEnum(pipes_struct *p, struct srvsvc_NetSessEnum *r) { DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__)); - ZERO_STRUCTP(ctr); + ZERO_STRUCTP(r->out.ctr); /* set up the */ - return init_srv_sess_info_ctr(p, ctr, - *level, - resume_handle, - totalentries); + return init_srv_sess_info_ctr(p, r->out.ctr, + *r->in.level, + r->in.resume_handle, + r->out.totalentries); } /******************************************************************* net sess del ********************************************************************/ -WERROR _srvsvc_NetSessDel(pipes_struct *p, const char *server_unc, const char *client, const char *user) +WERROR _srvsvc_NetSessDel(pipes_struct *p, struct srvsvc_NetSessDel *r) { struct sessionid *session_list; int num_sessions, snum; WERROR status; - char *machine = talloc_strdup(p->mem_ctx, server_unc); + char *machine = talloc_strdup(p->mem_ctx, r->in.server_unc); /* strip leading backslashes if any */ while (machine[0] == '\\') { @@ -1216,8 +1216,8 @@ WERROR _srvsvc_NetSessDel(pipes_struct *p, const char *server_unc, const char *c for (snum = 0; snum < num_sessions; snum++) { - if ((strequal(session_list[snum].username, user) || user[0] == '\0' ) && - strequal(session_list[snum].remote_machine, machine)) { + if ((strequal(session_list[snum].username, r->in.user) || r->in.user[0] == '\0' ) && + strequal(session_list[snum].remote_machine, machine)) { if (message_send_pid(pid_to_procid(session_list[snum].pid), MSG_SHUTDOWN, NULL, 0, False)) status = WERR_OK; @@ -1237,7 +1237,7 @@ done: Net share enum all. ********************************************************************/ -WERROR _srvsvc_NetShareEnumAll(pipes_struct *p, const char *server_unc, uint32_t *level, union srvsvc_NetShareCtr *ctr, uint32_t max_buffer, uint32_t *totalentries, uint32_t *resume_handle) +WERROR _srvsvc_NetShareEnumAll(pipes_struct *p, struct srvsvc_NetShareEnumAll *r) { DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__)); @@ -1247,15 +1247,15 @@ WERROR _srvsvc_NetShareEnumAll(pipes_struct *p, const char *server_unc, uint32_t } /* Create the list of shares for the response. */ - return init_srv_share_info_ctr(p, ctr, *level, - resume_handle, totalentries, True); + return init_srv_share_info_ctr(p, r->out.ctr, *r->in.level, + r->in.resume_handle, r->out.totalentries, True); } /******************************************************************* Net share enum. ********************************************************************/ -WERROR _srvsvc_NetShareEnum(pipes_struct *p, const char *server_unc, uint32_t *level, union srvsvc_NetShareCtr *ctr, uint32_t max_buffer, uint32_t *totalentries, uint32_t *resume_handle) +WERROR _srvsvc_NetShareEnum(pipes_struct *p, struct srvsvc_NetShareEnum *r) { DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__)); @@ -1265,79 +1265,72 @@ WERROR _srvsvc_NetShareEnum(pipes_struct *p, const char *server_unc, uint32_t *l } /* Create the list of shares for the response. */ - return init_srv_share_info_ctr(p, ctr, *level, - resume_handle, totalentries, False); + return init_srv_share_info_ctr(p, r->out.ctr, *r->in.level, + r->in.resume_handle, r->out.totalentries, False); } /******************************************************************* Net share get info. ********************************************************************/ -WERROR _srvsvc_NetShareGetInfo(pipes_struct *p, const char *server_unc, const char *share_name, uint32_t level, union srvsvc_NetShareInfo *info) +WERROR _srvsvc_NetShareGetInfo(pipes_struct *p, struct srvsvc_NetShareGetInfo *r) { const struct share_params *params; - params = get_share_params(p->mem_ctx, share_name); + params = get_share_params(p->mem_ctx, r->in.share_name); if (params != NULL) { - switch (level) { + switch (r->in.level) { case 0: - info->info0 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo0); - init_srv_share_info_0(p, info->info0, - params); + r->out.info->info0 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo0); + init_srv_share_info_0(p, r->out.info->info0, params); break; case 1: - info->info1 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1); - init_srv_share_info_1(p, info->info1, - params); + r->out.info->info1 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1); + init_srv_share_info_1(p, r->out.info->info1, params); break; case 2: - info->info2 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo2); - init_srv_share_info_2(p, info->info2, - params); + r->out.info->info2 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo2); + init_srv_share_info_2(p, r->out.info->info2, params); break; case 501: - info->info501 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo501); - init_srv_share_info_501(p, info->info501, - params); + r->out.info->info501 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo501); + init_srv_share_info_501(p, r->out.info->info501, params); break; case 502: - info->info502 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo502); - init_srv_share_info_502(p, info->info502, - params); + r->out.info->info502 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo502); + init_srv_share_info_502(p, r->out.info->info502, params); break; /* here for completeness */ case 1004: - info->info1004 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1004); - init_srv_share_info_1004(p, info->info1004, - params); + r->out.info->info1004 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1004); + init_srv_share_info_1004(p, r->out.info->info1004, params); break; case 1005: - info->info1005 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1005); - init_srv_share_info_1005(p, info->info1005, - params); + r->out.info->info1005 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1005); + init_srv_share_info_1005(p, r->out.info->info1005, params); break; /* here for completeness 1006 - 1501 */ case 1006: - info->info1006 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1006); - init_srv_share_info_1006(p, info->info1006, + r->out.info->info1006 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1006); + init_srv_share_info_1006(p, r->out.info->info1006, params); break; case 1007: - info->info1007 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1007); - init_srv_share_info_1007(p, info->info1007, + r->out.info->info1007 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1007); + init_srv_share_info_1007(p, r->out.info->info1007, params); break; case 1501: - info->info1501 = talloc(p->mem_ctx, struct sec_desc_buf); - init_srv_share_info_1501(p, info->info1501, + r->out.info->info1501 = talloc(p->mem_ctx, struct sec_desc_buf); + init_srv_share_info_1501(p, r->out.info->info1501, params); break; default: DEBUG(5,("init_srv_net_share_get_info: unsupported " - "switch value %d\n", level)); + "switch value %d\n", r->in.level)); return WERR_UNKNOWN_LEVEL; break; } @@ -1630,10 +1623,7 @@ static WERROR change_share(const char *share_name, const char *path, Net share set info. Modify share details. ********************************************************************/ -WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, const char *server_unc, - const char *share_name, uint32_t level, - union srvsvc_NetShareInfo info, - uint32_t *parm_error) +WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, struct srvsvc_NetShareSetInfo *r) { pstring comment; pstring pathname; @@ -1648,18 +1638,18 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, const char *server_unc, DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); - if (parm_error) { - *parm_error = 0; + if (r->out.parm_error) { + *r->out.parm_error = 0; } - if ( strequal(share_name,"IPC$") - || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) - || strequal(share_name,"global") ) + if ( strequal(r->in.share_name,"IPC$") + || ( lp_enable_asu_support() && strequal(r->in.share_name,"ADMIN$") ) + || strequal(r->in.share_name,"global") ) { return WERR_ACCESS_DENIED; } - fstrcpy(tmp_share_name, share_name); + fstrcpy(tmp_share_name, r->in.share_name); snum = find_service(tmp_share_name); /* Does this share exist ? */ @@ -1678,31 +1668,31 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, const char *server_unc, if ( p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op ) return WERR_ACCESS_DENIED; - switch (level) { + switch (r->in.level) { case 1: pstrcpy(pathname, lp_pathname(snum)); - pstrcpy(comment, info.info1->comment); - type = info.info1->type; + pstrcpy(comment, r->in.info.info1->comment); + type = r->in.info.info1->type; psd = NULL; break; case 2: - pstrcpy(comment, info.info2->comment); - pstrcpy(pathname, info.info2->path); - type = info.info2->type; - max_connections = (info.info2->max_users == 0xffffffff) ? - 0 : info.info2->max_users; + pstrcpy(comment, r->in.info.info2->comment); + pstrcpy(pathname, r->in.info.info2->path); + type = r->in.info.info2->type; + max_connections = (r->in.info.info2->max_users == 0xffffffff) ? + 0 : r->in.info.info2->max_users; psd = NULL; break; case 502: - pstrcpy(comment, info.info502->comment); - pstrcpy(pathname, info.info502->path); - type = info.info502->type; - psd = info.info502->sd; + pstrcpy(comment, r->in.info.info502->comment); + pstrcpy(pathname, r->in.info.info502->path); + type = r->in.info.info502->type; + psd = r->in.info.info502->sd; map_generic_share_sd_bits(psd); break; case 1004: pstrcpy(pathname, lp_pathname(snum)); - pstrcpy(comment, info.info1004->comment); + pstrcpy(comment, r->in.info.info1004->comment); type = STYPE_DISKTREE; break; case 1005: @@ -1710,7 +1700,7 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, const char *server_unc, user, so we must compare it to see if it's what is set in smb.conf, so that we can contine other ops like setting ACLs on a share */ - if (((info.info1005->dfs_flags & + if (((r->in.info.info1005->dfs_flags & SHARE_1005_CSC_POLICY_MASK) >> SHARE_1005_CSC_POLICY_SHIFT) == lp_csc_policy(snum)) return WERR_OK; @@ -1726,13 +1716,13 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, const char *server_unc, case 1501: pstrcpy(pathname, lp_pathname(snum)); pstrcpy(comment, lp_comment(snum)); - psd = info.info1501->sd; + psd = r->in.info.info1501->sd; map_generic_share_sd_bits(psd); type = STYPE_DISKTREE; break; default: DEBUG(5,("_srv_net_share_set_info: unsupported switch value " - "%d\n", level)); + "%d\n", r->in.level)); return WERR_UNKNOWN_LEVEL; } @@ -1778,10 +1768,10 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, const char *server_unc, &sd_size); if (old_sd && !sec_desc_equal(old_sd, psd)) { - if (!set_share_security(share_name, psd)) { + if (!set_share_security(r->in.share_name, psd)) { DEBUG(0,("_srv_net_share_set_info: Failed to " "change security info in share %s.\n", - share_name )); + r->in.share_name )); } } } @@ -1797,9 +1787,7 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, const char *server_unc, "comment" "max connections = " ********************************************************************/ -WERROR _srvsvc_NetShareAdd(pipes_struct *p, const char *server_unc, - uint32_t level, union srvsvc_NetShareInfo info, - uint32_t *parm_error) +WERROR _srvsvc_NetShareAdd(pipes_struct *p, struct srvsvc_NetShareAdd *r) { pstring share_name; pstring comment; @@ -1814,8 +1802,8 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, const char *server_unc, DEBUG(5,("_srv_net_share_add: %d\n", __LINE__)); - if (parm_error) { - *parm_error = 0; + if (r->out.parm_error) { + *r->out.parm_error = 0; } is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, @@ -1824,7 +1812,7 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, const char *server_unc, if (p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op ) return WERR_ACCESS_DENIED; - switch (level) { + switch (r->in.level) { case 0: /* No path. Not enough info in a level 0 to do anything. */ return WERR_ACCESS_DENIED; @@ -1832,22 +1820,22 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, const char *server_unc, /* Not enough info in a level 1 to do anything. */ return WERR_ACCESS_DENIED; case 2: - pstrcpy(share_name, info.info2->name); - pstrcpy(comment, info.info2->comment); - pstrcpy(pathname, info.info2->path); - max_connections = (info.info2->max_users == 0xffffffff) ? - 0 : info.info2->max_users; - type = info.info2->type; + pstrcpy(share_name, r->in.info.info2->name); + pstrcpy(comment, r->in.info.info2->comment); + pstrcpy(pathname, r->in.info.info2->path); + max_connections = (r->in.info.info2->max_users == 0xffffffff) ? + 0 : r->in.info.info2->max_users; + type = r->in.info.info2->type; break; case 501: /* No path. Not enough info in a level 501 to do anything. */ return WERR_ACCESS_DENIED; case 502: - pstrcpy(share_name, info.info502->name); - pstrcpy(comment, info.info502->comment); - pstrcpy(pathname, info.info502->path); - type = info.info502->type; - psd = info.info502->sd; + pstrcpy(share_name, r->in.info.info502->name); + pstrcpy(comment, r->in.info.info502->comment); + pstrcpy(pathname, r->in.info.info502->path); + type = r->in.info.info502->type; + psd = r->in.info.info502->sd; map_generic_share_sd_bits(psd); break; @@ -1864,7 +1852,7 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, const char *server_unc, return WERR_ACCESS_DENIED; default: DEBUG(5,("_srv_net_share_add: unsupported switch value %d\n", - level)); + r->in.level)); return WERR_UNKNOWN_LEVEL; } @@ -1933,8 +1921,7 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, const char *server_unc, a parameter. ********************************************************************/ -WERROR _srvsvc_NetShareDel(pipes_struct *p, const char *server_unc, - const char *share_name, uint32_t reserved) +WERROR _srvsvc_NetShareDel(pipes_struct *p, struct srvsvc_NetShareDel *r) { struct share_params *params; SE_PRIV se_diskop = SE_DISK_OPERATOR; @@ -1943,14 +1930,14 @@ WERROR _srvsvc_NetShareDel(pipes_struct *p, const char *server_unc, DEBUG(5,("_srv_net_share_del: %d\n", __LINE__)); - if ( strequal(share_name,"IPC$") - || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) - || strequal(share_name,"global") ) + if ( strequal(r->in.share_name, "IPC$") + || ( lp_enable_asu_support() && strequal(r->in.share_name,"ADMIN$") ) + || strequal(r->in.share_name, "global") ) { return WERR_ACCESS_DENIED; } - if (!(params = get_share_params(p->mem_ctx, share_name))) { + if (!(params = get_share_params(p->mem_ctx, r->in.share_name))) { return WERR_NO_SUCH_SHARE; } @@ -1979,19 +1966,24 @@ WERROR _srvsvc_NetShareDel(pipes_struct *p, const char *server_unc, return WERR_OK; } -WERROR _srvsvc_NetShareDelSticky(pipes_struct *p, const char *server_unc, - const char *share_name, uint32_t reserved) +WERROR _srvsvc_NetShareDelSticky(pipes_struct *p, struct srvsvc_NetShareDelSticky *r) { + struct srvsvc_NetShareDel s; + DEBUG(5,("_srv_net_share_del_stick: %d\n", __LINE__)); - return _srvsvc_NetShareDel(p, server_unc, share_name, reserved); + s.in.server_unc = r->in.server_unc; + s.in.share_name = r->in.share_name; + s.in.reserved = r->in.reserved; + + return _srvsvc_NetShareDel(p, &s); } /******************************************************************* time of day ********************************************************************/ -WERROR _srvsvc_NetRemoteTOD(pipes_struct *p, const char *server_unc, struct srvsvc_NetRemoteTODInfo *tod) +WERROR _srvsvc_NetRemoteTOD(pipes_struct *p, struct srvsvc_NetRemoteTOD *r) { struct tm *t; time_t unixdate = time(NULL); @@ -2007,18 +1999,18 @@ WERROR _srvsvc_NetRemoteTOD(pipes_struct *p, const char *server_unc, struct srvs t = gmtime(&unixdate); /* set up the */ - tod->elapsed = unixdate; - tod->msecs = 0; - tod->hours = t->tm_hour; - tod->mins = t->tm_min; - tod->secs = t->tm_sec; - tod->hunds = 0; - tod->timezone = zone; - tod->tinterval = 10000; - tod->day = t->tm_mday; - tod->month = t->tm_mon + 1; - tod->year = 1900+t->tm_year; - tod->weekday = t->tm_wday; + r->out.info->elapsed = unixdate; + r->out.info->msecs = 0; + r->out.info->hours = t->tm_hour; + r->out.info->mins = t->tm_min; + r->out.info->secs = t->tm_sec; + r->out.info->hunds = 0; + r->out.info->timezone = zone; + r->out.info->tinterval = 10000; + r->out.info->day = t->tm_mday; + r->out.info->month = t->tm_mon + 1; + r->out.info->year = 1900+t->tm_year; + r->out.info->weekday = t->tm_wday; DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__)); @@ -2029,7 +2021,7 @@ WERROR _srvsvc_NetRemoteTOD(pipes_struct *p, const char *server_unc, struct srvs Win9x NT tools get security descriptor. ***********************************************************************************/ -WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, const char *server_unc, const char *share, const char *file, uint32_t securityinformation, struct sec_desc_buf *sd_buf) +WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, struct srvsvc_NetGetFileSecurity *r) { SEC_DESC *psd = NULL; size_t sd_size; @@ -2049,11 +2041,11 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, const char *server_unc, const null_pw = data_blob(NULL, 0); become_root(); - conn = make_connection(share, null_pw, "A:", p->pipe_user.vuid, &nt_status); + conn = make_connection(r->in.share, null_pw, "A:", p->pipe_user.vuid, &nt_status); unbecome_root(); if (conn == NULL) { - DEBUG(3,("_srv_net_file_query_secdesc: Unable to connect to %s\n", share)); + DEBUG(3,("_srv_net_file_query_secdesc: Unable to connect to %s\n", r->in.share)); status = ntstatus_to_werror(nt_status); goto error_exit; } @@ -2065,26 +2057,26 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, const char *server_unc, const } became_user = True; - pstrcpy(tmp_file, file); + pstrcpy(tmp_file, r->in.file); nt_status = unix_convert(conn, tmp_file, False, NULL, &st); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_query_secdesc: bad pathname %s\n", file)); + DEBUG(3,("_srv_net_file_query_secdesc: bad pathname %s\n", r->in.file)); status = WERR_ACCESS_DENIED; goto error_exit; } - nt_status = check_name(conn, file); + nt_status = check_name(conn, r->in.file); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_query_secdesc: can't access %s\n", file)); + DEBUG(3,("_srv_net_file_query_secdesc: can't access %s\n", r->in.file)); status = WERR_ACCESS_DENIED; goto error_exit; } - nt_status = open_file_stat(conn, file, &st, &fsp); + nt_status = open_file_stat(conn, r->in.file, &st, &fsp); if (!NT_STATUS_IS_OK(nt_status)) { /* Perhaps it is a directory */ if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY)) - nt_status = open_directory(conn, file, &st, + nt_status = open_directory(conn, r->in.file, &st, READ_CONTROL_ACCESS, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, @@ -2092,7 +2084,7 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, const char *server_unc, const NULL, &fsp); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", file)); + DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", r->in.file)); status = WERR_ACCESS_DENIED; goto error_exit; } @@ -2101,13 +2093,13 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, const char *server_unc, const sd_size = SMB_VFS_GET_NT_ACL(fsp, fsp->fsp_name, (OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION|DACL_SECURITY_INFORMATION), &psd); if (sd_size == 0) { - DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", file)); + DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", r->in.file)); status = WERR_ACCESS_DENIED; goto error_exit; } - sd_buf->sd_size= sd_size; - sd_buf->sd = psd; + r->out.sd_buf->sd_size= sd_size; + r->out.sd_buf->sd = psd; psd->dacl->revision = (uint16) NT4_ACL_REVISION; @@ -2135,7 +2127,7 @@ error_exit: Win9x NT tools set security descriptor. ***********************************************************************************/ -WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, const char *server_unc, const char *share, const char *file, uint32_t securityinformation, struct sec_desc_buf sd_buf) +WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, struct srvsvc_NetSetFileSecurity *r) { BOOL ret; DATA_BLOB null_pw; @@ -2153,11 +2145,11 @@ WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, const char *server_unc, const null_pw = data_blob(NULL, 0); become_root(); - conn = make_connection(share, null_pw, "A:", p->pipe_user.vuid, &nt_status); + conn = make_connection(r->in.share, null_pw, "A:", p->pipe_user.vuid, &nt_status); unbecome_root(); if (conn == NULL) { - DEBUG(3,("_srv_net_file_set_secdesc: Unable to connect to %s\n", share)); + DEBUG(3,("_srv_net_file_set_secdesc: Unable to connect to %s\n", r->in.share)); status = ntstatus_to_werror(nt_status); goto error_exit; } @@ -2169,28 +2161,28 @@ WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, const char *server_unc, const } became_user = True; - pstrcpy(tmp_file, file); + pstrcpy(tmp_file, r->in.file); nt_status = unix_convert(conn, tmp_file, False, NULL, &st); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_set_secdesc: bad pathname %s\n", file)); + DEBUG(3,("_srv_net_file_set_secdesc: bad pathname %s\n", r->in.file)); status = WERR_ACCESS_DENIED; goto error_exit; } - nt_status = check_name(conn, file); + nt_status = check_name(conn, r->in.file); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_set_secdesc: can't access %s\n", file)); + DEBUG(3,("_srv_net_file_set_secdesc: can't access %s\n", r->in.file)); status = WERR_ACCESS_DENIED; goto error_exit; } - nt_status = open_file_stat(conn, file, &st, &fsp); + nt_status = open_file_stat(conn, r->in.file, &st, &fsp); if (!NT_STATUS_IS_OK(nt_status)) { /* Perhaps it is a directory */ if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY)) - nt_status = open_directory(conn, file, &st, + nt_status = open_directory(conn, r->in.file, &st, FILE_READ_ATTRIBUTES, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, @@ -2198,16 +2190,16 @@ WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, const char *server_unc, const NULL, &fsp); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", file)); + DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", r->in.file)); status = WERR_ACCESS_DENIED; goto error_exit; } } - ret = SMB_VFS_SET_NT_ACL(fsp, fsp->fsp_name, securityinformation, sd_buf.sd); + ret = SMB_VFS_SET_NT_ACL(fsp, fsp->fsp_name, r->in.securityinformation, r->in.sd_buf.sd); if (ret == False) { - DEBUG(3,("_srv_net_file_set_secdesc: Unable to set NT ACL on file %s\n", file)); + DEBUG(3,("_srv_net_file_set_secdesc: Unable to set NT ACL on file %s\n", r->in.file)); status = WERR_ACCESS_DENIED; goto error_exit; } @@ -2280,38 +2272,38 @@ static const char *next_server_disk_enum(uint32 *resume) return disk; } -WERROR _srvsvc_NetDiskEnum(pipes_struct *p, const char *server_unc, uint32_t level, struct srvsvc_NetDiskInfo *info, uint32_t maxlen, uint32_t *totalentries, uint32_t *resume_handle) +WERROR _srvsvc_NetDiskEnum(pipes_struct *p, struct srvsvc_NetDiskEnum *r) { uint32 i; const char *disk_name; WERROR status = WERR_OK; - *totalentries = init_server_disk_enum(resume_handle); - info->count = 0; + *r->out.totalentries = init_server_disk_enum(r->in.resume_handle); + r->out.info->count = 0; - if(!(info->disks = TALLOC_ARRAY(p->mem_ctx, struct srvsvc_NetDiskInfo0, MAX_SERVER_DISK_ENTRIES))) { + if(!(r->out.info->disks = TALLOC_ARRAY(p->mem_ctx, struct srvsvc_NetDiskInfo0, MAX_SERVER_DISK_ENTRIES))) { return WERR_NOMEM; } /*allow one struct srvsvc_NetDiskInfo0 for null terminator*/ - for(i = 0; i < MAX_SERVER_DISK_ENTRIES -1 && (disk_name = next_server_disk_enum(resume_handle)); i++) { + for(i = 0; i < MAX_SERVER_DISK_ENTRIES -1 && (disk_name = next_server_disk_enum(r->in.resume_handle)); i++) { - info->count++; - (*totalentries)++; + r->out.info->count++; + (*r->out.totalentries)++; /*copy disk name into a unicode string*/ - info->disks[i].disk = disk_name; + r->out.info->disks[i].disk = disk_name; } /* add a terminating null string. Is this there if there is more data to come? */ - info->count++; - (*totalentries)++; + r->out.info->count++; + (*r->out.totalentries)++; - info->disks[i].disk = ""; + r->out.info->disks[i].disk = ""; return status; } @@ -2319,29 +2311,29 @@ WERROR _srvsvc_NetDiskEnum(pipes_struct *p, const char *server_unc, uint32_t lev /******************************************************************** ********************************************************************/ -WERROR _srvsvc_NetNameValidate(pipes_struct *p, const char *server_unc, const char *name, uint32_t name_type, uint32_t flags) +WERROR _srvsvc_NetNameValidate(pipes_struct *p, struct srvsvc_NetNameValidate *r) { int len; - if ((flags != 0x0) && (flags != 0x80000000)) { + if ((r->in.flags != 0x0) && (r->in.flags != 0x80000000)) { return WERR_INVALID_PARAM; } - switch ( name_type ) { + switch ( r->in.name_type ) { case 0x9: - len = strlen_m(name); + len = strlen_m(r->in.name); - if ((flags == 0x0) && (len > 81)) { - DEBUG(5,("_srv_net_name_validate: share name too long (%s > 81 chars)\n", name)); + if ((r->in.flags == 0x0) && (len > 81)) { + DEBUG(5,("_srv_net_name_validate: share name too long (%s > 81 chars)\n", r->in.name)); return WERR_INVALID_NAME; } - if ((flags == 0x80000000) && (len > 13)) { - DEBUG(5,("_srv_net_name_validate: share name too long (%s > 13 chars)\n", name)); + if ((r->in.flags == 0x80000000) && (len > 13)) { + DEBUG(5,("_srv_net_name_validate: share name too long (%s > 13 chars)\n", r->in.name)); return WERR_INVALID_NAME; } - if ( ! validate_net_name( name, INVALID_SHARENAME_CHARS, sizeof(name) ) ) { - DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", name)); + if ( ! validate_net_name( r->in.name, INVALID_SHARENAME_CHARS, sizeof(r->in.name) ) ) { + DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", r->in.name)); return WERR_INVALID_NAME; } break; @@ -2357,216 +2349,216 @@ WERROR _srvsvc_NetNameValidate(pipes_struct *p, const char *server_unc, const ch /******************************************************************** ********************************************************************/ -WERROR _srvsvc_NetFileClose(pipes_struct *p, const char *server_unc, uint32_t fid) +WERROR _srvsvc_NetFileClose(pipes_struct *p, struct srvsvc_NetFileClose *r) { return WERR_ACCESS_DENIED; } -WERROR _srvsvc_NetCharDevEnum(pipes_struct *p, const char *server_unc, uint32_t *level, union srvsvc_NetCharDevCtr *ctr, uint32_t max_buffer, uint32_t *totalentries, uint32_t *resume_handle) +WERROR _srvsvc_NetCharDevEnum(pipes_struct *p, struct srvsvc_NetCharDevEnum *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetCharDevGetInfo(pipes_struct *p, const char *server_unc, const char *device_name, uint32_t level, union srvsvc_NetCharDevInfo *info) +WERROR _srvsvc_NetCharDevGetInfo(pipes_struct *p, struct srvsvc_NetCharDevGetInfo *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetCharDevControl(pipes_struct *p, const char *server_unc, const char *device_name, uint32_t opcode) +WERROR _srvsvc_NetCharDevControl(pipes_struct *p, struct srvsvc_NetCharDevControl *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetCharDevQEnum(pipes_struct *p, const char *server_unc, const char *user, uint32_t *level, union srvsvc_NetCharDevQCtr *ctr, uint32_t max_buffer, uint32_t *totalentries, uint32_t *resume_handle) +WERROR _srvsvc_NetCharDevQEnum(pipes_struct *p, struct srvsvc_NetCharDevQEnum *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetCharDevQGetInfo(pipes_struct *p, const char *server_unc, const char *queue_name, const char *user, uint32_t level, union srvsvc_NetCharDevQInfo *info) +WERROR _srvsvc_NetCharDevQGetInfo(pipes_struct *p, struct srvsvc_NetCharDevQGetInfo *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetCharDevQSetInfo(pipes_struct *p, const char *server_unc, const char *queue_name, uint32_t level, union srvsvc_NetCharDevQInfo info, uint32_t *parm_error) +WERROR _srvsvc_NetCharDevQSetInfo(pipes_struct *p, struct srvsvc_NetCharDevQSetInfo *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetCharDevQPurge(pipes_struct *p, const char *server_unc, const char *queue_name) +WERROR _srvsvc_NetCharDevQPurge(pipes_struct *p, struct srvsvc_NetCharDevQPurge *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetCharDevQPurgeSelf(pipes_struct *p, const char *server_unc, const char *queue_name, const char *computer_name) +WERROR _srvsvc_NetCharDevQPurgeSelf(pipes_struct *p, struct srvsvc_NetCharDevQPurgeSelf *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetFileGetInfo(pipes_struct *p, const char *server_unc, uint32_t fid, uint32_t level, union srvsvc_NetFileInfo *info) +WERROR _srvsvc_NetFileGetInfo(pipes_struct *p, struct srvsvc_NetFileGetInfo *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetShareCheck(pipes_struct *p, const char *server_unc, const char *device_name, enum srvsvc_ShareType *type) +WERROR _srvsvc_NetShareCheck(pipes_struct *p, struct srvsvc_NetShareCheck *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetServerStatisticsGet(pipes_struct *p, const char *server_unc, const char *service, uint32_t level, uint32_t options, struct srvsvc_Statistics *stats) +WERROR _srvsvc_NetServerStatisticsGet(pipes_struct *p, struct srvsvc_NetServerStatisticsGet *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetTransportAdd(pipes_struct *p, const char *server_unc, uint32_t level, union srvsvc_NetTransportInfo info) +WERROR _srvsvc_NetTransportAdd(pipes_struct *p, struct srvsvc_NetTransportAdd *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetTransportEnum(pipes_struct *p, const char *server_unc, uint32_t *level, union srvsvc_NetTransportCtr *transports, uint32_t max_buffer, uint32_t *totalentries, uint32_t *resume_handle) +WERROR _srvsvc_NetTransportEnum(pipes_struct *p, struct srvsvc_NetTransportEnum *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetTransportDel(pipes_struct *p, const char *server_unc, uint32_t unknown, struct srvsvc_NetTransportInfo0 transport) +WERROR _srvsvc_NetTransportDel(pipes_struct *p, struct srvsvc_NetTransportDel *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetSetServiceBits(pipes_struct *p, const char *server_unc, const char *transport, uint32_t servicebits, uint32_t updateimmediately) +WERROR _srvsvc_NetSetServiceBits(pipes_struct *p, struct srvsvc_NetSetServiceBits *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetPathType(pipes_struct *p, const char *server_unc, const char *path, uint32_t pathflags, uint32_t *pathtype) +WERROR _srvsvc_NetPathType(pipes_struct *p, struct srvsvc_NetPathType *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetPathCanonicalize(pipes_struct *p, const char *server_unc, const char *path, uint8_t *can_path, uint32_t maxbuf, const char *prefix, uint32_t *pathtype, uint32_t pathflags) +WERROR _srvsvc_NetPathCanonicalize(pipes_struct *p, struct srvsvc_NetPathCanonicalize *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetPathCompare(pipes_struct *p, const char *server_unc, const char *path1, const char *path2, uint32_t pathtype, uint32_t pathflags) +WERROR _srvsvc_NetPathCompare(pipes_struct *p, struct srvsvc_NetPathCompare *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NETRPRNAMECANONICALIZE(pipes_struct *p) +WERROR _srvsvc_NETRPRNAMECANONICALIZE(pipes_struct *p, struct srvsvc_NETRPRNAMECANONICALIZE *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetPRNameCompare(pipes_struct *p, const char *server_unc, const char *name1, const char *name2, uint32_t name_type, uint32_t flags) +WERROR _srvsvc_NetPRNameCompare(pipes_struct *p, struct srvsvc_NetPRNameCompare *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetShareDelStart(pipes_struct *p, const char *server_unc, const char *share, uint32_t reserved, struct policy_handle *hnd) +WERROR _srvsvc_NetShareDelStart(pipes_struct *p, struct srvsvc_NetShareDelStart *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetShareDelCommit(pipes_struct *p, struct policy_handle *hnd) +WERROR _srvsvc_NetShareDelCommit(pipes_struct *p, struct srvsvc_NetShareDelCommit *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetServerTransportAddEx(pipes_struct *p, const char *server_unc, uint32_t level, union srvsvc_NetTransportInfo info) +WERROR _srvsvc_NetServerTransportAddEx(pipes_struct *p, struct srvsvc_NetServerTransportAddEx *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetServerSetServiceBitsEx(pipes_struct *p, const char *server_unc, const char *emulated_server_unc, const char *transport, uint32_t servicebitsofinterest, uint32_t servicebits, uint32_t updateimmediately) +WERROR _srvsvc_NetServerSetServiceBitsEx(pipes_struct *p, struct srvsvc_NetServerSetServiceBitsEx *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NETRDFSGETVERSION(pipes_struct *p) +WERROR _srvsvc_NETRDFSGETVERSION(pipes_struct *p, struct srvsvc_NETRDFSGETVERSION *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NETRDFSCREATELOCALPARTITION(pipes_struct *p) +WERROR _srvsvc_NETRDFSCREATELOCALPARTITION(pipes_struct *p, struct srvsvc_NETRDFSCREATELOCALPARTITION *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NETRDFSDELETELOCALPARTITION(pipes_struct *p) +WERROR _srvsvc_NETRDFSDELETELOCALPARTITION(pipes_struct *p, struct srvsvc_NETRDFSDELETELOCALPARTITION *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NETRDFSSETLOCALVOLUMESTATE(pipes_struct *p) +WERROR _srvsvc_NETRDFSSETLOCALVOLUMESTATE(pipes_struct *p, struct srvsvc_NETRDFSSETLOCALVOLUMESTATE *R) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NETRDFSSETSERVERINFO(pipes_struct *p) +WERROR _srvsvc_NETRDFSSETSERVERINFO(pipes_struct *p, struct srvsvc_NETRDFSSETSERVERINFO *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NETRDFSCREATEEXITPOINT(pipes_struct *p) +WERROR _srvsvc_NETRDFSCREATEEXITPOINT(pipes_struct *p, struct srvsvc_NETRDFSCREATEEXITPOINT *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NETRDFSDELETEEXITPOINT(pipes_struct *p) +WERROR _srvsvc_NETRDFSDELETEEXITPOINT(pipes_struct *p, struct srvsvc_NETRDFSDELETEEXITPOINT *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NETRSERVERTRANSPORTDELEX(pipes_struct *p) +WERROR _srvsvc_NETRSERVERTRANSPORTDELEX(pipes_struct *p, struct srvsvc_NETRSERVERTRANSPORTDELEX *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NETRDFSMANAGERREPORTSITEINFO(pipes_struct *p) +WERROR _srvsvc_NETRDFSMANAGERREPORTSITEINFO(pipes_struct *p, struct srvsvc_NETRDFSMANAGERREPORTSITEINFO *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NETRDFSMODIFYPREFIX(pipes_struct *p) +WERROR _srvsvc_NETRDFSMODIFYPREFIX(pipes_struct *p, struct srvsvc_NETRDFSMODIFYPREFIX *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NETRDFSFIXLOCALVOLUME(pipes_struct *p) +WERROR _srvsvc_NETRDFSFIXLOCALVOLUME(pipes_struct *p, struct srvsvc_NETRDFSFIXLOCALVOLUME *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; -- cgit From 71730ae5eb658c8c674273d9162e1c989e3bccda Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 18 Jan 2007 11:31:38 +0000 Subject: r20876: Fix bug 4346 -- Thanks to YAMASAKI Hiroyuki (This used to be commit a7a66eb4eb2e518007b791457694c39dfff90705) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 06c84b60e9..3dea0a8493 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -215,7 +215,7 @@ static uint32 get_share_type(const struct share_params *params) type = STYPE_PRINTQ; if (strequal(lp_fstype(params->service), "IPC")) type = STYPE_IPC; - if (net_name[len_net_name] == '$') + if (net_name[len_net_name-1] == '$') type |= STYPE_HIDDEN; return type; -- cgit From 69d8c5ae5f1319e3c9430aa7d6d09ca2a62ba10a Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 1 Feb 2007 19:29:07 +0000 Subject: r21115: notify_internal.c needs to remove the table entry if a process has crashed. So it needs the specific error message. Make messages.c return NTSTATUS and specificially NT_STATUS_INVALID_HANDLE if sending to a non-existent process. Volker (This used to be commit 3f620d181da0c356c8ffbdb5b380ccab3645a972) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 3dea0a8493..c0953f2723 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1219,7 +1219,7 @@ WERROR _srvsvc_NetSessDel(pipes_struct *p, struct srvsvc_NetSessDel *r) if ((strequal(session_list[snum].username, r->in.user) || r->in.user[0] == '\0' ) && strequal(session_list[snum].remote_machine, machine)) { - if (message_send_pid(pid_to_procid(session_list[snum].pid), MSG_SHUTDOWN, NULL, 0, False)) + if (NT_STATUS_IS_OK(message_send_pid(pid_to_procid(session_list[snum].pid), MSG_SHUTDOWN, NULL, 0, False))) status = WERR_OK; } } -- cgit From 7a5fa7f12ec439ef5a4af29aa86498f799b6b9a5 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 6 Feb 2007 21:05:34 +0000 Subject: r21191: Add in the POSIX open/mkdir/unlink calls. Move more error code returns to NTSTATUS. Client test code to follow... See if this passes the build-farm before I add it into 3.0.25. Jeremy. (This used to be commit 83dbbdff345fa9e427c9579183f4380004bf3dd7) --- source3/rpc_server/srv_srvsvc_nt.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index c0953f2723..005c57e50a 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2081,6 +2081,7 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, struct srvsvc_NetGetFileSecur FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, 0, + FILE_ATTRIBUTE_DIRECTORY, NULL, &fsp); if (!NT_STATUS_IS_OK(nt_status)) { @@ -2187,6 +2188,7 @@ WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, struct srvsvc_NetSetFileSecur FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, 0, + FILE_ATTRIBUTE_DIRECTORY, NULL, &fsp); if (!NT_STATUS_IS_OK(nt_status)) { -- cgit From c96fc96de955ce5330af113abcee20645c8b5b78 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Fri, 9 Feb 2007 23:14:23 +0000 Subject: r21265: Fix some valgrind errors -- not in 3_0 (This used to be commit b419a3407532efcd50f54c77927b3b3bb566845f) --- source3/rpc_server/srv_srvsvc_nt.c | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 005c57e50a..615f5e1b07 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -80,8 +80,16 @@ static int pipe_enum_fn( TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, voi fenum->info[i].fid = (uint32)((procid_to_pid(&prec.pid)<<16) & prec.pnum); fenum->info[i].permissions = (FILE_READ_DATA|FILE_WRITE_DATA); fenum->info[i].num_locks = 0; - fenum->info[i].user = uidtoname( prec.uid ); - fenum->info[i].path = fullpath; + if (!(fenum->info[i].user = talloc_strdup( + fenum->ctx, uidtoname(prec.uid)))) { + /* There's not much we can do here. */ + fenum->info[i].user = ""; + } + if (!(fenum->info[i].path = talloc_strdup( + fenum->ctx, fullpath))) { + /* There's not much we can do here. */ + fenum->info[i].path = ""; + } fenum->count++; } @@ -172,8 +180,16 @@ static void enum_file_fn( const struct share_mode_entry *e, fenum->info[i].fid = e->share_file_id; fenum->info[i].permissions = permissions; fenum->info[i].num_locks = num_locks; - fenum->info[i].user = uidtoname(e->uid); - fenum->info[i].path = fullpath; + if (!(fenum->info[i].user = talloc_strdup( + fenum->ctx, uidtoname(e->uid)))) { + /* There's not much we can do here. */ + fenum->info[i].user = ""; + } + if (!(fenum->info[i].path = talloc_strdup( + fenum->ctx, fullpath))) { + /* There's not much we can do here. */ + fenum->info[i].path = ""; + } fenum->count++; } @@ -863,8 +879,14 @@ static void init_srv_sess_info_1(pipes_struct *p, struct srvsvc_NetSessCtr1 *ss1 num_files = net_count_files(pw->pw_uid, session_list[*snum].pid); guest = strequal( session_list[*snum].username, lp_guestaccount() ); - ss1->array[num_entries].client = session_list[*snum].remote_machine; - ss1->array[num_entries].user = session_list[*snum].username; + if (!(ss1->array[num_entries].client = talloc_strdup( + ss1->array, session_list[*snum].remote_machine))) { + ss1->array[num_entries].client = ""; + } + if (!(ss1->array[num_entries].user = talloc_strdup( + ss1->array, session_list[*snum].username))) { + ss1->array[num_entries].user = ""; + } ss1->array[num_entries].num_open = num_files; ss1->array[num_entries].time = connect_time; ss1->array[num_entries].idle_time = 0; -- cgit From 12ba88574bf91bdcc4447bfc3d429b799064bfd9 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 27 Apr 2007 23:18:41 +0000 Subject: r22542: Move over to using the _strict varients of the talloc calls. No functional changes. Looks bigger than it is :-). Jeremy. (This used to be commit f6fa3080fee1b20df9f1968500840a88cf0ee592) --- source3/rpc_server/srv_srvsvc_nt.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 615f5e1b07..8f68bf36a1 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -544,61 +544,61 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, switch (info_level) { case 0: - if (!(ctr->ctr0 = talloc_zero( + if (!(ctr->ctr0 = TALLOC_ZERO_P( p->mem_ctx, struct srvsvc_NetShareCtr0))) { goto done; } break; case 1: - if (!(ctr->ctr1 = talloc_zero( + if (!(ctr->ctr1 = TALLOC_ZERO_P( p->mem_ctx, struct srvsvc_NetShareCtr1))) { goto done; } break; case 2: - if (!(ctr->ctr2 = talloc_zero( + if (!(ctr->ctr2 = TALLOC_ZERO_P( p->mem_ctx, struct srvsvc_NetShareCtr2))) { goto done; } break; case 501: - if (!(ctr->ctr501 = talloc_zero( + if (!(ctr->ctr501 = TALLOC_ZERO_P( p->mem_ctx, struct srvsvc_NetShareCtr501))) { goto done; } break; case 502: - if (!(ctr->ctr502 = talloc_zero( + if (!(ctr->ctr502 = TALLOC_ZERO_P( p->mem_ctx, struct srvsvc_NetShareCtr502))) { goto done; } break; case 1004: - if (!(ctr->ctr1004 = talloc_zero( + if (!(ctr->ctr1004 = TALLOC_ZERO_P( p->mem_ctx, struct srvsvc_NetShareCtr1004))) { goto done; } break; case 1005: - if (!(ctr->ctr1005 = talloc_zero( + if (!(ctr->ctr1005 = TALLOC_ZERO_P( p->mem_ctx, struct srvsvc_NetShareCtr1005))) { goto done; } break; case 1006: - if (!(ctr->ctr1006 = talloc_zero( + if (!(ctr->ctr1006 = TALLOC_ZERO_P( p->mem_ctx, struct srvsvc_NetShareCtr1006))) { goto done; } break; case 1007: - if (!(ctr->ctr1007 = talloc_zero( + if (!(ctr->ctr1007 = TALLOC_ZERO_P( p->mem_ctx, struct srvsvc_NetShareCtr1007))) { goto done; } break; case 1501: - if (!(ctr->ctr1501 = talloc_zero( + if (!(ctr->ctr1501 = TALLOC_ZERO_P( p->mem_ctx, struct srvsvc_NetShareCtr1501))) { goto done; } @@ -781,7 +781,7 @@ static void init_srv_sess_info_0(pipes_struct *p, struct srvsvc_NetSessCtr0 *ss0 DEBUG(5,("init_srv_sess_0_ss0\n")); - ss0->array = talloc_array(p->mem_ctx, struct srvsvc_NetSessInfo0, *stot); + ss0->array = TALLOC_ARRAY(p->mem_ctx, struct srvsvc_NetSessInfo0, *stot); if (snum) { for (; (*snum) < (*stot); (*snum)++) { @@ -861,7 +861,7 @@ static void init_srv_sess_info_1(pipes_struct *p, struct srvsvc_NetSessCtr1 *ss1 (*stot) = list_sessions(&session_list); - ss1->array = talloc_array(p->mem_ctx, struct srvsvc_NetSessInfo1, *stot); + ss1->array = TALLOC_ARRAY(p->mem_ctx, struct srvsvc_NetSessInfo1, *stot); for (; (*snum) < (*stot); (*snum)++) { uint32 num_files; @@ -954,7 +954,7 @@ static void init_srv_conn_info_0(pipes_struct *p, struct srvsvc_NetConnCtr0 *ss0 DEBUG(5,("init_srv_conn_0_ss0\n")); if (snum) { - ss0->array = talloc_array(p->mem_ctx, struct srvsvc_NetConnInfo0, *stot); + ss0->array = TALLOC_ARRAY(p->mem_ctx, struct srvsvc_NetConnInfo0, *stot); for (; (*snum) < (*stot); (*snum)++) { ss0->array[num_entries].conn_id = (*stot); @@ -996,7 +996,7 @@ static void init_srv_conn_info_1(pipes_struct *p, struct srvsvc_NetConnCtr1 *ss1 DEBUG(5,("init_srv_conn_1_ss1\n")); if (snum) { - ss1->array = talloc_array(p->mem_ctx, struct srvsvc_NetConnInfo1, *stot); + ss1->array = TALLOC_ARRAY(p->mem_ctx, struct srvsvc_NetConnInfo1, *stot); for (; (*snum) < (*stot); (*snum)++) { ss1->array[num_entries].conn_id = (*stot); ss1->array[num_entries].conn_type = 0x3; @@ -1067,7 +1067,7 @@ static WERROR net_file_enum_3(pipes_struct *p, union srvsvc_NetFileCtr *ctr, uin (b) active pipes (c) open directories and files */ - ctr->ctr3 = talloc_zero(p->mem_ctx, struct srvsvc_NetFileCtr3); + ctr->ctr3 = TALLOC_ZERO_P(p->mem_ctx, struct srvsvc_NetFileCtr3); status = net_enum_files( ctx, &ctr->ctr3->array, num_entries, resume_hnd ); if ( !W_ERROR_IS_OK(status)) @@ -1121,7 +1121,7 @@ WERROR _srvsvc_NetSrvGetInfo(pipes_struct *p, struct srvsvc_NetSrvGetInfo *r) here, as most of it is made up. */ case 102: - r->out.info->info102 = talloc_zero(p->mem_ctx, struct srvsvc_NetSrvInfo102); + r->out.info->info102 = TALLOC_ZERO_P(p->mem_ctx, struct srvsvc_NetSrvInfo102); r->out.info->info102->platform_id = 500; r->out.info->info102->version_major = lp_major_announce_version(); @@ -1138,7 +1138,7 @@ WERROR _srvsvc_NetSrvGetInfo(pipes_struct *p, struct srvsvc_NetSrvGetInfo *r) r->out.info->info102->comment = lp_serverstring(); break; case 101: - r->out.info->info101 = talloc_zero(p->mem_ctx, struct srvsvc_NetSrvInfo101); + r->out.info->info101 = TALLOC_ZERO_P(p->mem_ctx, struct srvsvc_NetSrvInfo101); r->out.info->info101->platform_id = 500; r->out.info->info101->server_name = global_myname(); r->out.info->info101->version_major = lp_major_announce_version(); @@ -1147,7 +1147,7 @@ WERROR _srvsvc_NetSrvGetInfo(pipes_struct *p, struct srvsvc_NetSrvGetInfo *r) r->out.info->info101->comment = lp_serverstring(); break; case 100: - r->out.info->info100 = talloc_zero(p->mem_ctx, struct srvsvc_NetSrvInfo100); + r->out.info->info100 = TALLOC_ZERO_P(p->mem_ctx, struct srvsvc_NetSrvInfo100); r->out.info->info100->platform_id = 500; r->out.info->info100->server_name = global_myname(); break; -- cgit From e26dee48f079f429690584aa2666f498e08e6810 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sat, 28 Apr 2007 18:16:33 +0000 Subject: r22561: Fix a memleak in lanman.c: Nobody would free the session_list. Volker (This used to be commit 5d428400f77399b7fc30fb2a0fb10f0c74b96458) --- source3/rpc_server/srv_srvsvc_nt.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 8f68bf36a1..bdd8f68d51 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -769,13 +769,12 @@ static void init_srv_sess_info_0(pipes_struct *p, struct srvsvc_NetSessCtr0 *ss0 { struct sessionid *session_list; uint32 num_entries = 0; - (*stot) = list_sessions(&session_list); + (*stot) = list_sessions(p->mem_ctx, &session_list); if (ss0 == NULL) { if (snum) { (*snum) = 0; } - SAFE_FREE(session_list); return; } @@ -799,7 +798,6 @@ static void init_srv_sess_info_0(pipes_struct *p, struct srvsvc_NetSessCtr0 *ss0 ss0->array = NULL; ss0->count = 0; } - SAFE_FREE(session_list); } /******************************************************************* @@ -859,7 +857,7 @@ static void init_srv_sess_info_1(pipes_struct *p, struct srvsvc_NetSessCtr1 *ss1 return; } - (*stot) = list_sessions(&session_list); + (*stot) = list_sessions(p->mem_ctx, &session_list); ss1->array = TALLOC_ARRAY(p->mem_ctx, struct srvsvc_NetSessInfo1, *stot); @@ -900,8 +898,6 @@ static void init_srv_sess_info_1(pipes_struct *p, struct srvsvc_NetSessCtr1 *ss1 if ((*snum) >= (*stot)) { (*snum) = 0; } - - SAFE_FREE(session_list); } /******************************************************************* @@ -1222,7 +1218,7 @@ WERROR _srvsvc_NetSessDel(pipes_struct *p, struct srvsvc_NetSessDel *r) memmove(machine, &machine[1], strlen(machine)); } - num_sessions = list_sessions(&session_list); + num_sessions = list_sessions(p->mem_ctx, &session_list); DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__)); @@ -1248,10 +1244,7 @@ WERROR _srvsvc_NetSessDel(pipes_struct *p, struct srvsvc_NetSessDel *r) DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__)); - done: - SAFE_FREE(session_list); - return status; } -- cgit From 76ce309234adbe0a6a56b849a91714cab148c4a7 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 7 May 2007 15:31:12 +0000 Subject: r22751: Next step for the cluster merge: sessionid.tdb should contain a 'struct server_id' instead of a 'uint32 pid' (This used to be commit be7bac55c37676a8137c59a22dfb2e4c4821ac21) --- source3/rpc_server/srv_srvsvc_nt.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index bdd8f68d51..2365f7ece3 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -43,7 +43,7 @@ struct file_enum_count { }; struct sess_file_count { - pid_t pid; + struct server_id pid; uid_t uid; int count; }; @@ -809,7 +809,7 @@ static void sess_file_fn( const struct share_mode_entry *e, { struct sess_file_count *sess = (struct sess_file_count *)private_data; - if ( (procid_to_pid(&e->pid) == sess->pid) && (sess->uid == e->uid) ) { + if ( procid_equal(&e->pid, &sess->pid) && (sess->uid == e->uid) ) { sess->count++; } @@ -819,7 +819,7 @@ static void sess_file_fn( const struct share_mode_entry *e, /******************************************************************* ********************************************************************/ -static int net_count_files( uid_t uid, pid_t pid ) +static int net_count_files( uid_t uid, struct server_id pid ) { struct sess_file_count s_file_cnt; @@ -1237,7 +1237,7 @@ WERROR _srvsvc_NetSessDel(pipes_struct *p, struct srvsvc_NetSessDel *r) if ((strequal(session_list[snum].username, r->in.user) || r->in.user[0] == '\0' ) && strequal(session_list[snum].remote_machine, machine)) { - if (NT_STATUS_IS_OK(message_send_pid(pid_to_procid(session_list[snum].pid), MSG_SHUTDOWN, NULL, 0, False))) + if (NT_STATUS_IS_OK(message_send_pid(session_list[snum].pid, MSG_SHUTDOWN, NULL, 0, False))) status = WERR_OK; } } -- cgit From 4aa44f7475e03dcc596f6a13fffffda7268074a1 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 8 May 2007 13:44:36 +0000 Subject: r22761: This introduces lib/conn_tdb.c with two main functions: connections_traverse and connections_forall. This centralizes all the routines that did individual tdb_open("connections.tdb") and direct tdb_traverse. Volker (This used to be commit e43e94cda1ad8876b3cb5d1129080b57fa6ec214) --- source3/rpc_server/srv_srvsvc_nt.c | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 2365f7ece3..59e86e4912 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -104,27 +104,22 @@ static WERROR net_enum_pipes( TALLOC_CTX *ctx, struct srvsvc_NetFileInfo3 **info uint32 *count, uint32 *resume ) { struct file_enum_count fenum; - TDB_CONTEXT *conn_tdb = conn_tdb_ctx(); - if ( !conn_tdb ) { - DEBUG(0,("net_enum_pipes: Failed to retrieve the connections tdb handle!\n")); - return WERR_ACCESS_DENIED; - } - fenum.ctx = ctx; fenum.info = *info; fenum.count = *count; - if (tdb_traverse(conn_tdb, pipe_enum_fn, &fenum) == -1) { - DEBUG(0,("net_enum_pipes: traverse of connections.tdb failed with error %s.\n", - tdb_errorstr(conn_tdb) )); + if (connections_traverse(pipe_enum_fn, &fenum) == -1) { + DEBUG(0,("net_enum_pipes: traverse of connections.tdb " + "failed\n")); return WERR_NOMEM; } *info = fenum.info; *count = fenum.count; - return WERR_OK;} + return WERR_OK; +} /******************************************************************* ********************************************************************/ @@ -1421,7 +1416,7 @@ static WERROR add_share(const char *share_name, const char *path, if ( (ret = smbrun(command, NULL)) == 0 ) { /* Tell everyone we updated smb.conf. */ - message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, + message_send_all(MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL); } @@ -1517,7 +1512,7 @@ static WERROR delete_share(const char *sharename, if ( (ret = smbrun(command, NULL)) == 0 ) { /* Tell everyone we updated smb.conf. */ - message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, + message_send_all(MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL); } @@ -1575,7 +1570,7 @@ static WERROR change_share(const char *share_name, const char *path, if ( (ret = smbrun(command, NULL)) == 0 ) { /* Tell everyone we updated smb.conf. */ - message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, + message_send_all(MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL); } -- cgit From b4a7b7a8889737e2891fc1176feabd4ce47f2737 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 14 May 2007 12:16:20 +0000 Subject: r22844: Introduce const DATA_BLOB data_blob_null = { NULL, 0, NULL }; and replace all data_blob(NULL, 0) calls. (This used to be commit 3d3d61687ef00181f4f04e001d42181d93ac931e) --- source3/rpc_server/srv_srvsvc_nt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 59e86e4912..d0f2aa500f 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2048,7 +2048,7 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, struct srvsvc_NetGetFileSecur /* Null password is ok - we are already an authenticated user... */ - null_pw = data_blob(NULL, 0); + null_pw = data_blob_null; become_root(); conn = make_connection(r->in.share, null_pw, "A:", p->pipe_user.vuid, &nt_status); @@ -2153,7 +2153,7 @@ WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, struct srvsvc_NetSetFileSecur ZERO_STRUCT(st); /* Null password is ok - we are already an authenticated user... */ - null_pw = data_blob(NULL, 0); + null_pw = data_blob_null; become_root(); conn = make_connection(r->in.share, null_pw, "A:", p->pipe_user.vuid, &nt_status); -- cgit From fb99bbe67597555109ebd65613a5aab395b43499 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 15 May 2007 10:50:44 +0000 Subject: r22895: Convert some more calls from message_send_buf to messaging_send_buf (This used to be commit c8b98273406242a89a7e5d1fb5d79120ebe5822a) --- source3/rpc_server/srv_srvsvc_nt.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index d0f2aa500f..bb60f57a14 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1231,8 +1231,13 @@ WERROR _srvsvc_NetSessDel(pipes_struct *p, struct srvsvc_NetSessDel *r) if ((strequal(session_list[snum].username, r->in.user) || r->in.user[0] == '\0' ) && strequal(session_list[snum].remote_machine, machine)) { + NTSTATUS ntstat; + + ntstat = messaging_send(smbd_messaging_context(), + session_list[snum].pid, + MSG_SHUTDOWN, &data_blob_null); - if (NT_STATUS_IS_OK(message_send_pid(session_list[snum].pid, MSG_SHUTDOWN, NULL, 0, False))) + if (NT_STATUS_IS_OK(ntstat)) status = WERR_OK; } } -- cgit From 8c3f8e5697f29f1a9829298e0561ff7305b62082 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 15 May 2007 15:49:55 +0000 Subject: r22911: Pass a messaging_context to message_send_all (This used to be commit cc92ce665dcfe9054d09429219883b18a4cab090) --- source3/rpc_server/srv_srvsvc_nt.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index bb60f57a14..cf3268d44d 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1421,7 +1421,8 @@ static WERROR add_share(const char *share_name, const char *path, if ( (ret = smbrun(command, NULL)) == 0 ) { /* Tell everyone we updated smb.conf. */ - message_send_all(MSG_SMB_CONF_UPDATED, + message_send_all(smbd_messaging_context(), + MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL); } @@ -1517,7 +1518,8 @@ static WERROR delete_share(const char *sharename, if ( (ret = smbrun(command, NULL)) == 0 ) { /* Tell everyone we updated smb.conf. */ - message_send_all(MSG_SMB_CONF_UPDATED, + message_send_all(smbd_messaging_context(), + MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL); } @@ -1575,7 +1577,8 @@ static WERROR change_share(const char *share_name, const char *path, if ( (ret = smbrun(command, NULL)) == 0 ) { /* Tell everyone we updated smb.conf. */ - message_send_all(MSG_SMB_CONF_UPDATED, + message_send_all(smbd_messaging_context(), + MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL); } -- cgit From ac3f08ddbe0b484375624db0e35999a8584b57f4 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 21 May 2007 22:17:13 +0000 Subject: r23055: Rewrite messages.c to use auto-generated marshalling in the tdb. I'm doing this because for the clustering the marshalling is needed in more than one place, so I wanted a decent routine to marshall a message_rec struct which was not there before. Tridge, this seems about the same speed as it used to be before, the librpc/ndr overhead in my tests was under the noise. Volker (This used to be commit eaefd00563173dfabb7716c5695ac0a2f7139bb6) --- source3/rpc_server/srv_srvsvc_nt.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index cf3268d44d..df7cd06b67 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1423,7 +1423,7 @@ static WERROR add_share(const char *share_name, const char *path, /* Tell everyone we updated smb.conf. */ message_send_all(smbd_messaging_context(), MSG_SMB_CONF_UPDATED, - NULL, 0, False, NULL); + NULL, 0, NULL); } if ( is_disk_op ) @@ -1520,7 +1520,7 @@ static WERROR delete_share(const char *sharename, /* Tell everyone we updated smb.conf. */ message_send_all(smbd_messaging_context(), MSG_SMB_CONF_UPDATED, - NULL, 0, False, NULL); + NULL, 0, NULL); } if ( is_disk_op ) @@ -1579,7 +1579,7 @@ static WERROR change_share(const char *share_name, const char *path, /* Tell everyone we updated smb.conf. */ message_send_all(smbd_messaging_context(), MSG_SMB_CONF_UPDATED, - NULL, 0, False, NULL); + NULL, 0, NULL); } if ( is_disk_op ) -- cgit From 054bf2fc8bd8ac62e16ec04001c0a4a8409d0e1d Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 28 May 2007 11:38:42 +0000 Subject: r23171: Convert connections.tdb to dbwrap (This used to be commit 80a1f43825063bbbda896175d99700ede5a4757a) --- source3/rpc_server/srv_srvsvc_nt.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index df7cd06b67..06c733fe49 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -52,15 +52,15 @@ struct sess_file_count { Count the entries belonging to a service in the connection db. ****************************************************************************/ -static int pipe_enum_fn( TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *p) +static int pipe_enum_fn( struct db_record *rec, void *p) { struct pipe_open_rec prec; struct file_enum_count *fenum = (struct file_enum_count *)p; - if (dbuf.dsize != sizeof(struct pipe_open_rec)) + if (rec->value.dsize != sizeof(struct pipe_open_rec)) return 0; - memcpy(&prec, dbuf.dptr, sizeof(struct pipe_open_rec)); + memcpy(&prec, rec->value.dptr, sizeof(struct pipe_open_rec)); if ( process_exists(prec.pid) ) { struct srvsvc_NetFileInfo3 *f; @@ -124,14 +124,12 @@ static WERROR net_enum_pipes( TALLOC_CTX *ctx, struct srvsvc_NetFileInfo3 **info /******************************************************************* ********************************************************************/ -/* global needed to make use of the share_mode_forall() callback */ -static struct file_enum_count f_enum_cnt; - static void enum_file_fn( const struct share_mode_entry *e, const char *sharepath, const char *fname, - void *dummy ) + void *private_data ) { - struct file_enum_count *fenum = &f_enum_cnt; + struct file_enum_count *fenum = + (struct file_enum_count *)&private_data; /* If the pid was not found delete the entry from connections.tdb */ @@ -199,11 +197,13 @@ static void enum_file_fn( const struct share_mode_entry *e, static WERROR net_enum_files( TALLOC_CTX *ctx, struct srvsvc_NetFileInfo3 **info, uint32 *count, uint32 *resume ) { + struct file_enum_count f_enum_cnt; + f_enum_cnt.ctx = ctx; f_enum_cnt.count = *count; f_enum_cnt.info = *info; - share_mode_forall( enum_file_fn, NULL ); + share_mode_forall( enum_file_fn, (void *)&f_enum_cnt ); *info = f_enum_cnt.info; *count = f_enum_cnt.count; -- cgit From e8156439f24137b5418baad20a7f00f6949cfe29 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 29 May 2007 09:30:34 +0000 Subject: r23183: Check in a change made by Tridge: This replaces the internal explicit dev/ino file id representation by a "struct file_id". This is necessary as cluster file systems and NFS don't necessarily assign the same device number to the shared file system. With this structure in place we can now easily add different schemes to map a file to a unique 64-bit device node. Jeremy, you might note that I did not change the external interface of smb_share_modes.c. Volker (This used to be commit 9b10dbbd5de8813fc15ebbb6be9b18010ffe8139) --- source3/rpc_server/srv_srvsvc_nt.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 06c733fe49..7132f92c93 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -152,8 +152,7 @@ static void enum_file_fn( const struct share_mode_entry *e, /* need to count the number of locks on a file */ ZERO_STRUCT( fsp ); - fsp.dev = e->dev; - fsp.inode = e->inode; + fsp.file_id = e->id; if ( (brl = brl_get_locks_readonly(NULL,&fsp)) != NULL ) { num_locks = brl->num_locks; -- cgit From a0ac7a7f4c0290787cdadb5866272cee2bd61b8a Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 26 Jun 2007 22:49:10 +0000 Subject: r23620: Convert set_nt_acl to return NTSTATUS. Also fix the chown return to correctly return NT_STATUS_INVALID_OWNER if it should be disallowed. Matches better what W2K3R3 does. NFSv4 ACL module owners, please examine these changes. Jeremy. (This used to be commit fc6899a5506b272f8cd5f5837ca13300b4e69a5f) --- source3/rpc_server/srv_srvsvc_nt.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 7132f92c93..0573599a81 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2147,7 +2147,6 @@ error_exit: WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, struct srvsvc_NetSetFileSecurity *r) { - BOOL ret; DATA_BLOB null_pw; files_struct *fsp = NULL; SMB_STRUCT_STAT st; @@ -2215,9 +2214,9 @@ WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, struct srvsvc_NetSetFileSecur } } - ret = SMB_VFS_SET_NT_ACL(fsp, fsp->fsp_name, r->in.securityinformation, r->in.sd_buf.sd); + nt_status = SMB_VFS_SET_NT_ACL(fsp, fsp->fsp_name, r->in.securityinformation, r->in.sd_buf.sd); - if (ret == False) { + if (!NT_STATUS_IS_OK(nt_status)) { DEBUG(3,("_srv_net_file_set_secdesc: Unable to set NT ACL on file %s\n", r->in.file)); status = WERR_ACCESS_DENIED; goto error_exit; -- cgit From 0bc56a2e5ffd0e65e4770e10c80d9fec02950b36 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 5 Jul 2007 16:26:27 +0000 Subject: r23724: Reduce access to the global inbuf a tiny bit. Add a struct smb_request that contains some of the fields from the SMB header, removing the need to access inbuf directly. This right now is used only in the open file code & friends, and creating that header is only done when needed. This needs more work, but it is a start. Jeremy, I'm only checking this into 3_0, please review before I merge it to _26. Volker (This used to be commit ca988f4e79e977160d82e86486972afd15d4acf5) --- source3/rpc_server/srv_srvsvc_nt.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 0573599a81..1d370d3847 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2089,11 +2089,11 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, struct srvsvc_NetGetFileSecur goto error_exit; } - nt_status = open_file_stat(conn, r->in.file, &st, &fsp); + nt_status = open_file_stat(conn, NULL, r->in.file, &st, &fsp); if (!NT_STATUS_IS_OK(nt_status)) { /* Perhaps it is a directory */ if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY)) - nt_status = open_directory(conn, r->in.file, &st, + nt_status = open_directory(conn, NULL, r->in.file, &st, READ_CONTROL_ACCESS, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, @@ -2194,12 +2194,12 @@ WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, struct srvsvc_NetSetFileSecur } - nt_status = open_file_stat(conn, r->in.file, &st, &fsp); + nt_status = open_file_stat(conn, NULL, r->in.file, &st, &fsp); if (!NT_STATUS_IS_OK(nt_status)) { /* Perhaps it is a directory */ if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY)) - nt_status = open_directory(conn, r->in.file, &st, + nt_status = open_directory(conn, NULL, r->in.file, &st, FILE_READ_ATTRIBUTES, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, -- cgit From d824b98f80ba186030cbb70b3a1e5daf80469ecd Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 9 Jul 2007 19:25:36 +0000 Subject: r23779: Change from v2 or later to v3 or later. Jeremy. (This used to be commit 407e6e695b8366369b7c76af1ff76869b45347b3) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 1d370d3847..ce5c37ca0d 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -9,7 +9,7 @@ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, -- cgit From 153cfb9c83534b09f15cc16205d7adb19b394928 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 10 Jul 2007 05:23:25 +0000 Subject: r23801: The FSF has moved around a lot. This fixes their Mass Ave address. (This used to be commit 87c91e4362c51819032bfbebbb273c52e203b227) --- source3/rpc_server/srv_srvsvc_nt.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index ce5c37ca0d..ed32f6a765 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -18,8 +18,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * along with this program; if not, see . */ /* This is the implementation of the srvsvc pipe. */ -- cgit From 929e1d99209e20a9c2c95c8bdfc8eaa37b2c2291 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 30 Aug 2007 19:48:31 +0000 Subject: r24809: Consolidate the use of temporary talloc contexts. This adds the two functions talloc_stackframe() and talloc_tos(). * When a new talloc stackframe is allocated with talloc_stackframe(), then * the TALLOC_CTX returned with talloc_tos() is reset to that new * frame. Whenever that stack frame is TALLOC_FREE()'ed, then the reverse * happens: The previous talloc_tos() is restored. * * This API is designed to be robust in the sense that if someone forgets to * TALLOC_FREE() a stackframe, then the next outer one correctly cleans up and * resets the talloc_tos(). The original motivation for this patch was to get rid of the sid_string_static & friends buffers. Explicitly passing talloc context everywhere clutters code too much for my taste, so an implicit talloc_tos() is introduced here. Many of these static buffers are replaced by a single static pointer. The intended use would thus be that low-level functions can rather freely push stuff to talloc_tos, the upper layers clean up by freeing the stackframe. The more of these stackframes are used and correctly freed the more exact the memory cleanup happens. This patch removes the main_loop_talloc_ctx, tmp_talloc_ctx and lp_talloc_ctx (did I forget any?) So, never do a tmp_ctx = talloc_init("foo"); anymore, instead, use tmp_ctx = talloc_stackframe() :-) Volker (This used to be commit 6585ea2cb7f417e14540495b9c7380fe9c8c717b) --- source3/rpc_server/srv_srvsvc_nt.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index ed32f6a765..22eaac51a7 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1049,7 +1049,6 @@ static WERROR init_srv_conn_info_ctr(pipes_struct *p, union srvsvc_NetConnCtr *c static WERROR net_file_enum_3(pipes_struct *p, union srvsvc_NetFileCtr *ctr, uint32 *resume_hnd, uint32 *num_entries ) { - TALLOC_CTX *ctx = get_talloc_ctx(); WERROR status; /* TODO -- Windows enumerates @@ -1058,11 +1057,11 @@ static WERROR net_file_enum_3(pipes_struct *p, union srvsvc_NetFileCtr *ctr, uin ctr->ctr3 = TALLOC_ZERO_P(p->mem_ctx, struct srvsvc_NetFileCtr3); - status = net_enum_files( ctx, &ctr->ctr3->array, num_entries, resume_hnd ); + status = net_enum_files(p->mem_ctx, &ctr->ctr3->array, num_entries, resume_hnd ); if ( !W_ERROR_IS_OK(status)) return status; - status = net_enum_pipes( ctx, &ctr->ctr3->array, num_entries, resume_hnd ); + status = net_enum_pipes(p->mem_ctx, &ctr->ctr3->array, num_entries, resume_hnd ); if ( !W_ERROR_IS_OK(status)) return status; -- cgit From 132ee3990af5d31573978f5a3abf43db2303880b Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 7 Sep 2007 20:57:01 +0000 Subject: r25009: Large patch discussed with Volker. Move unix_convert to a talloc-based interface. More development will come on top of this. Remove the "mangled map" parameter. Jeremy. (This used to be commit dee8beba7a92b8a3f68bbcc59fd0a827f68c7736) --- source3/rpc_server/srv_srvsvc_nt.c | 42 ++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 18 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 22eaac51a7..4be519a9a3 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2047,7 +2047,7 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, struct srvsvc_NetGetFileSecur connection_struct *conn = NULL; BOOL became_user = False; WERROR status = WERR_OK; - pstring tmp_file; + char *tmp_file = NULL; ZERO_STRUCT(st); @@ -2072,26 +2072,29 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, struct srvsvc_NetGetFileSecur } became_user = True; - pstrcpy(tmp_file, r->in.file); - nt_status = unix_convert(conn, tmp_file, False, NULL, &st); + if (!r->in.file) { + status = WERR_INVALID_PARAM; + goto error_exit; + } + nt_status = unix_convert(conn, r->in.file, False, &tmp_file, NULL, &st); if (!NT_STATUS_IS_OK(nt_status)) { DEBUG(3,("_srv_net_file_query_secdesc: bad pathname %s\n", r->in.file)); status = WERR_ACCESS_DENIED; goto error_exit; } - nt_status = check_name(conn, r->in.file); + nt_status = check_name(conn, tmp_file); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_query_secdesc: can't access %s\n", r->in.file)); + DEBUG(3,("_srv_net_file_query_secdesc: can't access %s\n", tmp_file)); status = WERR_ACCESS_DENIED; goto error_exit; } - nt_status = open_file_stat(conn, NULL, r->in.file, &st, &fsp); + nt_status = open_file_stat(conn, NULL, tmp_file, &st, &fsp); if (!NT_STATUS_IS_OK(nt_status)) { /* Perhaps it is a directory */ if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY)) - nt_status = open_directory(conn, NULL, r->in.file, &st, + nt_status = open_directory(conn, NULL, tmp_file, &st, READ_CONTROL_ACCESS, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, @@ -2100,7 +2103,7 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, struct srvsvc_NetGetFileSecur NULL, &fsp); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", r->in.file)); + DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", tmp_file)); status = WERR_ACCESS_DENIED; goto error_exit; } @@ -2109,7 +2112,7 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, struct srvsvc_NetGetFileSecur sd_size = SMB_VFS_GET_NT_ACL(fsp, fsp->fsp_name, (OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION|DACL_SECURITY_INFORMATION), &psd); if (sd_size == 0) { - DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", r->in.file)); + DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", tmp_file)); status = WERR_ACCESS_DENIED; goto error_exit; } @@ -2152,7 +2155,7 @@ WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, struct srvsvc_NetSetFileSecur connection_struct *conn = NULL; BOOL became_user = False; WERROR status = WERR_OK; - pstring tmp_file; + char *tmp_file = NULL; ZERO_STRUCT(st); @@ -2176,28 +2179,31 @@ WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, struct srvsvc_NetSetFileSecur } became_user = True; - pstrcpy(tmp_file, r->in.file); - nt_status = unix_convert(conn, tmp_file, False, NULL, &st); + if (!r->in.file) { + status = WERR_INVALID_PARAM; + goto error_exit; + } + nt_status = unix_convert(conn, r->in.file, False, &tmp_file, NULL, &st); if (!NT_STATUS_IS_OK(nt_status)) { DEBUG(3,("_srv_net_file_set_secdesc: bad pathname %s\n", r->in.file)); status = WERR_ACCESS_DENIED; goto error_exit; } - nt_status = check_name(conn, r->in.file); + nt_status = check_name(conn, tmp_file); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_set_secdesc: can't access %s\n", r->in.file)); + DEBUG(3,("_srv_net_file_set_secdesc: can't access %s\n", tmp_file)); status = WERR_ACCESS_DENIED; goto error_exit; } - nt_status = open_file_stat(conn, NULL, r->in.file, &st, &fsp); + nt_status = open_file_stat(conn, NULL, tmp_file, &st, &fsp); if (!NT_STATUS_IS_OK(nt_status)) { /* Perhaps it is a directory */ if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY)) - nt_status = open_directory(conn, NULL, r->in.file, &st, + nt_status = open_directory(conn, NULL, tmp_file, &st, FILE_READ_ATTRIBUTES, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, @@ -2206,7 +2212,7 @@ WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, struct srvsvc_NetSetFileSecur NULL, &fsp); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", r->in.file)); + DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", tmp_file)); status = WERR_ACCESS_DENIED; goto error_exit; } @@ -2215,7 +2221,7 @@ WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, struct srvsvc_NetSetFileSecur nt_status = SMB_VFS_SET_NT_ACL(fsp, fsp->fsp_name, r->in.securityinformation, r->in.sd_buf.sd); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_set_secdesc: Unable to set NT ACL on file %s\n", r->in.file)); + DEBUG(3,("_srv_net_file_set_secdesc: Unable to set NT ACL on file %s\n", tmp_file)); status = WERR_ACCESS_DENIED; goto error_exit; } -- cgit From eacd3140573d1122a3785823e4003bfc6352c431 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 13 Sep 2007 22:08:59 +0000 Subject: r25138: More pstring elimination. Add a TALLOC_CTX parameter to unix_convert(). Jeremy. (This used to be commit 39c211a702e91c34c1a5a689e1b0c4530ea8a1ac) --- source3/rpc_server/srv_srvsvc_nt.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 4be519a9a3..5a3a78ef89 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2048,6 +2048,7 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, struct srvsvc_NetGetFileSecur BOOL became_user = False; WERROR status = WERR_OK; char *tmp_file = NULL; + TALLOC_CTX *ctx = talloc_tos(); ZERO_STRUCT(st); @@ -2076,7 +2077,7 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, struct srvsvc_NetGetFileSecur status = WERR_INVALID_PARAM; goto error_exit; } - nt_status = unix_convert(conn, r->in.file, False, &tmp_file, NULL, &st); + nt_status = unix_convert(ctx, conn, r->in.file, False, &tmp_file, NULL, &st); if (!NT_STATUS_IS_OK(nt_status)) { DEBUG(3,("_srv_net_file_query_secdesc: bad pathname %s\n", r->in.file)); status = WERR_ACCESS_DENIED; @@ -2156,6 +2157,7 @@ WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, struct srvsvc_NetSetFileSecur BOOL became_user = False; WERROR status = WERR_OK; char *tmp_file = NULL; + TALLOC_CTX *ctx = talloc_tos(); ZERO_STRUCT(st); @@ -2183,7 +2185,7 @@ WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, struct srvsvc_NetSetFileSecur status = WERR_INVALID_PARAM; goto error_exit; } - nt_status = unix_convert(conn, r->in.file, False, &tmp_file, NULL, &st); + nt_status = unix_convert(ctx, conn, r->in.file, False, &tmp_file, NULL, &st); if (!NT_STATUS_IS_OK(nt_status)) { DEBUG(3,("_srv_net_file_set_secdesc: bad pathname %s\n", r->in.file)); status = WERR_ACCESS_DENIED; -- cgit From 3665d6d9d54f0f52fcf1ad68ca7e126d7343d4fd Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Wed, 3 Oct 2007 12:51:36 +0000 Subject: r25480: Fix a segfault (This used to be commit 7e72a3046d5c318247d1e69b51bcb74e897e3eae) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 5a3a78ef89..d89fe65274 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -128,7 +128,7 @@ static void enum_file_fn( const struct share_mode_entry *e, void *private_data ) { struct file_enum_count *fenum = - (struct file_enum_count *)&private_data; + (struct file_enum_count *)private_data; /* If the pid was not found delete the entry from connections.tdb */ -- cgit From 105d2a67eadc009031ebc163a5cf30594303806f Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Wed, 3 Oct 2007 13:13:02 +0000 Subject: r25482: Slightly simplify logic Instead of one big if-branch for if (process_exists(..)) return if (!process_exists(..)) (This used to be commit 3acc00132c97b36e026162ae11a23953269dfbed) --- source3/rpc_server/srv_srvsvc_nt.c | 96 +++++++++++++++++++------------------- 1 file changed, 48 insertions(+), 48 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index d89fe65274..cc0968a544 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -129,64 +129,64 @@ static void enum_file_fn( const struct share_mode_entry *e, { struct file_enum_count *fenum = (struct file_enum_count *)private_data; + + struct srvsvc_NetFileInfo3 *f; + int i = fenum->count; + files_struct fsp; + struct byte_range_lock *brl; + int num_locks = 0; + pstring fullpath; + uint32 permissions; /* If the pid was not found delete the entry from connections.tdb */ - if ( process_exists(e->pid) ) { - struct srvsvc_NetFileInfo3 *f; - int i = fenum->count; - files_struct fsp; - struct byte_range_lock *brl; - int num_locks = 0; - pstring fullpath; - uint32 permissions; + if (!process_exists(e->pid)) { + return; + } - f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, struct srvsvc_NetFileInfo3, i+1 ); - if ( !f ) { - DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1)); - return; - } - fenum->info = f; + f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, + struct srvsvc_NetFileInfo3, i+1 ); + if ( !f ) { + DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1)); + return; + } + fenum->info = f; - /* need to count the number of locks on a file */ + /* need to count the number of locks on a file */ - ZERO_STRUCT( fsp ); - fsp.file_id = e->id; + ZERO_STRUCT( fsp ); + fsp.file_id = e->id; - if ( (brl = brl_get_locks_readonly(NULL,&fsp)) != NULL ) { - num_locks = brl->num_locks; - TALLOC_FREE( brl ); - } + if ( (brl = brl_get_locks_readonly(NULL,&fsp)) != NULL ) { + num_locks = brl->num_locks; + TALLOC_FREE( brl ); + } - if ( strcmp( fname, "." ) == 0 ) { - pstr_sprintf( fullpath, "C:%s", sharepath ); - } else { - pstr_sprintf( fullpath, "C:%s/%s", sharepath, fname ); - } - string_replace( fullpath, '/', '\\' ); + if ( strcmp( fname, "." ) == 0 ) { + pstr_sprintf( fullpath, "C:%s", sharepath ); + } else { + pstr_sprintf( fullpath, "C:%s/%s", sharepath, fname ); + } + string_replace( fullpath, '/', '\\' ); - /* mask out create (what ever that is) */ - permissions = e->share_access & (FILE_READ_DATA|FILE_WRITE_DATA); - - fenum->info[i].fid = e->share_file_id; - fenum->info[i].permissions = permissions; - fenum->info[i].num_locks = num_locks; - if (!(fenum->info[i].user = talloc_strdup( - fenum->ctx, uidtoname(e->uid)))) { - /* There's not much we can do here. */ - fenum->info[i].user = ""; - } - if (!(fenum->info[i].path = talloc_strdup( - fenum->ctx, fullpath))) { - /* There's not much we can do here. */ - fenum->info[i].path = ""; - } - - fenum->count++; + /* mask out create (what ever that is) */ + permissions = e->share_access & (FILE_READ_DATA|FILE_WRITE_DATA); + + fenum->info[i].fid = e->share_file_id; + fenum->info[i].permissions = permissions; + fenum->info[i].num_locks = num_locks; + if (!(fenum->info[i].user = talloc_strdup( + fenum->ctx, uidtoname(e->uid)))) { + /* There's not much we can do here. */ + fenum->info[i].user = ""; + } + if (!(fenum->info[i].path = talloc_strdup( + fenum->ctx, fullpath))) { + /* There's not much we can do here. */ + fenum->info[i].path = ""; } - - return; - + + fenum->count++; } /******************************************************************* -- cgit From 5d552214e69acbf9863624f4eed6ae57b7bf1f14 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Wed, 3 Oct 2007 18:37:57 +0000 Subject: r25484: Fix srvsrc_NetFileEnum listing only for one user (This used to be commit 9e1f513916d8836914580806580c4f8c38e5f2be) --- source3/rpc_server/srv_srvsvc_nt.c | 94 +++++++++++++++++++++++--------------- 1 file changed, 57 insertions(+), 37 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index cc0968a544..503ecc1d1c 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -37,6 +37,7 @@ extern userdom_struct current_user_info; struct file_enum_count { TALLOC_CTX *ctx; + const char *username; uint32 count; struct srvsvc_NetFileInfo3 *info; }; @@ -55,56 +56,64 @@ static int pipe_enum_fn( struct db_record *rec, void *p) { struct pipe_open_rec prec; struct file_enum_count *fenum = (struct file_enum_count *)p; + struct srvsvc_NetFileInfo3 *f; + int i = fenum->count; + pstring fullpath; + const char *username; if (rec->value.dsize != sizeof(struct pipe_open_rec)) return 0; memcpy(&prec, rec->value.dptr, sizeof(struct pipe_open_rec)); - if ( process_exists(prec.pid) ) { - struct srvsvc_NetFileInfo3 *f; - int i = fenum->count; - pstring fullpath; + if ( !process_exists(prec.pid) ) { + return 0; + } + + username = uidtoname(prec.uid); + + if ((fenum->username != NULL) + && !strequal(username, fenum->username)) { + return 0; + } - snprintf( fullpath, sizeof(fullpath), "\\PIPE\\%s", prec.name ); + snprintf( fullpath, sizeof(fullpath), "\\PIPE\\%s", prec.name ); - f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, struct srvsvc_NetFileInfo3, i+1 ); - if ( !f ) { - DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1)); - return 1; - } + f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, + struct srvsvc_NetFileInfo3, i+1 ); + if ( !f ) { + DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1)); + return 1; + } - fenum->info = f; + fenum->info = f; - fenum->info[i].fid = (uint32)((procid_to_pid(&prec.pid)<<16) & prec.pnum); - fenum->info[i].permissions = (FILE_READ_DATA|FILE_WRITE_DATA); - fenum->info[i].num_locks = 0; - if (!(fenum->info[i].user = talloc_strdup( - fenum->ctx, uidtoname(prec.uid)))) { - /* There's not much we can do here. */ - fenum->info[i].user = ""; - } - if (!(fenum->info[i].path = talloc_strdup( - fenum->ctx, fullpath))) { - /* There's not much we can do here. */ - fenum->info[i].path = ""; - } - - fenum->count++; + fenum->info[i].fid = (uint32)((procid_to_pid(&prec.pid)<<16) & prec.pnum); + fenum->info[i].permissions = (FILE_READ_DATA|FILE_WRITE_DATA); + fenum->info[i].num_locks = 0; + fenum->info[i].user = talloc_move(fenum->ctx, &username); + if (!(fenum->info[i].path = talloc_strdup( + fenum->ctx, fullpath))) { + /* There's not much we can do here. */ + fenum->info[i].path = ""; } + fenum->count++; + return 0; } /******************************************************************* ********************************************************************/ -static WERROR net_enum_pipes( TALLOC_CTX *ctx, struct srvsvc_NetFileInfo3 **info, +static WERROR net_enum_pipes( TALLOC_CTX *ctx, const char *username, + struct srvsvc_NetFileInfo3 **info, uint32 *count, uint32 *resume ) { struct file_enum_count fenum; fenum.ctx = ctx; + fenum.username = username; fenum.info = *info; fenum.count = *count; @@ -137,12 +146,20 @@ static void enum_file_fn( const struct share_mode_entry *e, int num_locks = 0; pstring fullpath; uint32 permissions; + const char *username; /* If the pid was not found delete the entry from connections.tdb */ if (!process_exists(e->pid)) { return; } + + username = uidtoname(e->uid); + + if ((fenum->username != NULL) + && !strequal(username, fenum->username)) { + return; + } f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, struct srvsvc_NetFileInfo3, i+1 ); @@ -175,11 +192,7 @@ static void enum_file_fn( const struct share_mode_entry *e, fenum->info[i].fid = e->share_file_id; fenum->info[i].permissions = permissions; fenum->info[i].num_locks = num_locks; - if (!(fenum->info[i].user = talloc_strdup( - fenum->ctx, uidtoname(e->uid)))) { - /* There's not much we can do here. */ - fenum->info[i].user = ""; - } + fenum->info[i].user = talloc_move(fenum->ctx, &username); if (!(fenum->info[i].path = talloc_strdup( fenum->ctx, fullpath))) { /* There's not much we can do here. */ @@ -192,12 +205,14 @@ static void enum_file_fn( const struct share_mode_entry *e, /******************************************************************* ********************************************************************/ -static WERROR net_enum_files( TALLOC_CTX *ctx, struct srvsvc_NetFileInfo3 **info, +static WERROR net_enum_files( TALLOC_CTX *ctx, const char *username, + struct srvsvc_NetFileInfo3 **info, uint32 *count, uint32 *resume ) { struct file_enum_count f_enum_cnt; f_enum_cnt.ctx = ctx; + f_enum_cnt.username = username; f_enum_cnt.count = *count; f_enum_cnt.info = *info; @@ -1047,7 +1062,9 @@ static WERROR init_srv_conn_info_ctr(pipes_struct *p, union srvsvc_NetConnCtr *c makes a SRV_R_NET_FILE_ENUM structure. ********************************************************************/ -static WERROR net_file_enum_3(pipes_struct *p, union srvsvc_NetFileCtr *ctr, uint32 *resume_hnd, uint32 *num_entries ) +static WERROR net_file_enum_3(pipes_struct *p, union srvsvc_NetFileCtr *ctr, + uint32 *resume_hnd, const char *username, + uint32 *num_entries ) { WERROR status; @@ -1057,11 +1074,13 @@ static WERROR net_file_enum_3(pipes_struct *p, union srvsvc_NetFileCtr *ctr, uin ctr->ctr3 = TALLOC_ZERO_P(p->mem_ctx, struct srvsvc_NetFileCtr3); - status = net_enum_files(p->mem_ctx, &ctr->ctr3->array, num_entries, resume_hnd ); + status = net_enum_files(p->mem_ctx, username, &ctr->ctr3->array, + num_entries, resume_hnd ); if ( !W_ERROR_IS_OK(status)) return status; - status = net_enum_pipes(p->mem_ctx, &ctr->ctr3->array, num_entries, resume_hnd ); + status = net_enum_pipes(p->mem_ctx, username, &ctr->ctr3->array, + num_entries, resume_hnd ); if ( !W_ERROR_IS_OK(status)) return status; @@ -1077,7 +1096,8 @@ WERROR _srvsvc_NetFileEnum(pipes_struct *p, struct srvsvc_NetFileEnum *r) { switch ( *r->in.level ) { case 3: - return net_file_enum_3(p, r->in.ctr, r->in.resume_handle, r->out.totalentries ); + return net_file_enum_3(p, r->in.ctr, r->in.resume_handle, + r->in.user, r->out.totalentries ); default: return WERR_UNKNOWN_LEVEL; } -- cgit From 0ebab65706e7e2ef82d8af81225db05a5f78b5c4 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Fri, 5 Oct 2007 21:41:17 +0000 Subject: r25534: Apply some const Why? It moves these structs from the data into the text segment, so they will never been copy-on-write copied. Not much, but as in German you say "Kleinvieh macht auch Mist...." (This used to be commit 0141e64ad4972232de867137064d0dae62da22ee) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 503ecc1d1c..321ff83156 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -27,7 +27,7 @@ #define MAX_SERVER_DISK_ENTRIES 15 -extern struct generic_mapping file_generic_mapping; +extern const struct generic_mapping file_generic_mapping; extern userdom_struct current_user_info; #undef DBGC_CLASS -- cgit From b5535567c11552ed675ecc489d440558f91f1d1d Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 7 Oct 2007 17:58:48 +0000 Subject: r25564: Pass sharename to delete_share_security() (This used to be commit d100bfffe2a503b8820889faedc6ed57100ca7af) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 321ff83156..2af4c79002 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1994,7 +1994,7 @@ WERROR _srvsvc_NetShareDel(pipes_struct *p, struct srvsvc_NetShareDel *r) } /* Delete the SD in the database. */ - delete_share_security(params); + delete_share_security(lp_servicename(params->service)); lp_killservice(params->service); -- cgit From e5a951325a6cac8567af3a66de6d2df577508ae4 Mon Sep 17 00:00:00 2001 From: "Gerald (Jerry) Carter" Date: Wed, 10 Oct 2007 15:34:30 -0500 Subject: [GLUE] Rsync SAMBA_3_2_0 SVN r25598 in order to create the v3-2-test branch. (This used to be commit 5c6c8e1fe93f340005110a7833946191659d88ab) --- source3/rpc_server/srv_srvsvc_nt.c | 2178 ++++++++++++++++++------------------ 1 file changed, 1106 insertions(+), 1072 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 2af4c79002..f23d6dfcb9 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -5,7 +5,6 @@ * Copyright (C) Jeremy Allison 2001. * Copyright (C) Nigel Williams 2001. * Copyright (C) Gerald (Jerry) Carter 2006. - * Copyright (C) Jelmer Vernooij 2006. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,10 +24,7 @@ #include "includes.h" -#define MAX_SERVER_DISK_ENTRIES 15 - extern const struct generic_mapping file_generic_mapping; -extern userdom_struct current_user_info; #undef DBGC_CLASS #define DBGC_CLASS DBGC_RPC_SRV @@ -38,8 +34,8 @@ extern userdom_struct current_user_info; struct file_enum_count { TALLOC_CTX *ctx; const char *username; - uint32 count; - struct srvsvc_NetFileInfo3 *info; + int count; + FILE_INFO_3 *info; }; struct sess_file_count { @@ -56,7 +52,7 @@ static int pipe_enum_fn( struct db_record *rec, void *p) { struct pipe_open_rec prec; struct file_enum_count *fenum = (struct file_enum_count *)p; - struct srvsvc_NetFileInfo3 *f; + FILE_INFO_3 *f; int i = fenum->count; pstring fullpath; const char *username; @@ -79,25 +75,19 @@ static int pipe_enum_fn( struct db_record *rec, void *p) snprintf( fullpath, sizeof(fullpath), "\\PIPE\\%s", prec.name ); - f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, - struct srvsvc_NetFileInfo3, i+1 ); + f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 ); if ( !f ) { DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1)); return 1; } - fenum->info = f; - fenum->info[i].fid = (uint32)((procid_to_pid(&prec.pid)<<16) & prec.pnum); - fenum->info[i].permissions = (FILE_READ_DATA|FILE_WRITE_DATA); - fenum->info[i].num_locks = 0; - fenum->info[i].user = talloc_move(fenum->ctx, &username); - if (!(fenum->info[i].path = talloc_strdup( - fenum->ctx, fullpath))) { - /* There's not much we can do here. */ - fenum->info[i].path = ""; - } - + init_srv_file_info3( + &fenum->info[i], + (uint32)((procid_to_pid(&prec.pid)<<16) & prec.pnum), + (FILE_READ_DATA|FILE_WRITE_DATA), + 0, username, fullpath); + fenum->count++; return 0; @@ -107,15 +97,15 @@ static int pipe_enum_fn( struct db_record *rec, void *p) ********************************************************************/ static WERROR net_enum_pipes( TALLOC_CTX *ctx, const char *username, - struct srvsvc_NetFileInfo3 **info, - uint32 *count, uint32 *resume ) + FILE_INFO_3 **info, + uint32 *count, uint32 resume ) { struct file_enum_count fenum; - + fenum.ctx = ctx; fenum.username = username; - fenum.info = *info; fenum.count = *count; + fenum.info = *info; if (connections_traverse(pipe_enum_fn, &fenum) == -1) { DEBUG(0,("net_enum_pipes: traverse of connections.tdb " @@ -136,10 +126,10 @@ static void enum_file_fn( const struct share_mode_entry *e, const char *sharepath, const char *fname, void *private_data ) { - struct file_enum_count *fenum = - (struct file_enum_count *)private_data; + struct file_enum_count *fenum = + (struct file_enum_count *)private_data; - struct srvsvc_NetFileInfo3 *f; + FILE_INFO_3 *f; int i = fenum->count; files_struct fsp; struct byte_range_lock *brl; @@ -150,7 +140,7 @@ static void enum_file_fn( const struct share_mode_entry *e, /* If the pid was not found delete the entry from connections.tdb */ - if (!process_exists(e->pid)) { + if ( !process_exists(e->pid) ) { return; } @@ -161,8 +151,7 @@ static void enum_file_fn( const struct share_mode_entry *e, return; } - f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, - struct srvsvc_NetFileInfo3, i+1 ); + f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 ); if ( !f ) { DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1)); return; @@ -174,7 +163,7 @@ static void enum_file_fn( const struct share_mode_entry *e, ZERO_STRUCT( fsp ); fsp.file_id = e->id; - if ( (brl = brl_get_locks_readonly(NULL,&fsp)) != NULL ) { + if ( (brl = brl_get_locks(NULL,&fsp)) != NULL ) { num_locks = brl->num_locks; TALLOC_FREE( brl ); } @@ -189,15 +178,13 @@ static void enum_file_fn( const struct share_mode_entry *e, /* mask out create (what ever that is) */ permissions = e->share_access & (FILE_READ_DATA|FILE_WRITE_DATA); - fenum->info[i].fid = e->share_file_id; - fenum->info[i].permissions = permissions; - fenum->info[i].num_locks = num_locks; - fenum->info[i].user = talloc_move(fenum->ctx, &username); - if (!(fenum->info[i].path = talloc_strdup( - fenum->ctx, fullpath))) { - /* There's not much we can do here. */ - fenum->info[i].path = ""; - } + /* now fill in the FILE_INFO_3 struct */ + init_srv_file_info3( &fenum->info[i], + e->share_file_id, + permissions, + num_locks, + username, + fullpath ); fenum->count++; } @@ -206,8 +193,8 @@ static void enum_file_fn( const struct share_mode_entry *e, ********************************************************************/ static WERROR net_enum_files( TALLOC_CTX *ctx, const char *username, - struct srvsvc_NetFileInfo3 **info, - uint32 *count, uint32 *resume ) + FILE_INFO_3 **info, + uint32 *count, uint32 resume ) { struct file_enum_count f_enum_cnt; @@ -225,19 +212,19 @@ static WERROR net_enum_files( TALLOC_CTX *ctx, const char *username, } /******************************************************************* - Utility function to get the 'type' of a share from a share definition. + Utility function to get the 'type' of a share from an snum. ********************************************************************/ -static uint32 get_share_type(const struct share_params *params) +static uint32 get_share_type(int snum) { - char *net_name = lp_servicename(params->service); + char *net_name = lp_servicename(snum); int len_net_name = strlen(net_name); /* work out the share type */ uint32 type = STYPE_DISKTREE; - if (lp_print_ok(params->service)) + if (lp_print_ok(snum)) type = STYPE_PRINTQ; - if (strequal(lp_fstype(params->service), "IPC")) + if (strequal(lp_fstype(snum), "IPC")) type = STYPE_IPC; if (net_name[len_net_name-1] == '$') type |= STYPE_HIDDEN; @@ -249,70 +236,65 @@ static uint32 get_share_type(const struct share_params *params) Fill in a share info level 0 structure. ********************************************************************/ -static void init_srv_share_info_0(pipes_struct *p, struct srvsvc_NetShareInfo0 *sh0, - const struct share_params *params) +static void init_srv_share_info_0(pipes_struct *p, SRV_SHARE_INFO_0 *sh0, int snum) { - sh0->name = lp_servicename(params->service); + pstring net_name; + + pstrcpy(net_name, lp_servicename(snum)); + + init_srv_share_info0(&sh0->info_0, net_name); + init_srv_share_info0_str(&sh0->info_0_str, net_name); } /******************************************************************* Fill in a share info level 1 structure. ********************************************************************/ -static void init_srv_share_info_1(pipes_struct *p, struct srvsvc_NetShareInfo1 *sh1, - const struct share_params *params) +static void init_srv_share_info_1(pipes_struct *p, SRV_SHARE_INFO_1 *sh1, int snum) { - connection_struct *conn = p->conn; + pstring remark; - sh1->comment = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)), - conn->user, conn->connectpath, conn->gid, - get_current_username(), - current_user_info.domain, - lp_comment(params->service)); + char *net_name = lp_servicename(snum); + pstrcpy(remark, lp_comment(snum)); + standard_sub_conn(p->conn, remark,sizeof(remark)); - sh1->name = lp_servicename(params->service); - sh1->type = get_share_type(params); + init_srv_share_info1(&sh1->info_1, net_name, get_share_type(snum), remark); + init_srv_share_info1_str(&sh1->info_1_str, net_name, remark); } /******************************************************************* Fill in a share info level 2 structure. ********************************************************************/ -static void init_srv_share_info_2(pipes_struct *p, struct srvsvc_NetShareInfo2 *sh2, - const struct share_params *params) +static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2, int snum) { - connection_struct *conn = p->conn; - char *remark; - char *path; - int max_connections = lp_max_connections(params->service); + pstring remark; + pstring path; + pstring passwd; + int max_connections = lp_max_connections(snum); uint32 max_uses = max_connections!=0 ? max_connections : 0xffffffff; int count = 0; - char *net_name = lp_servicename(params->service); + char *net_name = lp_servicename(snum); - remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)), - conn->user, conn->connectpath, conn->gid, - get_current_username(), - current_user_info.domain, - lp_comment(params->service)); - path = talloc_asprintf(p->mem_ctx, "C:%s", - lp_pathname(params->service)); + pstrcpy(remark, lp_comment(snum)); + standard_sub_conn(p->conn, remark,sizeof(remark)); + pstrcpy(path, "C:"); + pstrcat(path, lp_pathname(snum)); /* - * Change / to \\ so that win2k will see it as a valid path. This was - * added to enable use of browsing in win2k add share dialog. + * Change / to \\ so that win2k will see it as a valid path. This was added to + * enable use of browsing in win2k add share dialog. */ string_replace(path, '/', '\\'); + pstrcpy(passwd, ""); + count = count_current_connections( net_name, False ); - sh2->name = net_name; - sh2->type = get_share_type(params); - sh2->comment = remark; - sh2->permissions = 0; - sh2->max_users = max_uses; - sh2->current_users = count; - sh2->path = path; - sh2->password = ""; + init_srv_share_info2(&sh2->info_2, net_name, get_share_type(snum), + remark, 0, max_uses, count, path, passwd); + + init_srv_share_info2_str(&sh2->info_2_str, net_name, remark, path, passwd); } /******************************************************************* @@ -344,40 +326,28 @@ static void map_generic_share_sd_bits(SEC_DESC *psd) Fill in a share info level 501 structure. ********************************************************************/ -static void init_srv_share_info_501(pipes_struct *p, struct srvsvc_NetShareInfo501 *sh501, - const struct share_params *params) +static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501, int snum) { - connection_struct *conn = p->conn; - char *remark; - const char *net_name = lp_servicename(params->service); + pstring remark; - remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)), - conn->user, conn->connectpath, conn->gid, - get_current_username(), - current_user_info.domain, - lp_comment(params->service)); + const char *net_name = lp_servicename(snum); + pstrcpy(remark, lp_comment(snum)); + standard_sub_conn(p->conn, remark, sizeof(remark)); - - sh501->name = net_name; - sh501->type = get_share_type(params); - sh501->comment = remark; - sh501->csc_policy = (lp_csc_policy(params->service) << 4); + init_srv_share_info501(&sh501->info_501, net_name, get_share_type(snum), remark, (lp_csc_policy(snum) << 4)); + init_srv_share_info501_str(&sh501->info_501_str, net_name, remark); } /******************************************************************* Fill in a share info level 502 structure. ********************************************************************/ -static void init_srv_share_info_502(pipes_struct *p, struct srvsvc_NetShareInfo502 *sh502, - const struct share_params *params) +static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, int snum) { - int max_connections = lp_max_connections(params->service); - uint32 max_uses = max_connections!=0 ? max_connections : 0xffffffff; - connection_struct *conn = p->conn; - int count; - char *net_name; - char *remark; - char *path; + pstring net_name; + pstring remark; + pstring path; + pstring passwd; SEC_DESC *sd; size_t sd_size; TALLOC_CTX *ctx = p->mem_ctx; @@ -385,112 +355,87 @@ static void init_srv_share_info_502(pipes_struct *p, struct srvsvc_NetShareInfo5 ZERO_STRUCTP(sh502); - net_name = lp_servicename(params->service); - count = count_current_connections( net_name, False ); - - remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)), - conn->user, conn->connectpath, conn->gid, - get_current_username(), - current_user_info.domain, - lp_comment(params->service)); - - path = talloc_asprintf(p->mem_ctx, "C:%s", - lp_pathname(params->service)); + pstrcpy(net_name, lp_servicename(snum)); + pstrcpy(remark, lp_comment(snum)); + standard_sub_conn(p->conn, remark,sizeof(remark)); + pstrcpy(path, "C:"); + pstrcat(path, lp_pathname(snum)); /* - * Change / to \\ so that win2k will see it as a valid path. This was - * added to enable use of browsing in win2k add share dialog. + * Change / to \\ so that win2k will see it as a valid path. This was added to + * enable use of browsing in win2k add share dialog. */ string_replace(path, '/', '\\'); - sd = get_share_security(ctx, lp_servicename(params->service), - &sd_size); + pstrcpy(passwd, ""); + + sd = get_share_security(ctx, lp_servicename(snum), &sd_size); - sh502->name = net_name; - sh502->type = get_share_type(params); - sh502->comment = remark; - sh502->path = path; - sh502->password = ""; - sh502->sd = sd; - sh502->permissions = 0; - sh502->max_users = max_uses; - sh502->current_users = count; - sh502->unknown = 1; + init_srv_share_info502(&sh502->info_502, net_name, get_share_type(snum), remark, 0, 0xffffffff, 1, path, passwd, sd, sd_size); + init_srv_share_info502_str(&sh502->info_502_str, net_name, remark, path, passwd, sd, sd_size); } /*************************************************************************** Fill in a share info level 1004 structure. ***************************************************************************/ -static void init_srv_share_info_1004(pipes_struct *p, - struct srvsvc_NetShareInfo1004* sh1004, - const struct share_params *params) +static void init_srv_share_info_1004(pipes_struct *p, SRV_SHARE_INFO_1004* sh1004, int snum) { - connection_struct *conn = p->conn; - char *remark; + pstring remark; - remark = talloc_sub_advanced(p->mem_ctx, lp_servicename(SNUM(conn)), - conn->user, conn->connectpath, conn->gid, - get_current_username(), - current_user_info.domain, - lp_comment(params->service)); + pstrcpy(remark, lp_comment(snum)); + standard_sub_conn(p->conn, remark, sizeof(remark)); ZERO_STRUCTP(sh1004); - - sh1004->comment = remark; + + init_srv_share_info1004(&sh1004->info_1004, remark); + init_srv_share_info1004_str(&sh1004->info_1004_str, remark); } /*************************************************************************** Fill in a share info level 1005 structure. ***************************************************************************/ -static void init_srv_share_info_1005(pipes_struct *p, - struct srvsvc_NetShareInfo1005* sh1005, - const struct share_params *params) +static void init_srv_share_info_1005(pipes_struct *p, SRV_SHARE_INFO_1005* sh1005, int snum) { - sh1005->dfs_flags = 0; + sh1005->share_info_flags = 0; - if(lp_host_msdfs() && lp_msdfs_root(params->service)) - sh1005->dfs_flags |= + if(lp_host_msdfs() && lp_msdfs_root(snum)) + sh1005->share_info_flags |= SHARE_1005_IN_DFS | SHARE_1005_DFS_ROOT; - sh1005->dfs_flags |= - lp_csc_policy(params->service) << SHARE_1005_CSC_POLICY_SHIFT; + sh1005->share_info_flags |= + lp_csc_policy(snum) << SHARE_1005_CSC_POLICY_SHIFT; } /*************************************************************************** Fill in a share info level 1006 structure. ***************************************************************************/ -static void init_srv_share_info_1006(pipes_struct *p, - struct srvsvc_NetShareInfo1006* sh1006, - const struct share_params *params) +static void init_srv_share_info_1006(pipes_struct *p, SRV_SHARE_INFO_1006* sh1006, int snum) { - sh1006->max_users = -1; + sh1006->max_uses = -1; } /*************************************************************************** Fill in a share info level 1007 structure. ***************************************************************************/ -static void init_srv_share_info_1007(pipes_struct *p, - struct srvsvc_NetShareInfo1007* sh1007, - const struct share_params *params) +static void init_srv_share_info_1007(pipes_struct *p, SRV_SHARE_INFO_1007* sh1007, int snum) { + pstring alternate_directory_name = ""; uint32 flags = 0; ZERO_STRUCTP(sh1007); - sh1007->flags = flags; - sh1007->alternate_directory_name = ""; + init_srv_share_info1007(&sh1007->info_1007, flags, alternate_directory_name); + init_srv_share_info1007_str(&sh1007->info_1007_str, alternate_directory_name); } /******************************************************************* Fill in a share info level 1501 structure. ********************************************************************/ -static void init_srv_share_info_1501(pipes_struct *p, - struct sec_desc_buf *sh1501, - const struct share_params *params) +static void init_srv_share_info_1501(pipes_struct *p, SRV_SHARE_INFO_1501 *sh1501, int snum) { SEC_DESC *sd; size_t sd_size; @@ -498,282 +443,350 @@ static void init_srv_share_info_1501(pipes_struct *p, ZERO_STRUCTP(sh1501); - sd = get_share_security(ctx, lp_servicename(params->service), - &sd_size); + sd = get_share_security(ctx, lp_servicename(snum), &sd_size); - sh1501->sd = sd; + sh1501->sdb = make_sec_desc_buf(p->mem_ctx, sd_size, sd); } /******************************************************************* True if it ends in '$'. ********************************************************************/ -static BOOL is_hidden_share(const struct share_params *params) +static BOOL is_hidden_share(int snum) { - const char *net_name = lp_servicename(params->service); + const char *net_name = lp_servicename(snum); - return (net_name[strlen(net_name) - 1] == '$'); + return (net_name[strlen(net_name) - 1] == '$') ? True : False; } /******************************************************************* Fill in a share info structure. ********************************************************************/ -static WERROR init_srv_share_info_ctr(pipes_struct *p, - union srvsvc_NetShareCtr *ctr, - uint32 info_level, uint32 *resume_hnd, - uint32 *total_entries, BOOL all_shares) +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 = 0; + int snum; TALLOC_CTX *ctx = p->mem_ctx; - struct share_iterator *shares; - struct share_params *share; - WERROR result = WERR_NOMEM; DEBUG(5,("init_srv_share_info_ctr\n")); - ZERO_STRUCTP(ctr); + ZERO_STRUCTPN(ctr); - if (resume_hnd) { - *resume_hnd = 0; - } + ctr->info_level = ctr->switch_value = info_level; + *resume_hnd = 0; /* Ensure all the usershares are loaded. */ become_root(); - load_usershare_shares(); + num_services = load_usershare_shares(); load_registry_shares(); unbecome_root(); - *total_entries = 0; - - if (!(shares = share_list_all(ctx))) { - DEBUG(5, ("Could not list shares\n")); - return WERR_ACCESS_DENIED; + /* Count the number of entries. */ + for (snum = 0; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) + num_entries++; } + *total_entries = num_entries; + ctr->num_entries2 = ctr->num_entries = num_entries; + ctr->ptr_share_info = ctr->ptr_entries = 1; + + if (!num_entries) + return True; + switch (info_level) { case 0: - if (!(ctr->ctr0 = TALLOC_ZERO_P( - p->mem_ctx, struct srvsvc_NetShareCtr0))) { - goto done; + { + SRV_SHARE_INFO_0 *info0 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_0, num_entries); + int i = 0; + + if (!info0) { + return False; } + + for (snum = *resume_hnd; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { + init_srv_share_info_0(p, &info0[i++], snum); + } + } + + ctr->share.info0 = info0; break; + + } + case 1: - if (!(ctr->ctr1 = TALLOC_ZERO_P( - p->mem_ctx, struct srvsvc_NetShareCtr1))) { - goto done; + { + SRV_SHARE_INFO_1 *info1 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1, num_entries); + int i = 0; + + if (!info1) { + return False; + } + + for (snum = *resume_hnd; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { + init_srv_share_info_1(p, &info1[i++], snum); + } } + + ctr->share.info1 = info1; break; + } + case 2: - if (!(ctr->ctr2 = TALLOC_ZERO_P( - p->mem_ctx, struct srvsvc_NetShareCtr2))) { - goto done; + { + SRV_SHARE_INFO_2 *info2 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_2, num_entries); + int i = 0; + + if (!info2) { + return False; } + + for (snum = *resume_hnd; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { + init_srv_share_info_2(p, &info2[i++], snum); + } + } + + ctr->share.info2 = info2; break; + } + case 501: - if (!(ctr->ctr501 = TALLOC_ZERO_P( - p->mem_ctx, struct srvsvc_NetShareCtr501))) { - goto done; + { + SRV_SHARE_INFO_501 *info501 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_501, num_entries); + int i = 0; + + if (!info501) { + return False; + } + + for (snum = *resume_hnd; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { + init_srv_share_info_501(p, &info501[i++], snum); + } } + + ctr->share.info501 = info501; break; + } + case 502: - if (!(ctr->ctr502 = TALLOC_ZERO_P( - p->mem_ctx, struct srvsvc_NetShareCtr502))) { - goto done; + { + SRV_SHARE_INFO_502 *info502 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_502, num_entries); + int i = 0; + + if (!info502) { + return False; } + + for (snum = *resume_hnd; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { + init_srv_share_info_502(p, &info502[i++], snum); + } + } + + ctr->share.info502 = info502; break; + } + + /* here for completeness but not currently used with enum (1004 - 1501)*/ + case 1004: - if (!(ctr->ctr1004 = TALLOC_ZERO_P( - p->mem_ctx, struct srvsvc_NetShareCtr1004))) { - goto done; + { + SRV_SHARE_INFO_1004 *info1004 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1004, num_entries); + int i = 0; + + if (!info1004) { + return False; + } + + for (snum = *resume_hnd; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { + init_srv_share_info_1004(p, &info1004[i++], snum); + } } + + ctr->share.info1004 = info1004; break; + } + case 1005: - if (!(ctr->ctr1005 = TALLOC_ZERO_P( - p->mem_ctx, struct srvsvc_NetShareCtr1005))) { - goto done; + { + SRV_SHARE_INFO_1005 *info1005 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1005, num_entries); + int i = 0; + + if (!info1005) { + return False; } + + for (snum = *resume_hnd; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { + init_srv_share_info_1005(p, &info1005[i++], snum); + } + } + + ctr->share.info1005 = info1005; break; + } + case 1006: - if (!(ctr->ctr1006 = TALLOC_ZERO_P( - p->mem_ctx, struct srvsvc_NetShareCtr1006))) { - goto done; + { + SRV_SHARE_INFO_1006 *info1006 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1006, num_entries); + int i = 0; + + if (!info1006) { + return False; } + + for (snum = *resume_hnd; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { + init_srv_share_info_1006(p, &info1006[i++], snum); + } + } + + ctr->share.info1006 = info1006; break; + } + case 1007: - if (!(ctr->ctr1007 = TALLOC_ZERO_P( - p->mem_ctx, struct srvsvc_NetShareCtr1007))) { - goto done; + { + SRV_SHARE_INFO_1007 *info1007 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1007, num_entries); + int i = 0; + + if (!info1007) { + return False; + } + + for (snum = *resume_hnd; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { + init_srv_share_info_1007(p, &info1007[i++], snum); + } } + + ctr->share.info1007 = info1007; break; + } + case 1501: - if (!(ctr->ctr1501 = TALLOC_ZERO_P( - p->mem_ctx, struct srvsvc_NetShareCtr1501))) { - goto done; + { + SRV_SHARE_INFO_1501 *info1501 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1501, num_entries); + int i = 0; + + if (!info1501) { + return False; } + + for (snum = *resume_hnd; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { + init_srv_share_info_1501(p, &info1501[i++], snum); + } + } + + ctr->share.info1501 = info1501; break; + } default: - DEBUG(5,("init_srv_share_info_ctr: unsupported switch " - "value %d\n", info_level)); - return WERR_UNKNOWN_LEVEL; + DEBUG(5,("init_srv_share_info_ctr: unsupported switch value %d\n", info_level)); + return False; } - while ((share = next_share(shares)) != NULL) { - if (!lp_browseable(share->service)) { - continue; - } - if (!all_shares && is_hidden_share(share)) { - continue; - } + return True; +} +/******************************************************************* + Inits a SRV_R_NET_SHARE_ENUM structure. +********************************************************************/ + +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(p, &r_n->ctr, info_level, + &resume_hnd, &r_n->total_entries, all)) { + r_n->status = WERR_OK; + } else { + r_n->status = WERR_UNKNOWN_LEVEL; + } + + init_enum_hnd(&r_n->enum_hnd, resume_hnd); +} + +/******************************************************************* + Inits a SRV_R_NET_SHARE_GET_INFO structure. +********************************************************************/ + +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) +{ + WERROR status = WERR_OK; + int snum; + + DEBUG(5,("init_srv_r_net_share_get_info: %d\n", __LINE__)); + + r_n->info.switch_value = info_level; + + snum = find_service(share_name); + + if (snum >= 0) { switch (info_level) { case 0: - { - struct srvsvc_NetShareInfo0 i; - init_srv_share_info_0(p, &i, share); - ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo0, i, - &ctr->ctr0->array, &ctr->ctr0->count); - if (ctr->ctr0->array == NULL) { - return WERR_NOMEM; - } - *total_entries = ctr->ctr0->count; + init_srv_share_info_0(p, &r_n->info.share.info0, snum); break; - } - case 1: - { - struct srvsvc_NetShareInfo1 i; - init_srv_share_info_1(p, &i, share); - ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo1, i, - &ctr->ctr1->array, &ctr->ctr1->count); - if (ctr->ctr1->array == NULL) { - return WERR_NOMEM; - } - *total_entries = ctr->ctr1->count; + init_srv_share_info_1(p, &r_n->info.share.info1, snum); break; - } - case 2: - { - struct srvsvc_NetShareInfo2 i; - init_srv_share_info_2(p, &i, share); - ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo2, i, - &ctr->ctr2->array, &ctr->ctr2->count); - if (ctr->ctr2->array == NULL) { - return WERR_NOMEM; - } - *total_entries = ctr->ctr2->count; + init_srv_share_info_2(p, &r_n->info.share.info2, snum); break; - } - case 501: - { - struct srvsvc_NetShareInfo501 i; - init_srv_share_info_501(p, &i, share); - ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo501, i, - &ctr->ctr501->array, &ctr->ctr501->count); - if (ctr->ctr501->array == NULL) { - return WERR_NOMEM; - } - *total_entries = ctr->ctr501->count; + init_srv_share_info_501(p, &r_n->info.share.info501, snum); break; - } - case 502: - { - struct srvsvc_NetShareInfo502 i; - init_srv_share_info_502(p, &i, share); - ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo502, i, - &ctr->ctr502->array, &ctr->ctr502->count); - if (ctr->ctr502->array == NULL) { - return WERR_NOMEM; - } - *total_entries = ctr->ctr502->count; + init_srv_share_info_502(p, &r_n->info.share.info502, snum); break; - } - /* here for completeness but not currently used with enum - * (1004 - 1501)*/ - + /* here for completeness */ case 1004: - { - struct srvsvc_NetShareInfo1004 i; - init_srv_share_info_1004(p, &i, share); - ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo1004, i, - &ctr->ctr1004->array, &ctr->ctr1004->count); - if (ctr->ctr1004->array == NULL) { - return WERR_NOMEM; - } - *total_entries = ctr->ctr1004->count; + init_srv_share_info_1004(p, &r_n->info.share.info1004, snum); break; - } - case 1005: - { - struct srvsvc_NetShareInfo1005 i; - init_srv_share_info_1005(p, &i, share); - ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo1005, i, - &ctr->ctr1005->array, &ctr->ctr1005->count); - if (ctr->ctr1005->array == NULL) { - return WERR_NOMEM; - } - *total_entries = ctr->ctr1005->count; + init_srv_share_info_1005(p, &r_n->info.share.info1005, snum); break; - } + /* here for completeness 1006 - 1501 */ case 1006: - { - struct srvsvc_NetShareInfo1006 i; - init_srv_share_info_1006(p, &i, share); - ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo1006, i, - &ctr->ctr1006->array, &ctr->ctr1006->count); - if (ctr->ctr1006->array == NULL) { - return WERR_NOMEM; - } - *total_entries = ctr->ctr1006->count; + init_srv_share_info_1006(p, &r_n->info.share.info1006, snum); break; - } - case 1007: - { - struct srvsvc_NetShareInfo1007 i; - init_srv_share_info_1007(p, &i, share); - ADD_TO_ARRAY(ctx, struct srvsvc_NetShareInfo1007, i, - &ctr->ctr1007->array, &ctr->ctr1007->count); - if (ctr->ctr1007->array == NULL) { - return WERR_NOMEM; - } - *total_entries = ctr->ctr1007->count; + init_srv_share_info_1007(p, &r_n->info.share.info1007, snum); break; - } - case 1501: - { - struct sec_desc_buf i; - init_srv_share_info_1501(p, &i, share); - ADD_TO_ARRAY(ctx, struct sec_desc_buf, i, - &ctr->ctr1501->array, &ctr->ctr1501->count); - if (ctr->ctr1501->array == NULL) { - return WERR_NOMEM; - } - *total_entries = ctr->ctr1501->count; + init_srv_share_info_1501(p, &r_n->info.share.info1501, snum); + break; + default: + DEBUG(5,("init_srv_net_share_get_info: unsupported switch value %d\n", info_level)); + status = WERR_UNKNOWN_LEVEL; break; } - } - - TALLOC_FREE(share); + } else { + status = WERR_INVALID_NAME; } - result = WERR_OK; - done: - TALLOC_FREE(shares); - return result; + r_n->info.ptr_share_ctr = W_ERROR_IS_OK(status) ? 1 : 0; + r_n->status = status; } /******************************************************************* fill in a sess info level 0 structure. ********************************************************************/ -static void init_srv_sess_info_0(pipes_struct *p, struct srvsvc_NetSessCtr0 *ss0, uint32 *snum, uint32 *stot) +static void init_srv_sess_info_0(pipes_struct *p, SRV_SESS_INFO_0 *ss0, uint32 *snum, uint32 *stot) { struct sessionid *session_list; uint32 num_entries = 0; @@ -788,34 +801,37 @@ static void init_srv_sess_info_0(pipes_struct *p, struct srvsvc_NetSessCtr0 *ss0 DEBUG(5,("init_srv_sess_0_ss0\n")); - ss0->array = TALLOC_ARRAY(p->mem_ctx, struct srvsvc_NetSessInfo0, *stot); - if (snum) { - for (; (*snum) < (*stot); (*snum)++) { - ss0->array[num_entries].client = session_list[(*snum)].remote_machine; + for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) { + init_srv_sess_info0( &ss0->info_0[num_entries], session_list[(*snum)].remote_machine); num_entries++; } - ss0->count = num_entries; + ss0->num_entries_read = num_entries; + ss0->ptr_sess_info = num_entries > 0 ? 1 : 0; + ss0->num_entries_read2 = num_entries; if ((*snum) >= (*stot)) { (*snum) = 0; } } else { - ss0->array = NULL; - ss0->count = 0; + ss0->num_entries_read = 0; + ss0->ptr_sess_info = 0; + ss0->num_entries_read2 = 0; } } /******************************************************************* ********************************************************************/ +/* global needed to make use of the share_mode_forall() callback */ +static struct sess_file_count s_file_cnt; + static void sess_file_fn( const struct share_mode_entry *e, - const char *sharepath, const char *fname, - void *private_data ) + const char *sharepath, const char *fname, void *state ) { - struct sess_file_count *sess = (struct sess_file_count *)private_data; + struct sess_file_count *sess = &s_file_cnt; if ( procid_equal(&e->pid, &sess->pid) && (sess->uid == e->uid) ) { sess->count++; @@ -829,13 +845,11 @@ static void sess_file_fn( const struct share_mode_entry *e, static int net_count_files( uid_t uid, struct server_id pid ) { - struct sess_file_count s_file_cnt; - s_file_cnt.count = 0; s_file_cnt.uid = uid; s_file_cnt.pid = pid; - share_mode_forall( sess_file_fn, (void *)&s_file_cnt ); + share_mode_forall( sess_file_fn, NULL ); return s_file_cnt.count; } @@ -844,15 +858,16 @@ static int net_count_files( uid_t uid, struct server_id pid ) fill in a sess info level 1 structure. ********************************************************************/ -static void init_srv_sess_info_1(pipes_struct *p, struct srvsvc_NetSessCtr1 *ss1, uint32 *snum, uint32 *stot) +static void init_srv_sess_info_1(pipes_struct *p, SRV_SESS_INFO_1 *ss1, uint32 *snum, uint32 *stot) { struct sessionid *session_list; uint32 num_entries = 0; time_t now = time(NULL); if ( !snum ) { - ss1->count = 0; - ss1->array = NULL; + ss1->num_entries_read = 0; + ss1->ptr_sess_info = 0; + ss1->num_entries_read2 = 0; (*stot) = 0; @@ -860,16 +875,14 @@ static void init_srv_sess_info_1(pipes_struct *p, struct srvsvc_NetSessCtr1 *ss1 } if (ss1 == NULL) { - if (snum != NULL) - (*snum) = 0; + (*snum) = 0; return; } (*stot) = list_sessions(p->mem_ctx, &session_list); - - ss1->array = TALLOC_ARRAY(p->mem_ctx, struct srvsvc_NetSessInfo1, *stot); - for (; (*snum) < (*stot); (*snum)++) { + + for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) { uint32 num_files; uint32 connect_time; struct passwd *pw = sys_getpwnam(session_list[*snum].username); @@ -885,54 +898,52 @@ static void init_srv_sess_info_1(pipes_struct *p, struct srvsvc_NetSessCtr1 *ss1 num_files = net_count_files(pw->pw_uid, session_list[*snum].pid); guest = strequal( session_list[*snum].username, lp_guestaccount() ); - if (!(ss1->array[num_entries].client = talloc_strdup( - ss1->array, session_list[*snum].remote_machine))) { - ss1->array[num_entries].client = ""; - } - if (!(ss1->array[num_entries].user = talloc_strdup( - ss1->array, session_list[*snum].username))) { - ss1->array[num_entries].user = ""; - } - ss1->array[num_entries].num_open = num_files; - ss1->array[num_entries].time = connect_time; - ss1->array[num_entries].idle_time = 0; - ss1->array[num_entries].user_flags = guest; - + init_srv_sess_info1( &ss1->info_1[num_entries], + session_list[*snum].remote_machine, + session_list[*snum].username, + num_files, + connect_time, + 0, + guest); num_entries++; } - ss1->count = num_entries; + ss1->num_entries_read = num_entries; + ss1->ptr_sess_info = num_entries > 0 ? 1 : 0; + ss1->num_entries_read2 = num_entries; if ((*snum) >= (*stot)) { (*snum) = 0; } + } /******************************************************************* makes a SRV_R_NET_SESS_ENUM structure. ********************************************************************/ -static WERROR init_srv_sess_info_ctr(pipes_struct *p, union srvsvc_NetSessCtr *ctr, +static WERROR init_srv_sess_info_ctr(pipes_struct *p, SRV_SESS_INFO_CTR *ctr, int switch_value, uint32 *resume_hnd, uint32 *total_entries) { WERROR status = WERR_OK; DEBUG(5,("init_srv_sess_info_ctr: %d\n", __LINE__)); + ctr->switch_value = switch_value; + switch (switch_value) { case 0: - ctr->ctr0 = talloc(p->mem_ctx, struct srvsvc_NetSessCtr0); - init_srv_sess_info_0(p, ctr->ctr0, resume_hnd, total_entries); + init_srv_sess_info_0(p, &(ctr->sess.info0), resume_hnd, total_entries); + ctr->ptr_sess_ctr = 1; break; case 1: - ctr->ctr1 = talloc(p->mem_ctx, struct srvsvc_NetSessCtr1); - init_srv_sess_info_1(p, ctr->ctr1, resume_hnd, total_entries); + init_srv_sess_info_1(p, &(ctr->sess.info1), resume_hnd, total_entries); + ctr->ptr_sess_ctr = 1; break; default: DEBUG(5,("init_srv_sess_info_ctr: unsupported switch value %d\n", switch_value)); - if (resume_hnd != NULL) - (*resume_hnd) = 0; + (*resume_hnd) = 0; (*total_entries) = 0; - ctr->ctr0 = NULL; + ctr->ptr_sess_ctr = 0; status = WERR_UNKNOWN_LEVEL; break; } @@ -940,43 +951,66 @@ static WERROR init_srv_sess_info_ctr(pipes_struct *p, union srvsvc_NetSessCtr *c return status; } +/******************************************************************* + makes a SRV_R_NET_SESS_ENUM structure. +********************************************************************/ + +static void init_srv_r_net_sess_enum(pipes_struct *p, SRV_R_NET_SESS_ENUM *r_n, + uint32 resume_hnd, int sess_level, int switch_value) +{ + DEBUG(5,("init_srv_r_net_sess_enum: %d\n", __LINE__)); + + r_n->sess_level = sess_level; + + if (sess_level == -1) + r_n->status = WERR_UNKNOWN_LEVEL; + else + r_n->status = init_srv_sess_info_ctr(p, r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries); + + if (!W_ERROR_IS_OK(r_n->status)) + resume_hnd = 0; + + init_enum_hnd(&r_n->enum_hnd, resume_hnd); +} + /******************************************************************* fill in a conn info level 0 structure. ********************************************************************/ -static void init_srv_conn_info_0(pipes_struct *p, struct srvsvc_NetConnCtr0 *ss0, uint32 *snum, uint32 *stot) +static void init_srv_conn_info_0(SRV_CONN_INFO_0 *ss0, uint32 *snum, uint32 *stot) { uint32 num_entries = 0; (*stot) = 1; if (ss0 == NULL) { - if (snum != NULL) - (*snum) = 0; + (*snum) = 0; return; } DEBUG(5,("init_srv_conn_0_ss0\n")); if (snum) { - ss0->array = TALLOC_ARRAY(p->mem_ctx, struct srvsvc_NetConnInfo0, *stot); - for (; (*snum) < (*stot); (*snum)++) { + for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) { - ss0->array[num_entries].conn_id = (*stot); + init_srv_conn_info0(&ss0->info_0[num_entries], (*stot)); /* move on to creating next connection */ /* move on to creating next conn */ num_entries++; } - ss0->count = num_entries; + ss0->num_entries_read = num_entries; + ss0->ptr_conn_info = num_entries > 0 ? 1 : 0; + ss0->num_entries_read2 = num_entries; if ((*snum) >= (*stot)) { (*snum) = 0; } } else { - ss0->array = NULL; - ss0->count = 0; + ss0->num_entries_read = 0; + ss0->ptr_conn_info = 0; + ss0->num_entries_read2 = 0; (*stot) = 0; } @@ -986,44 +1020,55 @@ static void init_srv_conn_info_0(pipes_struct *p, struct srvsvc_NetConnCtr0 *ss0 fill in a conn info level 1 structure. ********************************************************************/ -static void init_srv_conn_info_1(pipes_struct *p, struct srvsvc_NetConnCtr1 *ss1, uint32 *snum, uint32 *stot) +static void init_srv_conn_1_info(CONN_INFO_1 *se1, CONN_INFO_1_STR *str1, + uint32 id, uint32 type, + uint32 num_opens, uint32 num_users, uint32 open_time, + const char *usr_name, const char *net_name) +{ + init_srv_conn_info1(se1 , id, type, num_opens, num_users, open_time, usr_name, net_name); + init_srv_conn_info1_str(str1, usr_name, net_name); +} + +/******************************************************************* + fill in a conn info level 1 structure. + ********************************************************************/ + +static void init_srv_conn_info_1(SRV_CONN_INFO_1 *ss1, uint32 *snum, uint32 *stot) { uint32 num_entries = 0; (*stot) = 1; if (ss1 == NULL) { - if (snum != NULL) - (*snum) = 0; + (*snum) = 0; return; } DEBUG(5,("init_srv_conn_1_ss1\n")); if (snum) { - ss1->array = TALLOC_ARRAY(p->mem_ctx, struct srvsvc_NetConnInfo1, *stot); - for (; (*snum) < (*stot); (*snum)++) { - ss1->array[num_entries].conn_id = (*stot); - ss1->array[num_entries].conn_type = 0x3; - ss1->array[num_entries].num_open = 1; - ss1->array[num_entries].num_users = 1; - ss1->array[num_entries].conn_time = 3; - ss1->array[num_entries].user = "dummy_user"; - ss1->array[num_entries].share = "IPC$"; + for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) { + init_srv_conn_1_info(&ss1->info_1[num_entries], + &ss1->info_1_str[num_entries], + (*stot), 0x3, 1, 1, 3,"dummy_user", "IPC$"); /* move on to creating next connection */ /* move on to creating next conn */ num_entries++; } - ss1->count = num_entries; + ss1->num_entries_read = num_entries; + ss1->ptr_conn_info = num_entries > 0 ? 1 : 0; + ss1->num_entries_read2 = num_entries; + if ((*snum) >= (*stot)) { (*snum) = 0; } } else { - ss1->count = 0; - ss1->array = NULL; + ss1->num_entries_read = 0; + ss1->ptr_conn_info = 0; + ss1->num_entries_read2 = 0; (*stot) = 0; } @@ -1033,24 +1078,28 @@ static void init_srv_conn_info_1(pipes_struct *p, struct srvsvc_NetConnCtr1 *ss1 makes a SRV_R_NET_CONN_ENUM structure. ********************************************************************/ -static WERROR init_srv_conn_info_ctr(pipes_struct *p, union srvsvc_NetConnCtr *ctr, +static WERROR init_srv_conn_info_ctr(SRV_CONN_INFO_CTR *ctr, int switch_value, uint32 *resume_hnd, uint32 *total_entries) { WERROR status = WERR_OK; DEBUG(5,("init_srv_conn_info_ctr: %d\n", __LINE__)); + ctr->switch_value = switch_value; + switch (switch_value) { case 0: - init_srv_conn_info_0(p, ctr->ctr0, resume_hnd, total_entries); + init_srv_conn_info_0(&ctr->conn.info0, resume_hnd, total_entries); + ctr->ptr_conn_ctr = 1; break; case 1: - init_srv_conn_info_1(p, ctr->ctr1, resume_hnd, total_entries); + init_srv_conn_info_1(&ctr->conn.info1, resume_hnd, total_entries); + ctr->ptr_conn_ctr = 1; break; default: DEBUG(5,("init_srv_conn_info_ctr: unsupported switch value %d\n", switch_value)); - ctr->ctr0 = NULL; - (*resume_hnd) = 0; + (*resume_hnd = 0); (*total_entries) = 0; + ctr->ptr_conn_ctr = 0; status = WERR_UNKNOWN_LEVEL; break; } @@ -1058,46 +1107,84 @@ static WERROR init_srv_conn_info_ctr(pipes_struct *p, union srvsvc_NetConnCtr *c return status; } +/******************************************************************* + makes a SRV_R_NET_CONN_ENUM structure. +********************************************************************/ + +static void init_srv_r_net_conn_enum(SRV_R_NET_CONN_ENUM *r_n, + uint32 resume_hnd, int conn_level, int switch_value) +{ + DEBUG(5,("init_srv_r_net_conn_enum: %d\n", __LINE__)); + + r_n->conn_level = conn_level; + if (conn_level == -1) + r_n->status = WERR_UNKNOWN_LEVEL; + else + r_n->status = init_srv_conn_info_ctr(r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries); + + if (!W_ERROR_IS_OK(r_n->status)) + resume_hnd = 0; + + init_enum_hnd(&r_n->enum_hnd, resume_hnd); +} + /******************************************************************* makes a SRV_R_NET_FILE_ENUM structure. ********************************************************************/ -static WERROR net_file_enum_3(pipes_struct *p, union srvsvc_NetFileCtr *ctr, - uint32 *resume_hnd, const char *username, - uint32 *num_entries ) +static WERROR net_file_enum_3( const char *username, SRV_R_NET_FILE_ENUM *r, + uint32 resume_hnd ) { - WERROR status; + TALLOC_CTX *ctx = talloc_tos(); + SRV_FILE_INFO_CTR *ctr = &r->ctr; /* TODO -- Windows enumerates (b) active pipes (c) open directories and files */ - ctr->ctr3 = TALLOC_ZERO_P(p->mem_ctx, struct srvsvc_NetFileCtr3); - - status = net_enum_files(p->mem_ctx, username, &ctr->ctr3->array, - num_entries, resume_hnd ); - if ( !W_ERROR_IS_OK(status)) - return status; + r->status = net_enum_files( ctx, username, &ctr->file.info3, + &ctr->num_entries, resume_hnd ); + if ( !W_ERROR_IS_OK(r->status)) + goto done; - status = net_enum_pipes(p->mem_ctx, username, &ctr->ctr3->array, - num_entries, resume_hnd ); - if ( !W_ERROR_IS_OK(status)) - return status; - - ctr->ctr3->count = *num_entries; + r->status = net_enum_pipes( ctx, username, &ctr->file.info3, + &ctr->num_entries, resume_hnd ); + if ( !W_ERROR_IS_OK(r->status)) + goto done; - return WERR_OK; + r->level = ctr->level = 3; + r->total_entries = ctr->num_entries; + /* ctr->num_entries = r->total_entries - resume_hnd; */ + ctr->num_entries2 = ctr->num_entries; + ctr->ptr_file_info = 1; + + r->status = WERR_OK; + +done: + if ( ctr->num_entries > 0 ) + ctr->ptr_entries = 1; + + init_enum_hnd(&r->enum_hnd, 0); + + return r->status; } /******************************************************************* *******************************************************************/ -WERROR _srvsvc_NetFileEnum(pipes_struct *p, struct srvsvc_NetFileEnum *r) +WERROR _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_FILE_ENUM *r_u) { - switch ( *r->in.level ) { - case 3: - return net_file_enum_3(p, r->in.ctr, r->in.resume_handle, - r->in.user, r->out.totalentries ); + switch ( q_u->level ) { + case 3: { + char *username; + if (!(username = rpcstr_pull_unistr2_talloc( + p->mem_ctx, q_u->username))) { + return WERR_NOMEM; + } + + return net_file_enum_3(username, r_u, + get_enum_hnd(&q_u->enum_hnd)); + } default: return WERR_UNKNOWN_LEVEL; } @@ -1109,11 +1196,15 @@ WERROR _srvsvc_NetFileEnum(pipes_struct *p, struct srvsvc_NetFileEnum *r) net server get info ********************************************************************/ -WERROR _srvsvc_NetSrvGetInfo(pipes_struct *p, struct srvsvc_NetSrvGetInfo *r) +WERROR _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV_R_NET_SRV_GET_INFO *r_u) { WERROR status = WERR_OK; + SRV_INFO_CTR *ctr = TALLOC_P(p->mem_ctx, SRV_INFO_CTR); - ZERO_STRUCTP(r->out.info); + if (!ctr) + return WERR_NOMEM; + + ZERO_STRUCTP(ctr); DEBUG(5,("srv_net_srv_get_info: %d\n", __LINE__)); @@ -1122,108 +1213,133 @@ WERROR _srvsvc_NetSrvGetInfo(pipes_struct *p, struct srvsvc_NetSrvGetInfo *r) return WERR_ACCESS_DENIED; } - switch (r->in.level) { + switch (q_u->switch_value) { /* Technically level 102 should only be available to Administrators but there isn't anything super-secret here, as most of it is made up. */ case 102: - r->out.info->info102 = TALLOC_ZERO_P(p->mem_ctx, struct srvsvc_NetSrvInfo102); - - r->out.info->info102->platform_id = 500; - r->out.info->info102->version_major = lp_major_announce_version(); - r->out.info->info102->version_minor = lp_minor_announce_version(); - r->out.info->info102->server_name = global_myname(); - r->out.info->info102->server_type = lp_default_server_announce(); - r->out.info->info102->userpath = "C:\\"; - r->out.info->info102->licenses = 10000; - r->out.info->info102->anndelta = 3000; - r->out.info->info102->disc = 0xf; - r->out.info->info102->users = 0xffffffff; - r->out.info->info102->hidden = 0; - r->out.info->info102->announce = 240; - r->out.info->info102->comment = lp_serverstring(); + init_srv_info_102(&ctr->srv.sv102, + 500, global_myname(), + string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH), + lp_major_announce_version(), lp_minor_announce_version(), + lp_default_server_announce(), + 0xffffffff, /* users */ + 0xf, /* disc */ + 0, /* hidden */ + 240, /* announce */ + 3000, /* announce delta */ + 100000, /* licenses */ + "c:\\"); /* user path */ break; case 101: - r->out.info->info101 = TALLOC_ZERO_P(p->mem_ctx, struct srvsvc_NetSrvInfo101); - r->out.info->info101->platform_id = 500; - r->out.info->info101->server_name = global_myname(); - r->out.info->info101->version_major = lp_major_announce_version(); - r->out.info->info101->version_minor = lp_minor_announce_version(); - r->out.info->info101->server_type = lp_default_server_announce(); - r->out.info->info101->comment = lp_serverstring(); + init_srv_info_101(&ctr->srv.sv101, + 500, global_myname(), + lp_major_announce_version(), lp_minor_announce_version(), + lp_default_server_announce(), + string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH)); break; case 100: - r->out.info->info100 = TALLOC_ZERO_P(p->mem_ctx, struct srvsvc_NetSrvInfo100); - r->out.info->info100->platform_id = 500; - r->out.info->info100->server_name = global_myname(); + init_srv_info_100(&ctr->srv.sv100, 500, global_myname()); break; default: - return WERR_UNKNOWN_LEVEL; + status = WERR_UNKNOWN_LEVEL; break; } + /* set up the net server get info structure */ + init_srv_r_net_srv_get_info(r_u, q_u->switch_value, ctr, status); + DEBUG(5,("srv_net_srv_get_info: %d\n", __LINE__)); - return status; + return r_u->status; } /******************************************************************* net server set info ********************************************************************/ -WERROR _srvsvc_NetSrvSetInfo(pipes_struct *p, struct srvsvc_NetSrvSetInfo *r) +WERROR _srv_net_srv_set_info(pipes_struct *p, SRV_Q_NET_SRV_SET_INFO *q_u, SRV_R_NET_SRV_SET_INFO *r_u) { + WERROR status = WERR_OK; + + DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__)); + /* Set up the net server set info structure. */ - if (r->out.parm_error) { - *r->out.parm_error = 0; - } - return WERR_OK; + + init_srv_r_net_srv_set_info(r_u, 0x0, status); + + DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__)); + + return r_u->status; } /******************************************************************* net conn enum ********************************************************************/ -WERROR _srvsvc_NetConnEnum(pipes_struct *p, struct srvsvc_NetConnEnum *r) +WERROR _srv_net_conn_enum(pipes_struct *p, SRV_Q_NET_CONN_ENUM *q_u, SRV_R_NET_CONN_ENUM *r_u) { DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__)); - ZERO_STRUCTP(r->out.ctr); + r_u->ctr = TALLOC_P(p->mem_ctx, SRV_CONN_INFO_CTR); + if (!r_u->ctr) + return WERR_NOMEM; + + ZERO_STRUCTP(r_u->ctr); /* set up the */ - return init_srv_conn_info_ctr(p, r->out.ctr, *r->in.level, r->in.resume_handle, r->out.totalentries); + init_srv_r_net_conn_enum(r_u, + get_enum_hnd(&q_u->enum_hnd), + q_u->conn_level, + q_u->ctr->switch_value); + + DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__)); + + return r_u->status; } /******************************************************************* net sess enum ********************************************************************/ -WERROR _srvsvc_NetSessEnum(pipes_struct *p, struct srvsvc_NetSessEnum *r) +WERROR _srv_net_sess_enum(pipes_struct *p, SRV_Q_NET_SESS_ENUM *q_u, SRV_R_NET_SESS_ENUM *r_u) { DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__)); - ZERO_STRUCTP(r->out.ctr); + r_u->ctr = TALLOC_P(p->mem_ctx, SRV_SESS_INFO_CTR); + if (!r_u->ctr) + return WERR_NOMEM; + + ZERO_STRUCTP(r_u->ctr); /* set up the */ - return init_srv_sess_info_ctr(p, r->out.ctr, - *r->in.level, - r->in.resume_handle, - r->out.totalentries); + init_srv_r_net_sess_enum(p, r_u, + get_enum_hnd(&q_u->enum_hnd), + q_u->sess_level, + q_u->ctr->switch_value); + + DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__)); + + return r_u->status; } /******************************************************************* net sess del ********************************************************************/ -WERROR _srvsvc_NetSessDel(pipes_struct *p, struct srvsvc_NetSessDel *r) +WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SESS_DEL *r_u) { struct sessionid *session_list; + struct current_user user; int num_sessions, snum; - WERROR status; + fstring username; + fstring machine; + BOOL not_root = False; - char *machine = talloc_strdup(p->mem_ctx, r->in.server_unc); + rpcstr_pull_unistr2_fstring(username, &q_u->uni_user_name); + rpcstr_pull_unistr2_fstring(machine, &q_u->uni_cli_name); /* strip leading backslashes if any */ while (machine[0] == '\\') { @@ -1234,11 +1350,13 @@ WERROR _srvsvc_NetSessDel(pipes_struct *p, struct srvsvc_NetSessDel *r) DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__)); - status = WERR_ACCESS_DENIED; + r_u->status = WERR_ACCESS_DENIED; + + get_current_user(&user, p); /* fail out now if you are not root or not a domain admin */ - if ((p->pipe_user.ut.uid != sec_initial_uid()) && + if ((user.ut.uid != sec_initial_uid()) && ( ! nt_token_check_domain_rid(p->pipe_user.nt_user_token, DOMAIN_GROUP_RID_ADMINS))) { goto done; @@ -1246,30 +1364,41 @@ WERROR _srvsvc_NetSessDel(pipes_struct *p, struct srvsvc_NetSessDel *r) for (snum = 0; snum < num_sessions; snum++) { - if ((strequal(session_list[snum].username, r->in.user) || r->in.user[0] == '\0' ) && - strequal(session_list[snum].remote_machine, machine)) { + if ((strequal(session_list[snum].username, username) || username[0] == '\0' ) && + strequal(session_list[snum].remote_machine, machine)) { + NTSTATUS ntstat; + + if (user.ut.uid != sec_initial_uid()) { + not_root = True; + become_root(); + } ntstat = messaging_send(smbd_messaging_context(), session_list[snum].pid, MSG_SHUTDOWN, &data_blob_null); - + if (NT_STATUS_IS_OK(ntstat)) - status = WERR_OK; + r_u->status = WERR_OK; + + if (not_root) + unbecome_root(); } } DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__)); + done: - return status; + + return r_u->status; } /******************************************************************* Net share enum all. ********************************************************************/ -WERROR _srvsvc_NetShareEnumAll(pipes_struct *p, struct srvsvc_NetShareEnumAll *r) +WERROR _srv_net_share_enum_all(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u) { DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__)); @@ -1279,15 +1408,20 @@ WERROR _srvsvc_NetShareEnumAll(pipes_struct *p, struct srvsvc_NetShareEnumAll *r } /* Create the list of shares for the response. */ - return init_srv_share_info_ctr(p, r->out.ctr, *r->in.level, - r->in.resume_handle, r->out.totalentries, True); + init_srv_r_net_share_enum(p, r_u, + q_u->ctr.info_level, + get_enum_hnd(&q_u->enum_hnd), True); + + DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__)); + + return r_u->status; } /******************************************************************* Net share enum. ********************************************************************/ -WERROR _srvsvc_NetShareEnum(pipes_struct *p, struct srvsvc_NetShareEnum *r) +WERROR _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u) { DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__)); @@ -1297,80 +1431,32 @@ WERROR _srvsvc_NetShareEnum(pipes_struct *p, struct srvsvc_NetShareEnum *r) } /* Create the list of shares for the response. */ - return init_srv_share_info_ctr(p, r->out.ctr, *r->in.level, - r->in.resume_handle, r->out.totalentries, False); + init_srv_r_net_share_enum(p, r_u, + q_u->ctr.info_level, + get_enum_hnd(&q_u->enum_hnd), False); + + DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__)); + + return r_u->status; } /******************************************************************* Net share get info. ********************************************************************/ -WERROR _srvsvc_NetShareGetInfo(pipes_struct *p, struct srvsvc_NetShareGetInfo *r) +WERROR _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, SRV_R_NET_SHARE_GET_INFO *r_u) { - const struct share_params *params; + fstring share_name; - params = get_share_params(p->mem_ctx, r->in.share_name); + DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__)); - if (params != NULL) { - switch (r->in.level) { - case 0: - r->out.info->info0 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo0); - init_srv_share_info_0(p, r->out.info->info0, params); - break; - case 1: - r->out.info->info1 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1); - init_srv_share_info_1(p, r->out.info->info1, params); - break; - case 2: - r->out.info->info2 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo2); - init_srv_share_info_2(p, r->out.info->info2, params); - break; - case 501: - r->out.info->info501 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo501); - init_srv_share_info_501(p, r->out.info->info501, params); - break; - case 502: - r->out.info->info502 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo502); - init_srv_share_info_502(p, r->out.info->info502, params); - break; + /* 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, r_u, share_name, q_u->info_level); - /* here for completeness */ - case 1004: - r->out.info->info1004 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1004); - init_srv_share_info_1004(p, r->out.info->info1004, params); - break; - case 1005: - r->out.info->info1005 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1005); - init_srv_share_info_1005(p, r->out.info->info1005, params); - break; + DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__)); - /* here for completeness 1006 - 1501 */ - case 1006: - r->out.info->info1006 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1006); - init_srv_share_info_1006(p, r->out.info->info1006, - params); - break; - case 1007: - r->out.info->info1007 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1007); - init_srv_share_info_1007(p, r->out.info->info1007, - params); - break; - case 1501: - r->out.info->info1501 = talloc(p->mem_ctx, struct sec_desc_buf); - init_srv_share_info_1501(p, r->out.info->info1501, - params); - break; - default: - DEBUG(5,("init_srv_net_share_get_info: unsupported " - "switch value %d\n", r->in.level)); - return WERR_UNKNOWN_LEVEL; - break; - } - } else { - return WERR_INVALID_NAME; - } - - return WERR_OK; + return r_u->status; } /******************************************************************* @@ -1378,314 +1464,59 @@ WERROR _srvsvc_NetShareGetInfo(pipes_struct *p, struct srvsvc_NetShareGetInfo *r ********************************************************************/ char *valid_share_pathname(char *dos_pathname) -{ - char *ptr; - - /* Convert any '\' paths to '/' */ - unix_format(dos_pathname); - unix_clean_name(dos_pathname); - - /* NT is braindead - it wants a C: prefix to a pathname ! So strip it. */ - ptr = dos_pathname; - if (strlen(dos_pathname) > 2 && ptr[1] == ':' && ptr[0] != '/') - ptr += 2; - - /* Only absolute paths allowed. */ - if (*ptr != '/') - return NULL; - - return ptr; -} - -static void setval_helper(struct registry_key *key, const char *name, - const char *value, WERROR *err) -{ - struct registry_value val; - - if (!W_ERROR_IS_OK(*err)) { - return; - } - - ZERO_STRUCT(val); - val.type = REG_SZ; - val.v.sz.str = CONST_DISCARD(char *, value); - val.v.sz.len = strlen(value)+1; - - *err = reg_setvalue(key, name, &val); -} - -static WERROR add_share(const char *share_name, const char *path, - const char *comment, uint32 max_connections, - const struct nt_user_token *token, - BOOL is_disk_op) -{ - if (lp_add_share_cmd() && *lp_add_share_cmd()) { - char *command; - int ret; - - if (asprintf(&command, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d", - lp_add_share_cmd(), dyn_CONFIGFILE, share_name, - path, comment, max_connections) == -1) { - return WERR_NOMEM; - } - - DEBUG(10,("add_share: Running [%s]\n", command )); - - /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/ - - if ( is_disk_op ) - become_root(); - - if ( (ret = smbrun(command, NULL)) == 0 ) { - /* Tell everyone we updated smb.conf. */ - message_send_all(smbd_messaging_context(), - MSG_SMB_CONF_UPDATED, - NULL, 0, NULL); - } - - if ( is_disk_op ) - unbecome_root(); - - /********* END SeDiskOperatorPrivilege BLOCK *********/ - - DEBUG(3,("_srv_net_share_add: Running [%s] returned (%d)\n", - command, ret )); - - /* - * No fallback to registry shares, the user did define a add - * share command, so fail here. - */ - - SAFE_FREE(command); - return (ret == 0) ? WERR_OK : WERR_ACCESS_DENIED; - } - - if (lp_registry_shares()) { - char *keyname; - struct registry_key *key; - enum winreg_CreateAction action; - WERROR err; - TALLOC_CTX *mem_ctx; - - if (!(keyname = talloc_asprintf(NULL, "%s\\%s", KEY_SMBCONF, - share_name))) { - return WERR_NOMEM; - } - - mem_ctx = (TALLOC_CTX *)keyname; - - err = reg_create_path(mem_ctx, keyname, REG_KEY_WRITE, - is_disk_op ? get_root_nt_token():token, - &action, &key); - - if (action != REG_CREATED_NEW_KEY) { - err = WERR_ALREADY_EXISTS; - } - - if (!W_ERROR_IS_OK(err)) { - TALLOC_FREE(mem_ctx); - return err; - } - - setval_helper(key, "path", path, &err); - if ((comment != NULL) && (comment[0] != '\0')) { - setval_helper(key, "comment", comment, &err); - } - if (max_connections != 0) { - char tmp[16]; - snprintf(tmp, sizeof(tmp), "%d", max_connections); - setval_helper(key, "max connections", tmp, &err); - } - - if (!W_ERROR_IS_OK(err)) { - /* - * Hmmmm. We'd need transactions on the registry to - * get this right.... - */ - reg_delete_path(is_disk_op ? get_root_nt_token():token, - keyname); - } - TALLOC_FREE(mem_ctx); - return err; - } - - return WERR_ACCESS_DENIED; -} - -static WERROR delete_share(const char *sharename, - const struct nt_user_token *token, - BOOL is_disk_op) -{ - if (lp_delete_share_cmd() && *lp_delete_share_cmd()) { - char *command; - int ret; - - if (asprintf(&command, "%s \"%s\" \"%s\"", - lp_delete_share_cmd(), dyn_CONFIGFILE, - sharename)) { - return WERR_NOMEM; - } - - DEBUG(10,("delete_share: Running [%s]\n", command )); - - /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/ - - if ( is_disk_op ) - become_root(); - - if ( (ret = smbrun(command, NULL)) == 0 ) { - /* Tell everyone we updated smb.conf. */ - message_send_all(smbd_messaging_context(), - MSG_SMB_CONF_UPDATED, - NULL, 0, NULL); - } - - if ( is_disk_op ) - unbecome_root(); - - /********* END SeDiskOperatorPrivilege BLOCK *********/ - - SAFE_FREE(command); - - DEBUG(3,("_srv_net_share_del: Running [%s] returned (%d)\n", - command, ret )); - return (ret == 0) ? WERR_OK : WERR_ACCESS_DENIED; - } - - if (lp_registry_shares()) { - char *keyname; - WERROR err; - - if (asprintf(&keyname, "%s\\%s", KEY_SMBCONF, - sharename) == -1) { - return WERR_NOMEM; - } - - err = reg_delete_path(is_disk_op ? get_root_nt_token():token, - keyname); - SAFE_FREE(keyname); - return err; - } - - return WERR_ACCESS_DENIED; -} - -static WERROR change_share(const char *share_name, const char *path, - const char *comment, uint32 max_connections, - const struct nt_user_token *token, - BOOL is_disk_op) -{ - if (lp_change_share_cmd() && *lp_change_share_cmd()) { - char *command; - int ret; - - if (asprintf(&command, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d", - lp_change_share_cmd(), dyn_CONFIGFILE, share_name, - path, comment, max_connections) == -1) { - return WERR_NOMEM; - } - - DEBUG(10,("_srv_net_share_set_info: Running [%s]\n", command)); - - /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/ - - if ( is_disk_op ) - become_root(); - - if ( (ret = smbrun(command, NULL)) == 0 ) { - /* Tell everyone we updated smb.conf. */ - message_send_all(smbd_messaging_context(), - MSG_SMB_CONF_UPDATED, - NULL, 0, NULL); - } - - if ( is_disk_op ) - unbecome_root(); - - /********* END SeDiskOperatorPrivilege BLOCK *********/ - - DEBUG(3,("_srv_net_share_set_info: Running [%s] returned " - "(%d)\n", command, ret )); - - SAFE_FREE(command); - - return (ret == 0) ? WERR_OK : WERR_ACCESS_DENIED; - } - - if (lp_registry_shares()) { - char *keyname; - struct registry_key *key; - WERROR err; - TALLOC_CTX *mem_ctx; - - if (!(keyname = talloc_asprintf(NULL, "%s\\%s", KEY_SMBCONF, - share_name))) { - return WERR_NOMEM; - } - - mem_ctx = (TALLOC_CTX *)keyname; - - err = reg_open_path(mem_ctx, keyname, REG_KEY_WRITE, - is_disk_op ? get_root_nt_token():token, - &key); - if (!W_ERROR_IS_OK(err)) { - TALLOC_FREE(mem_ctx); - return err; - } - - setval_helper(key, "path", path, &err); +{ + char *ptr; - reg_deletevalue(key, "comment"); - if ((comment != NULL) && (comment[0] != '\0')) { - setval_helper(key, "comment", comment, &err); - } + /* Convert any '\' paths to '/' */ + unix_format(dos_pathname); + unix_clean_name(dos_pathname); - reg_deletevalue(key, "max connections"); - if (max_connections != 0) { - char tmp[16]; - snprintf(tmp, sizeof(tmp), "%d", max_connections); - setval_helper(key, "max connections", tmp, &err); - } + /* NT is braindead - it wants a C: prefix to a pathname ! So strip it. */ + ptr = dos_pathname; + if (strlen(dos_pathname) > 2 && ptr[1] == ':' && ptr[0] != '/') + ptr += 2; - TALLOC_FREE(mem_ctx); - return err; - } + /* Only absolute paths allowed. */ + if (*ptr != '/') + return NULL; - return WERR_ACCESS_DENIED; + return ptr; } /******************************************************************* Net share set info. Modify share details. ********************************************************************/ -WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, struct srvsvc_NetShareSetInfo *r) +WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, SRV_R_NET_SHARE_SET_INFO *r_u) { - pstring comment; + struct current_user user; + pstring command; + fstring share_name; + fstring comment; pstring pathname; int type; int snum; + int ret; char *path; SEC_DESC *psd = NULL; SE_PRIV se_diskop = SE_DISK_OPERATOR; BOOL is_disk_op = False; int max_connections = 0; - fstring tmp_share_name; DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); - if (r->out.parm_error) { - *r->out.parm_error = 0; - } + unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name)); - if ( strequal(r->in.share_name,"IPC$") - || ( lp_enable_asu_support() && strequal(r->in.share_name,"ADMIN$") ) - || strequal(r->in.share_name,"global") ) + r_u->parm_error = 0; + + if ( strequal(share_name,"IPC$") + || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) + || strequal(share_name,"global") ) { return WERR_ACCESS_DENIED; } - fstrcpy(tmp_share_name, r->in.share_name); - snum = find_service(tmp_share_name); + snum = find_service(share_name); /* Does this share exist ? */ if (snum < 0) @@ -1695,39 +1526,47 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, struct srvsvc_NetShareSetInfo *r if (lp_print_ok(snum)) return WERR_ACCESS_DENIED; - is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, - &se_diskop ); + get_current_user(&user,p); + + is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); /* fail out now if you are not root and not a disk op */ - if ( p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op ) + if ( user.ut.uid != sec_initial_uid() && !is_disk_op ) return WERR_ACCESS_DENIED; - switch (r->in.level) { + switch (q_u->info_level) { case 1: pstrcpy(pathname, lp_pathname(snum)); - pstrcpy(comment, r->in.info.info1->comment); - type = r->in.info.info1->type; + unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(comment)); + type = q_u->info.share.info2.info_2.type; psd = NULL; break; case 2: - pstrcpy(comment, r->in.info.info2->comment); - pstrcpy(pathname, r->in.info.info2->path); - type = r->in.info.info2->type; - max_connections = (r->in.info.info2->max_users == 0xffffffff) ? - 0 : r->in.info.info2->max_users; + unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(comment)); + unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(pathname)); + type = q_u->info.share.info2.info_2.type; + max_connections = (q_u->info.share.info2.info_2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.info_2.max_uses; psd = NULL; break; +#if 0 + /* not supported on set but here for completeness */ + case 501: + unistr2_to_ascii(comment, &q_u->info.share.info501.info_501_str.uni_remark, sizeof(comment)); + type = q_u->info.share.info501.info_501.type; + psd = NULL; + break; +#endif case 502: - pstrcpy(comment, r->in.info.info502->comment); - pstrcpy(pathname, r->in.info.info502->path); - type = r->in.info.info502->type; - psd = r->in.info.info502->sd; + unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(comment)); + unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(pathname)); + type = q_u->info.share.info502.info_502.type; + psd = q_u->info.share.info502.info_502_str.sd; map_generic_share_sd_bits(psd); break; case 1004: pstrcpy(pathname, lp_pathname(snum)); - pstrcpy(comment, r->in.info.info1004->comment); + unistr2_to_ascii(comment, &q_u->info.share.info1004.info_1004_str.uni_remark, sizeof(comment)); type = STYPE_DISKTREE; break; case 1005: @@ -1735,14 +1574,12 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, struct srvsvc_NetShareSetInfo *r user, so we must compare it to see if it's what is set in smb.conf, so that we can contine other ops like setting ACLs on a share */ - if (((r->in.info.info1005->dfs_flags & + if (((q_u->info.share.info1005.share_info_flags & SHARE_1005_CSC_POLICY_MASK) >> SHARE_1005_CSC_POLICY_SHIFT) == lp_csc_policy(snum)) return WERR_OK; else { - DEBUG(3, ("_srv_net_share_set_info: client is trying " - "to change csc policy from the network; " - "must be done with smb.conf\n")); + DEBUG(3, ("_srv_net_share_set_info: client is trying to change csc policy from the network; must be done with smb.conf\n")); return WERR_ACCESS_DENIED; } case 1006: @@ -1750,14 +1587,13 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, struct srvsvc_NetShareSetInfo *r return WERR_ACCESS_DENIED; case 1501: pstrcpy(pathname, lp_pathname(snum)); - pstrcpy(comment, lp_comment(snum)); - psd = r->in.info.info1501->sd; + fstrcpy(comment, lp_comment(snum)); + psd = q_u->info.share.info1501.sdb->sd; map_generic_share_sd_bits(psd); type = STYPE_DISKTREE; break; default: - DEBUG(5,("_srv_net_share_set_info: unsupported switch value " - "%d\n", r->in.level)); + DEBUG(5,("_srv_net_share_set_info: unsupported switch value %d\n", q_u->info_level)); return WERR_UNKNOWN_LEVEL; } @@ -1769,29 +1605,52 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, struct srvsvc_NetShareSetInfo *r if (!(path = valid_share_pathname( pathname ))) return WERR_OBJECT_PATH_INVALID; - /* Ensure share name, pathname and comment don't contain '"' - * characters. */ - string_replace(tmp_share_name, '"', ' '); + /* Ensure share name, pathname and comment don't contain '"' characters. */ + string_replace(share_name, '"', ' '); string_replace(path, '"', ' '); string_replace(comment, '"', ' '); DEBUG(10,("_srv_net_share_set_info: change share command = %s\n", - lp_change_share_cmd() ? lp_change_share_cmd() : "NULL" )); + lp_change_share_cmd() ? lp_change_share_cmd() : "NULL" )); /* Only call modify function if something changed. */ - if (strcmp(path, lp_pathname(snum)) - || strcmp(comment, lp_comment(snum)) - || (lp_max_connections(snum) != max_connections) ) { - WERROR err; + if (strcmp(path, lp_pathname(snum)) || strcmp(comment, lp_comment(snum)) + || (lp_max_connections(snum) != max_connections) ) + { + if (!lp_change_share_cmd() || !*lp_change_share_cmd()) { + DEBUG(10,("_srv_net_share_set_info: No change share command\n")); + return WERR_ACCESS_DENIED; + } - err = change_share(tmp_share_name, path, comment, - max_connections, p->pipe_user.nt_user_token, - is_disk_op); + slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d", + lp_change_share_cmd(), dyn_CONFIGFILE, share_name, path, comment, max_connections ); - if (!W_ERROR_IS_OK(err)) { - return err; + DEBUG(10,("_srv_net_share_set_info: Running [%s]\n", command )); + + /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/ + + if ( is_disk_op ) + become_root(); + + if ( (ret = smbrun(command, NULL)) == 0 ) { + /* Tell everyone we updated smb.conf. */ + message_send_all(smbd_messaging_context(), + MSG_SMB_CONF_UPDATED, NULL, 0, + NULL); } + + if ( is_disk_op ) + unbecome_root(); + + /********* END SeDiskOperatorPrivilege BLOCK *********/ + + DEBUG(3,("_srv_net_share_set_info: Running [%s] returned (%d)\n", command, ret )); + + if ( ret != 0 ) + return WERR_ACCESS_DENIED; + } else { + DEBUG(10,("_srv_net_share_set_info: No change to share name (%s)\n", share_name )); } /* Replace SD if changed. */ @@ -1799,15 +1658,12 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, struct srvsvc_NetShareSetInfo *r SEC_DESC *old_sd; size_t sd_size; - old_sd = get_share_security(p->mem_ctx, lp_servicename(snum), - &sd_size); + old_sd = get_share_security(p->mem_ctx, lp_servicename(snum), &sd_size); if (old_sd && !sec_desc_equal(old_sd, psd)) { - if (!set_share_security(r->in.share_name, psd)) { - DEBUG(0,("_srv_net_share_set_info: Failed to " - "change security info in share %s.\n", - r->in.share_name )); - } + if (!set_share_security(share_name, psd)) + DEBUG(0,("_srv_net_share_set_info: Failed to change security info in share %s.\n", + share_name )); } } @@ -1816,38 +1672,44 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, struct srvsvc_NetShareSetInfo *r return WERR_OK; } - /******************************************************************* Net share add. Call 'add_share_command "sharename" "pathname" "comment" "max connections = " ********************************************************************/ -WERROR _srvsvc_NetShareAdd(pipes_struct *p, struct srvsvc_NetShareAdd *r) +WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_SHARE_ADD *r_u) { - pstring share_name; - pstring comment; + struct current_user user; + pstring command; + fstring share_name; + fstring comment; pstring pathname; - char *path; int type; + int snum; + int ret; + char *path; SEC_DESC *psd = NULL; SE_PRIV se_diskop = SE_DISK_OPERATOR; BOOL is_disk_op; - uint32 max_connections = 0; - WERROR err; + int max_connections = 0; DEBUG(5,("_srv_net_share_add: %d\n", __LINE__)); - if (r->out.parm_error) { - *r->out.parm_error = 0; - } + r_u->parm_error = 0; + + get_current_user(&user,p); - is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, - &se_diskop ); + is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); - if (p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op ) + if (user.ut.uid != sec_initial_uid() && !is_disk_op ) return WERR_ACCESS_DENIED; - switch (r->in.level) { + if (!lp_add_share_cmd() || !*lp_add_share_cmd()) { + DEBUG(10,("_srv_net_share_add: No add share command\n")); + return WERR_ACCESS_DENIED; + } + + switch (q_u->info_level) { case 0: /* No path. Not enough info in a level 0 to do anything. */ return WERR_ACCESS_DENIED; @@ -1855,27 +1717,25 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, struct srvsvc_NetShareAdd *r) /* Not enough info in a level 1 to do anything. */ return WERR_ACCESS_DENIED; case 2: - pstrcpy(share_name, r->in.info.info2->name); - pstrcpy(comment, r->in.info.info2->comment); - pstrcpy(pathname, r->in.info.info2->path); - max_connections = (r->in.info.info2->max_users == 0xffffffff) ? - 0 : r->in.info.info2->max_users; - type = r->in.info.info2->type; + 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)); + unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(share_name)); + max_connections = (q_u->info.share.info2.info_2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.info_2.max_uses; + type = q_u->info.share.info2.info_2.type; break; case 501: /* No path. Not enough info in a level 501 to do anything. */ return WERR_ACCESS_DENIED; case 502: - pstrcpy(share_name, r->in.info.info502->name); - pstrcpy(comment, r->in.info.info502->comment); - pstrcpy(pathname, r->in.info.info502->path); - type = r->in.info.info502->type; - psd = r->in.info.info502->sd; + unistr2_to_ascii(share_name, &q_u->info.share.info502.info_502_str.uni_netname, sizeof(share_name)); + unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(share_name)); + unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(share_name)); + type = q_u->info.share.info502.info_502.type; + psd = q_u->info.share.info502.info_502_str.sd; map_generic_share_sd_bits(psd); break; - /* none of the following contain share names. NetShareAdd - * does not have a separate parameter for the share name */ + /* none of the following contain share names. NetShareAdd does not have a separate parameter for the share name */ case 1004: case 1005: @@ -1886,30 +1746,28 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, struct srvsvc_NetShareAdd *r) /* DFS only level. */ return WERR_ACCESS_DENIED; default: - DEBUG(5,("_srv_net_share_add: unsupported switch value %d\n", - r->in.level)); + DEBUG(5,("_srv_net_share_add: unsupported switch value %d\n", q_u->info_level)); return WERR_UNKNOWN_LEVEL; } /* check for invalid share names */ - if ( !validate_net_name( share_name, INVALID_SHARENAME_CHARS, - sizeof(share_name) ) ) { - DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", - share_name)); + if ( !validate_net_name( share_name, INVALID_SHARENAME_CHARS, sizeof(share_name) ) ) { + DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", share_name)); return WERR_INVALID_NAME; } if ( strequal(share_name,"IPC$") || strequal(share_name,"global") - || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) ) + || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) ) { return WERR_ACCESS_DENIED; } - if (get_share_params(p->mem_ctx, share_name) != NULL) { - /* Share already exists. */ + snum = find_service(share_name); + + /* Share already exists. */ + if (snum >= 0) return WERR_ALREADY_EXISTS; - } /* We can only add disk shares. */ if (type != STYPE_DISKTREE) @@ -1919,24 +1777,45 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, struct srvsvc_NetShareAdd *r) if (!(path = valid_share_pathname( pathname ))) return WERR_OBJECT_PATH_INVALID; - /* Ensure share name, pathname and comment don't contain '"' - * characters. */ - + /* Ensure share name, pathname and comment don't contain '"' characters. */ string_replace(share_name, '"', ' '); string_replace(path, '"', ' '); string_replace(comment, '"', ' '); - err = add_share(share_name, path, comment, max_connections, - p->pipe_user.nt_user_token, is_disk_op); + slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d", + lp_add_share_cmd(), + dyn_CONFIGFILE, + share_name, + path, + comment, + max_connections); + + DEBUG(10,("_srv_net_share_add: Running [%s]\n", command )); + + /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/ + + if ( is_disk_op ) + become_root(); - if (!W_ERROR_IS_OK(err)) { - return err; + if ( (ret = smbrun(command, NULL)) == 0 ) { + /* Tell everyone we updated smb.conf. */ + message_send_all(smbd_messaging_context(), + MSG_SMB_CONF_UPDATED, NULL, 0, NULL); } + if ( is_disk_op ) + unbecome_root(); + + /********* END SeDiskOperatorPrivilege BLOCK *********/ + + DEBUG(3,("_srv_net_share_add: Running [%s] returned (%d)\n", command, ret )); + + if ( ret != 0 ) + return WERR_ACCESS_DENIED; + if (psd) { if (!set_share_security(share_name, psd)) { - DEBUG(0,("_srv_net_share_add: Failed to add security " - "info to share %s.\n", share_name )); + DEBUG(0,("_srv_net_share_add: Failed to add security info to share %s.\n", share_name )); } } @@ -1956,43 +1835,76 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, struct srvsvc_NetShareAdd *r) a parameter. ********************************************************************/ -WERROR _srvsvc_NetShareDel(pipes_struct *p, struct srvsvc_NetShareDel *r) +WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u) { - struct share_params *params; + struct current_user user; + pstring command; + fstring share_name; + int ret; + int snum; SE_PRIV se_diskop = SE_DISK_OPERATOR; BOOL is_disk_op; - WERROR err; + struct share_params *params; DEBUG(5,("_srv_net_share_del: %d\n", __LINE__)); - if ( strequal(r->in.share_name, "IPC$") - || ( lp_enable_asu_support() && strequal(r->in.share_name,"ADMIN$") ) - || strequal(r->in.share_name, "global") ) + unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name)); + + if ( strequal(share_name,"IPC$") + || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) + || strequal(share_name,"global") ) { return WERR_ACCESS_DENIED; } - if (!(params = get_share_params(p->mem_ctx, r->in.share_name))) { - return WERR_NO_SUCH_SHARE; - } + if (!(params = get_share_params(p->mem_ctx, share_name))) { + return WERR_NO_SUCH_SHARE; + } + + snum = find_service(share_name); /* No change to printer shares. */ - if (lp_print_ok(params->service)) + if (lp_print_ok(snum)) return WERR_ACCESS_DENIED; - is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, - &se_diskop ); + get_current_user(&user,p); + + is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); + + if (user.ut.uid != sec_initial_uid() && !is_disk_op ) + return WERR_ACCESS_DENIED; - if (p->pipe_user.ut.uid != sec_initial_uid() && !is_disk_op ) + if (!lp_delete_share_cmd() || !*lp_delete_share_cmd()) { + DEBUG(10,("_srv_net_share_del: No delete share command\n")); return WERR_ACCESS_DENIED; + } + + slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\"", + lp_delete_share_cmd(), dyn_CONFIGFILE, lp_servicename(snum)); + + DEBUG(10,("_srv_net_share_del: Running [%s]\n", command )); - err = delete_share(lp_servicename(params->service), - p->pipe_user.nt_user_token, is_disk_op); + /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/ + + if ( is_disk_op ) + become_root(); - if (!W_ERROR_IS_OK(err)) { - return err; + if ( (ret = smbrun(command, NULL)) == 0 ) { + /* Tell everyone we updated smb.conf. */ + message_send_all(smbd_messaging_context(), + MSG_SMB_CONF_UPDATED, NULL, 0, NULL); } + if ( is_disk_op ) + unbecome_root(); + + /********* END SeDiskOperatorPrivilege BLOCK *********/ + + DEBUG(3,("_srv_net_share_del: Running [%s] returned (%d)\n", command, ret )); + + if ( ret != 0 ) + return WERR_ACCESS_DENIED; + /* Delete the SD in the database. */ delete_share_security(lp_servicename(params->service)); @@ -2001,28 +1913,22 @@ WERROR _srvsvc_NetShareDel(pipes_struct *p, struct srvsvc_NetShareDel *r) return WERR_OK; } -WERROR _srvsvc_NetShareDelSticky(pipes_struct *p, struct srvsvc_NetShareDelSticky *r) +WERROR _srv_net_share_del_sticky(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u) { - struct srvsvc_NetShareDel s; - DEBUG(5,("_srv_net_share_del_stick: %d\n", __LINE__)); - s.in.server_unc = r->in.server_unc; - s.in.share_name = r->in.share_name; - s.in.reserved = r->in.reserved; - - return _srvsvc_NetShareDel(p, &s); + return _srv_net_share_del(p, q_u, r_u); } /******************************************************************* time of day ********************************************************************/ -WERROR _srvsvc_NetRemoteTOD(pipes_struct *p, struct srvsvc_NetRemoteTOD *r) +WERROR _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET_REMOTE_TOD *r_u) { + TIME_OF_DAY_INFO *tod; struct tm *t; time_t unixdate = time(NULL); - WERROR status = WERR_OK; /* We do this call first as if we do it *after* the gmtime call it overwrites the pointed-to values. JRA */ @@ -2031,91 +1937,106 @@ WERROR _srvsvc_NetRemoteTOD(pipes_struct *p, struct srvsvc_NetRemoteTOD *r) DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__)); + if ( !(tod = TALLOC_ZERO_P(p->mem_ctx, TIME_OF_DAY_INFO)) ) + return WERR_NOMEM; + + r_u->tod = tod; + r_u->ptr_srv_tod = 0x1; + r_u->status = WERR_OK; + + DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__)); + t = gmtime(&unixdate); /* set up the */ - r->out.info->elapsed = unixdate; - r->out.info->msecs = 0; - r->out.info->hours = t->tm_hour; - r->out.info->mins = t->tm_min; - r->out.info->secs = t->tm_sec; - r->out.info->hunds = 0; - r->out.info->timezone = zone; - r->out.info->tinterval = 10000; - r->out.info->day = t->tm_mday; - r->out.info->month = t->tm_mon + 1; - r->out.info->year = 1900+t->tm_year; - r->out.info->weekday = t->tm_wday; + init_time_of_day_info(tod, + unixdate, + 0, + t->tm_hour, + t->tm_min, + t->tm_sec, + 0, + zone, + 10000, + t->tm_mday, + t->tm_mon + 1, + 1900+t->tm_year, + t->tm_wday); DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__)); - return status; + return r_u->status; } /*********************************************************************************** Win9x NT tools get security descriptor. ***********************************************************************************/ -WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, struct srvsvc_NetGetFileSecurity *r) +WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC *q_u, + SRV_R_NET_FILE_QUERY_SECDESC *r_u) { SEC_DESC *psd = NULL; size_t sd_size; DATA_BLOB null_pw; + pstring filename_in; + char *filename = NULL; + pstring qualname; files_struct *fsp = NULL; SMB_STRUCT_STAT st; NTSTATUS nt_status; + struct current_user user; connection_struct *conn = NULL; - BOOL became_user = False; - WERROR status = WERR_OK; - char *tmp_file = NULL; + BOOL became_user = False; TALLOC_CTX *ctx = talloc_tos(); ZERO_STRUCT(st); + r_u->status = WERR_OK; + + unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname)); /* Null password is ok - we are already an authenticated user... */ null_pw = data_blob_null; + get_current_user(&user, p); + become_root(); - conn = make_connection(r->in.share, null_pw, "A:", p->pipe_user.vuid, &nt_status); + conn = make_connection(qualname, null_pw, "A:", user.vuid, &nt_status); unbecome_root(); if (conn == NULL) { - DEBUG(3,("_srv_net_file_query_secdesc: Unable to connect to %s\n", r->in.share)); - status = ntstatus_to_werror(nt_status); + DEBUG(3,("_srv_net_file_query_secdesc: Unable to connect to %s\n", qualname)); + r_u->status = ntstatus_to_werror(nt_status); goto error_exit; } if (!become_user(conn, conn->vuid)) { DEBUG(0,("_srv_net_file_query_secdesc: Can't become connected user!\n")); - status = WERR_ACCESS_DENIED; + r_u->status = WERR_ACCESS_DENIED; goto error_exit; } became_user = True; - if (!r->in.file) { - status = WERR_INVALID_PARAM; - goto error_exit; - } - nt_status = unix_convert(ctx, conn, r->in.file, False, &tmp_file, NULL, &st); + unistr2_to_ascii(filename_in, &q_u->uni_file_name, sizeof(filename_in)); + nt_status = unix_convert(ctx, conn, filename_in, False, &filename, NULL, &st); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_query_secdesc: bad pathname %s\n", r->in.file)); - status = WERR_ACCESS_DENIED; + DEBUG(3,("_srv_net_file_query_secdesc: bad pathname %s\n", filename)); + r_u->status = WERR_ACCESS_DENIED; goto error_exit; } - nt_status = check_name(conn, tmp_file); + nt_status = check_name(conn, filename); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_query_secdesc: can't access %s\n", tmp_file)); - status = WERR_ACCESS_DENIED; + DEBUG(3,("_srv_net_file_query_secdesc: can't access %s\n", filename)); + r_u->status = WERR_ACCESS_DENIED; goto error_exit; } - nt_status = open_file_stat(conn, NULL, tmp_file, &st, &fsp); - if (!NT_STATUS_IS_OK(nt_status)) { + nt_status = open_file_stat(conn, NULL, filename, &st, &fsp); + if ( !NT_STATUS_IS_OK(nt_status)) { /* Perhaps it is a directory */ if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY)) - nt_status = open_directory(conn, NULL, tmp_file, &st, + nt_status = open_directory(conn, NULL, filename, &st, READ_CONTROL_ACCESS, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, @@ -2124,8 +2045,8 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, struct srvsvc_NetGetFileSecur NULL, &fsp); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", tmp_file)); - status = WERR_ACCESS_DENIED; + DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", filename)); + r_u->status = ntstatus_to_werror(nt_status); goto error_exit; } } @@ -2133,20 +2054,23 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, struct srvsvc_NetGetFileSecur sd_size = SMB_VFS_GET_NT_ACL(fsp, fsp->fsp_name, (OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION|DACL_SECURITY_INFORMATION), &psd); if (sd_size == 0) { - DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", tmp_file)); - status = WERR_ACCESS_DENIED; + DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", filename)); + r_u->status = WERR_ACCESS_DENIED; goto error_exit; } - r->out.sd_buf->sd_size= sd_size; - r->out.sd_buf->sd = psd; + r_u->ptr_response = 1; + r_u->size_response = sd_size; + r_u->ptr_secdesc = 1; + r_u->size_secdesc = sd_size; + r_u->sec_desc = psd; psd->dacl->revision = (uint16) NT4_ACL_REVISION; close_file(fsp, NORMAL_CLOSE); unbecome_user(); - close_cnum(conn, p->pipe_user.vuid); - return status; + close_cnum(conn, user.vuid); + return r_u->status; error_exit: @@ -2158,74 +2082,80 @@ error_exit: unbecome_user(); if (conn) - close_cnum(conn, p->pipe_user.vuid); + close_cnum(conn, user.vuid); - return status; + return r_u->status; } /*********************************************************************************** Win9x NT tools set security descriptor. ***********************************************************************************/ -WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, struct srvsvc_NetSetFileSecurity *r) +WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_u, + SRV_R_NET_FILE_SET_SECDESC *r_u) { + pstring filename_in; + char *filename = NULL; + pstring qualname; DATA_BLOB null_pw; files_struct *fsp = NULL; SMB_STRUCT_STAT st; NTSTATUS nt_status; + struct current_user user; connection_struct *conn = NULL; BOOL became_user = False; - WERROR status = WERR_OK; - char *tmp_file = NULL; TALLOC_CTX *ctx = talloc_tos(); ZERO_STRUCT(st); + r_u->status = WERR_OK; + + unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname)); + /* Null password is ok - we are already an authenticated user... */ null_pw = data_blob_null; + get_current_user(&user, p); + become_root(); - conn = make_connection(r->in.share, null_pw, "A:", p->pipe_user.vuid, &nt_status); + conn = make_connection(qualname, null_pw, "A:", user.vuid, &nt_status); unbecome_root(); if (conn == NULL) { - DEBUG(3,("_srv_net_file_set_secdesc: Unable to connect to %s\n", r->in.share)); - status = ntstatus_to_werror(nt_status); + DEBUG(3,("_srv_net_file_set_secdesc: Unable to connect to %s\n", qualname)); + r_u->status = ntstatus_to_werror(nt_status); goto error_exit; } if (!become_user(conn, conn->vuid)) { DEBUG(0,("_srv_net_file_set_secdesc: Can't become connected user!\n")); - status = WERR_ACCESS_DENIED; + r_u->status = WERR_ACCESS_DENIED; goto error_exit; } became_user = True; - if (!r->in.file) { - status = WERR_INVALID_PARAM; - goto error_exit; - } - nt_status = unix_convert(ctx, conn, r->in.file, False, &tmp_file, NULL, &st); + unistr2_to_ascii(filename_in, &q_u->uni_file_name, sizeof(filename_in)); + nt_status = unix_convert(ctx, conn, filename, False, &filename, NULL, &st); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_set_secdesc: bad pathname %s\n", r->in.file)); - status = WERR_ACCESS_DENIED; + DEBUG(3,("_srv_net_file_set_secdesc: bad pathname %s\n", filename)); + r_u->status = WERR_ACCESS_DENIED; goto error_exit; } - nt_status = check_name(conn, tmp_file); + nt_status = check_name(conn, filename); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_set_secdesc: can't access %s\n", tmp_file)); - status = WERR_ACCESS_DENIED; + DEBUG(3,("_srv_net_file_set_secdesc: can't access %s\n", filename)); + r_u->status = WERR_ACCESS_DENIED; goto error_exit; } - nt_status = open_file_stat(conn, NULL, tmp_file, &st, &fsp); + nt_status = open_file_stat(conn, NULL, filename, &st, &fsp); - if (!NT_STATUS_IS_OK(nt_status)) { + if ( !NT_STATUS_IS_OK(nt_status) ) { /* Perhaps it is a directory */ if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY)) - nt_status = open_directory(conn, NULL, tmp_file, &st, + nt_status = open_directory(conn, NULL, filename, &st, FILE_READ_ATTRIBUTES, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, @@ -2233,25 +2163,25 @@ WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, struct srvsvc_NetSetFileSecur FILE_ATTRIBUTE_DIRECTORY, NULL, &fsp); - if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", tmp_file)); - status = WERR_ACCESS_DENIED; + if ( !NT_STATUS_IS_OK(nt_status) ) { + DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", filename)); + r_u->status = ntstatus_to_werror(nt_status); goto error_exit; } } - nt_status = SMB_VFS_SET_NT_ACL(fsp, fsp->fsp_name, r->in.securityinformation, r->in.sd_buf.sd); + nt_status = SMB_VFS_SET_NT_ACL(fsp, fsp->fsp_name, q_u->sec_info, q_u->sec_desc); - if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_set_secdesc: Unable to set NT ACL on file %s\n", tmp_file)); - status = WERR_ACCESS_DENIED; + if (!NT_STATUS_IS_OK(nt_status) ) { + DEBUG(3,("_srv_net_file_set_secdesc: Unable to set NT ACL on file %s\n", filename)); + r_u->status = WERR_ACCESS_DENIED; goto error_exit; } close_file(fsp, NORMAL_CLOSE); unbecome_user(); - close_cnum(conn, p->pipe_user.vuid); - return status; + close_cnum(conn, user.vuid); + return r_u->status; error_exit: @@ -2264,10 +2194,10 @@ error_exit: } if (conn) { - close_cnum(conn, p->pipe_user.vuid); + close_cnum(conn, user.vuid); } - return status; + return r_u->status; } /*********************************************************************************** @@ -2316,68 +2246,59 @@ static const char *next_server_disk_enum(uint32 *resume) return disk; } -WERROR _srvsvc_NetDiskEnum(pipes_struct *p, struct srvsvc_NetDiskEnum *r) +WERROR _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_DISK_ENUM *r_u) { uint32 i; const char *disk_name; + TALLOC_CTX *ctx = p->mem_ctx; + uint32 resume=get_enum_hnd(&q_u->enum_hnd); - WERROR status = WERR_OK; + r_u->status=WERR_OK; - *r->out.totalentries = init_server_disk_enum(r->in.resume_handle); - r->out.info->count = 0; + r_u->total_entries = init_server_disk_enum(&resume); - if(!(r->out.info->disks = TALLOC_ARRAY(p->mem_ctx, struct srvsvc_NetDiskInfo0, MAX_SERVER_DISK_ENTRIES))) { + r_u->disk_enum_ctr.unknown = 0; + + if(!(r_u->disk_enum_ctr.disk_info = TALLOC_ARRAY(ctx, DISK_INFO, MAX_SERVER_DISK_ENTRIES))) { return WERR_NOMEM; } - /*allow one struct srvsvc_NetDiskInfo0 for null terminator*/ + r_u->disk_enum_ctr.disk_info_ptr = r_u->disk_enum_ctr.disk_info ? 1 : 0; + + /*allow one DISK_INFO for null terminator*/ - for(i = 0; i < MAX_SERVER_DISK_ENTRIES -1 && (disk_name = next_server_disk_enum(r->in.resume_handle)); i++) { + for(i = 0; i < MAX_SERVER_DISK_ENTRIES -1 && (disk_name = next_server_disk_enum(&resume)); i++) { - r->out.info->count++; - (*r->out.totalentries)++; + r_u->disk_enum_ctr.entries_read++; /*copy disk name into a unicode string*/ - r->out.info->disks[i].disk = disk_name; + init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, disk_name); } /* add a terminating null string. Is this there if there is more data to come? */ - r->out.info->count++; - (*r->out.totalentries)++; + r_u->disk_enum_ctr.entries_read++; - r->out.info->disks[i].disk = ""; + init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, ""); - return status; + init_enum_hnd(&r_u->enum_hnd, resume); + + return r_u->status; } /******************************************************************** ********************************************************************/ -WERROR _srvsvc_NetNameValidate(pipes_struct *p, struct srvsvc_NetNameValidate *r) +WERROR _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV_R_NET_NAME_VALIDATE *r_u) { - int len; - - if ((r->in.flags != 0x0) && (r->in.flags != 0x80000000)) { - return WERR_INVALID_PARAM; - } + fstring sharename; - switch ( r->in.name_type ) { + switch ( q_u->type ) { case 0x9: - len = strlen_m(r->in.name); - - if ((r->in.flags == 0x0) && (len > 81)) { - DEBUG(5,("_srv_net_name_validate: share name too long (%s > 81 chars)\n", r->in.name)); - return WERR_INVALID_NAME; - } - if ((r->in.flags == 0x80000000) && (len > 13)) { - DEBUG(5,("_srv_net_name_validate: share name too long (%s > 13 chars)\n", r->in.name)); - return WERR_INVALID_NAME; - } - - if ( ! validate_net_name( r->in.name, INVALID_SHARENAME_CHARS, sizeof(r->in.name) ) ) { - DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", r->in.name)); + rpcstr_pull(sharename, q_u->sharename.buffer, sizeof(sharename), q_u->sharename.uni_str_len*2, 0); + if ( !validate_net_name( sharename, INVALID_SHARENAME_CHARS, sizeof(sharename) ) ) { + DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", sharename)); return WERR_INVALID_NAME; } break; @@ -2398,6 +2319,10 @@ WERROR _srvsvc_NetFileClose(pipes_struct *p, struct srvsvc_NetFileClose *r) return WERR_ACCESS_DENIED; } + +/******************************************************************** +********************************************************************/ + WERROR _srvsvc_NetCharDevEnum(pipes_struct *p, struct srvsvc_NetCharDevEnum *r) { p->rng_fault_state = True; @@ -2446,18 +2371,96 @@ WERROR _srvsvc_NetCharDevQPurgeSelf(pipes_struct *p, struct srvsvc_NetCharDevQPu return WERR_NOT_SUPPORTED; } +WERROR _srvsvc_NetConnEnum(pipes_struct *p, struct srvsvc_NetConnEnum *r) +{ + p->rng_fault_state = True; + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetFileEnum(pipes_struct *p, struct srvsvc_NetFileEnum *r) +{ + p->rng_fault_state = True; + return WERR_NOT_SUPPORTED; +} + WERROR _srvsvc_NetFileGetInfo(pipes_struct *p, struct srvsvc_NetFileGetInfo *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } +WERROR _srvsvc_NetSessEnum(pipes_struct *p, struct srvsvc_NetSessEnum *r) +{ + p->rng_fault_state = True; + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetSessDel(pipes_struct *p, struct srvsvc_NetSessDel *r) +{ + p->rng_fault_state = True; + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetShareAdd(pipes_struct *p, struct srvsvc_NetShareAdd *r) +{ + p->rng_fault_state = True; + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetShareEnumAll(pipes_struct *p, struct srvsvc_NetShareEnumAll *r) +{ + p->rng_fault_state = True; + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetShareGetInfo(pipes_struct *p, struct srvsvc_NetShareGetInfo *r) +{ + p->rng_fault_state = True; + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, struct srvsvc_NetShareSetInfo *r) +{ + p->rng_fault_state = True; + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetShareDel(pipes_struct *p, struct srvsvc_NetShareDel *r) +{ + p->rng_fault_state = True; + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetShareDelSticky(pipes_struct *p, struct srvsvc_NetShareDelSticky *r) +{ + p->rng_fault_state = True; + return WERR_NOT_SUPPORTED; +} + WERROR _srvsvc_NetShareCheck(pipes_struct *p, struct srvsvc_NetShareCheck *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } +WERROR _srvsvc_NetSrvGetInfo(pipes_struct *p, struct srvsvc_NetSrvGetInfo *r) +{ + p->rng_fault_state = True; + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetSrvSetInfo(pipes_struct *p, struct srvsvc_NetSrvSetInfo *r) +{ + p->rng_fault_state = True; + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetDiskEnum(pipes_struct *p, struct srvsvc_NetDiskEnum *r) +{ + p->rng_fault_state = True; + return WERR_NOT_SUPPORTED; +} + WERROR _srvsvc_NetServerStatisticsGet(pipes_struct *p, struct srvsvc_NetServerStatisticsGet *r) { p->rng_fault_state = True; @@ -2482,6 +2485,12 @@ WERROR _srvsvc_NetTransportDel(pipes_struct *p, struct srvsvc_NetTransportDel *r return WERR_NOT_SUPPORTED; } +WERROR _srvsvc_NetRemoteTOD(pipes_struct *p, struct srvsvc_NetRemoteTOD *r) +{ + p->rng_fault_state = True; + return WERR_NOT_SUPPORTED; +} + WERROR _srvsvc_NetSetServiceBits(pipes_struct *p, struct srvsvc_NetSetServiceBits *r) { p->rng_fault_state = True; @@ -2506,6 +2515,12 @@ WERROR _srvsvc_NetPathCompare(pipes_struct *p, struct srvsvc_NetPathCompare *r) return WERR_NOT_SUPPORTED; } +WERROR _srvsvc_NetNameValidate(pipes_struct *p, struct srvsvc_NetNameValidate *r) +{ + p->rng_fault_state = True; + return WERR_NOT_SUPPORTED; +} + WERROR _srvsvc_NETRPRNAMECANONICALIZE(pipes_struct *p, struct srvsvc_NETRPRNAMECANONICALIZE *r) { p->rng_fault_state = True; @@ -2518,6 +2533,12 @@ WERROR _srvsvc_NetPRNameCompare(pipes_struct *p, struct srvsvc_NetPRNameCompare return WERR_NOT_SUPPORTED; } +WERROR _srvsvc_NetShareEnum(pipes_struct *p, struct srvsvc_NetShareEnum *r) +{ + p->rng_fault_state = True; + return WERR_NOT_SUPPORTED; +} + WERROR _srvsvc_NetShareDelStart(pipes_struct *p, struct srvsvc_NetShareDelStart *r) { p->rng_fault_state = True; @@ -2530,6 +2551,18 @@ WERROR _srvsvc_NetShareDelCommit(pipes_struct *p, struct srvsvc_NetShareDelCommi return WERR_NOT_SUPPORTED; } +WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, struct srvsvc_NetGetFileSecurity *r) +{ + p->rng_fault_state = True; + return WERR_NOT_SUPPORTED; +} + +WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, struct srvsvc_NetSetFileSecurity *r) +{ + p->rng_fault_state = True; + return WERR_NOT_SUPPORTED; +} + WERROR _srvsvc_NetServerTransportAddEx(pipes_struct *p, struct srvsvc_NetServerTransportAddEx *r) { p->rng_fault_state = True; @@ -2560,7 +2593,7 @@ WERROR _srvsvc_NETRDFSDELETELOCALPARTITION(pipes_struct *p, struct srvsvc_NETRDF return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NETRDFSSETLOCALVOLUMESTATE(pipes_struct *p, struct srvsvc_NETRDFSSETLOCALVOLUMESTATE *R) +WERROR _srvsvc_NETRDFSSETLOCALVOLUMESTATE(pipes_struct *p, struct srvsvc_NETRDFSSETLOCALVOLUMESTATE *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; @@ -2584,26 +2617,27 @@ WERROR _srvsvc_NETRDFSDELETEEXITPOINT(pipes_struct *p, struct srvsvc_NETRDFSDELE return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NETRSERVERTRANSPORTDELEX(pipes_struct *p, struct srvsvc_NETRSERVERTRANSPORTDELEX *r) +WERROR _srvsvc_NETRDFSMODIFYPREFIX(pipes_struct *p, struct srvsvc_NETRDFSMODIFYPREFIX *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NETRDFSMANAGERREPORTSITEINFO(pipes_struct *p, struct srvsvc_NETRDFSMANAGERREPORTSITEINFO *r) +WERROR _srvsvc_NETRDFSFIXLOCALVOLUME(pipes_struct *p, struct srvsvc_NETRDFSFIXLOCALVOLUME *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NETRDFSMODIFYPREFIX(pipes_struct *p, struct srvsvc_NETRDFSMODIFYPREFIX *r) +WERROR _srvsvc_NETRDFSMANAGERREPORTSITEINFO(pipes_struct *p, struct srvsvc_NETRDFSMANAGERREPORTSITEINFO *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NETRDFSFIXLOCALVOLUME(pipes_struct *p, struct srvsvc_NETRDFSFIXLOCALVOLUME *r) +WERROR _srvsvc_NETRSERVERTRANSPORTDELEX(pipes_struct *p, struct srvsvc_NETRSERVERTRANSPORTDELEX *r) { p->rng_fault_state = True; return WERR_NOT_SUPPORTED; } + -- cgit From 30191d1a5704ad2b158386b511558972d539ce47 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 18 Oct 2007 17:40:25 -0700 Subject: RIP BOOL. Convert BOOL -> bool. I found a few interesting bugs in various places whilst doing this (places that assumed BOOL == int). I also need to fix the Samba4 pidl generation (next checkin). Jeremy. (This used to be commit f35a266b3cbb3e5fa6a86be60f34fe340a3ca71f) --- source3/rpc_server/srv_srvsvc_nt.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index f23d6dfcb9..27bc807367 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -452,7 +452,7 @@ static void init_srv_share_info_1501(pipes_struct *p, SRV_SHARE_INFO_1501 *sh150 True if it ends in '$'. ********************************************************************/ -static BOOL is_hidden_share(int snum) +static bool is_hidden_share(int snum) { const char *net_name = lp_servicename(snum); @@ -463,8 +463,8 @@ static BOOL is_hidden_share(int snum) Fill in a share info structure. ********************************************************************/ -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) +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 = 0; @@ -703,7 +703,7 @@ static BOOL init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, ********************************************************************/ 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) + uint32 info_level, uint32 resume_hnd, bool all) { DEBUG(5,("init_srv_r_net_share_enum: %d\n", __LINE__)); @@ -886,7 +886,7 @@ static void init_srv_sess_info_1(pipes_struct *p, SRV_SESS_INFO_1 *ss1, uint32 * uint32 num_files; uint32 connect_time; struct passwd *pw = sys_getpwnam(session_list[*snum].username); - BOOL guest; + bool guest; if ( !pw ) { DEBUG(10,("init_srv_sess_info_1: failed to find owner: %s\n", @@ -1336,7 +1336,7 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES int num_sessions, snum; fstring username; fstring machine; - BOOL not_root = False; + bool not_root = False; rpcstr_pull_unistr2_fstring(username, &q_u->uni_user_name); rpcstr_pull_unistr2_fstring(machine, &q_u->uni_cli_name); @@ -1500,7 +1500,7 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S char *path; SEC_DESC *psd = NULL; SE_PRIV se_diskop = SE_DISK_OPERATOR; - BOOL is_disk_op = False; + bool is_disk_op = False; int max_connections = 0; DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); @@ -1690,7 +1690,7 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S char *path; SEC_DESC *psd = NULL; SE_PRIV se_diskop = SE_DISK_OPERATOR; - BOOL is_disk_op; + bool is_disk_op; int max_connections = 0; DEBUG(5,("_srv_net_share_add: %d\n", __LINE__)); @@ -1843,7 +1843,7 @@ WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S int ret; int snum; SE_PRIV se_diskop = SE_DISK_OPERATOR; - BOOL is_disk_op; + bool is_disk_op; struct share_params *params; DEBUG(5,("_srv_net_share_del: %d\n", __LINE__)); @@ -1986,7 +1986,7 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC NTSTATUS nt_status; struct current_user user; connection_struct *conn = NULL; - BOOL became_user = False; + bool became_user = False; TALLOC_CTX *ctx = talloc_tos(); ZERO_STRUCT(st); @@ -2103,7 +2103,7 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ NTSTATUS nt_status; struct current_user user; connection_struct *conn = NULL; - BOOL became_user = False; + bool became_user = False; TALLOC_CTX *ctx = talloc_tos(); ZERO_STRUCT(st); -- cgit From 23f6c371c992de211e10b7ae9cd46de3ec672143 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Fri, 19 Oct 2007 22:42:28 +0200 Subject: Streamline logic, reducing the amount of indentation. Michael (This used to be commit aae3d04e30a0e6f21f661da3dc6a2835d31ce964) --- source3/rpc_server/srv_srvsvc_nt.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 27bc807367..55c30c5315 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2033,22 +2033,21 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC } nt_status = open_file_stat(conn, NULL, filename, &st, &fsp); - if ( !NT_STATUS_IS_OK(nt_status)) { - /* Perhaps it is a directory */ - if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY)) - nt_status = open_directory(conn, NULL, filename, &st, - READ_CONTROL_ACCESS, - FILE_SHARE_READ|FILE_SHARE_WRITE, - FILE_OPEN, - 0, - FILE_ATTRIBUTE_DIRECTORY, - NULL, &fsp); - - if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", filename)); - r_u->status = ntstatus_to_werror(nt_status); - goto error_exit; - } + /* Perhaps it is a directory */ + if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY)) { + nt_status = open_directory(conn, NULL, filename, &st, + READ_CONTROL_ACCESS, + FILE_SHARE_READ|FILE_SHARE_WRITE, + FILE_OPEN, + 0, + FILE_ATTRIBUTE_DIRECTORY, + NULL, &fsp); + } + + if (!NT_STATUS_IS_OK(nt_status)) { + DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", filename)); + r_u->status = ntstatus_to_werror(nt_status); + goto error_exit; } sd_size = SMB_VFS_GET_NT_ACL(fsp, fsp->fsp_name, (OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION|DACL_SECURITY_INFORMATION), &psd); -- cgit From 15953b82eb3b49d736b4b835b1d0d3cf0da0bff8 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sat, 13 Oct 2007 21:06:49 +0200 Subject: Make [f]get_nt_acl return NTSTATUS (This used to be commit dcbe1bf942d017a3cd5084c6ef605a13912f795b) --- source3/rpc_server/srv_srvsvc_nt.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 55c30c5315..5a3c451cde 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2050,14 +2050,19 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC goto error_exit; } - sd_size = SMB_VFS_GET_NT_ACL(fsp, fsp->fsp_name, (OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION|DACL_SECURITY_INFORMATION), &psd); + nt_status = SMB_VFS_GET_NT_ACL(fsp, fsp->fsp_name, + (OWNER_SECURITY_INFORMATION + |GROUP_SECURITY_INFORMATION + |DACL_SECURITY_INFORMATION), &psd); - if (sd_size == 0) { + if (!NT_STATUS_IS_OK(nt_status)) { DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", filename)); - r_u->status = WERR_ACCESS_DENIED; + r_u->status = ntstatus_to_werror(nt_status); goto error_exit; } + sd_size = sec_desc_size(psd); + r_u->ptr_response = 1; r_u->size_response = sd_size; r_u->ptr_secdesc = 1; -- cgit From 68be9a820059ee96dd26c527efd7c14e679d3f2c Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 15 Nov 2007 14:19:52 -0800 Subject: More pstring removal. This one was tricky. I had to add one horror (pstring_clean_name()) which will have to remain until I've removed all pstrings from the client code. Jeremy. (This used to be commit 1ea3ac80146b83c2522b69e7747c823366a2b47d) --- source3/rpc_server/srv_srvsvc_nt.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 5a3c451cde..51dffb8904 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1463,17 +1463,22 @@ WERROR _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, S Check a given DOS pathname is valid for a share. ********************************************************************/ -char *valid_share_pathname(char *dos_pathname) +char *valid_share_pathname(TALLOC_CTX *ctx, const char *dos_pathname) { - char *ptr; + char *ptr = talloc_strdup(ctx, dos_pathname); + if (!ptr) { + return NULL; + } /* Convert any '\' paths to '/' */ - unix_format(dos_pathname); - unix_clean_name(dos_pathname); + unix_format(ptr); + ptr = unix_clean_name(talloc_tos(), ptr); + if (!ptr) { + return NULL; + } /* NT is braindead - it wants a C: prefix to a pathname ! So strip it. */ - ptr = dos_pathname; - if (strlen(dos_pathname) > 2 && ptr[1] == ':' && ptr[0] != '/') + if (strlen(ptr) > 2 && ptr[1] == ':' && ptr[0] != '/') ptr += 2; /* Only absolute paths allowed. */ @@ -1602,7 +1607,7 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S return WERR_ACCESS_DENIED; /* Check if the pathname is valid. */ - if (!(path = valid_share_pathname( pathname ))) + if (!(path = valid_share_pathname(p->mem_ctx, pathname ))) return WERR_OBJECT_PATH_INVALID; /* Ensure share name, pathname and comment don't contain '"' characters. */ @@ -1774,7 +1779,7 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S return WERR_ACCESS_DENIED; /* Check if the pathname is valid. */ - if (!(path = valid_share_pathname( pathname ))) + if (!(path = valid_share_pathname(p->mem_ctx, pathname ))) return WERR_OBJECT_PATH_INVALID; /* Ensure share name, pathname and comment don't contain '"' characters. */ -- cgit From 3a452a15b7185dd4023c7dc8d44004c962f39d98 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 27 Nov 2007 11:22:58 -0800 Subject: Remove pstring from everything in rpc_server except srv_spoolss_nt.c and srv_srvsvc_nt.c. They're next :-). Jeremy. (This used to be commit 55b4f9d003b036af69085f7b64e0df08c5ba440d) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 51dffb8904..9788eb5bcc 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1472,7 +1472,7 @@ char *valid_share_pathname(TALLOC_CTX *ctx, const char *dos_pathname) } /* Convert any '\' paths to '/' */ unix_format(ptr); - ptr = unix_clean_name(talloc_tos(), ptr); + ptr = unix_clean_name(ctx, ptr); if (!ptr) { return NULL; } -- cgit From 6b6655edd90850d09c7711fc3b9fe98271e3e625 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 27 Nov 2007 14:35:30 -0800 Subject: Remove pstrings from everything except srv_spoolss_nt.c. Jeremy. (This used to be commit 0002a9e96b0ef78316295a6eb94ff29b64e2f988) --- source3/rpc_server/srv_srvsvc_nt.c | 510 +++++++++++++++++++++++-------------- 1 file changed, 315 insertions(+), 195 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 9788eb5bcc..b034e7cbd3 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -54,14 +54,14 @@ static int pipe_enum_fn( struct db_record *rec, void *p) struct file_enum_count *fenum = (struct file_enum_count *)p; FILE_INFO_3 *f; int i = fenum->count; - pstring fullpath; + char *fullpath = NULL; const char *username; - + if (rec->value.dsize != sizeof(struct pipe_open_rec)) return 0; memcpy(&prec, rec->value.dptr, sizeof(struct pipe_open_rec)); - + if ( !process_exists(prec.pid) ) { return 0; } @@ -72,22 +72,26 @@ static int pipe_enum_fn( struct db_record *rec, void *p) && !strequal(username, fenum->username)) { return 0; } - - snprintf( fullpath, sizeof(fullpath), "\\PIPE\\%s", prec.name ); - + + fullpath = talloc_asprintf(fenum->ctx, "\\PIPE\\%s", prec.name ); + if (!fullpath) { + return 1; + } + f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 ); if ( !f ) { DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1)); return 1; } fenum->info = f; - + init_srv_file_info3( - &fenum->info[i], + &fenum->info[i], (uint32)((procid_to_pid(&prec.pid)<<16) & prec.pnum), - (FILE_READ_DATA|FILE_WRITE_DATA), + (FILE_READ_DATA|FILE_WRITE_DATA), 0, username, fullpath); - + + TALLOC_FREE(fullpath); fenum->count++; return 0; @@ -112,17 +116,17 @@ static WERROR net_enum_pipes( TALLOC_CTX *ctx, const char *username, "failed\n")); return WERR_NOMEM; } - + *info = fenum.info; *count = fenum.count; - + return WERR_OK; } /******************************************************************* ********************************************************************/ -static void enum_file_fn( const struct share_mode_entry *e, +static void enum_file_fn( const struct share_mode_entry *e, const char *sharepath, const char *fname, void *private_data ) { @@ -134,10 +138,10 @@ static void enum_file_fn( const struct share_mode_entry *e, files_struct fsp; struct byte_range_lock *brl; int num_locks = 0; - pstring fullpath; + char *fullpath = NULL; uint32 permissions; const char *username; - + /* If the pid was not found delete the entry from connections.tdb */ if ( !process_exists(e->pid) ) { @@ -150,7 +154,7 @@ static void enum_file_fn( const struct share_mode_entry *e, && !strequal(username, fenum->username)) { return; } - + f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 ); if ( !f ) { DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1)); @@ -159,33 +163,38 @@ static void enum_file_fn( const struct share_mode_entry *e, fenum->info = f; /* need to count the number of locks on a file */ - - ZERO_STRUCT( fsp ); + + ZERO_STRUCT( fsp ); fsp.file_id = e->id; - + if ( (brl = brl_get_locks(NULL,&fsp)) != NULL ) { num_locks = brl->num_locks; - TALLOC_FREE( brl ); + TALLOC_FREE(brl); } - + if ( strcmp( fname, "." ) == 0 ) { - pstr_sprintf( fullpath, "C:%s", sharepath ); + fullpath = talloc_asprintf(fenum->ctx, "C:%s", sharepath ); } else { - pstr_sprintf( fullpath, "C:%s/%s", sharepath, fname ); + fullpath = talloc_asprintf(fenum->ctx, "C:%s/%s", + sharepath, fname ); + } + if (!fullpath) { + return; } string_replace( fullpath, '/', '\\' ); - + /* mask out create (what ever that is) */ permissions = e->share_access & (FILE_READ_DATA|FILE_WRITE_DATA); /* now fill in the FILE_INFO_3 struct */ - init_srv_file_info3( &fenum->info[i], + init_srv_file_info3( &fenum->info[i], e->share_file_id, permissions, num_locks, username, fullpath ); - + + TALLOC_FREE(fullpath); fenum->count++; } @@ -214,11 +223,11 @@ static WERROR net_enum_files( TALLOC_CTX *ctx, const char *username, /******************************************************************* Utility function to get the 'type' of a share from an snum. ********************************************************************/ -static uint32 get_share_type(int snum) +static uint32 get_share_type(int snum) { char *net_name = lp_servicename(snum); int len_net_name = strlen(net_name); - + /* work out the share type */ uint32 type = STYPE_DISKTREE; @@ -231,16 +240,14 @@ static uint32 get_share_type(int snum) return type; } - + /******************************************************************* Fill in a share info level 0 structure. ********************************************************************/ static void init_srv_share_info_0(pipes_struct *p, SRV_SHARE_INFO_0 *sh0, int snum) { - pstring net_name; - - pstrcpy(net_name, lp_servicename(snum)); + const char *net_name = lp_servicename(snum); init_srv_share_info0(&sh0->info_0, net_name); init_srv_share_info0_str(&sh0->info_0_str, net_name); @@ -252,14 +259,22 @@ static void init_srv_share_info_0(pipes_struct *p, SRV_SHARE_INFO_0 *sh0, int sn static void init_srv_share_info_1(pipes_struct *p, SRV_SHARE_INFO_1 *sh1, int snum) { - pstring remark; - char *net_name = lp_servicename(snum); - pstrcpy(remark, lp_comment(snum)); - standard_sub_conn(p->conn, remark,sizeof(remark)); + char *remark = talloc_strdup(p->mem_ctx, lp_comment(snum)); - init_srv_share_info1(&sh1->info_1, net_name, get_share_type(snum), remark); - init_srv_share_info1_str(&sh1->info_1_str, net_name, remark); + if (remark) { + remark = standard_sub_conn(p->mem_ctx, + p->conn, + remark); + } + + init_srv_share_info1(&sh1->info_1, + net_name, + get_share_type(snum), + remark ? remark: ""); + init_srv_share_info1_str(&sh1->info_1_str, + net_name, + remark ? remark: ""); } /******************************************************************* @@ -268,33 +283,48 @@ static void init_srv_share_info_1(pipes_struct *p, SRV_SHARE_INFO_1 *sh1, int sn static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2, int snum) { - pstring remark; - pstring path; - pstring passwd; + char *remark = NULL; + char *path = NULL; int max_connections = lp_max_connections(snum); uint32 max_uses = max_connections!=0 ? max_connections : 0xffffffff; int count = 0; char *net_name = lp_servicename(snum); - - pstrcpy(remark, lp_comment(snum)); - standard_sub_conn(p->conn, remark,sizeof(remark)); - pstrcpy(path, "C:"); - pstrcat(path, lp_pathname(snum)); - /* - * Change / to \\ so that win2k will see it as a valid path. This was added to - * enable use of browsing in win2k add share dialog. - */ + remark = talloc_strdup(p->mem_ctx, lp_comment(snum)); + if (remark) { + remark = standard_sub_conn(p->mem_ctx, + p->conn, + remark); + } + path = talloc_asprintf(p->mem_ctx, + "C:%s", lp_pathname(snum)); - string_replace(path, '/', '\\'); + if (path) { + /* + * Change / to \\ so that win2k will see it as a valid path. + * This was added to enable use of browsing in win2k add + * share dialog. + */ - pstrcpy(passwd, ""); + string_replace(path, '/', '\\'); + } - count = count_current_connections( net_name, False ); - init_srv_share_info2(&sh2->info_2, net_name, get_share_type(snum), - remark, 0, max_uses, count, path, passwd); + count = count_current_connections(net_name, false); + init_srv_share_info2(&sh2->info_2, + net_name, + get_share_type(snum), + remark ? remark : "", + 0, + max_uses, + count, + path ? path : "", + ""); - init_srv_share_info2_str(&sh2->info_2_str, net_name, remark, path, passwd); + init_srv_share_info2_str(&sh2->info_2_str, + net_name, + remark ? remark : "", + path ? path : "", + ""); } /******************************************************************* @@ -319,7 +349,7 @@ static void map_generic_share_sd_bits(SEC_DESC *psd) se_map_generic(&psa->access_mask, &file_generic_mapping); psa->access_mask |= orig_mask; - } + } } /******************************************************************* @@ -328,14 +358,17 @@ static void map_generic_share_sd_bits(SEC_DESC *psd) static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501, int snum) { - pstring remark; - const char *net_name = lp_servicename(snum); - pstrcpy(remark, lp_comment(snum)); - standard_sub_conn(p->conn, remark, sizeof(remark)); + char *remark = talloc_strdup(p->mem_ctx, lp_comment(snum)); + + if (remark) { + remark = standard_sub_conn(p->mem_ctx, p->conn, remark); + } - init_srv_share_info501(&sh501->info_501, net_name, get_share_type(snum), remark, (lp_csc_policy(snum) << 4)); - init_srv_share_info501_str(&sh501->info_501_str, net_name, remark); + init_srv_share_info501(&sh501->info_501, net_name, get_share_type(snum), + remark ? remark : "", (lp_csc_policy(snum) << 4)); + init_srv_share_info501_str(&sh501->info_501_str, + net_name, remark ? remark : ""); } /******************************************************************* @@ -344,36 +377,47 @@ static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501, static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, int snum) { - pstring net_name; - pstring remark; - pstring path; - pstring passwd; - SEC_DESC *sd; - size_t sd_size; + const char *net_name = lp_servicename(snum); + char *path = NULL; + SEC_DESC *sd = NULL; + size_t sd_size = 0; TALLOC_CTX *ctx = p->mem_ctx; - + char *remark = talloc_strdup(ctx, lp_comment(snum));; ZERO_STRUCTP(sh502); - pstrcpy(net_name, lp_servicename(snum)); - pstrcpy(remark, lp_comment(snum)); - standard_sub_conn(p->conn, remark,sizeof(remark)); - pstrcpy(path, "C:"); - pstrcat(path, lp_pathname(snum)); - - /* - * Change / to \\ so that win2k will see it as a valid path. This was added to - * enable use of browsing in win2k add share dialog. - */ - - string_replace(path, '/', '\\'); - - pstrcpy(passwd, ""); + if (remark) { + remark = standard_sub_conn(ctx, p->conn, remark); + } + path = talloc_asprintf(ctx, "C:%s", lp_pathname(snum)); + if (path) { + /* + * Change / to \\ so that win2k will see it as a valid path. This was added to + * enable use of browsing in win2k add share dialog. + */ + string_replace(path, '/', '\\'); + } sd = get_share_security(ctx, lp_servicename(snum), &sd_size); - init_srv_share_info502(&sh502->info_502, net_name, get_share_type(snum), remark, 0, 0xffffffff, 1, path, passwd, sd, sd_size); - init_srv_share_info502_str(&sh502->info_502_str, net_name, remark, path, passwd, sd, sd_size); + init_srv_share_info502(&sh502->info_502, + net_name, + get_share_type(snum), + remark ? remark : "", + 0, + 0xffffffff, + 1, + path ? path : "", + "", + sd, + sd_size); + init_srv_share_info502_str(&sh502->info_502_str, + net_name, + remark ? remark : "", + path ? path : "", + "", + sd, + sd_size); } /*************************************************************************** @@ -382,15 +426,17 @@ static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, static void init_srv_share_info_1004(pipes_struct *p, SRV_SHARE_INFO_1004* sh1004, int snum) { - pstring remark; + char *remark = talloc_strdup(p->mem_ctx, lp_comment(snum)); - pstrcpy(remark, lp_comment(snum)); - standard_sub_conn(p->conn, remark, sizeof(remark)); + if (remark) { + remark = standard_sub_conn(p->mem_ctx, p->conn, remark); + } ZERO_STRUCTP(sh1004); - - init_srv_share_info1004(&sh1004->info_1004, remark); - init_srv_share_info1004_str(&sh1004->info_1004_str, remark); + + init_srv_share_info1004(&sh1004->info_1004, remark ? remark : ""); + init_srv_share_info1004_str(&sh1004->info_1004_str, + remark ? remark : ""); } /*************************************************************************** @@ -402,9 +448,9 @@ static void init_srv_share_info_1005(pipes_struct *p, SRV_SHARE_INFO_1005* sh100 sh1005->share_info_flags = 0; if(lp_host_msdfs() && lp_msdfs_root(snum)) - sh1005->share_info_flags |= + sh1005->share_info_flags |= SHARE_1005_IN_DFS | SHARE_1005_DFS_ROOT; - sh1005->share_info_flags |= + sh1005->share_info_flags |= lp_csc_policy(snum) << SHARE_1005_CSC_POLICY_SHIFT; } /*************************************************************************** @@ -422,13 +468,12 @@ static void init_srv_share_info_1006(pipes_struct *p, SRV_SHARE_INFO_1006* sh100 static void init_srv_share_info_1007(pipes_struct *p, SRV_SHARE_INFO_1007* sh1007, int snum) { - pstring alternate_directory_name = ""; uint32 flags = 0; ZERO_STRUCTP(sh1007); - - init_srv_share_info1007(&sh1007->info_1007, flags, alternate_directory_name); - init_srv_share_info1007_str(&sh1007->info_1007_str, alternate_directory_name); + + init_srv_share_info1007(&sh1007->info_1007, flags, ""); + init_srv_share_info1007_str(&sh1007->info_1007_str, ""); } /******************************************************************* @@ -1465,8 +1510,13 @@ WERROR _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, S char *valid_share_pathname(TALLOC_CTX *ctx, const char *dos_pathname) { - char *ptr = talloc_strdup(ctx, dos_pathname); + char *ptr = NULL; + + if (!dos_pathname) { + return NULL; + } + ptr = talloc_strdup(ctx, dos_pathname); if (!ptr) { return NULL; } @@ -1495,26 +1545,30 @@ char *valid_share_pathname(TALLOC_CTX *ctx, const char *dos_pathname) WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, SRV_R_NET_SHARE_SET_INFO *r_u) { struct current_user user; - pstring command; - fstring share_name; - fstring comment; - pstring pathname; + char *command = NULL; + char *share_name = NULL; + char *comment = NULL; + char *pathname = NULL; int type; int snum; int ret; - char *path; + char *path = NULL; SEC_DESC *psd = NULL; SE_PRIV se_diskop = SE_DISK_OPERATOR; bool is_disk_op = False; int max_connections = 0; + TALLOC_CTX *ctx = p->mem_ctx; DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); - unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name)); + share_name = unistr2_to_ascii_talloc(ctx, &q_u->uni_share_name); + if (!share_name) { + return WERR_NET_NAME_NOT_FOUND; + } r_u->parm_error = 0; - if ( strequal(share_name,"IPC$") + if ( strequal(share_name,"IPC$") || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) || strequal(share_name,"global") ) { @@ -1534,22 +1588,25 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S get_current_user(&user,p); is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); - + /* fail out now if you are not root and not a disk op */ - + if ( user.ut.uid != sec_initial_uid() && !is_disk_op ) return WERR_ACCESS_DENIED; switch (q_u->info_level) { case 1: - pstrcpy(pathname, lp_pathname(snum)); - unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(comment)); + pathname = talloc_strdup(ctx, lp_pathname(snum)); + comment = unistr2_to_ascii_talloc(ctx, + &q_u->info.share.info2.info_2_str.uni_remark); type = q_u->info.share.info2.info_2.type; psd = NULL; break; case 2: - unistr2_to_ascii(comment, &q_u->info.share.info2.info_2_str.uni_remark, sizeof(comment)); - unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(pathname)); + comment = unistr2_to_ascii_talloc(ctx, + &q_u->info.share.info2.info_2_str.uni_remark); + pathname = unistr2_to_ascii_talloc(ctx, + &q_u->info.share.info2.info_2_str.uni_path); type = q_u->info.share.info2.info_2.type; max_connections = (q_u->info.share.info2.info_2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.info_2.max_uses; psd = NULL; @@ -1563,15 +1620,18 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S break; #endif case 502: - unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(comment)); - unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(pathname)); + comment = unistr2_to_ascii_talloc(ctx, + &q_u->info.share.info502.info_502_str.uni_remark); + pathname = unistr2_to_ascii_talloc(ctx, + &q_u->info.share.info502.info_502_str.uni_path); type = q_u->info.share.info502.info_502.type; psd = q_u->info.share.info502.info_502_str.sd; map_generic_share_sd_bits(psd); break; case 1004: - pstrcpy(pathname, lp_pathname(snum)); - unistr2_to_ascii(comment, &q_u->info.share.info1004.info_1004_str.uni_remark, sizeof(comment)); + pathname = talloc_strdup(ctx, lp_pathname(snum)); + comment = unistr2_to_ascii_talloc(ctx, + &q_u->info.share.info1004.info_1004_str.uni_remark); type = STYPE_DISKTREE; break; case 1005: @@ -1591,8 +1651,8 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S case 1007: return WERR_ACCESS_DENIED; case 1501: - pstrcpy(pathname, lp_pathname(snum)); - fstrcpy(comment, lp_comment(snum)); + pathname = talloc_strdup(ctx, lp_pathname(snum)); + comment = talloc_strdup(ctx, lp_comment(snum)); psd = q_u->info.share.info1501.sdb->sd; map_generic_share_sd_bits(psd); type = STYPE_DISKTREE; @@ -1605,7 +1665,7 @@ WERROR _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 WERR_ACCESS_DENIED; - + /* Check if the pathname is valid. */ if (!(path = valid_share_pathname(p->mem_ctx, pathname ))) return WERR_OBJECT_PATH_INVALID; @@ -1613,45 +1673,57 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S /* Ensure share name, pathname and comment don't contain '"' characters. */ string_replace(share_name, '"', ' '); string_replace(path, '"', ' '); - string_replace(comment, '"', ' '); + if (comment) { + string_replace(comment, '"', ' '); + } DEBUG(10,("_srv_net_share_set_info: change share command = %s\n", lp_change_share_cmd() ? lp_change_share_cmd() : "NULL" )); /* Only call modify function if something changed. */ - - if (strcmp(path, lp_pathname(snum)) || strcmp(comment, lp_comment(snum)) - || (lp_max_connections(snum) != max_connections) ) - { + + if (strcmp(path, lp_pathname(snum)) || strcmp(comment, lp_comment(snum)) + || (lp_max_connections(snum) != max_connections)) { if (!lp_change_share_cmd() || !*lp_change_share_cmd()) { DEBUG(10,("_srv_net_share_set_info: No change share command\n")); return WERR_ACCESS_DENIED; } - slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d", - lp_change_share_cmd(), dyn_CONFIGFILE, share_name, path, comment, max_connections ); + command = talloc_asprintf(p->mem_ctx, + "%s \"%s\" \"%s\" \"%s\" \"%s\" %d", + lp_change_share_cmd(), + dyn_CONFIGFILE, + share_name, + path, + comment ? comment : "", + max_connections); + if (!command) { + return WERR_NOMEM; + } DEBUG(10,("_srv_net_share_set_info: Running [%s]\n", command )); - + /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/ - - if ( is_disk_op ) + + if (is_disk_op) become_root(); - + if ( (ret = smbrun(command, NULL)) == 0 ) { /* Tell everyone we updated smb.conf. */ message_send_all(smbd_messaging_context(), MSG_SMB_CONF_UPDATED, NULL, 0, NULL); } - + if ( is_disk_op ) unbecome_root(); - + /********* END SeDiskOperatorPrivilege BLOCK *********/ DEBUG(3,("_srv_net_share_set_info: Running [%s] returned (%d)\n", command, ret )); - + + TALLOC_FREE(command); + if ( ret != 0 ) return WERR_ACCESS_DENIED; } else { @@ -1671,24 +1743,24 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S share_name )); } } - + DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); return WERR_OK; } /******************************************************************* - Net share add. Call 'add_share_command "sharename" "pathname" + Net share add. Call 'add_share_command "sharename" "pathname" "comment" "max connections = " ********************************************************************/ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_SHARE_ADD *r_u) { struct current_user user; - pstring command; - fstring share_name; - fstring comment; - pstring pathname; + char *command = NULL; + char *share_name = NULL; + char *comment = NULL; + char *pathname = NULL; int type; int snum; int ret; @@ -1697,6 +1769,7 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S SE_PRIV se_diskop = SE_DISK_OPERATOR; bool is_disk_op; int max_connections = 0; + TALLOC_CTX *ctx = p->mem_ctx; DEBUG(5,("_srv_net_share_add: %d\n", __LINE__)); @@ -1706,14 +1779,14 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); - if (user.ut.uid != sec_initial_uid() && !is_disk_op ) + if (user.ut.uid != sec_initial_uid() && !is_disk_op ) return WERR_ACCESS_DENIED; if (!lp_add_share_cmd() || !*lp_add_share_cmd()) { DEBUG(10,("_srv_net_share_add: No add share command\n")); return WERR_ACCESS_DENIED; } - + switch (q_u->info_level) { case 0: /* No path. Not enough info in a level 0 to do anything. */ @@ -1722,9 +1795,12 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S /* Not enough info in a level 1 to do anything. */ return WERR_ACCESS_DENIED; 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)); - unistr2_to_ascii(pathname, &q_u->info.share.info2.info_2_str.uni_path, sizeof(share_name)); + share_name = unistr2_to_ascii_talloc(ctx, + &q_u->info.share.info2.info_2_str.uni_netname); + comment = unistr2_to_ascii_talloc(ctx, + &q_u->info.share.info2.info_2_str.uni_remark); + pathname = unistr2_to_ascii_talloc(ctx, + &q_u->info.share.info2.info_2_str.uni_path); max_connections = (q_u->info.share.info2.info_2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.info_2.max_uses; type = q_u->info.share.info2.info_2.type; break; @@ -1732,9 +1808,12 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S /* No path. Not enough info in a level 501 to do anything. */ return WERR_ACCESS_DENIED; case 502: - unistr2_to_ascii(share_name, &q_u->info.share.info502.info_502_str.uni_netname, sizeof(share_name)); - unistr2_to_ascii(comment, &q_u->info.share.info502.info_502_str.uni_remark, sizeof(share_name)); - unistr2_to_ascii(pathname, &q_u->info.share.info502.info_502_str.uni_path, sizeof(share_name)); + share_name = unistr2_to_ascii_talloc(ctx, + &q_u->info.share.info502.info_502_str.uni_netname); + comment = unistr2_to_ascii_talloc(ctx, + &q_u->info.share.info502.info_502_str.uni_remark); + pathname = unistr2_to_ascii_talloc(ctx, + &q_u->info.share.info502.info_502_str.uni_path); type = q_u->info.share.info502.info_502.type; psd = q_u->info.share.info502.info_502_str.sd; map_generic_share_sd_bits(psd); @@ -1757,48 +1836,60 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S /* check for invalid share names */ - if ( !validate_net_name( share_name, INVALID_SHARENAME_CHARS, sizeof(share_name) ) ) { - DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", share_name)); + if (!share_name || !validate_net_name(share_name, + INVALID_SHARENAME_CHARS, + strlen(share_name))) { + DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", + share_name ? share_name : "")); return WERR_INVALID_NAME; } - if ( strequal(share_name,"IPC$") || strequal(share_name,"global") - || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) ) - { + if (strequal(share_name,"IPC$") || strequal(share_name,"global") + || (lp_enable_asu_support() && + strequal(share_name,"ADMIN$"))) { return WERR_ACCESS_DENIED; } snum = find_service(share_name); /* Share already exists. */ - if (snum >= 0) + if (snum >= 0) { return WERR_ALREADY_EXISTS; + } /* We can only add disk shares. */ - if (type != STYPE_DISKTREE) + if (type != STYPE_DISKTREE) { return WERR_ACCESS_DENIED; - + } + /* Check if the pathname is valid. */ - if (!(path = valid_share_pathname(p->mem_ctx, pathname ))) + if (!(path = valid_share_pathname(p->mem_ctx, pathname))) { return WERR_OBJECT_PATH_INVALID; + } /* Ensure share name, pathname and comment don't contain '"' characters. */ string_replace(share_name, '"', ' '); string_replace(path, '"', ' '); - string_replace(comment, '"', ' '); - - slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d", - lp_add_share_cmd(), - dyn_CONFIGFILE, - share_name, - path, - comment, + if (comment) { + string_replace(comment, '"', ' '); + } + + command = talloc_asprintf(ctx, + "%s \"%s\" \"%s\" \"%s\" \"%s\" %d", + lp_add_share_cmd(), + dyn_CONFIGFILE, + share_name, + path, + comment ? comment : "", max_connections); - + if (!command) { + return WERR_NOMEM; + } + DEBUG(10,("_srv_net_share_add: Running [%s]\n", command )); - + /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/ - + if ( is_disk_op ) become_root(); @@ -1810,11 +1901,13 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S if ( is_disk_op ) unbecome_root(); - + /********* END SeDiskOperatorPrivilege BLOCK *********/ DEBUG(3,("_srv_net_share_add: Running [%s] returned (%d)\n", command, ret )); + TALLOC_FREE(command); + if ( ret != 0 ) return WERR_ACCESS_DENIED; @@ -1843,29 +1936,33 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u) { struct current_user user; - pstring command; - fstring share_name; + char *command = NULL; + char *share_name = NULL; int ret; int snum; SE_PRIV se_diskop = SE_DISK_OPERATOR; bool is_disk_op; - struct share_params *params; + struct share_params *params; + TALLOC_CTX *ctx = p->mem_ctx; DEBUG(5,("_srv_net_share_del: %d\n", __LINE__)); - unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name)); + share_name = unistr2_to_ascii_talloc(ctx, &q_u->uni_share_name); - if ( strequal(share_name,"IPC$") + if (!share_name) { + return WERR_NET_NAME_NOT_FOUND; + } + if ( strequal(share_name,"IPC$") || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) || strequal(share_name,"global") ) { return WERR_ACCESS_DENIED; } - if (!(params = get_share_params(p->mem_ctx, share_name))) { - return WERR_NO_SUCH_SHARE; - } - + if (!(params = get_share_params(p->mem_ctx, share_name))) { + return WERR_NO_SUCH_SHARE; + } + snum = find_service(share_name); /* No change to printer shares. */ @@ -1876,21 +1973,27 @@ WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); - if (user.ut.uid != sec_initial_uid() && !is_disk_op ) + if (user.ut.uid != sec_initial_uid() && !is_disk_op ) return WERR_ACCESS_DENIED; if (!lp_delete_share_cmd() || !*lp_delete_share_cmd()) { DEBUG(10,("_srv_net_share_del: No delete share command\n")); return WERR_ACCESS_DENIED; } - - slprintf(command, sizeof(command)-1, "%s \"%s\" \"%s\"", - lp_delete_share_cmd(), dyn_CONFIGFILE, lp_servicename(snum)); + + command = talloc_asprintf(ctx, + "%s \"%s\" \"%s\"", + lp_delete_share_cmd(), + dyn_CONFIGFILE, + lp_servicename(snum)); + if (!command) { + return WERR_NOMEM; + } DEBUG(10,("_srv_net_share_del: Running [%s]\n", command )); /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/ - + if ( is_disk_op ) become_root(); @@ -1902,7 +2005,7 @@ WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S if ( is_disk_op ) unbecome_root(); - + /********* END SeDiskOperatorPrivilege BLOCK *********/ DEBUG(3,("_srv_net_share_del: Running [%s] returned (%d)\n", command, ret )); @@ -1983,22 +2086,26 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC SEC_DESC *psd = NULL; size_t sd_size; DATA_BLOB null_pw; - pstring filename_in; + char *filename_in = NULL; char *filename = NULL; - pstring qualname; + char *qualname = NULL; files_struct *fsp = NULL; SMB_STRUCT_STAT st; NTSTATUS nt_status; struct current_user user; connection_struct *conn = NULL; bool became_user = False; - TALLOC_CTX *ctx = talloc_tos(); + TALLOC_CTX *ctx = p->mem_ctx; ZERO_STRUCT(st); r_u->status = WERR_OK; - unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname)); + qualname = unistr2_to_ascii_talloc(ctx, &q_u->uni_qual_name); + if (!qualname) { + r_u->status = WERR_ACCESS_DENIED; + goto error_exit; + } /* Null password is ok - we are already an authenticated user... */ null_pw = data_blob_null; @@ -2022,7 +2129,12 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC } became_user = True; - unistr2_to_ascii(filename_in, &q_u->uni_file_name, sizeof(filename_in)); + filename_in = unistr2_to_ascii_talloc(ctx, &q_u->uni_file_name); + if (!filename_in) { + r_u->status = WERR_ACCESS_DENIED; + goto error_exit; + } + nt_status = unix_convert(ctx, conn, filename_in, False, &filename, NULL, &st); if (!NT_STATUS_IS_OK(nt_status)) { DEBUG(3,("_srv_net_file_query_secdesc: bad pathname %s\n", filename)); @@ -2090,7 +2202,7 @@ error_exit: if (became_user) unbecome_user(); - if (conn) + if (conn) close_cnum(conn, user.vuid); return r_u->status; @@ -2103,9 +2215,9 @@ error_exit: WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_u, SRV_R_NET_FILE_SET_SECDESC *r_u) { - pstring filename_in; + char *filename_in = NULL; char *filename = NULL; - pstring qualname; + char *qualname = NULL; DATA_BLOB null_pw; files_struct *fsp = NULL; SMB_STRUCT_STAT st; @@ -2113,13 +2225,17 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ struct current_user user; connection_struct *conn = NULL; bool became_user = False; - TALLOC_CTX *ctx = talloc_tos(); + TALLOC_CTX *ctx = p->mem_ctx; ZERO_STRUCT(st); r_u->status = WERR_OK; - unistr2_to_ascii(qualname, &q_u->uni_qual_name, sizeof(qualname)); + qualname = unistr2_to_ascii_talloc(ctx, &q_u->uni_qual_name); + if (!qualname) { + r_u->status = WERR_ACCESS_DENIED; + goto error_exit; + } /* Null password is ok - we are already an authenticated user... */ null_pw = data_blob_null; @@ -2143,7 +2259,12 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ } became_user = True; - unistr2_to_ascii(filename_in, &q_u->uni_file_name, sizeof(filename_in)); + filename_in= unistr2_to_ascii_talloc(ctx, &q_u->uni_file_name); + if (!filename_in) { + r_u->status = WERR_ACCESS_DENIED; + goto error_exit; + } + nt_status = unix_convert(ctx, conn, filename, False, &filename, NULL, &st); if (!NT_STATUS_IS_OK(nt_status)) { DEBUG(3,("_srv_net_file_set_secdesc: bad pathname %s\n", filename)); @@ -2158,7 +2279,6 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ goto error_exit; } - nt_status = open_file_stat(conn, NULL, filename, &st, &fsp); if ( !NT_STATUS_IS_OK(nt_status) ) { -- cgit From 7faee02d0d351c5c039e8f1be7e82ce3a93cbe96 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Mon, 10 Dec 2007 11:30:37 -0800 Subject: Remove the char[1024] strings from dynconfig. Replace them with malloc'ing accessor functions. Should save a lot of static space :-). Jeremy. (This used to be commit 52dc5eaef2106015b3a8b659e818bdb15ad94b05) --- source3/rpc_server/srv_srvsvc_nt.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index b034e7cbd3..125ccb4752 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1692,7 +1692,7 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S command = talloc_asprintf(p->mem_ctx, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d", lp_change_share_cmd(), - dyn_CONFIGFILE, + get_dyn_CONFIGFILE(), share_name, path, comment ? comment : "", @@ -1877,7 +1877,7 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S command = talloc_asprintf(ctx, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d", lp_add_share_cmd(), - dyn_CONFIGFILE, + get_dyn_CONFIGFILE(), share_name, path, comment ? comment : "", @@ -1984,7 +1984,7 @@ WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S command = talloc_asprintf(ctx, "%s \"%s\" \"%s\"", lp_delete_share_cmd(), - dyn_CONFIGFILE, + get_dyn_CONFIGFILE(), lp_servicename(snum)); if (!command) { return WERR_NOMEM; -- cgit From 233eb0e560acb26f8706fd3ab96d4c6379458414 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Wed, 5 Dec 2007 09:53:10 +0100 Subject: Change the prototype of the vfs function get_nt_acl(). Up to now, get_nt_acl() took a files_struct pointer (fsp) and a file name. All the underlying functions should need and now do need (after the previous preparatory work), is a connection_struct and a file name. The connection_struct is already there in the vfs_handle passed to the vfs functions. So the files_struct argument can be eliminated. This eliminates the need of calling open_file_stat in a couple of places to produce the fsp needed. Michael (This used to be commit b5f600fab53c9d159a958c59795db3ba4a8acc63) --- source3/rpc_server/srv_srvsvc_nt.c | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 125ccb4752..43f57a0109 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2089,7 +2089,6 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC char *filename_in = NULL; char *filename = NULL; char *qualname = NULL; - files_struct *fsp = NULL; SMB_STRUCT_STAT st; NTSTATUS nt_status; struct current_user user; @@ -2149,25 +2148,7 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC goto error_exit; } - nt_status = open_file_stat(conn, NULL, filename, &st, &fsp); - /* Perhaps it is a directory */ - if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY)) { - nt_status = open_directory(conn, NULL, filename, &st, - READ_CONTROL_ACCESS, - FILE_SHARE_READ|FILE_SHARE_WRITE, - FILE_OPEN, - 0, - FILE_ATTRIBUTE_DIRECTORY, - NULL, &fsp); - } - - if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_query_secdesc: Unable to open file %s\n", filename)); - r_u->status = ntstatus_to_werror(nt_status); - goto error_exit; - } - - nt_status = SMB_VFS_GET_NT_ACL(fsp, fsp->fsp_name, + nt_status = SMB_VFS_GET_NT_ACL(conn, filename, (OWNER_SECURITY_INFORMATION |GROUP_SECURITY_INFORMATION |DACL_SECURITY_INFORMATION), &psd); @@ -2188,17 +2169,12 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC psd->dacl->revision = (uint16) NT4_ACL_REVISION; - close_file(fsp, NORMAL_CLOSE); unbecome_user(); close_cnum(conn, user.vuid); return r_u->status; error_exit: - if(fsp) { - close_file(fsp, NORMAL_CLOSE); - } - if (became_user) unbecome_user(); -- cgit From addf598cde41d17ad4cf497a64b9a2b27e4028c5 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 20 Dec 2007 22:17:16 +0100 Subject: Some C++ warnings (This used to be commit 5ab82d4f574f2a2e2761e9e414c66a70aeffb05d) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 43f57a0109..3cc2472116 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2167,7 +2167,7 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC r_u->size_secdesc = sd_size; r_u->sec_desc = psd; - psd->dacl->revision = (uint16) NT4_ACL_REVISION; + psd->dacl->revision = NT4_ACL_REVISION; unbecome_user(); close_cnum(conn, user.vuid); -- cgit From e9b8eb14468c37e772476f6d32188d6e85c2083c Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 27 Dec 2007 21:30:15 +0100 Subject: Remove a silly static (This used to be commit ef75dcc9ffda85d77c8f22d0db702efbf8e642ed) --- source3/rpc_server/srv_srvsvc_nt.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 3cc2472116..842a28c776 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -870,13 +870,11 @@ static void init_srv_sess_info_0(pipes_struct *p, SRV_SESS_INFO_0 *ss0, uint32 * /******************************************************************* ********************************************************************/ -/* global needed to make use of the share_mode_forall() callback */ -static struct sess_file_count s_file_cnt; - static void sess_file_fn( const struct share_mode_entry *e, - const char *sharepath, const char *fname, void *state ) + const char *sharepath, const char *fname, + void *data ) { - struct sess_file_count *sess = &s_file_cnt; + struct sess_file_count *sess = (struct sess_file_count *)data; if ( procid_equal(&e->pid, &sess->pid) && (sess->uid == e->uid) ) { sess->count++; @@ -890,11 +888,13 @@ static void sess_file_fn( const struct share_mode_entry *e, static int net_count_files( uid_t uid, struct server_id pid ) { + struct sess_file_count s_file_cnt; + s_file_cnt.count = 0; s_file_cnt.uid = uid; s_file_cnt.pid = pid; - share_mode_forall( sess_file_fn, NULL ); + share_mode_forall( sess_file_fn, &s_file_cnt ); return s_file_cnt.count; } -- cgit From 7cbdb48475b0340154fad60cb4b7cc53dc2bbcfd Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sat, 29 Dec 2007 23:00:49 +0100 Subject: Remove tiny code duplication ndr_size_security_descriptor does the same as sec_desc_size (This used to be commit bc3bd7a8e7c6e9e27acb195c86abb92c0f53112f) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 842a28c776..01e5cf2cda 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2159,7 +2159,7 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC goto error_exit; } - sd_size = sec_desc_size(psd); + sd_size = ndr_size_security_descriptor(psd, 0); r_u->ptr_response = 1; r_u->size_response = sd_size; -- cgit From 5ddb2abf7611a93960056075ea56f992329c3678 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 6 Jan 2008 16:15:45 +0100 Subject: Some more talloc_tos() (This used to be commit 444e35e7df1f13fc285183da8fb41b30ad99a3fa) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 01e5cf2cda..1b877ee5b4 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -167,7 +167,7 @@ static void enum_file_fn( const struct share_mode_entry *e, ZERO_STRUCT( fsp ); fsp.file_id = e->id; - if ( (brl = brl_get_locks(NULL,&fsp)) != NULL ) { + if ( (brl = brl_get_locks(talloc_tos(), &fsp)) != NULL ) { num_locks = brl->num_locks; TALLOC_FREE(brl); } -- cgit From d85c517b45b8feb8469f7073d770e7fedc818259 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 22 Feb 2008 17:35:53 +0100 Subject: Add variable to define if a share should be hidden. If you create a share on a Windows machine called foo$ then this share is of the type STYPE_DISKTREE. So it is possible to administrate this kind of share. Tested on Windows NT and 2003. In samba we assume that if a share with a $ at the end must be of the type STYPE_DISKTREE_HIDDEN. This is wrong, so we need a variable in the config to define if the share should be hidden or not. (This used to be commit a3da677bf0faed56e6731ee96708a7847a61d118) --- source3/rpc_server/srv_srvsvc_nt.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 1b877ee5b4..f0680a89e5 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -225,9 +225,6 @@ static WERROR net_enum_files( TALLOC_CTX *ctx, const char *username, ********************************************************************/ static uint32 get_share_type(int snum) { - char *net_name = lp_servicename(snum); - int len_net_name = strlen(net_name); - /* work out the share type */ uint32 type = STYPE_DISKTREE; @@ -235,7 +232,7 @@ static uint32 get_share_type(int snum) type = STYPE_PRINTQ; if (strequal(lp_fstype(snum), "IPC")) type = STYPE_IPC; - if (net_name[len_net_name-1] == '$') + if (lp_hidden(snum)) type |= STYPE_HIDDEN; return type; -- cgit From b2ed9341ee309acf2cb6f81bff4bc9243bf21d55 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 28 Feb 2008 10:14:26 +0100 Subject: Fix segfault in _srv_net_file_enum. Guenther (This used to be commit 6523a051ded9f7b433fcce2d4c4a5f186b5a28f6) --- source3/rpc_server/srv_srvsvc_nt.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index f0680a89e5..37bd204f75 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1216,17 +1216,20 @@ done: WERROR _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_FILE_ENUM *r_u) { + const char *username = NULL; + switch ( q_u->level ) { - case 3: { - char *username; - if (!(username = rpcstr_pull_unistr2_talloc( - p->mem_ctx, q_u->username))) { - return WERR_NOMEM; + case 3: + if (q_u->username) { + username = rpcstr_pull_unistr2_talloc( + p->mem_ctx, q_u->username); + if (!username) { + return WERR_NOMEM; + } } return net_file_enum_3(username, r_u, get_enum_hnd(&q_u->enum_hnd)); - } default: return WERR_UNKNOWN_LEVEL; } -- cgit From 1751b533f00ca75082b452ca9922c2c8f277be4b Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 28 Feb 2008 14:06:11 +0100 Subject: Rename the 'hidden' variable to 'administrative share'. (This used to be commit eff3d3bad5a8860b99375cc0be9dc24f3679e416) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 37bd204f75..8a25b6cfd5 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -232,7 +232,7 @@ static uint32 get_share_type(int snum) type = STYPE_PRINTQ; if (strequal(lp_fstype(snum), "IPC")) type = STYPE_IPC; - if (lp_hidden(snum)) + if (lp_administrative_share(snum)) type |= STYPE_HIDDEN; return type; -- cgit From d89877070e9ae3e3cc2690fd4ffb683d6e44f982 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Tue, 4 Mar 2008 21:46:09 +0100 Subject: Whitespace cleanup in srvsvc server. Guenther (This used to be commit 3c0a3f8de742678b56f6b998a014105c05400666) --- source3/rpc_server/srv_srvsvc_nt.c | 100 ++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 50 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 8a25b6cfd5..880c808bd5 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1,21 +1,21 @@ -/* +/* * Unix SMB/CIFS implementation. * RPC Pipe client / server routines * Copyright (C) Andrew Tridgell 1992-1997, * Copyright (C) Jeremy Allison 2001. * Copyright (C) Nigel Williams 2001. * Copyright (C) Gerald (Jerry) Carter 2006. - * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ @@ -101,11 +101,11 @@ static int pipe_enum_fn( struct db_record *rec, void *p) ********************************************************************/ static WERROR net_enum_pipes( TALLOC_CTX *ctx, const char *username, - FILE_INFO_3 **info, + FILE_INFO_3 **info, uint32 *count, uint32 resume ) { struct file_enum_count fenum; - + fenum.ctx = ctx; fenum.username = username; fenum.count = *count; @@ -202,7 +202,7 @@ static void enum_file_fn( const struct share_mode_entry *e, ********************************************************************/ static WERROR net_enum_files( TALLOC_CTX *ctx, const char *username, - FILE_INFO_3 **info, + FILE_INFO_3 **info, uint32 *count, uint32 resume ) { struct file_enum_count f_enum_cnt; @@ -211,12 +211,12 @@ static WERROR net_enum_files( TALLOC_CTX *ctx, const char *username, f_enum_cnt.username = username; f_enum_cnt.count = *count; f_enum_cnt.info = *info; - + share_mode_forall( enum_file_fn, (void *)&f_enum_cnt ); - + *info = f_enum_cnt.info; *count = f_enum_cnt.count; - + return WERR_OK; } @@ -602,7 +602,7 @@ static bool init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, { SRV_SHARE_INFO_501 *info501 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_501, num_entries); int i = 0; - + if (!info501) { return False; } @@ -612,7 +612,7 @@ static bool init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, init_srv_share_info_501(p, &info501[i++], snum); } } - + ctr->share.info501 = info501; break; } @@ -637,7 +637,7 @@ static bool init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, } /* here for completeness but not currently used with enum (1004 - 1501)*/ - + case 1004: { SRV_SHARE_INFO_1004 *info1004 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1004, num_entries); @@ -745,7 +745,7 @@ static bool init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, ********************************************************************/ 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) + uint32 info_level, uint32 resume_hnd, bool all) { DEBUG(5,("init_srv_r_net_share_enum: %d\n", __LINE__)); @@ -852,7 +852,7 @@ static void init_srv_sess_info_0(pipes_struct *p, SRV_SESS_INFO_0 *ss0, uint32 * ss0->num_entries_read = num_entries; ss0->ptr_sess_info = num_entries > 0 ? 1 : 0; ss0->num_entries_read2 = num_entries; - + if ((*snum) >= (*stot)) { (*snum) = 0; } @@ -867,16 +867,16 @@ static void init_srv_sess_info_0(pipes_struct *p, SRV_SESS_INFO_0 *ss0, uint32 * /******************************************************************* ********************************************************************/ -static void sess_file_fn( const struct share_mode_entry *e, +static void sess_file_fn( const struct share_mode_entry *e, const char *sharepath, const char *fname, void *data ) { struct sess_file_count *sess = (struct sess_file_count *)data; - + if ( procid_equal(&e->pid, &sess->pid) && (sess->uid == e->uid) ) { sess->count++; } - + return; } @@ -890,9 +890,9 @@ static int net_count_files( uid_t uid, struct server_id pid ) s_file_cnt.count = 0; s_file_cnt.uid = uid; s_file_cnt.pid = pid; - + share_mode_forall( sess_file_fn, &s_file_cnt ); - + return s_file_cnt.count; } @@ -910,42 +910,42 @@ static void init_srv_sess_info_1(pipes_struct *p, SRV_SESS_INFO_1 *ss1, uint32 * ss1->num_entries_read = 0; ss1->ptr_sess_info = 0; ss1->num_entries_read2 = 0; - + (*stot) = 0; return; } - + if (ss1 == NULL) { (*snum) = 0; return; } (*stot) = list_sessions(p->mem_ctx, &session_list); - + for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) { uint32 num_files; uint32 connect_time; struct passwd *pw = sys_getpwnam(session_list[*snum].username); bool guest; - + if ( !pw ) { DEBUG(10,("init_srv_sess_info_1: failed to find owner: %s\n", session_list[*snum].username)); continue; } - + connect_time = (uint32)(now - session_list[*snum].connect_start); num_files = net_count_files(pw->pw_uid, session_list[*snum].pid); guest = strequal( session_list[*snum].username, lp_guestaccount() ); - - init_srv_sess_info1( &ss1->info_1[num_entries], + + init_srv_sess_info1( &ss1->info_1[num_entries], session_list[*snum].remote_machine, - session_list[*snum].username, + session_list[*snum].username, num_files, connect_time, - 0, + 0, guest); num_entries++; } @@ -953,7 +953,7 @@ static void init_srv_sess_info_1(pipes_struct *p, SRV_SESS_INFO_1 *ss1, uint32 * ss1->num_entries_read = num_entries; ss1->ptr_sess_info = num_entries > 0 ? 1 : 0; ss1->num_entries_read2 = num_entries; - + if ((*snum) >= (*stot)) { (*snum) = 0; } @@ -998,7 +998,7 @@ static WERROR init_srv_sess_info_ctr(pipes_struct *p, SRV_SESS_INFO_CTR *ctr, ********************************************************************/ static void init_srv_r_net_sess_enum(pipes_struct *p, SRV_R_NET_SESS_ENUM *r_n, - uint32 resume_hnd, int sess_level, int switch_value) + uint32 resume_hnd, int sess_level, int switch_value) { DEBUG(5,("init_srv_r_net_sess_enum: %d\n", __LINE__)); @@ -1044,7 +1044,7 @@ static void init_srv_conn_info_0(SRV_CONN_INFO_0 *ss0, uint32 *snum, uint32 *sto ss0->num_entries_read = num_entries; ss0->ptr_conn_info = num_entries > 0 ? 1 : 0; ss0->num_entries_read2 = num_entries; - + if ((*snum) >= (*stot)) { (*snum) = 0; } @@ -1101,7 +1101,7 @@ static void init_srv_conn_info_1(SRV_CONN_INFO_1 *ss1, uint32 *snum, uint32 *sto ss1->num_entries_read = num_entries; ss1->ptr_conn_info = num_entries > 0 ? 1 : 0; ss1->num_entries_read2 = num_entries; - + if ((*snum) >= (*stot)) { (*snum) = 0; @@ -1111,7 +1111,7 @@ static void init_srv_conn_info_1(SRV_CONN_INFO_1 *ss1, uint32 *snum, uint32 *sto ss1->num_entries_read = 0; ss1->ptr_conn_info = 0; ss1->num_entries_read2 = 0; - + (*stot) = 0; } } @@ -1154,7 +1154,7 @@ static WERROR init_srv_conn_info_ctr(SRV_CONN_INFO_CTR *ctr, ********************************************************************/ static void init_srv_r_net_conn_enum(SRV_R_NET_CONN_ENUM *r_n, - uint32 resume_hnd, int conn_level, int switch_value) + uint32 resume_hnd, int conn_level, int switch_value) { DEBUG(5,("init_srv_r_net_conn_enum: %d\n", __LINE__)); @@ -1180,7 +1180,7 @@ static WERROR net_file_enum_3( const char *username, SRV_R_NET_FILE_ENUM *r, TALLOC_CTX *ctx = talloc_tos(); SRV_FILE_INFO_CTR *ctr = &r->ctr; - /* TODO -- Windows enumerates + /* TODO -- Windows enumerates (b) active pipes (c) open directories and files */ @@ -1188,12 +1188,12 @@ static WERROR net_file_enum_3( const char *username, SRV_R_NET_FILE_ENUM *r, &ctr->num_entries, resume_hnd ); if ( !W_ERROR_IS_OK(r->status)) goto done; - + r->status = net_enum_pipes( ctx, username, &ctr->file.info3, &ctr->num_entries, resume_hnd ); if ( !W_ERROR_IS_OK(r->status)) goto done; - + r->level = ctr->level = 3; r->total_entries = ctr->num_entries; /* ctr->num_entries = r->total_entries - resume_hnd; */ @@ -1203,7 +1203,7 @@ static WERROR net_file_enum_3( const char *username, SRV_R_NET_FILE_ENUM *r, r->status = WERR_OK; done: - if ( ctr->num_entries > 0 ) + if ( ctr->num_entries > 0 ) ctr->ptr_entries = 1; init_enum_hnd(&r->enum_hnd, 0); @@ -1233,7 +1233,7 @@ WERROR _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_F default: return WERR_UNKNOWN_LEVEL; } - + return WERR_OK; } @@ -1266,7 +1266,7 @@ WERROR _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV_R case 102: init_srv_info_102(&ctr->srv.sv102, - 500, global_myname(), + 500, global_myname(), string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH), lp_major_announce_version(), lp_minor_announce_version(), lp_default_server_announce(), @@ -1401,7 +1401,7 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES /* fail out now if you are not root or not a domain admin */ - if ((user.ut.uid != sec_initial_uid()) && + if ((user.ut.uid != sec_initial_uid()) && ( ! nt_token_check_domain_rid(p->pipe_user.nt_user_token, DOMAIN_GROUP_RID_ADMINS))) { goto done; @@ -1413,7 +1413,7 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES strequal(session_list[snum].remote_machine, machine)) { NTSTATUS ntstat; - + if (user.ut.uid != sec_initial_uid()) { not_root = True; become_root(); @@ -1422,11 +1422,11 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES ntstat = messaging_send(smbd_messaging_context(), session_list[snum].pid, MSG_SHUTDOWN, &data_blob_null); - + if (NT_STATUS_IS_OK(ntstat)) r_u->status = WERR_OK; - if (not_root) + if (not_root) unbecome_root(); } } @@ -1720,7 +1720,7 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S /********* END SeDiskOperatorPrivilege BLOCK *********/ - DEBUG(3,("_srv_net_share_set_info: Running [%s] returned (%d)\n", command, ret )); + DEBUG(3,("_srv_net_share_set_info: Running [%s] returned (%d)\n", command, ret )); TALLOC_FREE(command); @@ -1819,7 +1819,7 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S map_generic_share_sd_bits(psd); break; - /* none of the following contain share names. NetShareAdd does not have a separate parameter for the share name */ + /* none of the following contain share names. NetShareAdd does not have a separate parameter for the share name */ case 1004: case 1005: @@ -2070,7 +2070,7 @@ WERROR _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET t->tm_mon + 1, 1900+t->tm_year, t->tm_wday); - + DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__)); return r_u->status; @@ -2362,7 +2362,7 @@ WERROR _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_D r_u->total_entries = init_server_disk_enum(&resume); - r_u->disk_enum_ctr.unknown = 0; + r_u->disk_enum_ctr.unknown = 0; if(!(r_u->disk_enum_ctr.disk_info = TALLOC_ARRAY(ctx, DISK_INFO, MAX_SERVER_DISK_ENTRIES))) { return WERR_NOMEM; @@ -2378,7 +2378,7 @@ WERROR _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_D /*copy disk name into a unicode string*/ - init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, disk_name); + init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, disk_name); } /* add a terminating null string. Is this there if there is more data to come? */ -- cgit From 2c3dc9baa57d32c48cc58f16abae20fe763fd06f Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Tue, 4 Mar 2008 23:07:45 +0100 Subject: Use pidl for _srvsvc_NetSrvGetInfo(). Guenther (This used to be commit 34caa41fa6d44165b470508261c2bde124fc4955) --- source3/rpc_server/srv_srvsvc_nt.c | 106 ++++++++++++++++++++++--------------- 1 file changed, 63 insertions(+), 43 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 880c808bd5..ddb7e120d9 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1238,67 +1238,93 @@ WERROR _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_F } /******************************************************************* -net server get info + _srvsvc_NetSrvGetInfo ********************************************************************/ -WERROR _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV_R_NET_SRV_GET_INFO *r_u) +WERROR _srvsvc_NetSrvGetInfo(pipes_struct *p, + struct srvsvc_NetSrvGetInfo *r) { WERROR status = WERR_OK; - SRV_INFO_CTR *ctr = TALLOC_P(p->mem_ctx, SRV_INFO_CTR); - if (!ctr) - return WERR_NOMEM; - - ZERO_STRUCTP(ctr); - - DEBUG(5,("srv_net_srv_get_info: %d\n", __LINE__)); + DEBUG(5,("_srvsvc_NetSrvGetInfo: %d\n", __LINE__)); if (!pipe_access_check(p)) { - DEBUG(3, ("access denied to srv_net_srv_get_info\n")); + DEBUG(3, ("access denied to _srvsvc_NetSrvGetInfo\n")); return WERR_ACCESS_DENIED; } - switch (q_u->switch_value) { + switch (r->in.level) { /* Technically level 102 should only be available to Administrators but there isn't anything super-secret here, as most of it is made up. */ - case 102: - init_srv_info_102(&ctr->srv.sv102, - 500, global_myname(), - string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH), - lp_major_announce_version(), lp_minor_announce_version(), - lp_default_server_announce(), - 0xffffffff, /* users */ - 0xf, /* disc */ - 0, /* hidden */ - 240, /* announce */ - 3000, /* announce delta */ - 100000, /* licenses */ - "c:\\"); /* user path */ + case 102: { + struct srvsvc_NetSrvInfo102 *info102; + + info102 = TALLOC_P(p->mem_ctx, struct srvsvc_NetSrvInfo102); + if (!info102) { + return WERR_NOMEM; + } + + init_srvsvc_NetSrvInfo102(info102, + PLATFORM_ID_NT, + global_myname(), + lp_major_announce_version(), + lp_minor_announce_version(), + lp_default_server_announce(), + string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH), + 0xffffffff, /* users */ + 0xf, /* disc */ + 0, /* hidden */ + 240, /* announce */ + 3000, /* announce delta */ + 100000, /* licenses */ + "c:\\"); /* user path */ + r->out.info->info102 = info102; break; - case 101: - init_srv_info_101(&ctr->srv.sv101, - 500, global_myname(), - lp_major_announce_version(), lp_minor_announce_version(), - lp_default_server_announce(), - string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH)); + } + case 101: { + struct srvsvc_NetSrvInfo101 *info101; + + info101 = TALLOC_P(p->mem_ctx, struct srvsvc_NetSrvInfo101); + if (!info101) { + return WERR_NOMEM; + } + + init_srvsvc_NetSrvInfo101(info101, + PLATFORM_ID_NT, + global_myname(), + lp_major_announce_version(), + lp_minor_announce_version(), + lp_default_server_announce(), + string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH)); + r->out.info->info101 = info101; break; - case 100: - init_srv_info_100(&ctr->srv.sv100, 500, global_myname()); + } + case 100: { + struct srvsvc_NetSrvInfo100 *info100; + + info100 = TALLOC_P(p->mem_ctx, struct srvsvc_NetSrvInfo100); + if (!info100) { + return WERR_NOMEM; + } + + init_srvsvc_NetSrvInfo100(info100, + PLATFORM_ID_NT, + global_myname()); + r->out.info->info100 = info100; + break; + } default: status = WERR_UNKNOWN_LEVEL; break; } - /* set up the net server get info structure */ - init_srv_r_net_srv_get_info(r_u, q_u->switch_value, ctr, status); - - DEBUG(5,("srv_net_srv_get_info: %d\n", __LINE__)); + DEBUG(5,("_srvsvc_NetSrvGetInfo: %d\n", __LINE__)); - return r_u->status; + return status; } /******************************************************************* @@ -2548,12 +2574,6 @@ WERROR _srvsvc_NetShareCheck(pipes_struct *p, struct srvsvc_NetShareCheck *r) return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetSrvGetInfo(pipes_struct *p, struct srvsvc_NetSrvGetInfo *r) -{ - p->rng_fault_state = True; - return WERR_NOT_SUPPORTED; -} - WERROR _srvsvc_NetSrvSetInfo(pipes_struct *p, struct srvsvc_NetSrvSetInfo *r) { p->rng_fault_state = True; -- cgit From eb44792a22f6889edcaa0760ab4ca86e9313122f Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Tue, 4 Mar 2008 23:40:25 +0100 Subject: Use pidl for _srvsvc_NetSrvSetInfo(). Guenther (This used to be commit 75b0bbf790da44c45c679c374dbe09f288f3fb8c) --- source3/rpc_server/srv_srvsvc_nt.c | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index ddb7e120d9..a3c9248ad2 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1328,22 +1328,21 @@ WERROR _srvsvc_NetSrvGetInfo(pipes_struct *p, } /******************************************************************* -net server set info + _srvsvc_NetSrvSetInfo ********************************************************************/ -WERROR _srv_net_srv_set_info(pipes_struct *p, SRV_Q_NET_SRV_SET_INFO *q_u, SRV_R_NET_SRV_SET_INFO *r_u) +WERROR _srvsvc_NetSrvSetInfo(pipes_struct *p, + struct srvsvc_NetSrvSetInfo *r) { WERROR status = WERR_OK; - DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__)); + DEBUG(5,("_srvsvc_NetSrvSetInfo: %d\n", __LINE__)); /* Set up the net server set info structure. */ - init_srv_r_net_srv_set_info(r_u, 0x0, status); + DEBUG(5,("_srvsvc_NetSrvSetInfo: %d\n", __LINE__)); - DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__)); - - return r_u->status; + return status; } /******************************************************************* @@ -2574,12 +2573,6 @@ WERROR _srvsvc_NetShareCheck(pipes_struct *p, struct srvsvc_NetShareCheck *r) return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetSrvSetInfo(pipes_struct *p, struct srvsvc_NetSrvSetInfo *r) -{ - p->rng_fault_state = True; - return WERR_NOT_SUPPORTED; -} - WERROR _srvsvc_NetDiskEnum(pipes_struct *p, struct srvsvc_NetDiskEnum *r) { p->rng_fault_state = True; -- cgit From c6c67005a820fd20afd0674d9b8f529450f0e1ae Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Wed, 5 Mar 2008 01:26:39 +0100 Subject: Use pidl for _srvsvc_NetShareSetInfo(). Guenther (This used to be commit 9bfa77edc68a887972b609bfb0aee8bbbc89ce04) --- source3/rpc_server/srv_srvsvc_nt.c | 82 ++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 44 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index a3c9248ad2..75c262a7a6 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1564,16 +1564,17 @@ char *valid_share_pathname(TALLOC_CTX *ctx, const char *dos_pathname) } /******************************************************************* - Net share set info. Modify share details. + _srvsvc_NetShareSetInfo. Modify share details. ********************************************************************/ -WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, SRV_R_NET_SHARE_SET_INFO *r_u) +WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, + struct srvsvc_NetShareSetInfo *r) { struct current_user user; char *command = NULL; char *share_name = NULL; char *comment = NULL; - char *pathname = NULL; + const char *pathname = NULL; int type; int snum; int ret; @@ -1583,15 +1584,16 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S bool is_disk_op = False; int max_connections = 0; TALLOC_CTX *ctx = p->mem_ctx; + union srvsvc_NetShareInfo *info = r->in.info; - DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); + DEBUG(5,("_srvsvc_NetShareSetInfo: %d\n", __LINE__)); - share_name = unistr2_to_ascii_talloc(ctx, &q_u->uni_share_name); + share_name = talloc_strdup(p->mem_ctx, r->in.share_name); if (!share_name) { - return WERR_NET_NAME_NOT_FOUND; + return WERR_NOMEM; } - r_u->parm_error = 0; + *r->out.parm_error = 0; if ( strequal(share_name,"IPC$") || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) @@ -1619,44 +1621,39 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S if ( user.ut.uid != sec_initial_uid() && !is_disk_op ) return WERR_ACCESS_DENIED; - switch (q_u->info_level) { + switch (r->in.level) { case 1: pathname = talloc_strdup(ctx, lp_pathname(snum)); - comment = unistr2_to_ascii_talloc(ctx, - &q_u->info.share.info2.info_2_str.uni_remark); - type = q_u->info.share.info2.info_2.type; + comment = talloc_strdup(ctx, info->info2->comment); + type = info->info2->type; psd = NULL; break; case 2: - comment = unistr2_to_ascii_talloc(ctx, - &q_u->info.share.info2.info_2_str.uni_remark); - pathname = unistr2_to_ascii_talloc(ctx, - &q_u->info.share.info2.info_2_str.uni_path); - type = q_u->info.share.info2.info_2.type; - max_connections = (q_u->info.share.info2.info_2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.info_2.max_uses; + comment = talloc_strdup(ctx, info->info2->comment); + pathname = info->info2->path; + type = info->info2->type; + max_connections = (info->info2->max_users == 0xffffffff) ? + 0 : info->info2->max_users; psd = NULL; break; #if 0 /* not supported on set but here for completeness */ case 501: - unistr2_to_ascii(comment, &q_u->info.share.info501.info_501_str.uni_remark, sizeof(comment)); - type = q_u->info.share.info501.info_501.type; + comment = talloc_strdup(ctx, info->info501->comment); + type = info->info501->type; psd = NULL; break; #endif case 502: - comment = unistr2_to_ascii_talloc(ctx, - &q_u->info.share.info502.info_502_str.uni_remark); - pathname = unistr2_to_ascii_talloc(ctx, - &q_u->info.share.info502.info_502_str.uni_path); - type = q_u->info.share.info502.info_502.type; - psd = q_u->info.share.info502.info_502_str.sd; + comment = talloc_strdup(ctx, info->info502->comment); + pathname = info->info502->path; + type = info->info502->type; + psd = info->info502->sd; map_generic_share_sd_bits(psd); break; case 1004: pathname = talloc_strdup(ctx, lp_pathname(snum)); - comment = unistr2_to_ascii_talloc(ctx, - &q_u->info.share.info1004.info_1004_str.uni_remark); + comment = talloc_strdup(ctx, info->info1004->comment); type = STYPE_DISKTREE; break; case 1005: @@ -1664,12 +1661,12 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S user, so we must compare it to see if it's what is set in smb.conf, so that we can contine other ops like setting ACLs on a share */ - if (((q_u->info.share.info1005.share_info_flags & + if (((info->info1005->dfs_flags & SHARE_1005_CSC_POLICY_MASK) >> SHARE_1005_CSC_POLICY_SHIFT) == lp_csc_policy(snum)) return WERR_OK; else { - DEBUG(3, ("_srv_net_share_set_info: client is trying to change csc policy from the network; must be done with smb.conf\n")); + DEBUG(3, ("_srvsvc_NetShareSetInfo: client is trying to change csc policy from the network; must be done with smb.conf\n")); return WERR_ACCESS_DENIED; } case 1006: @@ -1678,12 +1675,13 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S case 1501: pathname = talloc_strdup(ctx, lp_pathname(snum)); comment = talloc_strdup(ctx, lp_comment(snum)); - psd = q_u->info.share.info1501.sdb->sd; + psd = info->info1501->sd; map_generic_share_sd_bits(psd); type = STYPE_DISKTREE; break; default: - DEBUG(5,("_srv_net_share_set_info: unsupported switch value %d\n", q_u->info_level)); + DEBUG(5,("_srvsvc_NetShareSetInfo: unsupported switch value %d\n", + r->in.level)); return WERR_UNKNOWN_LEVEL; } @@ -1702,7 +1700,7 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S string_replace(comment, '"', ' '); } - DEBUG(10,("_srv_net_share_set_info: change share command = %s\n", + DEBUG(10,("_srvsvc_NetShareSetInfo: change share command = %s\n", lp_change_share_cmd() ? lp_change_share_cmd() : "NULL" )); /* Only call modify function if something changed. */ @@ -1710,7 +1708,7 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S if (strcmp(path, lp_pathname(snum)) || strcmp(comment, lp_comment(snum)) || (lp_max_connections(snum) != max_connections)) { if (!lp_change_share_cmd() || !*lp_change_share_cmd()) { - DEBUG(10,("_srv_net_share_set_info: No change share command\n")); + DEBUG(10,("_srvsvc_NetShareSetInfo: No change share command\n")); return WERR_ACCESS_DENIED; } @@ -1726,7 +1724,7 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S return WERR_NOMEM; } - DEBUG(10,("_srv_net_share_set_info: Running [%s]\n", command )); + DEBUG(10,("_srvsvc_NetShareSetInfo: Running [%s]\n", command )); /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/ @@ -1745,14 +1743,16 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S /********* END SeDiskOperatorPrivilege BLOCK *********/ - DEBUG(3,("_srv_net_share_set_info: Running [%s] returned (%d)\n", command, ret )); + DEBUG(3,("_srvsvc_NetShareSetInfo: Running [%s] returned (%d)\n", + command, ret )); TALLOC_FREE(command); if ( ret != 0 ) return WERR_ACCESS_DENIED; } else { - DEBUG(10,("_srv_net_share_set_info: No change to share name (%s)\n", share_name )); + DEBUG(10,("_srvsvc_NetShareSetInfo: No change to share name (%s)\n", + share_name )); } /* Replace SD if changed. */ @@ -1764,12 +1764,12 @@ WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, S if (old_sd && !sec_desc_equal(old_sd, psd)) { if (!set_share_security(share_name, psd)) - DEBUG(0,("_srv_net_share_set_info: Failed to change security info in share %s.\n", + DEBUG(0,("_srvsvc_NetShareSetInfo: Failed to change security info in share %s.\n", share_name )); } } - DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__)); + DEBUG(5,("_srvsvc_NetShareSetInfo: %d\n", __LINE__)); return WERR_OK; } @@ -2549,12 +2549,6 @@ WERROR _srvsvc_NetShareGetInfo(pipes_struct *p, struct srvsvc_NetShareGetInfo *r return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, struct srvsvc_NetShareSetInfo *r) -{ - p->rng_fault_state = True; - return WERR_NOT_SUPPORTED; -} - WERROR _srvsvc_NetShareDel(pipes_struct *p, struct srvsvc_NetShareDel *r) { p->rng_fault_state = True; -- cgit From 78b20443c587d303aa33f594c746c38e2689004d Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Wed, 5 Mar 2008 10:34:45 +0100 Subject: Use pidl for _srvsvc_NetRemoteTOD(). Guenther (This used to be commit 2b4e0f0593c6378cdac4811ded830ca694afac9e) --- source3/rpc_server/srv_srvsvc_nt.c | 55 +++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 31 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 75c262a7a6..4efea33738 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2054,12 +2054,13 @@ WERROR _srv_net_share_del_sticky(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_ } /******************************************************************* -time of day + _srvsvc_NetRemoteTOD ********************************************************************/ -WERROR _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET_REMOTE_TOD *r_u) +WERROR _srvsvc_NetRemoteTOD(pipes_struct *p, + struct srvsvc_NetRemoteTOD *r) { - TIME_OF_DAY_INFO *tod; + struct srvsvc_NetRemoteTODInfo *tod; struct tm *t; time_t unixdate = time(NULL); @@ -2068,37 +2069,35 @@ WERROR _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET uint32 zone = get_time_zone(unixdate)/60; - DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__)); + DEBUG(5,("_srvsvc_NetRemoteTOD: %d\n", __LINE__)); - if ( !(tod = TALLOC_ZERO_P(p->mem_ctx, TIME_OF_DAY_INFO)) ) + if ( !(tod = TALLOC_ZERO_P(p->mem_ctx, struct srvsvc_NetRemoteTODInfo)) ) return WERR_NOMEM; - r_u->tod = tod; - r_u->ptr_srv_tod = 0x1; - r_u->status = WERR_OK; + *r->out.info = tod; - DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__)); + DEBUG(5,("_srvsvc_NetRemoteTOD: %d\n", __LINE__)); t = gmtime(&unixdate); /* set up the */ - init_time_of_day_info(tod, - unixdate, - 0, - t->tm_hour, - t->tm_min, - t->tm_sec, - 0, - zone, - 10000, - t->tm_mday, - t->tm_mon + 1, - 1900+t->tm_year, - t->tm_wday); - - DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__)); + init_srvsvc_NetRemoteTODInfo(tod, + unixdate, + 0, + t->tm_hour, + t->tm_min, + t->tm_sec, + 0, + zone, + 10000, + t->tm_mday, + t->tm_mon + 1, + 1900+t->tm_year, + t->tm_wday); - return r_u->status; + DEBUG(5,("_srvsvc_NetRemoteTOD: %d\n", __LINE__)); + + return WERR_OK; } /*********************************************************************************** @@ -2597,12 +2596,6 @@ WERROR _srvsvc_NetTransportDel(pipes_struct *p, struct srvsvc_NetTransportDel *r return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetRemoteTOD(pipes_struct *p, struct srvsvc_NetRemoteTOD *r) -{ - p->rng_fault_state = True; - return WERR_NOT_SUPPORTED; -} - WERROR _srvsvc_NetSetServiceBits(pipes_struct *p, struct srvsvc_NetSetServiceBits *r) { p->rng_fault_state = True; -- cgit From 7b75317989e8a5fc46130151f94543009626203b Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Fri, 7 Mar 2008 16:19:43 +0100 Subject: Use pidl for _srvsvc_NetShareGetInfo, _srvsvc_NetShareEnum and srvsvc_NetShareEnumAll. Fixing resume handling while we are there. Guenther (This used to be commit 128637bdd7c37ca166a7d478b33b00c39f0ede62) --- source3/rpc_server/srv_srvsvc_nt.c | 599 ++++++++++++++++--------------------- 1 file changed, 266 insertions(+), 333 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 4efea33738..3c5d1e4154 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -242,19 +242,18 @@ static uint32 get_share_type(int snum) Fill in a share info level 0 structure. ********************************************************************/ -static void init_srv_share_info_0(pipes_struct *p, SRV_SHARE_INFO_0 *sh0, int snum) +static void init_srv_share_info_0(pipes_struct *p, struct srvsvc_NetShareInfo0 *r, int snum) { const char *net_name = lp_servicename(snum); - init_srv_share_info0(&sh0->info_0, net_name); - init_srv_share_info0_str(&sh0->info_0_str, net_name); + init_srvsvc_NetShareInfo0(r, net_name); } /******************************************************************* Fill in a share info level 1 structure. ********************************************************************/ -static void init_srv_share_info_1(pipes_struct *p, SRV_SHARE_INFO_1 *sh1, int snum) +static void init_srv_share_info_1(pipes_struct *p, struct srvsvc_NetShareInfo1 *r, int snum) { char *net_name = lp_servicename(snum); char *remark = talloc_strdup(p->mem_ctx, lp_comment(snum)); @@ -265,20 +264,16 @@ static void init_srv_share_info_1(pipes_struct *p, SRV_SHARE_INFO_1 *sh1, int sn remark); } - init_srv_share_info1(&sh1->info_1, - net_name, - get_share_type(snum), - remark ? remark: ""); - init_srv_share_info1_str(&sh1->info_1_str, - net_name, - remark ? remark: ""); + init_srvsvc_NetShareInfo1(r, net_name, + get_share_type(snum), + remark ? remark : ""); } /******************************************************************* Fill in a share info level 2 structure. ********************************************************************/ -static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2, int snum) +static void init_srv_share_info_2(pipes_struct *p, struct srvsvc_NetShareInfo2 *r, int snum) { char *remark = NULL; char *path = NULL; @@ -307,21 +302,15 @@ static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2, int sn } count = count_current_connections(net_name, false); - init_srv_share_info2(&sh2->info_2, - net_name, - get_share_type(snum), - remark ? remark : "", - 0, - max_uses, - count, - path ? path : "", - ""); - - init_srv_share_info2_str(&sh2->info_2_str, - net_name, - remark ? remark : "", - path ? path : "", - ""); + + init_srvsvc_NetShareInfo2(r, net_name, + get_share_type(snum), + remark ? remark : "", + 0, + max_uses, + count, + path ? path : "", + ""); } /******************************************************************* @@ -353,7 +342,7 @@ static void map_generic_share_sd_bits(SEC_DESC *psd) Fill in a share info level 501 structure. ********************************************************************/ -static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501, int snum) +static void init_srv_share_info_501(pipes_struct *p, struct srvsvc_NetShareInfo501 *r, int snum) { const char *net_name = lp_servicename(snum); char *remark = talloc_strdup(p->mem_ctx, lp_comment(snum)); @@ -362,17 +351,17 @@ static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501, remark = standard_sub_conn(p->mem_ctx, p->conn, remark); } - init_srv_share_info501(&sh501->info_501, net_name, get_share_type(snum), - remark ? remark : "", (lp_csc_policy(snum) << 4)); - init_srv_share_info501_str(&sh501->info_501_str, - net_name, remark ? remark : ""); + init_srvsvc_NetShareInfo501(r, net_name, + get_share_type(snum), + remark ? remark : "", + (lp_csc_policy(snum) << 4)); } /******************************************************************* Fill in a share info level 502 structure. ********************************************************************/ -static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, int snum) +static void init_srv_share_info_502(pipes_struct *p, struct srvsvc_NetShareInfo502 *r, int snum) { const char *net_name = lp_servicename(snum); char *path = NULL; @@ -381,8 +370,6 @@ static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, TALLOC_CTX *ctx = p->mem_ctx; char *remark = talloc_strdup(ctx, lp_comment(snum));; - ZERO_STRUCTP(sh502); - if (remark) { remark = standard_sub_conn(ctx, p->conn, remark); } @@ -397,31 +384,23 @@ static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, sd = get_share_security(ctx, lp_servicename(snum), &sd_size); - init_srv_share_info502(&sh502->info_502, - net_name, - get_share_type(snum), - remark ? remark : "", - 0, - 0xffffffff, - 1, - path ? path : "", - "", - sd, - sd_size); - init_srv_share_info502_str(&sh502->info_502_str, - net_name, - remark ? remark : "", - path ? path : "", - "", - sd, - sd_size); + init_srvsvc_NetShareInfo502(r, net_name, + get_share_type(snum), + remark ? remark : "", + 0, + 0xffffffff, + 1, + path ? path : "", + "", + 0, + sd); } /*************************************************************************** Fill in a share info level 1004 structure. ***************************************************************************/ -static void init_srv_share_info_1004(pipes_struct *p, SRV_SHARE_INFO_1004* sh1004, int snum) +static void init_srv_share_info_1004(pipes_struct *p, struct srvsvc_NetShareInfo1004 *r, int snum) { char *remark = talloc_strdup(p->mem_ctx, lp_comment(snum)); @@ -429,65 +408,59 @@ static void init_srv_share_info_1004(pipes_struct *p, SRV_SHARE_INFO_1004* sh100 remark = standard_sub_conn(p->mem_ctx, p->conn, remark); } - ZERO_STRUCTP(sh1004); - - init_srv_share_info1004(&sh1004->info_1004, remark ? remark : ""); - init_srv_share_info1004_str(&sh1004->info_1004_str, - remark ? remark : ""); + init_srvsvc_NetShareInfo1004(r, remark ? remark : ""); } /*************************************************************************** Fill in a share info level 1005 structure. ***************************************************************************/ -static void init_srv_share_info_1005(pipes_struct *p, SRV_SHARE_INFO_1005* sh1005, int snum) +static void init_srv_share_info_1005(pipes_struct *p, struct srvsvc_NetShareInfo1005 *r, int snum) { - sh1005->share_info_flags = 0; + uint32_t dfs_flags = 0; + + if (lp_host_msdfs() && lp_msdfs_root(snum)) { + dfs_flags |= SHARE_1005_IN_DFS | SHARE_1005_DFS_ROOT; + } - if(lp_host_msdfs() && lp_msdfs_root(snum)) - sh1005->share_info_flags |= - SHARE_1005_IN_DFS | SHARE_1005_DFS_ROOT; - sh1005->share_info_flags |= - lp_csc_policy(snum) << SHARE_1005_CSC_POLICY_SHIFT; + dfs_flags |= lp_csc_policy(snum) << SHARE_1005_CSC_POLICY_SHIFT; + + init_srvsvc_NetShareInfo1005(r, dfs_flags); } + /*************************************************************************** Fill in a share info level 1006 structure. ***************************************************************************/ -static void init_srv_share_info_1006(pipes_struct *p, SRV_SHARE_INFO_1006* sh1006, int snum) +static void init_srv_share_info_1006(pipes_struct *p, struct srvsvc_NetShareInfo1006 *r, int snum) { - sh1006->max_uses = -1; + init_srvsvc_NetShareInfo1006(r, 0xffffffff); } /*************************************************************************** Fill in a share info level 1007 structure. ***************************************************************************/ -static void init_srv_share_info_1007(pipes_struct *p, SRV_SHARE_INFO_1007* sh1007, int snum) +static void init_srv_share_info_1007(pipes_struct *p, struct srvsvc_NetShareInfo1007 *r, int snum) { uint32 flags = 0; - ZERO_STRUCTP(sh1007); - - init_srv_share_info1007(&sh1007->info_1007, flags, ""); - init_srv_share_info1007_str(&sh1007->info_1007_str, ""); + init_srvsvc_NetShareInfo1007(r, flags, ""); } /******************************************************************* Fill in a share info level 1501 structure. ********************************************************************/ -static void init_srv_share_info_1501(pipes_struct *p, SRV_SHARE_INFO_1501 *sh1501, int snum) +static void init_srv_share_info_1501(pipes_struct *p, struct sec_desc_buf *r, int snum) { SEC_DESC *sd; size_t sd_size; TALLOC_CTX *ctx = p->mem_ctx; - ZERO_STRUCTP(sh1501); - sd = get_share_security(ctx, lp_servicename(snum), &sd_size); - sh1501->sdb = make_sec_desc_buf(p->mem_ctx, sd_size, sd); + r = make_sec_desc_buf(p->mem_ctx, sd_size, sd); } /******************************************************************* @@ -505,21 +478,24 @@ static bool is_hidden_share(int snum) Fill in a share info structure. ********************************************************************/ -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) +static WERROR init_srv_share_info_ctr(pipes_struct *p, + struct srvsvc_NetShareInfoCtr *info_ctr, + uint32_t *resume_handle_p, + uint32_t *total_entries, + bool all_shares) { int num_entries = 0; + int alloc_entries = 0; int num_services = 0; int snum; TALLOC_CTX *ctx = p->mem_ctx; + int i = 0; + int valid_share_count = 0; + union srvsvc_NetShareCtr ctr; + uint32_t resume_handle = resume_handle_p ? *resume_handle_p : 0; DEBUG(5,("init_srv_share_info_ctr\n")); - ZERO_STRUCTPN(ctr); - - ctr->info_level = ctr->switch_value = info_level; - *resume_hnd = 0; - /* Ensure all the usershares are loaded. */ become_root(); num_services = load_usershare_shares(); @@ -528,300 +504,202 @@ static bool init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr, /* Count the number of entries. */ for (snum = 0; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { num_entries++; + } } - *total_entries = num_entries; - ctr->num_entries2 = ctr->num_entries = num_entries; - ctr->ptr_share_info = ctr->ptr_entries = 1; - - if (!num_entries) - return True; + if (!num_entries || (resume_handle >= num_entries)) { + return WERR_OK; + } - switch (info_level) { + /* Calculate alloc entries. */ + alloc_entries = num_entries - resume_handle; + switch (info_ctr->level) { case 0: - { - SRV_SHARE_INFO_0 *info0 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_0, num_entries); - int i = 0; + ctr.ctr0 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr0); + W_ERROR_HAVE_NO_MEMORY(ctr.ctr0); - if (!info0) { - return False; - } + ctr.ctr0->count = alloc_entries; + ctr.ctr0->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo0, alloc_entries); + W_ERROR_HAVE_NO_MEMORY(ctr.ctr0->array); - for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { - init_srv_share_info_0(p, &info0[i++], snum); + for (snum = 0; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) && + (resume_handle <= (i + valid_share_count++)) ) { + init_srv_share_info_0(p, &ctr.ctr0->array[i++], snum); } } - ctr->share.info0 = info0; break; - } - case 1: - { - SRV_SHARE_INFO_1 *info1 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1, num_entries); - int i = 0; + ctr.ctr1 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr1); + W_ERROR_HAVE_NO_MEMORY(ctr.ctr1); - if (!info1) { - return False; - } + ctr.ctr1->count = alloc_entries; + ctr.ctr1->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo1, alloc_entries); + W_ERROR_HAVE_NO_MEMORY(ctr.ctr1->array); - for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { - init_srv_share_info_1(p, &info1[i++], snum); + for (snum = 0; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) && + (resume_handle <= (i + valid_share_count++)) ) { + init_srv_share_info_1(p, &ctr.ctr1->array[i++], snum); } } - ctr->share.info1 = info1; break; - } case 2: - { - SRV_SHARE_INFO_2 *info2 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_2, num_entries); - int i = 0; + ctr.ctr2 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr2); + W_ERROR_HAVE_NO_MEMORY(ctr.ctr2); - if (!info2) { - return False; - } + ctr.ctr2->count = alloc_entries; + ctr.ctr2->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo2, alloc_entries); + W_ERROR_HAVE_NO_MEMORY(ctr.ctr2->array); - for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { - init_srv_share_info_2(p, &info2[i++], snum); + for (snum = 0; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) && + (resume_handle <= (i + valid_share_count++)) ) { + init_srv_share_info_2(p, &ctr.ctr2->array[i++], snum); } } - ctr->share.info2 = info2; break; - } case 501: - { - SRV_SHARE_INFO_501 *info501 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_501, num_entries); - int i = 0; + ctr.ctr501 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr501); + W_ERROR_HAVE_NO_MEMORY(ctr.ctr501); - if (!info501) { - return False; - } + ctr.ctr501->count = alloc_entries; + ctr.ctr501->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo501, alloc_entries); + W_ERROR_HAVE_NO_MEMORY(ctr.ctr501->array); - for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { - init_srv_share_info_501(p, &info501[i++], snum); + for (snum = 0; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) && + (resume_handle <= (i + valid_share_count++)) ) { + init_srv_share_info_501(p, &ctr.ctr501->array[i++], snum); } } - ctr->share.info501 = info501; break; - } case 502: - { - SRV_SHARE_INFO_502 *info502 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_502, num_entries); - int i = 0; + ctr.ctr502 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr502); + W_ERROR_HAVE_NO_MEMORY(ctr.ctr502); - if (!info502) { - return False; - } + ctr.ctr502->count = alloc_entries; + ctr.ctr502->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo502, alloc_entries); + W_ERROR_HAVE_NO_MEMORY(ctr.ctr502->array); - for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { - init_srv_share_info_502(p, &info502[i++], snum); + for (snum = 0; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) && + (resume_handle <= (i + valid_share_count++)) ) { + init_srv_share_info_502(p, &ctr.ctr502->array[i++], snum); } } - ctr->share.info502 = info502; break; - } - - /* here for completeness but not currently used with enum (1004 - 1501)*/ case 1004: - { - SRV_SHARE_INFO_1004 *info1004 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1004, num_entries); - int i = 0; + ctr.ctr1004 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr1004); + W_ERROR_HAVE_NO_MEMORY(ctr.ctr1004); - if (!info1004) { - return False; - } + ctr.ctr1004->count = alloc_entries; + ctr.ctr1004->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo1004, alloc_entries); + W_ERROR_HAVE_NO_MEMORY(ctr.ctr1004->array); - for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { - init_srv_share_info_1004(p, &info1004[i++], snum); + for (snum = 0; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) && + (resume_handle <= (i + valid_share_count++)) ) { + init_srv_share_info_1004(p, &ctr.ctr1004->array[i++], snum); } } - ctr->share.info1004 = info1004; break; - } case 1005: - { - SRV_SHARE_INFO_1005 *info1005 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1005, num_entries); - int i = 0; + ctr.ctr1005 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr1005); + W_ERROR_HAVE_NO_MEMORY(ctr.ctr1005); - if (!info1005) { - return False; - } + ctr.ctr1005->count = alloc_entries; + ctr.ctr1005->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo1005, alloc_entries); + W_ERROR_HAVE_NO_MEMORY(ctr.ctr1005->array); - for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { - init_srv_share_info_1005(p, &info1005[i++], snum); + for (snum = 0; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) && + (resume_handle <= (i + valid_share_count++)) ) { + init_srv_share_info_1005(p, &ctr.ctr1005->array[i++], snum); } } - ctr->share.info1005 = info1005; break; - } case 1006: - { - SRV_SHARE_INFO_1006 *info1006 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1006, num_entries); - int i = 0; + ctr.ctr1006 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr1006); + W_ERROR_HAVE_NO_MEMORY(ctr.ctr1006); - if (!info1006) { - return False; - } + ctr.ctr1006->count = alloc_entries; + ctr.ctr1006->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo1006, alloc_entries); + W_ERROR_HAVE_NO_MEMORY(ctr.ctr1006->array); - for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { - init_srv_share_info_1006(p, &info1006[i++], snum); + for (snum = 0; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) && + (resume_handle <= (i + valid_share_count++)) ) { + init_srv_share_info_1006(p, &ctr.ctr1006->array[i++], snum); } } - ctr->share.info1006 = info1006; break; - } case 1007: - { - SRV_SHARE_INFO_1007 *info1007 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1007, num_entries); - int i = 0; + ctr.ctr1007 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr1007); + W_ERROR_HAVE_NO_MEMORY(ctr.ctr1007); - if (!info1007) { - return False; - } + ctr.ctr1007->count = alloc_entries; + ctr.ctr1007->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo1007, alloc_entries); + W_ERROR_HAVE_NO_MEMORY(ctr.ctr1007->array); - for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { - init_srv_share_info_1007(p, &info1007[i++], snum); + for (snum = 0; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) && + (resume_handle <= (i + valid_share_count++)) ) { + init_srv_share_info_1007(p, &ctr.ctr1007->array[i++], snum); } } - ctr->share.info1007 = info1007; break; - } case 1501: - { - SRV_SHARE_INFO_1501 *info1501 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1501, num_entries); - int i = 0; + ctr.ctr1501 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr1501); + W_ERROR_HAVE_NO_MEMORY(ctr.ctr1501); - if (!info1501) { - return False; - } + ctr.ctr1501->count = alloc_entries; + ctr.ctr1501->array = TALLOC_ZERO_ARRAY(ctx, struct sec_desc_buf, alloc_entries); + W_ERROR_HAVE_NO_MEMORY(ctr.ctr1501->array); - for (snum = *resume_hnd; snum < num_services; snum++) { - if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { - init_srv_share_info_1501(p, &info1501[i++], snum); + for (snum = 0; snum < num_services; snum++) { + if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) && + (resume_handle <= (i + valid_share_count++)) ) { + init_srv_share_info_1501(p, &ctr.ctr1501->array[i++], snum); } } - ctr->share.info1501 = info1501; break; - } + default: - DEBUG(5,("init_srv_share_info_ctr: unsupported switch value %d\n", info_level)); - return False; + DEBUG(5,("init_srv_share_info_ctr: unsupported switch value %d\n", + info_ctr->level)); + return WERR_UNKNOWN_LEVEL; } - return True; -} - -/******************************************************************* - Inits a SRV_R_NET_SHARE_ENUM structure. -********************************************************************/ - -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(p, &r_n->ctr, info_level, - &resume_hnd, &r_n->total_entries, all)) { - r_n->status = WERR_OK; - } else { - r_n->status = WERR_UNKNOWN_LEVEL; + *total_entries = alloc_entries; + if (resume_handle_p) { + *resume_handle_p = num_entries; } - init_enum_hnd(&r_n->enum_hnd, resume_hnd); -} + info_ctr->ctr = ctr; -/******************************************************************* - Inits a SRV_R_NET_SHARE_GET_INFO structure. -********************************************************************/ - -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) -{ - WERROR status = WERR_OK; - int snum; - - DEBUG(5,("init_srv_r_net_share_get_info: %d\n", __LINE__)); - - r_n->info.switch_value = info_level; - - snum = find_service(share_name); - - if (snum >= 0) { - switch (info_level) { - case 0: - init_srv_share_info_0(p, &r_n->info.share.info0, snum); - break; - case 1: - init_srv_share_info_1(p, &r_n->info.share.info1, snum); - break; - case 2: - init_srv_share_info_2(p, &r_n->info.share.info2, snum); - break; - case 501: - init_srv_share_info_501(p, &r_n->info.share.info501, snum); - break; - case 502: - init_srv_share_info_502(p, &r_n->info.share.info502, snum); - break; - - /* here for completeness */ - case 1004: - init_srv_share_info_1004(p, &r_n->info.share.info1004, snum); - break; - case 1005: - init_srv_share_info_1005(p, &r_n->info.share.info1005, snum); - break; - - /* here for completeness 1006 - 1501 */ - case 1006: - init_srv_share_info_1006(p, &r_n->info.share.info1006, snum); - break; - case 1007: - init_srv_share_info_1007(p, &r_n->info.share.info1007, snum); - break; - case 1501: - init_srv_share_info_1501(p, &r_n->info.share.info1501, snum); - break; - default: - DEBUG(5,("init_srv_net_share_get_info: unsupported switch value %d\n", info_level)); - status = WERR_UNKNOWN_LEVEL; - break; - } - } else { - status = WERR_INVALID_NAME; - } - - r_n->info.ptr_share_ctr = W_ERROR_IS_OK(status) ? 1 : 0; - r_n->status = status; + return WERR_OK; } /******************************************************************* @@ -1465,68 +1343,141 @@ done: } /******************************************************************* - Net share enum all. + _srvsvc_NetShareEnumAll ********************************************************************/ -WERROR _srv_net_share_enum_all(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u) +WERROR _srvsvc_NetShareEnumAll(pipes_struct *p, + struct srvsvc_NetShareEnumAll *r) { - DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__)); + WERROR werr; + + DEBUG(5,("_srvsvc_NetShareEnumAll: %d\n", __LINE__)); if (!pipe_access_check(p)) { - DEBUG(3, ("access denied to srv_net_share_enum_all\n")); + DEBUG(3, ("access denied to _srvsvc_NetShareEnumAll\n")); return WERR_ACCESS_DENIED; } /* Create the list of shares for the response. */ - init_srv_r_net_share_enum(p, r_u, - q_u->ctr.info_level, - get_enum_hnd(&q_u->enum_hnd), True); + werr = init_srv_share_info_ctr(p, + r->in.info_ctr, + r->in.resume_handle, + r->out.totalentries, + true); - DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__)); + DEBUG(5,("_srvsvc_NetShareEnumAll: %d\n", __LINE__)); - return r_u->status; + return werr; } /******************************************************************* - Net share enum. + _srvsvc_NetShareEnum ********************************************************************/ -WERROR _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u) +WERROR _srvsvc_NetShareEnum(pipes_struct *p, + struct srvsvc_NetShareEnum *r) { - DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__)); + WERROR werr; + + DEBUG(5,("_srvsvc_NetShareEnum: %d\n", __LINE__)); if (!pipe_access_check(p)) { - DEBUG(3, ("access denied to srv_net_share_enum\n")); + DEBUG(3, ("access denied to _srvsvc_NetShareEnum\n")); return WERR_ACCESS_DENIED; } /* Create the list of shares for the response. */ - init_srv_r_net_share_enum(p, r_u, - q_u->ctr.info_level, - get_enum_hnd(&q_u->enum_hnd), False); + werr = init_srv_share_info_ctr(p, + r->in.info_ctr, + r->in.resume_handle, + r->out.totalentries, + false); - DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__)); + DEBUG(5,("_srvsvc_NetShareEnum: %d\n", __LINE__)); - return r_u->status; + return werr; } /******************************************************************* - Net share get info. + _srvsvc_NetShareGetInfo ********************************************************************/ -WERROR _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, SRV_R_NET_SHARE_GET_INFO *r_u) +WERROR _srvsvc_NetShareGetInfo(pipes_struct *p, + struct srvsvc_NetShareGetInfo *r) { + WERROR status = WERR_OK; fstring share_name; + int snum; + union srvsvc_NetShareInfo *info = r->out.info; - DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__)); + DEBUG(5,("_srvsvc_NetShareGetInfo: %d\n", __LINE__)); - /* 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, r_u, share_name, q_u->info_level); + fstrcpy(share_name, r->in.share_name); - DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__)); + snum = find_service(share_name); + if (snum < 0) { + return WERR_INVALID_NAME; + } - return r_u->status; + switch (r->in.level) { + case 0: + info->info0 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo0); + W_ERROR_HAVE_NO_MEMORY(info->info0); + init_srv_share_info_0(p, info->info0, snum); + break; + case 1: + info->info1 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo1); + W_ERROR_HAVE_NO_MEMORY(info->info1); + init_srv_share_info_1(p, info->info1, snum); + break; + case 2: + info->info2 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo2); + W_ERROR_HAVE_NO_MEMORY(info->info2); + init_srv_share_info_2(p, info->info2, snum); + break; + case 501: + info->info501 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo501); + W_ERROR_HAVE_NO_MEMORY(info->info501); + init_srv_share_info_501(p, info->info501, snum); + break; + case 502: + info->info502 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo502); + W_ERROR_HAVE_NO_MEMORY(info->info502); + init_srv_share_info_502(p, info->info502, snum); + break; + case 1004: + info->info1004 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo1004); + W_ERROR_HAVE_NO_MEMORY(info->info1004); + init_srv_share_info_1004(p, info->info1004, snum); + break; + case 1005: + info->info1005 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo1005); + W_ERROR_HAVE_NO_MEMORY(info->info1005); + init_srv_share_info_1005(p, info->info1005, snum); + break; + case 1006: + info->info1006 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo1006); + W_ERROR_HAVE_NO_MEMORY(info->info1006); + init_srv_share_info_1006(p, info->info1006, snum); + break; + case 1007: + info->info1007 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo1007); + W_ERROR_HAVE_NO_MEMORY(info->info1007); + init_srv_share_info_1007(p, info->info1007, snum); + break; + case 1501: + init_srv_share_info_1501(p, info->info1501, snum); + break; + default: + DEBUG(5,("_srvsvc_NetShareGetInfo: unsupported switch value %d\n", + r->in.level)); + status = WERR_UNKNOWN_LEVEL; + break; + } + + DEBUG(5,("_srvsvc_NetShareGetInfo: %d\n", __LINE__)); + + return status; } /******************************************************************* @@ -2536,18 +2487,6 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, struct srvsvc_NetShareAdd *r) return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetShareEnumAll(pipes_struct *p, struct srvsvc_NetShareEnumAll *r) -{ - p->rng_fault_state = True; - return WERR_NOT_SUPPORTED; -} - -WERROR _srvsvc_NetShareGetInfo(pipes_struct *p, struct srvsvc_NetShareGetInfo *r) -{ - p->rng_fault_state = True; - return WERR_NOT_SUPPORTED; -} - WERROR _srvsvc_NetShareDel(pipes_struct *p, struct srvsvc_NetShareDel *r) { p->rng_fault_state = True; @@ -2638,12 +2577,6 @@ WERROR _srvsvc_NetPRNameCompare(pipes_struct *p, struct srvsvc_NetPRNameCompare return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetShareEnum(pipes_struct *p, struct srvsvc_NetShareEnum *r) -{ - p->rng_fault_state = True; - return WERR_NOT_SUPPORTED; -} - WERROR _srvsvc_NetShareDelStart(pipes_struct *p, struct srvsvc_NetShareDelStart *r) { p->rng_fault_state = True; -- cgit From ad3a1b8475bc850578f0ee6a71747b204066340e Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Fri, 7 Mar 2008 23:26:00 +0100 Subject: Use pidl for _srvsvc_NetShareDel and _srvsvc_NetShareDelSticky. Guenther (This used to be commit 73b6587493d9a987a691ece495db9f42ce562efe) --- source3/rpc_server/srv_srvsvc_nt.c | 46 +++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 23 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 3c5d1e4154..a6cf06caa7 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1905,11 +1905,13 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S } /******************************************************************* - Net share delete. Call "delete share command" with the share name as + _srvsvc_NetShareDel + Call "delete share command" with the share name as a parameter. ********************************************************************/ -WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u) +WERROR _srvsvc_NetShareDel(pipes_struct *p, + struct srvsvc_NetShareDel *r) { struct current_user user; char *command = NULL; @@ -1921,10 +1923,9 @@ WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S struct share_params *params; TALLOC_CTX *ctx = p->mem_ctx; - DEBUG(5,("_srv_net_share_del: %d\n", __LINE__)); - - share_name = unistr2_to_ascii_talloc(ctx, &q_u->uni_share_name); + DEBUG(5,("_srvsvc_NetShareDel: %d\n", __LINE__)); + share_name = talloc_strdup(p->mem_ctx, r->in.share_name); if (!share_name) { return WERR_NET_NAME_NOT_FOUND; } @@ -1953,7 +1954,7 @@ WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S return WERR_ACCESS_DENIED; if (!lp_delete_share_cmd() || !*lp_delete_share_cmd()) { - DEBUG(10,("_srv_net_share_del: No delete share command\n")); + DEBUG(10,("_srvsvc_NetShareDel: No delete share command\n")); return WERR_ACCESS_DENIED; } @@ -1966,7 +1967,7 @@ WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S return WERR_NOMEM; } - DEBUG(10,("_srv_net_share_del: Running [%s]\n", command )); + DEBUG(10,("_srvsvc_NetShareDel: Running [%s]\n", command )); /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/ @@ -1984,7 +1985,7 @@ WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S /********* END SeDiskOperatorPrivilege BLOCK *********/ - DEBUG(3,("_srv_net_share_del: Running [%s] returned (%d)\n", command, ret )); + DEBUG(3,("_srvsvc_NetShareDel: Running [%s] returned (%d)\n", command, ret )); if ( ret != 0 ) return WERR_ACCESS_DENIED; @@ -1997,11 +1998,22 @@ WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_S return WERR_OK; } -WERROR _srv_net_share_del_sticky(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u) +/******************************************************************* + _srvsvc_NetShareDelSticky +********************************************************************/ + +WERROR _srvsvc_NetShareDelSticky(pipes_struct *p, + struct srvsvc_NetShareDelSticky *r) { - DEBUG(5,("_srv_net_share_del_stick: %d\n", __LINE__)); + struct srvsvc_NetShareDel q; - return _srv_net_share_del(p, q_u, r_u); + DEBUG(5,("_srvsvc_NetShareDelSticky: %d\n", __LINE__)); + + q.in.server_unc = r->in.server_unc; + q.in.share_name = r->in.share_name; + q.in.reserved = r->in.reserved; + + return _srvsvc_NetShareDel(p, &q); } /******************************************************************* @@ -2487,18 +2499,6 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, struct srvsvc_NetShareAdd *r) return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetShareDel(pipes_struct *p, struct srvsvc_NetShareDel *r) -{ - p->rng_fault_state = True; - return WERR_NOT_SUPPORTED; -} - -WERROR _srvsvc_NetShareDelSticky(pipes_struct *p, struct srvsvc_NetShareDelSticky *r) -{ - p->rng_fault_state = True; - return WERR_NOT_SUPPORTED; -} - WERROR _srvsvc_NetShareCheck(pipes_struct *p, struct srvsvc_NetShareCheck *r) { p->rng_fault_state = True; -- cgit From 9beec265bcc81261bd220b78396cc42e6ee5eb5d Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Fri, 7 Mar 2008 23:40:00 +0100 Subject: Use pidl for _srvsvc_NetNameValidate. Guenther (This used to be commit 2e1df306785296979ea064006402254e318e946b) --- source3/rpc_server/srv_srvsvc_nt.c | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index a6cf06caa7..a64691c635 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2380,17 +2380,19 @@ WERROR _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_D } /******************************************************************** + _srvsvc_NetNameValidate ********************************************************************/ -WERROR _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV_R_NET_NAME_VALIDATE *r_u) +WERROR _srvsvc_NetNameValidate(pipes_struct *p, + struct srvsvc_NetNameValidate *r) { - fstring sharename; - - switch ( q_u->type ) { + switch (r->in.name_type) { case 0x9: - rpcstr_pull(sharename, q_u->sharename.buffer, sizeof(sharename), q_u->sharename.uni_str_len*2, 0); - if ( !validate_net_name( sharename, INVALID_SHARENAME_CHARS, sizeof(sharename) ) ) { - DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", sharename)); + if (!validate_net_name(r->in.name, INVALID_SHARENAME_CHARS, + strlen_m(r->in.name))) + { + DEBUG(5,("_srvsvc_NetNameValidate: Bad sharename \"%s\"\n", + r->in.name)); return WERR_INVALID_NAME; } break; @@ -2402,7 +2404,6 @@ WERROR _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV return WERR_OK; } - /******************************************************************** ********************************************************************/ @@ -2559,12 +2560,6 @@ WERROR _srvsvc_NetPathCompare(pipes_struct *p, struct srvsvc_NetPathCompare *r) return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetNameValidate(pipes_struct *p, struct srvsvc_NetNameValidate *r) -{ - p->rng_fault_state = True; - return WERR_NOT_SUPPORTED; -} - WERROR _srvsvc_NETRPRNAMECANONICALIZE(pipes_struct *p, struct srvsvc_NETRPRNAMECANONICALIZE *r) { p->rng_fault_state = True; -- cgit From 45c91e7d754592f32108113d9fc395bd16e3b227 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Sat, 8 Mar 2008 00:22:44 +0100 Subject: Use pidl for _srvsvc_NetShareAdd. Guenther (This used to be commit fd3e7728181e7a208706e477905173bec44c982e) --- source3/rpc_server/srv_srvsvc_nt.c | 66 ++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 34 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index a64691c635..d45ebb26e6 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1726,11 +1726,13 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, } /******************************************************************* - Net share add. Call 'add_share_command "sharename" "pathname" + _srvsvc_NetShareAdd. + Call 'add_share_command "sharename" "pathname" "comment" "max connections = " ********************************************************************/ -WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_SHARE_ADD *r_u) +WERROR _srvsvc_NetShareAdd(pipes_struct *p, + struct srvsvc_NetShareAdd *r) { struct current_user user; char *command = NULL; @@ -1747,9 +1749,9 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S int max_connections = 0; TALLOC_CTX *ctx = p->mem_ctx; - DEBUG(5,("_srv_net_share_add: %d\n", __LINE__)); + DEBUG(5,("_srvsvc_NetShareAdd: %d\n", __LINE__)); - r_u->parm_error = 0; + *r->out.parm_error = 0; get_current_user(&user,p); @@ -1759,11 +1761,11 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S return WERR_ACCESS_DENIED; if (!lp_add_share_cmd() || !*lp_add_share_cmd()) { - DEBUG(10,("_srv_net_share_add: No add share command\n")); + DEBUG(10,("_srvsvc_NetShareAdd: No add share command\n")); return WERR_ACCESS_DENIED; } - switch (q_u->info_level) { + switch (r->in.level) { case 0: /* No path. Not enough info in a level 0 to do anything. */ return WERR_ACCESS_DENIED; @@ -1771,27 +1773,24 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S /* Not enough info in a level 1 to do anything. */ return WERR_ACCESS_DENIED; case 2: - share_name = unistr2_to_ascii_talloc(ctx, - &q_u->info.share.info2.info_2_str.uni_netname); - comment = unistr2_to_ascii_talloc(ctx, - &q_u->info.share.info2.info_2_str.uni_remark); - pathname = unistr2_to_ascii_talloc(ctx, - &q_u->info.share.info2.info_2_str.uni_path); - max_connections = (q_u->info.share.info2.info_2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.info_2.max_uses; - type = q_u->info.share.info2.info_2.type; + share_name = talloc_strdup(ctx, r->in.info->info2->name); + comment = talloc_strdup(ctx, r->in.info->info2->comment); + pathname = talloc_strdup(ctx, r->in.info->info2->path); + max_connections = (r->in.info->info2->max_users == 0xffffffff) ? + 0 : r->in.info->info2->max_users; + type = r->in.info->info2->type; break; case 501: /* No path. Not enough info in a level 501 to do anything. */ return WERR_ACCESS_DENIED; case 502: - share_name = unistr2_to_ascii_talloc(ctx, - &q_u->info.share.info502.info_502_str.uni_netname); - comment = unistr2_to_ascii_talloc(ctx, - &q_u->info.share.info502.info_502_str.uni_remark); - pathname = unistr2_to_ascii_talloc(ctx, - &q_u->info.share.info502.info_502_str.uni_path); - type = q_u->info.share.info502.info_502.type; - psd = q_u->info.share.info502.info_502_str.sd; + share_name = talloc_strdup(ctx, r->in.info->info502->name); + comment = talloc_strdup(ctx, r->in.info->info502->comment); + pathname = talloc_strdup(ctx, r->in.info->info502->path); + max_connections = (r->in.info->info502->max_users == 0xffffffff) ? + 0 : r->in.info->info502->max_users; + type = r->in.info->info502->type; + psd = r->in.info->info502->sd; map_generic_share_sd_bits(psd); break; @@ -1806,7 +1805,8 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S /* DFS only level. */ return WERR_ACCESS_DENIED; default: - DEBUG(5,("_srv_net_share_add: unsupported switch value %d\n", q_u->info_level)); + DEBUG(5,("_srvsvc_NetShareAdd: unsupported switch value %d\n", + r->in.level)); return WERR_UNKNOWN_LEVEL; } @@ -1815,7 +1815,7 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S if (!share_name || !validate_net_name(share_name, INVALID_SHARENAME_CHARS, strlen(share_name))) { - DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", + DEBUG(5,("_srvsvc_NetShareAdd: Bad sharename \"%s\"\n", share_name ? share_name : "")); return WERR_INVALID_NAME; } @@ -1862,13 +1862,15 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S return WERR_NOMEM; } - DEBUG(10,("_srv_net_share_add: Running [%s]\n", command )); + DEBUG(10,("_srvsvc_NetShareAdd: Running [%s]\n", command )); /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/ if ( is_disk_op ) become_root(); + /* FIXME: use libnetconf here - gd */ + if ( (ret = smbrun(command, NULL)) == 0 ) { /* Tell everyone we updated smb.conf. */ message_send_all(smbd_messaging_context(), @@ -1880,7 +1882,8 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S /********* END SeDiskOperatorPrivilege BLOCK *********/ - DEBUG(3,("_srv_net_share_add: Running [%s] returned (%d)\n", command, ret )); + DEBUG(3,("_srvsvc_NetShareAdd: Running [%s] returned (%d)\n", + command, ret )); TALLOC_FREE(command); @@ -1889,7 +1892,8 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S if (psd) { if (!set_share_security(share_name, psd)) { - DEBUG(0,("_srv_net_share_add: Failed to add security info to share %s.\n", share_name )); + DEBUG(0,("_srvsvc_NetShareAdd: Failed to add security info to share %s.\n", + share_name )); } } @@ -1899,7 +1903,7 @@ WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_S * from the client. JRA. */ - DEBUG(5,("_srv_net_share_add: %d\n", __LINE__)); + DEBUG(5,("_srvsvc_NetShareAdd: %d\n", __LINE__)); return WERR_OK; } @@ -2494,12 +2498,6 @@ WERROR _srvsvc_NetSessDel(pipes_struct *p, struct srvsvc_NetSessDel *r) return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetShareAdd(pipes_struct *p, struct srvsvc_NetShareAdd *r) -{ - p->rng_fault_state = True; - return WERR_NOT_SUPPORTED; -} - WERROR _srvsvc_NetShareCheck(pipes_struct *p, struct srvsvc_NetShareCheck *r) { p->rng_fault_state = True; -- cgit From 3102609c4bf18c547ad2171b313e620647a718bf Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Sat, 8 Mar 2008 00:42:40 +0100 Subject: Use pidl for _srvsvc_NetSetFileSecurity. Guenther (This used to be commit 64a121c147c825259a06a8cd8de85ec31dd5b4a4) --- source3/rpc_server/srv_srvsvc_nt.c | 54 ++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 28 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index d45ebb26e6..276ae8e243 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2176,11 +2176,12 @@ error_exit: } /*********************************************************************************** + _srvsvc_NetSetFileSecurity Win9x NT tools set security descriptor. ***********************************************************************************/ -WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_u, - SRV_R_NET_FILE_SET_SECDESC *r_u) +WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, + struct srvsvc_NetSetFileSecurity *r) { char *filename_in = NULL; char *filename = NULL; @@ -2189,6 +2190,7 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ files_struct *fsp = NULL; SMB_STRUCT_STAT st; NTSTATUS nt_status; + WERROR werr; struct current_user user; connection_struct *conn = NULL; bool became_user = False; @@ -2196,11 +2198,11 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ ZERO_STRUCT(st); - r_u->status = WERR_OK; + werr = WERR_OK; - qualname = unistr2_to_ascii_talloc(ctx, &q_u->uni_qual_name); + qualname = talloc_strdup(ctx, r->in.share); if (!qualname) { - r_u->status = WERR_ACCESS_DENIED; + werr = WERR_ACCESS_DENIED; goto error_exit; } @@ -2214,35 +2216,35 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ unbecome_root(); if (conn == NULL) { - DEBUG(3,("_srv_net_file_set_secdesc: Unable to connect to %s\n", qualname)); - r_u->status = ntstatus_to_werror(nt_status); + DEBUG(3,("_srvsvc_NetSetFileSecurity: Unable to connect to %s\n", qualname)); + werr = ntstatus_to_werror(nt_status); 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 = WERR_ACCESS_DENIED; + DEBUG(0,("_srvsvc_NetSetFileSecurity: Can't become connected user!\n")); + werr = WERR_ACCESS_DENIED; goto error_exit; } became_user = True; - filename_in= unistr2_to_ascii_talloc(ctx, &q_u->uni_file_name); + filename_in = talloc_strdup(ctx, r->in.file); if (!filename_in) { - r_u->status = WERR_ACCESS_DENIED; + werr = WERR_ACCESS_DENIED; goto error_exit; } nt_status = unix_convert(ctx, conn, filename, False, &filename, NULL, &st); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_set_secdesc: bad pathname %s\n", filename)); - r_u->status = WERR_ACCESS_DENIED; + DEBUG(3,("_srvsvc_NetSetFileSecurity: bad pathname %s\n", filename)); + werr = WERR_ACCESS_DENIED; goto error_exit; } nt_status = check_name(conn, filename); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_set_secdesc: can't access %s\n", filename)); - r_u->status = WERR_ACCESS_DENIED; + DEBUG(3,("_srvsvc_NetSetFileSecurity: can't access %s\n", filename)); + werr = WERR_ACCESS_DENIED; goto error_exit; } @@ -2260,24 +2262,26 @@ WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_ NULL, &fsp); if ( !NT_STATUS_IS_OK(nt_status) ) { - DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", filename)); - r_u->status = ntstatus_to_werror(nt_status); + DEBUG(3,("_srvsvc_NetSetFileSecurity: Unable to open file %s\n", filename)); + werr = ntstatus_to_werror(nt_status); goto error_exit; } } - nt_status = SMB_VFS_SET_NT_ACL(fsp, fsp->fsp_name, q_u->sec_info, q_u->sec_desc); + nt_status = SMB_VFS_SET_NT_ACL(fsp, fsp->fsp_name, + r->in.securityinformation, + r->in.sd_buf->sd); if (!NT_STATUS_IS_OK(nt_status) ) { - DEBUG(3,("_srv_net_file_set_secdesc: Unable to set NT ACL on file %s\n", filename)); - r_u->status = WERR_ACCESS_DENIED; + DEBUG(3,("_srvsvc_NetSetFileSecurity: Unable to set NT ACL on file %s\n", filename)); + werr = WERR_ACCESS_DENIED; goto error_exit; } close_file(fsp, NORMAL_CLOSE); unbecome_user(); close_cnum(conn, user.vuid); - return r_u->status; + return werr; error_exit: @@ -2293,7 +2297,7 @@ error_exit: close_cnum(conn, user.vuid); } - return r_u->status; + return werr; } /*********************************************************************************** @@ -2588,12 +2592,6 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, struct srvsvc_NetGetFileSecur return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, struct srvsvc_NetSetFileSecurity *r) -{ - p->rng_fault_state = True; - return WERR_NOT_SUPPORTED; -} - WERROR _srvsvc_NetServerTransportAddEx(pipes_struct *p, struct srvsvc_NetServerTransportAddEx *r) { p->rng_fault_state = True; -- cgit From fa58ebd8f7c5a14a11b36d0497904e944a23d24f Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Sat, 8 Mar 2008 00:57:52 +0100 Subject: Use pidl for _srvsvc_NetGetFileSecurity. Guenther (This used to be commit 8b016efeb0bb4cd5d91928952a258fce1b6f97d0) --- source3/rpc_server/srv_srvsvc_nt.c | 66 +++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 30 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 276ae8e243..0d4addde14 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2068,11 +2068,12 @@ WERROR _srvsvc_NetRemoteTOD(pipes_struct *p, } /*********************************************************************************** + _srvsvc_NetGetFileSecurity Win9x NT tools get security descriptor. ***********************************************************************************/ -WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC *q_u, - SRV_R_NET_FILE_QUERY_SECDESC *r_u) +WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, + struct srvsvc_NetGetFileSecurity *r) { SEC_DESC *psd = NULL; size_t sd_size; @@ -2082,18 +2083,20 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC char *qualname = NULL; SMB_STRUCT_STAT st; NTSTATUS nt_status; + WERROR werr; struct current_user user; connection_struct *conn = NULL; bool became_user = False; TALLOC_CTX *ctx = p->mem_ctx; + struct sec_desc_buf *sd_buf; ZERO_STRUCT(st); - r_u->status = WERR_OK; + werr = WERR_OK; - qualname = unistr2_to_ascii_talloc(ctx, &q_u->uni_qual_name); + qualname = talloc_strdup(ctx, r->in.share); if (!qualname) { - r_u->status = WERR_ACCESS_DENIED; + werr = WERR_ACCESS_DENIED; goto error_exit; } @@ -2107,35 +2110,38 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC unbecome_root(); if (conn == NULL) { - DEBUG(3,("_srv_net_file_query_secdesc: Unable to connect to %s\n", qualname)); - r_u->status = ntstatus_to_werror(nt_status); + DEBUG(3,("_srvsvc_NetGetFileSecurity: Unable to connect to %s\n", + qualname)); + werr = ntstatus_to_werror(nt_status); goto error_exit; } if (!become_user(conn, conn->vuid)) { - DEBUG(0,("_srv_net_file_query_secdesc: Can't become connected user!\n")); - r_u->status = WERR_ACCESS_DENIED; + DEBUG(0,("_srvsvc_NetGetFileSecurity: Can't become connected user!\n")); + werr = WERR_ACCESS_DENIED; goto error_exit; } became_user = True; - filename_in = unistr2_to_ascii_talloc(ctx, &q_u->uni_file_name); + filename_in = talloc_strdup(ctx, r->in.file); if (!filename_in) { - r_u->status = WERR_ACCESS_DENIED; + werr = WERR_ACCESS_DENIED; goto error_exit; } nt_status = unix_convert(ctx, conn, filename_in, False, &filename, NULL, &st); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_query_secdesc: bad pathname %s\n", filename)); - r_u->status = WERR_ACCESS_DENIED; + DEBUG(3,("_srvsvc_NetGetFileSecurity: bad pathname %s\n", + filename)); + werr = WERR_ACCESS_DENIED; goto error_exit; } nt_status = check_name(conn, filename); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_query_secdesc: can't access %s\n", filename)); - r_u->status = WERR_ACCESS_DENIED; + DEBUG(3,("_srvsvc_NetGetFileSecurity: can't access %s\n", + filename)); + werr = WERR_ACCESS_DENIED; goto error_exit; } @@ -2145,24 +2151,30 @@ WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC |DACL_SECURITY_INFORMATION), &psd); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", filename)); - r_u->status = ntstatus_to_werror(nt_status); + DEBUG(3,("_srvsvc_NetGetFileSecurity: Unable to get NT ACL for file %s\n", + filename)); + werr = ntstatus_to_werror(nt_status); goto error_exit; } sd_size = ndr_size_security_descriptor(psd, 0); - r_u->ptr_response = 1; - r_u->size_response = sd_size; - r_u->ptr_secdesc = 1; - r_u->size_secdesc = sd_size; - r_u->sec_desc = psd; + sd_buf = TALLOC_ZERO_P(ctx, struct sec_desc_buf); + if (!sd_buf) { + werr = WERR_NOMEM; + goto error_exit; + } + + sd_buf->sd_size = sd_size; + sd_buf->sd = psd; + + *r->out.sd_buf = sd_buf; psd->dacl->revision = NT4_ACL_REVISION; unbecome_user(); close_cnum(conn, user.vuid); - return r_u->status; + return werr; error_exit: @@ -2172,7 +2184,7 @@ error_exit: if (conn) close_cnum(conn, user.vuid); - return r_u->status; + return werr; } /*********************************************************************************** @@ -2586,12 +2598,6 @@ WERROR _srvsvc_NetShareDelCommit(pipes_struct *p, struct srvsvc_NetShareDelCommi return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, struct srvsvc_NetGetFileSecurity *r) -{ - p->rng_fault_state = True; - return WERR_NOT_SUPPORTED; -} - WERROR _srvsvc_NetServerTransportAddEx(pipes_struct *p, struct srvsvc_NetServerTransportAddEx *r) { p->rng_fault_state = True; -- cgit From ca354276ca491a413c8dfc30e9c093e71dc2e9d3 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Sun, 9 Mar 2008 18:01:52 +0100 Subject: Use pidl for _srvsvc_NetSessDel(). Guenther (This used to be commit 8a10bc13aee7c34f466fa69773694be97f0e7d85) --- source3/rpc_server/srv_srvsvc_nt.c | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 0d4addde14..7c2efc946d 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1274,31 +1274,33 @@ WERROR _srv_net_sess_enum(pipes_struct *p, SRV_Q_NET_SESS_ENUM *q_u, SRV_R_NET_S } /******************************************************************* -net sess del + _srvsvc_NetSessDel ********************************************************************/ -WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SESS_DEL *r_u) +WERROR _srvsvc_NetSessDel(pipes_struct *p, + struct srvsvc_NetSessDel *r) { struct sessionid *session_list; struct current_user user; int num_sessions, snum; - fstring username; - fstring machine; + const char *username; + const char *machine; bool not_root = False; + WERROR werr; - rpcstr_pull_unistr2_fstring(username, &q_u->uni_user_name); - rpcstr_pull_unistr2_fstring(machine, &q_u->uni_cli_name); + username = r->in.user; + machine = r->in.client; /* strip leading backslashes if any */ - while (machine[0] == '\\') { - memmove(machine, &machine[1], strlen(machine)); + if (machine && machine[0] == '\\' && machine[1] == '\\') { + machine += 2; } num_sessions = list_sessions(p->mem_ctx, &session_list); - DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__)); + DEBUG(5,("_srvsvc_NetSessDel: %d\n", __LINE__)); - r_u->status = WERR_ACCESS_DENIED; + werr = WERR_ACCESS_DENIED; get_current_user(&user, p); @@ -1327,19 +1329,18 @@ WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SES MSG_SHUTDOWN, &data_blob_null); if (NT_STATUS_IS_OK(ntstat)) - r_u->status = WERR_OK; + werr = WERR_OK; if (not_root) unbecome_root(); } } - DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__)); - + DEBUG(5,("_srvsvc_NetSessDel: %d\n", __LINE__)); done: - return r_u->status; + return werr; } /******************************************************************* @@ -2508,12 +2509,6 @@ WERROR _srvsvc_NetSessEnum(pipes_struct *p, struct srvsvc_NetSessEnum *r) return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetSessDel(pipes_struct *p, struct srvsvc_NetSessDel *r) -{ - p->rng_fault_state = True; - return WERR_NOT_SUPPORTED; -} - WERROR _srvsvc_NetShareCheck(pipes_struct *p, struct srvsvc_NetShareCheck *r) { p->rng_fault_state = True; -- cgit From b960bc265b51c6e3627895bfd1375da9c6579252 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Tue, 11 Mar 2008 10:48:52 +0100 Subject: Use pidl for _srvsvc_NetDiskEnum. Guenther (This used to be commit 933d546f86b48bfd9f84045ec21efc1c362b4d93) --- source3/rpc_server/srv_srvsvc_nt.c | 48 +++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 24 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 7c2efc946d..eb304aa60c 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2359,45 +2359,51 @@ static const char *next_server_disk_enum(uint32 *resume) return disk; } -WERROR _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_DISK_ENUM *r_u) +/******************************************************************** + _srvsvc_NetDiskEnum +********************************************************************/ + +WERROR _srvsvc_NetDiskEnum(pipes_struct *p, + struct srvsvc_NetDiskEnum *r) { uint32 i; const char *disk_name; TALLOC_CTX *ctx = p->mem_ctx; - uint32 resume=get_enum_hnd(&q_u->enum_hnd); - - r_u->status=WERR_OK; - - r_u->total_entries = init_server_disk_enum(&resume); + WERROR werr; + uint32_t resume = r->in.resume_handle ? *r->in.resume_handle : 0; - r_u->disk_enum_ctr.unknown = 0; + werr = WERR_OK; - if(!(r_u->disk_enum_ctr.disk_info = TALLOC_ARRAY(ctx, DISK_INFO, MAX_SERVER_DISK_ENTRIES))) { - return WERR_NOMEM; - } + *r->out.totalentries = init_server_disk_enum(&resume); - r_u->disk_enum_ctr.disk_info_ptr = r_u->disk_enum_ctr.disk_info ? 1 : 0; + r->out.info->disks = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetDiskInfo0, + MAX_SERVER_DISK_ENTRIES); + W_ERROR_HAVE_NO_MEMORY(r->out.info->disks); - /*allow one DISK_INFO for null terminator*/ + /*allow one struct srvsvc_NetDiskInfo0 for null terminator*/ for(i = 0; i < MAX_SERVER_DISK_ENTRIES -1 && (disk_name = next_server_disk_enum(&resume)); i++) { - r_u->disk_enum_ctr.entries_read++; + r->out.info->count++; /*copy disk name into a unicode string*/ - init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, disk_name); + r->out.info->disks[i].disk = talloc_strdup(ctx, disk_name); + W_ERROR_HAVE_NO_MEMORY(r->out.info->disks[i].disk); } /* add a terminating null string. Is this there if there is more data to come? */ - r_u->disk_enum_ctr.entries_read++; + r->out.info->count++; - init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, ""); + r->out.info->disks[i].disk = talloc_strdup(ctx, ""); + W_ERROR_HAVE_NO_MEMORY(r->out.info->disks[i].disk); - init_enum_hnd(&r_u->enum_hnd, resume); + if (r->out.resume_handle) { + *r->out.resume_handle = resume; + } - return r_u->status; + return werr; } /******************************************************************** @@ -2515,12 +2521,6 @@ WERROR _srvsvc_NetShareCheck(pipes_struct *p, struct srvsvc_NetShareCheck *r) return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetDiskEnum(pipes_struct *p, struct srvsvc_NetDiskEnum *r) -{ - p->rng_fault_state = True; - return WERR_NOT_SUPPORTED; -} - WERROR _srvsvc_NetServerStatisticsGet(pipes_struct *p, struct srvsvc_NetServerStatisticsGet *r) { p->rng_fault_state = True; -- cgit From 2a40d670410823de807224ce175d3ec89a7006b3 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Tue, 11 Mar 2008 11:30:55 +0100 Subject: Trying to fix resume_handling for srvsvc_NetShareEnumAll. Guenther (This used to be commit 874a0ffd7dbd993230c00c503ec6b27fbffb7745) --- source3/rpc_server/srv_srvsvc_nt.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index eb304aa60c..6421efdf8f 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -694,7 +694,11 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, *total_entries = alloc_entries; if (resume_handle_p) { - *resume_handle_p = num_entries; + if (all_shares) { + *resume_handle_p = (num_entries == 0) ? *resume_handle_p : 0; + } else { + *resume_handle_p = num_entries; + } } info_ctr->ctr = ctr; -- cgit From b371db93bba1fd1753966a7270f0d6936d5863f2 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Wed, 12 Mar 2008 02:10:35 +0100 Subject: init_srv_share_info_ctr: Add debug messages. Michael (This used to be commit 8b2cc36ffcb3bccb760ec7cb0a22558eab56070d) --- source3/rpc_server/srv_srvsvc_nt.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 6421efdf8f..2658e5a37a 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -505,7 +505,10 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, /* Count the number of entries. */ for (snum = 0; snum < num_services; snum++) { if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) { + DEBUG(10, ("counting service %s\n", lp_servicename(snum))); num_entries++; + } else { + DEBUG(10, ("NOT counting service %s\n", lp_servicename(snum))); } } -- cgit From 16f4e059f79373ddfe293b1ba9ab7dd4cb466042 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Wed, 12 Mar 2008 02:12:11 +0100 Subject: init_srv_share_info_ctr: fix counting of services. The number of services was recorded too early leading to registry shares not showing up in browse lists. Guenther - please check. Michael (This used to be commit 737e470e02d1233fda51e903f27955e45427e95a) --- source3/rpc_server/srv_srvsvc_nt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 2658e5a37a..56d3159949 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -498,8 +498,9 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, /* Ensure all the usershares are loaded. */ become_root(); - num_services = load_usershare_shares(); + load_usershare_shares(); load_registry_shares(); + num_services = lp_numservices(); unbecome_root(); /* Count the number of entries. */ -- cgit From 63a6acdfa84253ce602b2a6050093752d69f4771 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Wed, 19 Mar 2008 01:25:59 +0100 Subject: Use pidl for _srvsvc_NetFileEnum. Guenther (This used to be commit 6c6700ed7148b73b2ce52fc00020c7e253a577d3) --- source3/rpc_server/srv_srvsvc_nt.c | 169 ++++++++++++++++--------------------- 1 file changed, 71 insertions(+), 98 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 56d3159949..053f57ec36 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -34,8 +34,7 @@ extern const struct generic_mapping file_generic_mapping; struct file_enum_count { TALLOC_CTX *ctx; const char *username; - int count; - FILE_INFO_3 *info; + struct srvsvc_NetFileCtr3 *ctr3; }; struct sess_file_count { @@ -52,8 +51,8 @@ static int pipe_enum_fn( struct db_record *rec, void *p) { struct pipe_open_rec prec; struct file_enum_count *fenum = (struct file_enum_count *)p; - FILE_INFO_3 *f; - int i = fenum->count; + struct srvsvc_NetFileInfo3 *f; + int i = fenum->ctr3->count; char *fullpath = NULL; const char *username; @@ -78,21 +77,22 @@ static int pipe_enum_fn( struct db_record *rec, void *p) return 1; } - f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 ); + f = TALLOC_REALLOC_ARRAY(fenum->ctx, fenum->ctr3->array, + struct srvsvc_NetFileInfo3, i+1); if ( !f ) { DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1)); return 1; } - fenum->info = f; + fenum->ctr3->array = f; - init_srv_file_info3( - &fenum->info[i], - (uint32)((procid_to_pid(&prec.pid)<<16) & prec.pnum), - (FILE_READ_DATA|FILE_WRITE_DATA), - 0, username, fullpath); + init_srvsvc_NetFileInfo3(&fenum->ctr3->array[i], + (uint32_t)((procid_to_pid(&prec.pid)<<16) & prec.pnum), + (FILE_READ_DATA|FILE_WRITE_DATA), + 0, + fullpath, + username); - TALLOC_FREE(fullpath); - fenum->count++; + fenum->ctr3->count++; return 0; } @@ -100,16 +100,16 @@ static int pipe_enum_fn( struct db_record *rec, void *p) /******************************************************************* ********************************************************************/ -static WERROR net_enum_pipes( TALLOC_CTX *ctx, const char *username, - FILE_INFO_3 **info, - uint32 *count, uint32 resume ) +static WERROR net_enum_pipes(TALLOC_CTX *ctx, + const char *username, + struct srvsvc_NetFileCtr3 **ctr3, + uint32_t resume ) { struct file_enum_count fenum; fenum.ctx = ctx; fenum.username = username; - fenum.count = *count; - fenum.info = *info; + fenum.ctr3 = *ctr3; if (connections_traverse(pipe_enum_fn, &fenum) == -1) { DEBUG(0,("net_enum_pipes: traverse of connections.tdb " @@ -117,8 +117,7 @@ static WERROR net_enum_pipes( TALLOC_CTX *ctx, const char *username, return WERR_NOMEM; } - *info = fenum.info; - *count = fenum.count; + *ctr3 = fenum.ctr3; return WERR_OK; } @@ -133,8 +132,8 @@ static void enum_file_fn( const struct share_mode_entry *e, struct file_enum_count *fenum = (struct file_enum_count *)private_data; - FILE_INFO_3 *f; - int i = fenum->count; + struct srvsvc_NetFileInfo3 *f; + int i = fenum->ctr3->count; files_struct fsp; struct byte_range_lock *brl; int num_locks = 0; @@ -155,12 +154,13 @@ static void enum_file_fn( const struct share_mode_entry *e, return; } - f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 ); + f = TALLOC_REALLOC_ARRAY(fenum->ctx, fenum->ctr3->array, + struct srvsvc_NetFileInfo3, i+1); if ( !f ) { DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1)); return; } - fenum->info = f; + fenum->ctr3->array = f; /* need to count the number of locks on a file */ @@ -186,36 +186,33 @@ static void enum_file_fn( const struct share_mode_entry *e, /* mask out create (what ever that is) */ permissions = e->share_access & (FILE_READ_DATA|FILE_WRITE_DATA); - /* now fill in the FILE_INFO_3 struct */ - init_srv_file_info3( &fenum->info[i], - e->share_file_id, - permissions, - num_locks, - username, - fullpath ); - - TALLOC_FREE(fullpath); - fenum->count++; + /* now fill in the srvsvc_NetFileInfo3 struct */ + init_srvsvc_NetFileInfo3(&fenum->ctr3->array[i], + e->share_file_id, + permissions, + num_locks, + username, + fullpath); + fenum->ctr3->count++; } /******************************************************************* ********************************************************************/ -static WERROR net_enum_files( TALLOC_CTX *ctx, const char *username, - FILE_INFO_3 **info, - uint32 *count, uint32 resume ) +static WERROR net_enum_files(TALLOC_CTX *ctx, + const char *username, + struct srvsvc_NetFileCtr3 **ctr3, + uint32_t resume) { struct file_enum_count f_enum_cnt; f_enum_cnt.ctx = ctx; f_enum_cnt.username = username; - f_enum_cnt.count = *count; - f_enum_cnt.info = *info; + f_enum_cnt.ctr3 = *ctr3; share_mode_forall( enum_file_fn, (void *)&f_enum_cnt ); - *info = f_enum_cnt.info; - *count = f_enum_cnt.count; + *ctr3 = f_enum_cnt.ctr3; return WERR_OK; } @@ -1057,70 +1054,52 @@ static void init_srv_r_net_conn_enum(SRV_R_NET_CONN_ENUM *r_n, } /******************************************************************* - makes a SRV_R_NET_FILE_ENUM structure. -********************************************************************/ + _srvsvc_NetFileEnum +*******************************************************************/ -static WERROR net_file_enum_3( const char *username, SRV_R_NET_FILE_ENUM *r, - uint32 resume_hnd ) +WERROR _srvsvc_NetFileEnum(pipes_struct *p, + struct srvsvc_NetFileEnum *r) { - TALLOC_CTX *ctx = talloc_tos(); - SRV_FILE_INFO_CTR *ctr = &r->ctr; + TALLOC_CTX *ctx = NULL; + struct srvsvc_NetFileCtr3 *ctr3; + uint32_t resume_hnd = 0; + WERROR werr; + + switch (r->in.info_ctr->level) { + case 3: + break; + default: + return WERR_UNKNOWN_LEVEL; + } + + ctx = talloc_tos(); + ctr3 = r->in.info_ctr->ctr.ctr3; + if (!ctr3) { + goto done; + } /* TODO -- Windows enumerates (b) active pipes (c) open directories and files */ - r->status = net_enum_files( ctx, username, &ctr->file.info3, - &ctr->num_entries, resume_hnd ); - if ( !W_ERROR_IS_OK(r->status)) + werr = net_enum_files(ctx, r->in.user, &ctr3, resume_hnd); + if (!W_ERROR_IS_OK(werr)) { goto done; + } - r->status = net_enum_pipes( ctx, username, &ctr->file.info3, - &ctr->num_entries, resume_hnd ); - if ( !W_ERROR_IS_OK(r->status)) + werr = net_enum_pipes(ctx, r->in.user, &ctr3, resume_hnd); + if (!W_ERROR_IS_OK(werr)) { goto done; + } - r->level = ctr->level = 3; - r->total_entries = ctr->num_entries; - /* ctr->num_entries = r->total_entries - resume_hnd; */ - ctr->num_entries2 = ctr->num_entries; - ctr->ptr_file_info = 1; - - r->status = WERR_OK; - -done: - if ( ctr->num_entries > 0 ) - ctr->ptr_entries = 1; - - init_enum_hnd(&r->enum_hnd, 0); - - return r->status; -} - -/******************************************************************* -*******************************************************************/ - -WERROR _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_FILE_ENUM *r_u) -{ - const char *username = NULL; - - switch ( q_u->level ) { - case 3: - if (q_u->username) { - username = rpcstr_pull_unistr2_talloc( - p->mem_ctx, q_u->username); - if (!username) { - return WERR_NOMEM; - } - } + *r->out.totalentries = ctr3->count; + r->out.info_ctr->ctr.ctr3->array = ctr3->array; + r->out.info_ctr->ctr.ctr3->count = ctr3->count; - return net_file_enum_3(username, r_u, - get_enum_hnd(&q_u->enum_hnd)); - default: - return WERR_UNKNOWN_LEVEL; - } + werr = WERR_OK; - return WERR_OK; + done: + return werr; } /******************************************************************* @@ -2505,12 +2484,6 @@ WERROR _srvsvc_NetConnEnum(pipes_struct *p, struct srvsvc_NetConnEnum *r) return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetFileEnum(pipes_struct *p, struct srvsvc_NetFileEnum *r) -{ - p->rng_fault_state = True; - return WERR_NOT_SUPPORTED; -} - WERROR _srvsvc_NetFileGetInfo(pipes_struct *p, struct srvsvc_NetFileGetInfo *r) { p->rng_fault_state = True; -- cgit From 5346641c1c3d5f665a684f7250f82955869ef9a9 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 20 Mar 2008 16:15:38 +0100 Subject: Fix an uninitialized variable warning (This used to be commit 4cc09ec40609484c973361a0cc0f05bfaef1738e) --- source3/rpc_server/srv_srvsvc_nt.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 053f57ec36..15c7d710d0 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1075,6 +1075,7 @@ WERROR _srvsvc_NetFileEnum(pipes_struct *p, ctx = talloc_tos(); ctr3 = r->in.info_ctr->ctr.ctr3; if (!ctr3) { + werr = WERR_INVALID_PARAM; goto done; } -- cgit From a6bbefa1cbe1b996106cabcefefe446ffd22bdc0 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Fri, 21 Mar 2008 01:58:43 +0100 Subject: Use pidl for _srvsvc_NetConnEnum(). Guenther (This used to be commit b8714e03e70070b5dfb1a0b15b191dfac0634c44) --- source3/rpc_server/srv_srvsvc_nt.c | 231 +++++++++++++++---------------------- 1 file changed, 96 insertions(+), 135 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 15c7d710d0..5478a73534 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -902,155 +902,116 @@ static void init_srv_r_net_sess_enum(pipes_struct *p, SRV_R_NET_SESS_ENUM *r_n, fill in a conn info level 0 structure. ********************************************************************/ -static void init_srv_conn_info_0(SRV_CONN_INFO_0 *ss0, uint32 *snum, uint32 *stot) +static WERROR init_srv_conn_info_0(struct srvsvc_NetConnCtr0 *ctr0, + uint32_t *resume_handle_p, + uint32_t *total_entries) { - uint32 num_entries = 0; - (*stot) = 1; + uint32_t num_entries = 0; + uint32_t resume_handle = resume_handle_p ? *resume_handle_p : 0; - if (ss0 == NULL) { - (*snum) = 0; - return; + DEBUG(5,("init_srv_conn_info_0\n")); + + if (ctr0 == NULL) { + if (resume_handle_p) { + *resume_handle_p = 0; + } + return WERR_OK; } - DEBUG(5,("init_srv_conn_0_ss0\n")); + *total_entries = 1; - if (snum) { - for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) { + ZERO_STRUCTP(ctr0); - init_srv_conn_info0(&ss0->info_0[num_entries], (*stot)); + for (; resume_handle < *total_entries && num_entries < MAX_CONN_ENTRIES; resume_handle++) { - /* move on to creating next connection */ - /* move on to creating next conn */ - num_entries++; + ctr0->array = TALLOC_REALLOC_ARRAY(talloc_tos(), + ctr0->array, + struct srvsvc_NetConnInfo0, + num_entries+1); + if (!ctr0->array) { + return WERR_NOMEM; } - ss0->num_entries_read = num_entries; - ss0->ptr_conn_info = num_entries > 0 ? 1 : 0; - ss0->num_entries_read2 = num_entries; + init_srvsvc_NetConnInfo0(&ctr0->array[num_entries], + (*total_entries)); - if ((*snum) >= (*stot)) { - (*snum) = 0; - } + /* move on to creating next connection */ + num_entries++; + } - } else { - ss0->num_entries_read = 0; - ss0->ptr_conn_info = 0; - ss0->num_entries_read2 = 0; + ctr0->count = num_entries; + *total_entries = num_entries; - (*stot) = 0; + if (resume_handle_p) { + if (*resume_handle_p >= *total_entries) { + *resume_handle_p = 0; + } else { + *resume_handle_p = resume_handle; + } } -} - -/******************************************************************* - fill in a conn info level 1 structure. - ********************************************************************/ -static void init_srv_conn_1_info(CONN_INFO_1 *se1, CONN_INFO_1_STR *str1, - uint32 id, uint32 type, - uint32 num_opens, uint32 num_users, uint32 open_time, - const char *usr_name, const char *net_name) -{ - init_srv_conn_info1(se1 , id, type, num_opens, num_users, open_time, usr_name, net_name); - init_srv_conn_info1_str(str1, usr_name, net_name); + return WERR_OK; } /******************************************************************* fill in a conn info level 1 structure. ********************************************************************/ -static void init_srv_conn_info_1(SRV_CONN_INFO_1 *ss1, uint32 *snum, uint32 *stot) +static WERROR init_srv_conn_info_1(struct srvsvc_NetConnCtr1 *ctr1, + uint32_t *resume_handle_p, + uint32_t *total_entries) { - uint32 num_entries = 0; - (*stot) = 1; - - if (ss1 == NULL) { - (*snum) = 0; - return; - } - - DEBUG(5,("init_srv_conn_1_ss1\n")); + uint32_t num_entries = 0; + uint32_t resume_handle = resume_handle_p ? *resume_handle_p : 0; - if (snum) { - for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) { - init_srv_conn_1_info(&ss1->info_1[num_entries], - &ss1->info_1_str[num_entries], - (*stot), 0x3, 1, 1, 3,"dummy_user", "IPC$"); + DEBUG(5,("init_srv_conn_info_1\n")); - /* move on to creating next connection */ - /* move on to creating next conn */ - num_entries++; + if (ctr1 == NULL) { + if (resume_handle_p) { + *resume_handle_p = 0; } + return WERR_OK; + } - ss1->num_entries_read = num_entries; - ss1->ptr_conn_info = num_entries > 0 ? 1 : 0; - ss1->num_entries_read2 = num_entries; + *total_entries = 1; + ZERO_STRUCTP(ctr1); - if ((*snum) >= (*stot)) { - (*snum) = 0; + for (; (resume_handle < *total_entries) && num_entries < MAX_CONN_ENTRIES; resume_handle++) { + + ctr1->array = TALLOC_REALLOC_ARRAY(talloc_tos(), + ctr1->array, + struct srvsvc_NetConnInfo1, + num_entries+1); + if (!ctr1->array) { + return WERR_NOMEM; } - } else { - ss1->num_entries_read = 0; - ss1->ptr_conn_info = 0; - ss1->num_entries_read2 = 0; + init_srvsvc_NetConnInfo1(&ctr1->array[num_entries], + (*total_entries), + 0x3, + 1, + 1, + 3, + "dummy_user", + "IPC$"); - (*stot) = 0; + /* move on to creating next connection */ + num_entries++; } -} - -/******************************************************************* - makes a SRV_R_NET_CONN_ENUM structure. -********************************************************************/ -static WERROR init_srv_conn_info_ctr(SRV_CONN_INFO_CTR *ctr, - int switch_value, uint32 *resume_hnd, uint32 *total_entries) -{ - WERROR status = WERR_OK; - DEBUG(5,("init_srv_conn_info_ctr: %d\n", __LINE__)); + ctr1->count = num_entries; + *total_entries = num_entries; - ctr->switch_value = switch_value; - - switch (switch_value) { - case 0: - init_srv_conn_info_0(&ctr->conn.info0, resume_hnd, total_entries); - ctr->ptr_conn_ctr = 1; - break; - case 1: - init_srv_conn_info_1(&ctr->conn.info1, resume_hnd, total_entries); - ctr->ptr_conn_ctr = 1; - break; - default: - DEBUG(5,("init_srv_conn_info_ctr: unsupported switch value %d\n", switch_value)); - (*resume_hnd = 0); - (*total_entries) = 0; - ctr->ptr_conn_ctr = 0; - status = WERR_UNKNOWN_LEVEL; - break; + if (resume_handle_p) { + if (*resume_handle_p >= *total_entries) { + *resume_handle_p = 0; + } else { + *resume_handle_p = resume_handle; + } } - return status; -} - -/******************************************************************* - makes a SRV_R_NET_CONN_ENUM structure. -********************************************************************/ - -static void init_srv_r_net_conn_enum(SRV_R_NET_CONN_ENUM *r_n, - uint32 resume_hnd, int conn_level, int switch_value) -{ - DEBUG(5,("init_srv_r_net_conn_enum: %d\n", __LINE__)); - - r_n->conn_level = conn_level; - if (conn_level == -1) - r_n->status = WERR_UNKNOWN_LEVEL; - else - r_n->status = init_srv_conn_info_ctr(r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries); - - if (!W_ERROR_IS_OK(r_n->status)) - resume_hnd = 0; - - init_enum_hnd(&r_n->enum_hnd, resume_hnd); + return WERR_OK; } /******************************************************************* @@ -1212,28 +1173,34 @@ WERROR _srvsvc_NetSrvSetInfo(pipes_struct *p, } /******************************************************************* -net conn enum + _srvsvc_NetConnEnum ********************************************************************/ -WERROR _srv_net_conn_enum(pipes_struct *p, SRV_Q_NET_CONN_ENUM *q_u, SRV_R_NET_CONN_ENUM *r_u) +WERROR _srvsvc_NetConnEnum(pipes_struct *p, + struct srvsvc_NetConnEnum *r) { - DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__)); - - r_u->ctr = TALLOC_P(p->mem_ctx, SRV_CONN_INFO_CTR); - if (!r_u->ctr) - return WERR_NOMEM; + WERROR werr; - ZERO_STRUCTP(r_u->ctr); + DEBUG(5,("_srvsvc_NetConnEnum: %d\n", __LINE__)); - /* set up the */ - init_srv_r_net_conn_enum(r_u, - get_enum_hnd(&q_u->enum_hnd), - q_u->conn_level, - q_u->ctr->switch_value); + switch (r->in.info_ctr->level) { + case 0: + werr = init_srv_conn_info_0(r->in.info_ctr->ctr.ctr0, + r->in.resume_handle, + r->out.totalentries); + break; + case 1: + werr = init_srv_conn_info_1(r->in.info_ctr->ctr.ctr1, + r->in.resume_handle, + r->out.totalentries); + break; + default: + return WERR_UNKNOWN_LEVEL; + } - DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__)); + DEBUG(5,("_srvsvc_NetConnEnum: %d\n", __LINE__)); - return r_u->status; + return werr; } /******************************************************************* @@ -2479,12 +2446,6 @@ WERROR _srvsvc_NetCharDevQPurgeSelf(pipes_struct *p, struct srvsvc_NetCharDevQPu return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetConnEnum(pipes_struct *p, struct srvsvc_NetConnEnum *r) -{ - p->rng_fault_state = True; - return WERR_NOT_SUPPORTED; -} - WERROR _srvsvc_NetFileGetInfo(pipes_struct *p, struct srvsvc_NetFileGetInfo *r) { p->rng_fault_state = True; -- cgit From 08213f706ed600efc6afa5f4bb2cb7e603ee193e Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Fri, 21 Mar 2008 03:51:37 +0100 Subject: Use pidl for _srvsvc_NetSessEnum(). Guenther (This used to be commit 5d14938b14f8e59608771b1899fd473d63f3bde1) --- source3/rpc_server/srv_srvsvc_nt.c | 228 ++++++++++++++++--------------------- 1 file changed, 95 insertions(+), 133 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 5478a73534..c8f21b76bb 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -711,40 +711,49 @@ static WERROR init_srv_share_info_ctr(pipes_struct *p, fill in a sess info level 0 structure. ********************************************************************/ -static void init_srv_sess_info_0(pipes_struct *p, SRV_SESS_INFO_0 *ss0, uint32 *snum, uint32 *stot) +static WERROR init_srv_sess_info_0(pipes_struct *p, + struct srvsvc_NetSessCtr0 *ctr0, + uint32_t *resume_handle_p, + uint32_t *total_entries) { struct sessionid *session_list; - uint32 num_entries = 0; - (*stot) = list_sessions(p->mem_ctx, &session_list); + uint32_t num_entries = 0; + uint32_t resume_handle = resume_handle_p ? *resume_handle_p : 0; + *total_entries = list_sessions(p->mem_ctx, &session_list); - if (ss0 == NULL) { - if (snum) { - (*snum) = 0; + DEBUG(5,("init_srv_sess_info_0\n")); + + if (ctr0 == NULL) { + if (resume_handle_p) { + *resume_handle_p = 0; } - return; + return WERR_OK; } - DEBUG(5,("init_srv_sess_0_ss0\n")); + for (; resume_handle < *total_entries && num_entries < MAX_SESS_ENTRIES; resume_handle++) { - if (snum) { - for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) { - init_srv_sess_info0( &ss0->info_0[num_entries], session_list[(*snum)].remote_machine); - num_entries++; - } + ctr0->array = TALLOC_REALLOC_ARRAY(p->mem_ctx, + ctr0->array, + struct srvsvc_NetSessInfo0, + num_entries+1); + W_ERROR_HAVE_NO_MEMORY(ctr0->array); - ss0->num_entries_read = num_entries; - ss0->ptr_sess_info = num_entries > 0 ? 1 : 0; - ss0->num_entries_read2 = num_entries; + init_srvsvc_NetSessInfo0(&ctr0->array[num_entries], + session_list[resume_handle].remote_machine); + num_entries++; + } - if ((*snum) >= (*stot)) { - (*snum) = 0; - } + ctr0->count = num_entries; - } else { - ss0->num_entries_read = 0; - ss0->ptr_sess_info = 0; - ss0->num_entries_read2 = 0; + if (resume_handle_p) { + if (*resume_handle_p >= *total_entries) { + *resume_handle_p = 0; + } else { + *resume_handle_p = resume_handle; + } } + + return WERR_OK; } /******************************************************************* @@ -783,119 +792,70 @@ static int net_count_files( uid_t uid, struct server_id pid ) fill in a sess info level 1 structure. ********************************************************************/ -static void init_srv_sess_info_1(pipes_struct *p, SRV_SESS_INFO_1 *ss1, uint32 *snum, uint32 *stot) +static WERROR init_srv_sess_info_1(pipes_struct *p, + struct srvsvc_NetSessCtr1 *ctr1, + uint32_t *resume_handle_p, + uint32_t *total_entries) { struct sessionid *session_list; - uint32 num_entries = 0; + uint32_t num_entries = 0; time_t now = time(NULL); + uint32_t resume_handle = resume_handle_p ? *resume_handle_p : 0; - if ( !snum ) { - ss1->num_entries_read = 0; - ss1->ptr_sess_info = 0; - ss1->num_entries_read2 = 0; - - (*stot) = 0; - - return; - } + ZERO_STRUCTP(ctr1); - if (ss1 == NULL) { - (*snum) = 0; - return; + if (ctr1 == NULL) { + if (resume_handle_p) { + *resume_handle_p = 0; + } + return WERR_OK; } - (*stot) = list_sessions(p->mem_ctx, &session_list); + *total_entries = list_sessions(p->mem_ctx, &session_list); - - for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) { + for (; resume_handle < *total_entries && num_entries < MAX_SESS_ENTRIES; resume_handle++) { uint32 num_files; uint32 connect_time; - struct passwd *pw = sys_getpwnam(session_list[*snum].username); + struct passwd *pw = sys_getpwnam(session_list[resume_handle].username); bool guest; if ( !pw ) { DEBUG(10,("init_srv_sess_info_1: failed to find owner: %s\n", - session_list[*snum].username)); + session_list[resume_handle].username)); continue; } - connect_time = (uint32)(now - session_list[*snum].connect_start); - num_files = net_count_files(pw->pw_uid, session_list[*snum].pid); - guest = strequal( session_list[*snum].username, lp_guestaccount() ); + connect_time = (uint32_t)(now - session_list[resume_handle].connect_start); + num_files = net_count_files(pw->pw_uid, session_list[resume_handle].pid); + guest = strequal( session_list[resume_handle].username, lp_guestaccount() ); - init_srv_sess_info1( &ss1->info_1[num_entries], - session_list[*snum].remote_machine, - session_list[*snum].username, - num_files, - connect_time, - 0, - guest); + ctr1->array = TALLOC_REALLOC_ARRAY(p->mem_ctx, + ctr1->array, + struct srvsvc_NetSessInfo1, + num_entries+1); + W_ERROR_HAVE_NO_MEMORY(ctr1->array); + + init_srvsvc_NetSessInfo1(&ctr1->array[num_entries], + session_list[resume_handle].remote_machine, + session_list[resume_handle].username, + num_files, + connect_time, + 0, + guest); num_entries++; } - ss1->num_entries_read = num_entries; - ss1->ptr_sess_info = num_entries > 0 ? 1 : 0; - ss1->num_entries_read2 = num_entries; - - if ((*snum) >= (*stot)) { - (*snum) = 0; - } - -} - -/******************************************************************* - makes a SRV_R_NET_SESS_ENUM structure. -********************************************************************/ - -static WERROR init_srv_sess_info_ctr(pipes_struct *p, SRV_SESS_INFO_CTR *ctr, - int switch_value, uint32 *resume_hnd, uint32 *total_entries) -{ - WERROR status = WERR_OK; - DEBUG(5,("init_srv_sess_info_ctr: %d\n", __LINE__)); - - ctr->switch_value = switch_value; + ctr1->count = num_entries; - switch (switch_value) { - case 0: - init_srv_sess_info_0(p, &(ctr->sess.info0), resume_hnd, total_entries); - ctr->ptr_sess_ctr = 1; - break; - case 1: - init_srv_sess_info_1(p, &(ctr->sess.info1), resume_hnd, total_entries); - ctr->ptr_sess_ctr = 1; - break; - default: - DEBUG(5,("init_srv_sess_info_ctr: unsupported switch value %d\n", switch_value)); - (*resume_hnd) = 0; - (*total_entries) = 0; - ctr->ptr_sess_ctr = 0; - status = WERR_UNKNOWN_LEVEL; - break; + if (resume_handle_p) { + if (*resume_handle_p >= *total_entries) { + *resume_handle_p = 0; + } else { + *resume_handle_p = resume_handle; + } } - return status; -} - -/******************************************************************* - makes a SRV_R_NET_SESS_ENUM structure. -********************************************************************/ - -static void init_srv_r_net_sess_enum(pipes_struct *p, SRV_R_NET_SESS_ENUM *r_n, - uint32 resume_hnd, int sess_level, int switch_value) -{ - DEBUG(5,("init_srv_r_net_sess_enum: %d\n", __LINE__)); - - r_n->sess_level = sess_level; - - if (sess_level == -1) - r_n->status = WERR_UNKNOWN_LEVEL; - else - r_n->status = init_srv_sess_info_ctr(p, r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries); - - if (!W_ERROR_IS_OK(r_n->status)) - resume_hnd = 0; - - init_enum_hnd(&r_n->enum_hnd, resume_hnd); + return WERR_OK; } /******************************************************************* @@ -1204,28 +1164,36 @@ WERROR _srvsvc_NetConnEnum(pipes_struct *p, } /******************************************************************* -net sess enum + _srvsvc_NetSessEnum ********************************************************************/ -WERROR _srv_net_sess_enum(pipes_struct *p, SRV_Q_NET_SESS_ENUM *q_u, SRV_R_NET_SESS_ENUM *r_u) +WERROR _srvsvc_NetSessEnum(pipes_struct *p, + struct srvsvc_NetSessEnum *r) { - DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__)); - - r_u->ctr = TALLOC_P(p->mem_ctx, SRV_SESS_INFO_CTR); - if (!r_u->ctr) - return WERR_NOMEM; + WERROR werr; - ZERO_STRUCTP(r_u->ctr); + DEBUG(5,("_srvsvc_NetSessEnum: %d\n", __LINE__)); - /* set up the */ - init_srv_r_net_sess_enum(p, r_u, - get_enum_hnd(&q_u->enum_hnd), - q_u->sess_level, - q_u->ctr->switch_value); + switch (r->in.info_ctr->level) { + case 0: + werr = init_srv_sess_info_0(p, + r->in.info_ctr->ctr.ctr0, + r->in.resume_handle, + r->out.totalentries); + break; + case 1: + werr = init_srv_sess_info_1(p, + r->in.info_ctr->ctr.ctr1, + r->in.resume_handle, + r->out.totalentries); + break; + default: + return WERR_UNKNOWN_LEVEL; + } - DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__)); + DEBUG(5,("_srvsvc_NetSessEnum: %d\n", __LINE__)); - return r_u->status; + return werr; } /******************************************************************* @@ -2452,12 +2420,6 @@ WERROR _srvsvc_NetFileGetInfo(pipes_struct *p, struct srvsvc_NetFileGetInfo *r) return WERR_NOT_SUPPORTED; } -WERROR _srvsvc_NetSessEnum(pipes_struct *p, struct srvsvc_NetSessEnum *r) -{ - p->rng_fault_state = True; - return WERR_NOT_SUPPORTED; -} - WERROR _srvsvc_NetShareCheck(pipes_struct *p, struct srvsvc_NetShareCheck *r) { p->rng_fault_state = True; -- cgit From 1dc52e8fbf1d9e56ff7fdcd1c637e21e6b23e456 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Fri, 21 Mar 2008 03:56:54 +0100 Subject: Move MAX.*ENTRY definitions out of old rpc srvsvc parsing code. Guenther (This used to be commit 4e36657275caa77bc9712fe627aeb6fe4aefc151) --- source3/rpc_server/srv_srvsvc_nt.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index c8f21b76bb..adbe3f684b 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -29,6 +29,21 @@ extern const struct generic_mapping file_generic_mapping; #undef DBGC_CLASS #define DBGC_CLASS DBGC_RPC_SRV +#define MAX_SERVER_DISK_ENTRIES 15 + +/***************************/ + +/* oops - this is going to take up a *massive* amount of stack. */ +/* the UNISTR2s already have 1024 uint16 chars in them... */ + +#define MAX_SESS_ENTRIES 32 + +/***************************/ + +/* oops - this is going to take up a *massive* amount of stack. */ +/* the UNISTR2s already have 1024 uint16 chars in them... */ +#define MAX_CONN_ENTRIES 32 + /* Use for enumerating connections, pipes, & files */ struct file_enum_count { -- cgit From 7c8e66210d1c327fad0378f3ed215809e02bb0cd Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Fri, 21 Mar 2008 04:13:49 +0100 Subject: Add my copyright. Guenther (This used to be commit 4689057f63599ebaf9ce658ca3b3168b2bbe531f) --- source3/rpc_server/srv_srvsvc_nt.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index adbe3f684b..a89a99646b 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -5,6 +5,7 @@ * Copyright (C) Jeremy Allison 2001. * Copyright (C) Nigel Williams 2001. * Copyright (C) Gerald (Jerry) Carter 2006. + * Copyright (C) Guenther Deschner 2008. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by -- cgit From 35cab4a8c27b3471557bbbd04d8bcf49dfec51c0 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Fri, 21 Mar 2008 10:28:33 +0100 Subject: Fix Coverity ID 548 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Günther, please check -- in all infolevels we do a comment=talloc_strdup Thanks, Volker (This used to be commit e2021c5b5710768968ae724220eb1e3f47c9e639) --- source3/rpc_server/srv_srvsvc_nt.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index a89a99646b..8359511939 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1580,6 +1580,10 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, if (type != STYPE_DISKTREE) return WERR_ACCESS_DENIED; + if (comment == NULL) { + return WERR_NOMEM; + } + /* Check if the pathname is valid. */ if (!(path = valid_share_pathname(p->mem_ctx, pathname ))) return WERR_OBJECT_PATH_INVALID; @@ -1587,9 +1591,7 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, /* Ensure share name, pathname and comment don't contain '"' characters. */ string_replace(share_name, '"', ' '); string_replace(path, '"', ' '); - if (comment) { - string_replace(comment, '"', ' '); - } + string_replace(comment, '"', ' '); DEBUG(10,("_srvsvc_NetShareSetInfo: change share command = %s\n", lp_change_share_cmd() ? lp_change_share_cmd() : "NULL" )); -- cgit From dbe34cf0aeaeb66d3d505845b2b2c4ec5572741a Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Mon, 31 Mar 2008 22:49:03 +0200 Subject: Fix _srvsvc_NetShareSetInfo. Guenther (This used to be commit 2fd90b62d7e61fa0c23f8f41e9f12fc16f29a8b1) --- source3/rpc_server/srv_srvsvc_nt.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 8359511939..6d7561ed5f 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -1484,7 +1484,9 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, return WERR_NOMEM; } - *r->out.parm_error = 0; + if (r->out.parm_error) { + *r->out.parm_error = 0; + } if ( strequal(share_name,"IPC$") || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) @@ -1515,8 +1517,8 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, switch (r->in.level) { case 1: pathname = talloc_strdup(ctx, lp_pathname(snum)); - comment = talloc_strdup(ctx, info->info2->comment); - type = info->info2->type; + comment = talloc_strdup(ctx, info->info1->comment); + type = info->info1->type; psd = NULL; break; case 2: -- cgit From 9afc225b377c29a851150af2fddfb26050cbf4a9 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Mon, 31 Mar 2008 23:51:34 +0200 Subject: Fix SRVSVC ShareInfo max_users handling server side. Guenther (This used to be commit b4d944e724f7ae2a97ba788b185aba7b7308b475) --- source3/rpc_server/srv_srvsvc_nt.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 6d7561ed5f..57b42af4e5 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -291,7 +291,7 @@ static void init_srv_share_info_2(pipes_struct *p, struct srvsvc_NetShareInfo2 * char *remark = NULL; char *path = NULL; int max_connections = lp_max_connections(snum); - uint32 max_uses = max_connections!=0 ? max_connections : 0xffffffff; + uint32_t max_uses = max_connections!=0 ? max_connections : (uint32_t)-1; int count = 0; char *net_name = lp_servicename(snum); @@ -401,7 +401,7 @@ static void init_srv_share_info_502(pipes_struct *p, struct srvsvc_NetShareInfo5 get_share_type(snum), remark ? remark : "", 0, - 0xffffffff, + (uint32_t)-1, 1, path ? path : "", "", @@ -447,7 +447,7 @@ static void init_srv_share_info_1005(pipes_struct *p, struct srvsvc_NetShareInfo static void init_srv_share_info_1006(pipes_struct *p, struct srvsvc_NetShareInfo1006 *r, int snum) { - init_srvsvc_NetShareInfo1006(r, 0xffffffff); + init_srvsvc_NetShareInfo1006(r, (uint32_t)-1); } /*************************************************************************** @@ -1525,7 +1525,7 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, comment = talloc_strdup(ctx, info->info2->comment); pathname = info->info2->path; type = info->info2->type; - max_connections = (info->info2->max_users == 0xffffffff) ? + max_connections = (info->info2->max_users == (uint32_t)-1) ? 0 : info->info2->max_users; psd = NULL; break; @@ -1720,7 +1720,7 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, share_name = talloc_strdup(ctx, r->in.info->info2->name); comment = talloc_strdup(ctx, r->in.info->info2->comment); pathname = talloc_strdup(ctx, r->in.info->info2->path); - max_connections = (r->in.info->info2->max_users == 0xffffffff) ? + max_connections = (r->in.info->info2->max_users == (uint32_t)-1) ? 0 : r->in.info->info2->max_users; type = r->in.info->info2->type; break; @@ -1731,7 +1731,7 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, share_name = talloc_strdup(ctx, r->in.info->info502->name); comment = talloc_strdup(ctx, r->in.info->info502->comment); pathname = talloc_strdup(ctx, r->in.info->info502->path); - max_connections = (r->in.info->info502->max_users == 0xffffffff) ? + max_connections = (r->in.info->info502->max_users == (uint32_t)-1) ? 0 : r->in.info->info502->max_users; type = r->in.info->info502->type; psd = r->in.info->info502->sd; -- cgit From a3991c9ef40b221ecd36344d65e723e357d8b3c7 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Tue, 1 Apr 2008 00:02:48 +0200 Subject: Fix SRVSVC ShareInfo level 502 server side handling. Guenther (This used to be commit 776facabf6f09f643d6dc526aa83f8db517465f9) --- source3/rpc_server/srv_srvsvc_nt.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 57b42af4e5..7188360f69 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -379,6 +379,7 @@ static void init_srv_share_info_502(pipes_struct *p, struct srvsvc_NetShareInfo5 const char *net_name = lp_servicename(snum); char *path = NULL; SEC_DESC *sd = NULL; + struct sec_desc_buf *sd_buf = NULL; size_t sd_size = 0; TALLOC_CTX *ctx = p->mem_ctx; char *remark = talloc_strdup(ctx, lp_comment(snum));; @@ -397,6 +398,8 @@ static void init_srv_share_info_502(pipes_struct *p, struct srvsvc_NetShareInfo5 sd = get_share_security(ctx, lp_servicename(snum), &sd_size); + sd_buf = make_sec_desc_buf(p->mem_ctx, sd_size, sd); + init_srvsvc_NetShareInfo502(r, net_name, get_share_type(snum), remark ? remark : "", @@ -405,8 +408,7 @@ static void init_srv_share_info_502(pipes_struct *p, struct srvsvc_NetShareInfo5 1, path ? path : "", "", - 0, - sd); + sd_buf); } /*************************************************************************** @@ -1541,7 +1543,7 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, comment = talloc_strdup(ctx, info->info502->comment); pathname = info->info502->path; type = info->info502->type; - psd = info->info502->sd; + psd = info->info502->sd_buf.sd; map_generic_share_sd_bits(psd); break; case 1004: @@ -1734,7 +1736,7 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, max_connections = (r->in.info->info502->max_users == (uint32_t)-1) ? 0 : r->in.info->info502->max_users; type = r->in.info->info502->type; - psd = r->in.info->info502->sd; + psd = r->in.info->info502->sd_buf.sd; map_generic_share_sd_bits(psd); break; -- cgit From b430b382202858a6c52c1cacbb91910b2dd7e16c Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 2 May 2008 17:22:10 -0700 Subject: Remove the "stat_open()" function, flag, and all associated code. It was only being (correctly) used in the can_read/can_write checks for hide unreadable/unwritable and this is more properly done using the functions in smbd/file_access.c. Preparing to do NT access checks on all file access. Jeremy. (This used to be commit 6bfb06ad95963ae2acb67c4694a98282d3b29faa) --- source3/rpc_server/srv_srvsvc_nt.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 7188360f69..1b578cc9f8 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2206,13 +2206,20 @@ WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, goto error_exit; } - nt_status = open_file_stat(conn, NULL, filename, &st, &fsp); + nt_status = open_file_ntcreate(conn, NULL, filename, &st, + FILE_WRITE_ATTRIBUTES, + FILE_SHARE_READ|FILE_SHARE_WRITE, + FILE_OPEN, + 0, + FILE_ATTRIBUTE_NORMAL, + INTERNAL_OPEN_ONLY, + NULL, &fsp); if ( !NT_STATUS_IS_OK(nt_status) ) { /* Perhaps it is a directory */ if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY)) nt_status = open_directory(conn, NULL, filename, &st, - FILE_READ_ATTRIBUTES, + FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, 0, -- cgit From 00b2cdf75e9bea25034440054b4acd91a179c86d Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 8 May 2008 18:09:07 -0700 Subject: Yay ! Remove a VFS entry. Removed the set_nt_acl() call, this can only be done via fset_nt_acl() using an open file/directory handle. I'd like to do the same with get_nt_acl() but am concerned about efficiency problems with "hide unreadable/hide unwritable" when doing a directory listing (this would mean opening every file in the dir on list). Moving closer to rationalizing the ACL model and maybe moving the POSIX calls into a posix_acl VFS module rather than having them as first class citizens of the VFS. Jeremy. (This used to be commit f487f742cb903a06fbf2be006ddc9ce9063339ed) --- source3/rpc_server/srv_srvsvc_nt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 1b578cc9f8..18c6f4de53 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2233,7 +2233,7 @@ WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, } } - nt_status = SMB_VFS_SET_NT_ACL(fsp, fsp->fsp_name, + nt_status = SMB_VFS_FSET_NT_ACL(fsp, r->in.securityinformation, r->in.sd_buf->sd); -- cgit From 3f76504d92e0bde89472e569acd64494729778a5 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 9 May 2008 11:14:45 -0700 Subject: Remove a couple of uses of SMB_VFS_GET_NT_ACL(), use SMB_VFS_FGET_NT_ACL instead. I'd like to ultimately remove SMB_VFS_GET_NT_ACL. Jeremy. (This used to be commit 4221937b68e2414295279b27c5f12a80f826ed4b) --- source3/rpc_server/srv_srvsvc_nt.c | 55 +++++++++++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 13 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 18c6f4de53..947ad46568 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2029,20 +2029,18 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, char *qualname = NULL; SMB_STRUCT_STAT st; NTSTATUS nt_status; - WERROR werr; + WERROR werr = WERR_ACCESS_DENIED; struct current_user user; connection_struct *conn = NULL; bool became_user = False; TALLOC_CTX *ctx = p->mem_ctx; - struct sec_desc_buf *sd_buf; + struct sec_desc_buf *sd_buf = NULL; + files_struct *fsp = NULL; ZERO_STRUCT(st); - werr = WERR_OK; - qualname = talloc_strdup(ctx, r->in.share); if (!qualname) { - werr = WERR_ACCESS_DENIED; goto error_exit; } @@ -2064,14 +2062,12 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, if (!become_user(conn, conn->vuid)) { DEBUG(0,("_srvsvc_NetGetFileSecurity: Can't become connected user!\n")); - werr = WERR_ACCESS_DENIED; goto error_exit; } became_user = True; filename_in = talloc_strdup(ctx, r->in.file); if (!filename_in) { - werr = WERR_ACCESS_DENIED; goto error_exit; } @@ -2079,7 +2075,6 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, if (!NT_STATUS_IS_OK(nt_status)) { DEBUG(3,("_srvsvc_NetGetFileSecurity: bad pathname %s\n", filename)); - werr = WERR_ACCESS_DENIED; goto error_exit; } @@ -2087,11 +2082,37 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, if (!NT_STATUS_IS_OK(nt_status)) { DEBUG(3,("_srvsvc_NetGetFileSecurity: can't access %s\n", filename)); - werr = WERR_ACCESS_DENIED; goto error_exit; } - nt_status = SMB_VFS_GET_NT_ACL(conn, filename, + if (!(S_ISDIR(st.st_mode))) { + nt_status = open_file_ntcreate(conn, NULL, filename, &st, + FILE_READ_ATTRIBUTES, + FILE_SHARE_READ|FILE_SHARE_WRITE, + FILE_OPEN, + 0, + FILE_ATTRIBUTE_NORMAL, + 0, + NULL, &fsp); + + } else { + nt_status = open_directory(conn, NULL, filename, &st, + FILE_READ_ATTRIBUTES, + FILE_SHARE_READ|FILE_SHARE_WRITE, + FILE_OPEN, + 0, + FILE_ATTRIBUTE_DIRECTORY, + NULL, &fsp); + } + + if (!NT_STATUS_IS_OK(nt_status)) { + DEBUG(3,("_srvsvc_NetGetFileSecurity: can't open %s\n", + filename)); + werr = ntstatus_to_werror(nt_status); + goto error_exit; + } + + nt_status = SMB_VFS_FGET_NT_ACL(fsp, (OWNER_SECURITY_INFORMATION |GROUP_SECURITY_INFORMATION |DACL_SECURITY_INFORMATION), &psd); @@ -2118,17 +2139,25 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, psd->dacl->revision = NT4_ACL_REVISION; + close_file(fsp, NORMAL_CLOSE); + unbecome_user(); close_cnum(conn, user.vuid); - return werr; + return WERR_OK; error_exit: - if (became_user) + if(fsp) { + close_file(fsp, NORMAL_CLOSE); + } + + if (became_user) { unbecome_user(); + } - if (conn) + if (conn) { close_cnum(conn, user.vuid); + } return werr; } -- cgit From 537dc11bf4825472178a64837838ac17111a85f3 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 22 May 2008 14:28:13 -0700 Subject: Fix 2 bugs with displaying open file state. Firstly the IDL is documented incorrectly in the MS-DOCS. Username and path need to be reversed (yes I will raise this with MS). Secondly, we need to check access_mask for the permissions, not share_access (share_access are the deny modes). Jeremy. (This used to be commit bdaad19f90e991aba2afccfa13afbbfe2ac7baaf) --- source3/rpc_server/srv_srvsvc_nt.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 947ad46568..5e17693bfa 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -105,8 +105,8 @@ static int pipe_enum_fn( struct db_record *rec, void *p) (uint32_t)((procid_to_pid(&prec.pid)<<16) & prec.pnum), (FILE_READ_DATA|FILE_WRITE_DATA), 0, - fullpath, - username); + username, + fullpath); fenum->ctr3->count++; @@ -200,7 +200,7 @@ static void enum_file_fn( const struct share_mode_entry *e, string_replace( fullpath, '/', '\\' ); /* mask out create (what ever that is) */ - permissions = e->share_access & (FILE_READ_DATA|FILE_WRITE_DATA); + permissions = e->access_mask & (FILE_READ_DATA|FILE_WRITE_DATA); /* now fill in the srvsvc_NetFileInfo3 struct */ init_srvsvc_NetFileInfo3(&fenum->ctr3->array[i], -- cgit From ac65ed4aad4f2d6b59c721a3e2eead6996df4069 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 22 May 2008 14:36:09 -0700 Subject: Arggh. Got the path/user the wrong way around. IDL is correct :-). Jeremy. (This used to be commit 2281274480d8cf9e773874301dbbc7bf06346901) --- source3/rpc_server/srv_srvsvc_nt.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 5e17693bfa..ebbc39c304 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -105,8 +105,8 @@ static int pipe_enum_fn( struct db_record *rec, void *p) (uint32_t)((procid_to_pid(&prec.pid)<<16) & prec.pnum), (FILE_READ_DATA|FILE_WRITE_DATA), 0, - username, - fullpath); + fullpath, + username); fenum->ctr3->count++; @@ -207,8 +207,8 @@ static void enum_file_fn( const struct share_mode_entry *e, e->share_file_id, permissions, num_locks, - username, - fullpath); + fullpath, + username); fenum->ctr3->count++; } -- cgit From 8c926ed0ea2522cd8a3a69890cdf692a9c8fb23f Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 22 May 2008 16:19:26 -0700 Subject: Arggh. Got the path/user the wrong way around. IDL is correct :-). Jeremy. (This used to be commit 1078b5c53ae9d6f9532eecebf9cf4a1712200b7e) --- source3/rpc_server/srv_srvsvc_nt.c | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index ebbc39c304..9ffe9a569f 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -32,19 +32,6 @@ extern const struct generic_mapping file_generic_mapping; #define MAX_SERVER_DISK_ENTRIES 15 -/***************************/ - -/* oops - this is going to take up a *massive* amount of stack. */ -/* the UNISTR2s already have 1024 uint16 chars in them... */ - -#define MAX_SESS_ENTRIES 32 - -/***************************/ - -/* oops - this is going to take up a *massive* amount of stack. */ -/* the UNISTR2s already have 1024 uint16 chars in them... */ -#define MAX_CONN_ENTRIES 32 - /* Use for enumerating connections, pipes, & files */ struct file_enum_count { @@ -102,7 +89,7 @@ static int pipe_enum_fn( struct db_record *rec, void *p) fenum->ctr3->array = f; init_srvsvc_NetFileInfo3(&fenum->ctr3->array[i], - (uint32_t)((procid_to_pid(&prec.pid)<<16) & prec.pnum), + (((uint32_t)(procid_to_pid(&prec.pid))<<16) | prec.pnum), (FILE_READ_DATA|FILE_WRITE_DATA), 0, fullpath, @@ -204,7 +191,7 @@ static void enum_file_fn( const struct share_mode_entry *e, /* now fill in the srvsvc_NetFileInfo3 struct */ init_srvsvc_NetFileInfo3(&fenum->ctr3->array[i], - e->share_file_id, + (((uint32_t)(procid_to_pid(&e->pid))<<16) | e->share_file_id), permissions, num_locks, fullpath, @@ -748,7 +735,7 @@ static WERROR init_srv_sess_info_0(pipes_struct *p, return WERR_OK; } - for (; resume_handle < *total_entries && num_entries < MAX_SESS_ENTRIES; resume_handle++) { + for (; resume_handle < *total_entries; resume_handle++) { ctr0->array = TALLOC_REALLOC_ARRAY(p->mem_ctx, ctr0->array, @@ -831,7 +818,7 @@ static WERROR init_srv_sess_info_1(pipes_struct *p, *total_entries = list_sessions(p->mem_ctx, &session_list); - for (; resume_handle < *total_entries && num_entries < MAX_SESS_ENTRIES; resume_handle++) { + for (; resume_handle < *total_entries; resume_handle++) { uint32 num_files; uint32 connect_time; struct passwd *pw = sys_getpwnam(session_list[resume_handle].username); @@ -900,7 +887,7 @@ static WERROR init_srv_conn_info_0(struct srvsvc_NetConnCtr0 *ctr0, ZERO_STRUCTP(ctr0); - for (; resume_handle < *total_entries && num_entries < MAX_CONN_ENTRIES; resume_handle++) { + for (; resume_handle < *total_entries; resume_handle++) { ctr0->array = TALLOC_REALLOC_ARRAY(talloc_tos(), ctr0->array, @@ -955,7 +942,7 @@ static WERROR init_srv_conn_info_1(struct srvsvc_NetConnCtr1 *ctr1, ZERO_STRUCTP(ctr1); - for (; (resume_handle < *total_entries) && num_entries < MAX_CONN_ENTRIES; resume_handle++) { + for (; resume_handle < *total_entries; resume_handle++) { ctr1->array = TALLOC_REALLOC_ARRAY(talloc_tos(), ctr1->array, -- cgit From 508d0310e7ce990deaba890e5e64eee7f0b4abbb Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 22 May 2008 16:20:25 -0700 Subject: Revert "Arggh. Got the path/user the wrong way around. IDL is correct :-)." This reverts commit 1078b5c53ae9d6f9532eecebf9cf4a1712200b7e. This message doesn't match the actual change. (This used to be commit a65abb49cf8d291c7deb659912c0df34ec37da02) --- source3/rpc_server/srv_srvsvc_nt.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 9ffe9a569f..ebbc39c304 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -32,6 +32,19 @@ extern const struct generic_mapping file_generic_mapping; #define MAX_SERVER_DISK_ENTRIES 15 +/***************************/ + +/* oops - this is going to take up a *massive* amount of stack. */ +/* the UNISTR2s already have 1024 uint16 chars in them... */ + +#define MAX_SESS_ENTRIES 32 + +/***************************/ + +/* oops - this is going to take up a *massive* amount of stack. */ +/* the UNISTR2s already have 1024 uint16 chars in them... */ +#define MAX_CONN_ENTRIES 32 + /* Use for enumerating connections, pipes, & files */ struct file_enum_count { @@ -89,7 +102,7 @@ static int pipe_enum_fn( struct db_record *rec, void *p) fenum->ctr3->array = f; init_srvsvc_NetFileInfo3(&fenum->ctr3->array[i], - (((uint32_t)(procid_to_pid(&prec.pid))<<16) | prec.pnum), + (uint32_t)((procid_to_pid(&prec.pid)<<16) & prec.pnum), (FILE_READ_DATA|FILE_WRITE_DATA), 0, fullpath, @@ -191,7 +204,7 @@ static void enum_file_fn( const struct share_mode_entry *e, /* now fill in the srvsvc_NetFileInfo3 struct */ init_srvsvc_NetFileInfo3(&fenum->ctr3->array[i], - (((uint32_t)(procid_to_pid(&e->pid))<<16) | e->share_file_id), + e->share_file_id, permissions, num_locks, fullpath, @@ -735,7 +748,7 @@ static WERROR init_srv_sess_info_0(pipes_struct *p, return WERR_OK; } - for (; resume_handle < *total_entries; resume_handle++) { + for (; resume_handle < *total_entries && num_entries < MAX_SESS_ENTRIES; resume_handle++) { ctr0->array = TALLOC_REALLOC_ARRAY(p->mem_ctx, ctr0->array, @@ -818,7 +831,7 @@ static WERROR init_srv_sess_info_1(pipes_struct *p, *total_entries = list_sessions(p->mem_ctx, &session_list); - for (; resume_handle < *total_entries; resume_handle++) { + for (; resume_handle < *total_entries && num_entries < MAX_SESS_ENTRIES; resume_handle++) { uint32 num_files; uint32 connect_time; struct passwd *pw = sys_getpwnam(session_list[resume_handle].username); @@ -887,7 +900,7 @@ static WERROR init_srv_conn_info_0(struct srvsvc_NetConnCtr0 *ctr0, ZERO_STRUCTP(ctr0); - for (; resume_handle < *total_entries; resume_handle++) { + for (; resume_handle < *total_entries && num_entries < MAX_CONN_ENTRIES; resume_handle++) { ctr0->array = TALLOC_REALLOC_ARRAY(talloc_tos(), ctr0->array, @@ -942,7 +955,7 @@ static WERROR init_srv_conn_info_1(struct srvsvc_NetConnCtr1 *ctr1, ZERO_STRUCTP(ctr1); - for (; resume_handle < *total_entries; resume_handle++) { + for (; (resume_handle < *total_entries) && num_entries < MAX_CONN_ENTRIES; resume_handle++) { ctr1->array = TALLOC_REALLOC_ARRAY(talloc_tos(), ctr1->array, -- cgit From d83931cb6e809b22eba5f1a8df1312cee9d4b19c Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 22 May 2008 16:23:07 -0700 Subject: Remove MAX_SESS_ENTRIES and MAX_CONN_ENTRIES limits as they are no longer needed now we have IDL marshalling. Change the calculation of the 32-bit fileid we return to a Windows client. We can't just use the generation count as it starts at zero for every smbd - and this command must enumerate all files open across all smbds. We'd really like combination of process-id + dev + inode + generation count to be unique, but as we can't fit that into 32 bits just use 16 bits of pid + generation count. Jeremy. (This used to be commit 8b926d5a93d04b828990057ae6f1e090764305c1) --- source3/rpc_server/srv_srvsvc_nt.c | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index ebbc39c304..9ffe9a569f 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -32,19 +32,6 @@ extern const struct generic_mapping file_generic_mapping; #define MAX_SERVER_DISK_ENTRIES 15 -/***************************/ - -/* oops - this is going to take up a *massive* amount of stack. */ -/* the UNISTR2s already have 1024 uint16 chars in them... */ - -#define MAX_SESS_ENTRIES 32 - -/***************************/ - -/* oops - this is going to take up a *massive* amount of stack. */ -/* the UNISTR2s already have 1024 uint16 chars in them... */ -#define MAX_CONN_ENTRIES 32 - /* Use for enumerating connections, pipes, & files */ struct file_enum_count { @@ -102,7 +89,7 @@ static int pipe_enum_fn( struct db_record *rec, void *p) fenum->ctr3->array = f; init_srvsvc_NetFileInfo3(&fenum->ctr3->array[i], - (uint32_t)((procid_to_pid(&prec.pid)<<16) & prec.pnum), + (((uint32_t)(procid_to_pid(&prec.pid))<<16) | prec.pnum), (FILE_READ_DATA|FILE_WRITE_DATA), 0, fullpath, @@ -204,7 +191,7 @@ static void enum_file_fn( const struct share_mode_entry *e, /* now fill in the srvsvc_NetFileInfo3 struct */ init_srvsvc_NetFileInfo3(&fenum->ctr3->array[i], - e->share_file_id, + (((uint32_t)(procid_to_pid(&e->pid))<<16) | e->share_file_id), permissions, num_locks, fullpath, @@ -748,7 +735,7 @@ static WERROR init_srv_sess_info_0(pipes_struct *p, return WERR_OK; } - for (; resume_handle < *total_entries && num_entries < MAX_SESS_ENTRIES; resume_handle++) { + for (; resume_handle < *total_entries; resume_handle++) { ctr0->array = TALLOC_REALLOC_ARRAY(p->mem_ctx, ctr0->array, @@ -831,7 +818,7 @@ static WERROR init_srv_sess_info_1(pipes_struct *p, *total_entries = list_sessions(p->mem_ctx, &session_list); - for (; resume_handle < *total_entries && num_entries < MAX_SESS_ENTRIES; resume_handle++) { + for (; resume_handle < *total_entries; resume_handle++) { uint32 num_files; uint32 connect_time; struct passwd *pw = sys_getpwnam(session_list[resume_handle].username); @@ -900,7 +887,7 @@ static WERROR init_srv_conn_info_0(struct srvsvc_NetConnCtr0 *ctr0, ZERO_STRUCTP(ctr0); - for (; resume_handle < *total_entries && num_entries < MAX_CONN_ENTRIES; resume_handle++) { + for (; resume_handle < *total_entries; resume_handle++) { ctr0->array = TALLOC_REALLOC_ARRAY(talloc_tos(), ctr0->array, @@ -955,7 +942,7 @@ static WERROR init_srv_conn_info_1(struct srvsvc_NetConnCtr1 *ctr1, ZERO_STRUCTP(ctr1); - for (; (resume_handle < *total_entries) && num_entries < MAX_CONN_ENTRIES; resume_handle++) { + for (; resume_handle < *total_entries; resume_handle++) { ctr1->array = TALLOC_REALLOC_ARRAY(talloc_tos(), ctr1->array, -- cgit From 6811dc3fc236e62f042e43efa500cc55346c29d6 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 27 May 2008 11:23:59 -0700 Subject: Allow server manager to close open files selected by id. Jeremy. (This used to be commit 7eeed8bb41059ec2bddedb6a71deddeec7f33af2) --- source3/rpc_server/srv_srvsvc_nt.c | 57 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 9ffe9a569f..6f7b232071 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2399,14 +2399,67 @@ WERROR _srvsvc_NetNameValidate(pipes_struct *p, return WERR_OK; } +/******************************************************************* +********************************************************************/ + +static void enum_file_close_fn( const struct share_mode_entry *e, + const char *sharepath, const char *fname, + void *private_data ) +{ + char msg[MSG_SMB_SHARE_MODE_ENTRY_SIZE]; + struct srvsvc_NetFileClose *r = + (struct srvsvc_NetFileClose *)private_data; + uint32_t fid = (((uint32_t)(procid_to_pid(&e->pid))<<16) | e->share_file_id); + + if (fid != r->in.fid) { + return; /* Not this file. */ + } + + if (!process_exists(e->pid) ) { + return; + } + + /* Ok - send the close message. */ + DEBUG(10,("enum_file_close_fn: request to close file %s, %s\n", + sharepath, + share_mode_str(talloc_tos(), 0, e) )); + + share_mode_entry_to_message(msg, e); + + r->out.result = ntstatus_to_werror( + messaging_send_buf(smbd_messaging_context(), + e->pid, MSG_SMB_CLOSE_FILE, + (uint8 *)msg, + MSG_SMB_SHARE_MODE_ENTRY_SIZE)); +} + /******************************************************************** + Close a file given a 32-bit file id. ********************************************************************/ WERROR _srvsvc_NetFileClose(pipes_struct *p, struct srvsvc_NetFileClose *r) { - return WERR_ACCESS_DENIED; -} + struct current_user user; + SE_PRIV se_diskop = SE_DISK_OPERATOR; + bool is_disk_op; + + DEBUG(5,("_srvsvc_NetFileClose: %d\n", __LINE__)); + + get_current_user(&user,p); + is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop ); + + if (user.ut.uid != sec_initial_uid() && !is_disk_op) { + return WERR_ACCESS_DENIED; + } + + /* enum_file_close_fn sends the close message to + * the relevent smbd process. */ + + r->out.result = WERR_BADFILE; + share_mode_forall( enum_file_close_fn, (void *)r); + return r->out.result; +} /******************************************************************** ********************************************************************/ -- cgit From c5401a2a46da9a7523f4363be14805eb893ea0f4 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 23 Jun 2008 08:33:04 +0200 Subject: Correct calculation of "remark" in srv_srvsvc_nt.c Very likely the client is not interested in the values for the IPC$ share :-) (This used to be commit 40ca5764cf4310769c002b8cb6041fe2af4e6d0b) --- source3/rpc_server/srv_srvsvc_nt.c | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 6f7b232071..57f2fe7f65 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -259,9 +259,11 @@ static void init_srv_share_info_1(pipes_struct *p, struct srvsvc_NetShareInfo1 * char *remark = talloc_strdup(p->mem_ctx, lp_comment(snum)); if (remark) { - remark = standard_sub_conn(p->mem_ctx, - p->conn, - remark); + remark = talloc_sub_advanced( + p->mem_ctx, lp_servicename(snum), + get_current_username(), lp_pathname(snum), + p->pipe_user.ut.uid, get_current_username(), + "", remark); } init_srvsvc_NetShareInfo1(r, net_name, @@ -284,9 +286,11 @@ static void init_srv_share_info_2(pipes_struct *p, struct srvsvc_NetShareInfo2 * remark = talloc_strdup(p->mem_ctx, lp_comment(snum)); if (remark) { - remark = standard_sub_conn(p->mem_ctx, - p->conn, - remark); + remark = talloc_sub_advanced( + p->mem_ctx, lp_servicename(snum), + get_current_username(), lp_pathname(snum), + p->pipe_user.ut.uid, get_current_username(), + "", remark); } path = talloc_asprintf(p->mem_ctx, "C:%s", lp_pathname(snum)); @@ -348,7 +352,11 @@ static void init_srv_share_info_501(pipes_struct *p, struct srvsvc_NetShareInfo5 char *remark = talloc_strdup(p->mem_ctx, lp_comment(snum)); if (remark) { - remark = standard_sub_conn(p->mem_ctx, p->conn, remark); + remark = talloc_sub_advanced( + p->mem_ctx, lp_servicename(snum), + get_current_username(), lp_pathname(snum), + p->pipe_user.ut.uid, get_current_username(), + "", remark); } init_srvsvc_NetShareInfo501(r, net_name, @@ -372,7 +380,11 @@ static void init_srv_share_info_502(pipes_struct *p, struct srvsvc_NetShareInfo5 char *remark = talloc_strdup(ctx, lp_comment(snum));; if (remark) { - remark = standard_sub_conn(ctx, p->conn, remark); + remark = talloc_sub_advanced( + p->mem_ctx, lp_servicename(snum), + get_current_username(), lp_pathname(snum), + p->pipe_user.ut.uid, get_current_username(), + "", remark); } path = talloc_asprintf(ctx, "C:%s", lp_pathname(snum)); if (path) { @@ -407,7 +419,11 @@ static void init_srv_share_info_1004(pipes_struct *p, struct srvsvc_NetShareInfo char *remark = talloc_strdup(p->mem_ctx, lp_comment(snum)); if (remark) { - remark = standard_sub_conn(p->mem_ctx, p->conn, remark); + remark = talloc_sub_advanced( + p->mem_ctx, lp_servicename(snum), + get_current_username(), lp_pathname(snum), + p->pipe_user.ut.uid, get_current_username(), + "", remark); } init_srvsvc_NetShareInfo1004(r, remark ? remark : ""); -- cgit From 2646fce6338216372af6f6b3198995adfbad90dd Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 27 Jul 2008 17:59:15 +0200 Subject: Fix srvsvc_Net[Get|Set]FileSecurity There were two bugs in those routines: They did not send INTERNAL_OPEN_ONLY to open_file_ntcreate() and they did not chdir, so the file could never be found. While there I decided to remove the become_root() calls and call create_file() instead of the lower-level routines. (This used to be commit 669771738422776f8c81086ffea4924b62d72957) --- source3/rpc_server/srv_srvsvc_nt.c | 242 +++++++++++++------------------------ 1 file changed, 87 insertions(+), 155 deletions(-) (limited to 'source3/rpc_server/srv_srvsvc_nt.c') diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c index 57f2fe7f65..bb9c3687fb 100644 --- a/source3/rpc_server/srv_srvsvc_nt.c +++ b/source3/rpc_server/srv_srvsvc_nt.c @@ -2026,91 +2026,59 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, { SEC_DESC *psd = NULL; size_t sd_size; - DATA_BLOB null_pw; - char *filename_in = NULL; - char *filename = NULL; - char *qualname = NULL; + fstring servicename; SMB_STRUCT_STAT st; NTSTATUS nt_status; - WERROR werr = WERR_ACCESS_DENIED; - struct current_user user; + WERROR werr; connection_struct *conn = NULL; - bool became_user = False; - TALLOC_CTX *ctx = p->mem_ctx; struct sec_desc_buf *sd_buf = NULL; files_struct *fsp = NULL; + int snum; + char *oldcwd = NULL; ZERO_STRUCT(st); - qualname = talloc_strdup(ctx, r->in.share); - if (!qualname) { - goto error_exit; - } - - /* Null password is ok - we are already an authenticated user... */ - null_pw = data_blob_null; - - get_current_user(&user, p); - - become_root(); - conn = make_connection(qualname, null_pw, "A:", user.vuid, &nt_status); - unbecome_root(); - - if (conn == NULL) { - DEBUG(3,("_srvsvc_NetGetFileSecurity: Unable to connect to %s\n", - qualname)); - werr = ntstatus_to_werror(nt_status); - goto error_exit; - } - - if (!become_user(conn, conn->vuid)) { - DEBUG(0,("_srvsvc_NetGetFileSecurity: Can't become connected user!\n")); - goto error_exit; - } - became_user = True; - - filename_in = talloc_strdup(ctx, r->in.file); - if (!filename_in) { - goto error_exit; - } + fstrcpy(servicename, r->in.share); - nt_status = unix_convert(ctx, conn, filename_in, False, &filename, NULL, &st); - if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srvsvc_NetGetFileSecurity: bad pathname %s\n", - filename)); + snum = find_service(servicename); + if (snum == -1) { + DEBUG(10, ("Could not find service %s\n", servicename)); + werr = WERR_NET_NAME_NOT_FOUND; goto error_exit; } - nt_status = check_name(conn, filename); + nt_status = create_conn_struct(talloc_tos(), &conn, snum, + lp_pathname(snum), &oldcwd); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srvsvc_NetGetFileSecurity: can't access %s\n", - filename)); + DEBUG(10, ("create_conn_struct failed: %s\n", + nt_errstr(nt_status))); + werr = ntstatus_to_werror(nt_status); goto error_exit; } - if (!(S_ISDIR(st.st_mode))) { - nt_status = open_file_ntcreate(conn, NULL, filename, &st, - FILE_READ_ATTRIBUTES, - FILE_SHARE_READ|FILE_SHARE_WRITE, - FILE_OPEN, - 0, - FILE_ATTRIBUTE_NORMAL, - 0, - NULL, &fsp); - - } else { - nt_status = open_directory(conn, NULL, filename, &st, - FILE_READ_ATTRIBUTES, - FILE_SHARE_READ|FILE_SHARE_WRITE, - FILE_OPEN, - 0, - FILE_ATTRIBUTE_DIRECTORY, - NULL, &fsp); - } + conn->server_info = p->server_info; + + nt_status = create_file( + conn, /* conn */ + NULL, /* req */ + 0, /* root_dir_fid */ + r->in.file, /* fname */ + FILE_READ_ATTRIBUTES, /* access_mask */ + FILE_SHARE_READ|FILE_SHARE_WRITE, /* share_access */ + FILE_OPEN, /* create_disposition*/ + 0, /* create_options */ + 0, /* file_attributes */ + INTERNAL_OPEN_ONLY, /* oplock_request */ + 0, /* allocation_size */ + NULL, /* sd */ + NULL, /* ea_list */ + &fsp, /* result */ + NULL, /* pinfo */ + NULL); /* psbuf */ if (!NT_STATUS_IS_OK(nt_status)) { DEBUG(3,("_srvsvc_NetGetFileSecurity: can't open %s\n", - filename)); + r->in.file)); werr = ntstatus_to_werror(nt_status); goto error_exit; } @@ -2121,15 +2089,15 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, |DACL_SECURITY_INFORMATION), &psd); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srvsvc_NetGetFileSecurity: Unable to get NT ACL for file %s\n", - filename)); + DEBUG(3,("_srvsvc_NetGetFileSecurity: Unable to get NT ACL " + "for file %s\n", r->in.file)); werr = ntstatus_to_werror(nt_status); goto error_exit; } sd_size = ndr_size_security_descriptor(psd, 0); - sd_buf = TALLOC_ZERO_P(ctx, struct sec_desc_buf); + sd_buf = TALLOC_ZERO_P(p->mem_ctx, struct sec_desc_buf); if (!sd_buf) { werr = WERR_NOMEM; goto error_exit; @@ -2143,23 +2111,22 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, psd->dacl->revision = NT4_ACL_REVISION; close_file(fsp, NORMAL_CLOSE); - - unbecome_user(); - close_cnum(conn, user.vuid); + vfs_ChDir(conn, oldcwd); + conn_free_internal(conn); return WERR_OK; error_exit: - if(fsp) { + if (fsp) { close_file(fsp, NORMAL_CLOSE); } - if (became_user) { - unbecome_user(); + if (oldcwd) { + vfs_ChDir(conn, oldcwd); } if (conn) { - close_cnum(conn, user.vuid); + conn_free_internal(conn); } return werr; @@ -2173,125 +2140,90 @@ error_exit: WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, struct srvsvc_NetSetFileSecurity *r) { - char *filename_in = NULL; - char *filename = NULL; - char *qualname = NULL; - DATA_BLOB null_pw; + fstring servicename; files_struct *fsp = NULL; SMB_STRUCT_STAT st; NTSTATUS nt_status; WERROR werr; - struct current_user user; connection_struct *conn = NULL; - bool became_user = False; - TALLOC_CTX *ctx = p->mem_ctx; + int snum; + char *oldcwd = NULL; ZERO_STRUCT(st); - werr = WERR_OK; + fstrcpy(servicename, r->in.share); - qualname = talloc_strdup(ctx, r->in.share); - if (!qualname) { - werr = WERR_ACCESS_DENIED; + snum = find_service(servicename); + if (snum == -1) { + DEBUG(10, ("Could not find service %s\n", servicename)); + werr = WERR_NET_NAME_NOT_FOUND; goto error_exit; } - /* Null password is ok - we are already an authenticated user... */ - null_pw = data_blob_null; - - get_current_user(&user, p); - - become_root(); - conn = make_connection(qualname, null_pw, "A:", user.vuid, &nt_status); - unbecome_root(); - - if (conn == NULL) { - DEBUG(3,("_srvsvc_NetSetFileSecurity: Unable to connect to %s\n", qualname)); + nt_status = create_conn_struct(talloc_tos(), &conn, snum, + lp_pathname(snum), &oldcwd); + if (!NT_STATUS_IS_OK(nt_status)) { + DEBUG(10, ("create_conn_struct failed: %s\n", + nt_errstr(nt_status))); werr = ntstatus_to_werror(nt_status); goto error_exit; } - if (!become_user(conn, conn->vuid)) { - DEBUG(0,("_srvsvc_NetSetFileSecurity: Can't become connected user!\n")); - werr = WERR_ACCESS_DENIED; - goto error_exit; - } - became_user = True; + conn->server_info = p->server_info; + + nt_status = create_file( + conn, /* conn */ + NULL, /* req */ + 0, /* root_dir_fid */ + r->in.file, /* fname */ + FILE_WRITE_ATTRIBUTES, /* access_mask */ + FILE_SHARE_READ|FILE_SHARE_WRITE, /* share_access */ + FILE_OPEN, /* create_disposition*/ + 0, /* create_options */ + 0, /* file_attributes */ + INTERNAL_OPEN_ONLY, /* oplock_request */ + 0, /* allocation_size */ + NULL, /* sd */ + NULL, /* ea_list */ + &fsp, /* result */ + NULL, /* pinfo */ + NULL); /* psbuf */ - filename_in = talloc_strdup(ctx, r->in.file); - if (!filename_in) { - werr = WERR_ACCESS_DENIED; - goto error_exit; - } - - nt_status = unix_convert(ctx, conn, filename, False, &filename, NULL, &st); - if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srvsvc_NetSetFileSecurity: bad pathname %s\n", filename)); - werr = WERR_ACCESS_DENIED; - goto error_exit; - } - - nt_status = check_name(conn, filename); if (!NT_STATUS_IS_OK(nt_status)) { - DEBUG(3,("_srvsvc_NetSetFileSecurity: can't access %s\n", filename)); - werr = WERR_ACCESS_DENIED; + DEBUG(3,("_srvsvc_NetSetFileSecurity: can't open %s\n", + r->in.file)); + werr = ntstatus_to_werror(nt_status); goto error_exit; } - nt_status = open_file_ntcreate(conn, NULL, filename, &st, - FILE_WRITE_ATTRIBUTES, - FILE_SHARE_READ|FILE_SHARE_WRITE, - FILE_OPEN, - 0, - FILE_ATTRIBUTE_NORMAL, - INTERNAL_OPEN_ONLY, - NULL, &fsp); - - if ( !NT_STATUS_IS_OK(nt_status) ) { - /* Perhaps it is a directory */ - if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY)) - nt_status = open_directory(conn, NULL, filename, &st, - FILE_WRITE_ATTRIBUTES, - FILE_SHARE_READ|FILE_SHARE_WRITE, - FILE_OPEN, - 0, - FILE_ATTRIBUTE_DIRECTORY, - NULL, &fsp); - - if ( !NT_STATUS_IS_OK(nt_status) ) { - DEBUG(3,("_srvsvc_NetSetFileSecurity: Unable to open file %s\n", filename)); - werr = ntstatus_to_werror(nt_status); - goto error_exit; - } - } - nt_status = SMB_VFS_FSET_NT_ACL(fsp, r->in.securityinformation, r->in.sd_buf->sd); if (!NT_STATUS_IS_OK(nt_status) ) { - DEBUG(3,("_srvsvc_NetSetFileSecurity: Unable to set NT ACL on file %s\n", filename)); + DEBUG(3,("_srvsvc_NetSetFileSecurity: Unable to set NT ACL " + "on file %s\n", r->in.share)); werr = WERR_ACCESS_DENIED; goto error_exit; } close_file(fsp, NORMAL_CLOSE); - unbecome_user(); - close_cnum(conn, user.vuid); - return werr; + vfs_ChDir(conn, oldcwd); + conn_free_internal(conn); + return WERR_OK; error_exit: - if(fsp) { + if (fsp) { close_file(fsp, NORMAL_CLOSE); } - if (became_user) { - unbecome_user(); + if (oldcwd) { + vfs_ChDir(conn, oldcwd); } if (conn) { - close_cnum(conn, user.vuid); + conn_free_internal(conn); } return werr; -- cgit