12 files changed:
bool set_current_service(connection_struct *conn, uint16 flags, bool do_chdir);
void load_registry_shares(void);
int add_home_service(const char *service, const char *username, const char *homedir);
bool set_current_service(connection_struct *conn, uint16 flags, bool do_chdir);
void load_registry_shares(void);
int add_home_service(const char *service, const char *username, const char *homedir);
-int find_service(fstring service);
+int find_service(const char *service_in, fstring service);
connection_struct *make_connection_snum(struct smbd_server_connection *sconn,
int snum, user_struct *vuser,
DATA_BLOB password,
connection_struct *make_connection_snum(struct smbd_server_connection *sconn,
int snum, user_struct *vuser,
DATA_BLOB password,
-int find_service(fstring service)
+int find_service(const char *service_in, fstring service)
+ if (!name) {
+ return false;
+ }
+
for ( i=0; i<max_len && name[i]; i++ ) {
/* fail if strchr_m() finds one of the invalid characters */
if ( name[i] && strchr_m( invalid_chars, name[i] ) ) {
for ( i=0; i<max_len && name[i]; i++ ) {
/* fail if strchr_m() finds one of the invalid characters */
if ( name[i] && strchr_m( invalid_chars, name[i] ) ) {
- fstrcpy(sname, service);
- snum = find_service(sname);
+ snum = find_service(service, sname);
if (snum == -1) {
/*
* Should not happen, but we should not fail just *here*.
if (snum == -1) {
/*
* Should not happen, but we should not fail just *here*.
const char *sharename)
{
struct share_params *result;
const char *sharename)
{
struct share_params *result;
- if (!(sname = SMB_STRDUP(sharename))) {
- return NULL;
- }
-
- snum = find_service(sname);
- SAFE_FREE(sname);
+ snum = find_service(sharename, sname);
if (snum < 0) {
return NULL;
if (snum < 0) {
return NULL;
- fstrcpy(printdollar, "print$");
-
- printdollar_snum = find_service(printdollar);
+ printdollar_snum = find_service("print$", printdollar);
if (printdollar_snum == -1) {
*perr = WERR_NO_SUCH_SHARE;
return -1;
if (printdollar_snum == -1) {
*perr = WERR_NO_SUCH_SHARE;
return -1;
return WERR_UNKNOWN_PRINTER_DRIVER;
}
return WERR_UNKNOWN_PRINTER_DRIVER;
}
- fstrcpy(printdollar, "print$");
-
- printdollar_snum = find_service(printdollar);
+ printdollar_snum = find_service("print$", printdollar);
if (printdollar_snum == -1) {
*perr = WERR_NO_SUCH_SHARE;
return WERR_NO_SUCH_SHARE;
if (printdollar_snum == -1) {
*perr = WERR_NO_SUCH_SHARE;
return WERR_NO_SUCH_SHARE;
DEBUG(6,("delete_driver_files: deleting driver [%s] - version [%d]\n",
r->driver_name, r->version));
DEBUG(6,("delete_driver_files: deleting driver [%s] - version [%d]\n",
r->driver_name, r->version));
- fstrcpy(printdollar, "print$");
-
- printdollar_snum = find_service(printdollar);
+ printdollar_snum = find_service("print$", printdollar);
if (printdollar_snum == -1) {
return false;
}
if (printdollar_snum == -1) {
return false;
}
static bool add_printers_by_registry( struct regsubkey_ctr *subkeys )
{
int i, num_keys, snum;
static bool add_printers_by_registry( struct regsubkey_ctr *subkeys )
{
int i, num_keys, snum;
NT_PRINTER_INFO_LEVEL_2 info2;
NT_PRINTER_INFO_LEVEL printer;
NT_PRINTER_INFO_LEVEL_2 info2;
NT_PRINTER_INFO_LEVEL printer;
become_root();
for ( i=0; i<num_keys; i++ ) {
become_root();
for ( i=0; i<num_keys; i++ ) {
- printername = regsubkey_ctr_specific_key( subkeys, i );
- snum = find_service( printername );
+ fstring printername;
+ printername_in = regsubkey_ctr_specific_key( subkeys, i );
+ snum = find_service(printername_in, printername);
/* just verify a valied snum for now */
if ( snum == -1 ) {
/* just verify a valied snum for now */
if ( snum == -1 ) {
DEBUG(5,("_srvsvc_NetShareGetInfo: %d\n", __LINE__));
DEBUG(5,("_srvsvc_NetShareGetInfo: %d\n", __LINE__));
- fstrcpy(share_name, r->in.share_name);
+ if (!r->in.share_name) {
+ return WERR_INVALID_NAME;
+ }
- snum = find_service(share_name);
+ snum = find_service(r->in.share_name, share_name);
if (snum < 0) {
return WERR_INVALID_NAME;
}
if (snum < 0) {
return WERR_INVALID_NAME;
}
struct srvsvc_NetShareSetInfo *r)
{
char *command = NULL;
struct srvsvc_NetShareSetInfo *r)
{
char *command = NULL;
- char *share_name = NULL;
char *comment = NULL;
const char *pathname = NULL;
int type;
char *comment = NULL;
const char *pathname = NULL;
int type;
DEBUG(5,("_srvsvc_NetShareSetInfo: %d\n", __LINE__));
DEBUG(5,("_srvsvc_NetShareSetInfo: %d\n", __LINE__));
- share_name = talloc_strdup(p->mem_ctx, r->in.share_name);
- if (!share_name) {
- return WERR_NOMEM;
+ if (!r->in.share_name) {
+ return WERR_INVALID_NAME;
}
if (r->out.parm_error) {
*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$") )
- || 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") )
{
DEBUG(5,("_srvsvc_NetShareSetInfo: share %s cannot be "
"modified by a remote user.\n",
{
DEBUG(5,("_srvsvc_NetShareSetInfo: share %s cannot be "
"modified by a remote user.\n",
return WERR_ACCESS_DENIED;
}
return WERR_ACCESS_DENIED;
}
- snum = find_service(share_name);
+ snum = find_service(r->in.share_name, share_name);
/* Does this share exist ? */
if (snum < 0)
/* Does this share exist ? */
if (snum < 0)
struct srvsvc_NetShareAdd *r)
{
char *command = NULL;
struct srvsvc_NetShareAdd *r)
{
char *command = NULL;
- char *share_name = NULL;
+ char *share_name_in = NULL;
+ fstring share_name;
char *comment = NULL;
char *pathname = NULL;
int type;
char *comment = NULL;
char *pathname = NULL;
int type;
/* Not enough info in a level 1 to do anything. */
return WERR_ACCESS_DENIED;
case 2:
/* Not enough info in a level 1 to do anything. */
return WERR_ACCESS_DENIED;
case 2:
- share_name = talloc_strdup(ctx, r->in.info->info2->name);
+ share_name_in = 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 == (uint32_t)-1) ?
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 == (uint32_t)-1) ?
/* No path. Not enough info in a level 501 to do anything. */
return WERR_ACCESS_DENIED;
case 502:
/* No path. Not enough info in a level 501 to do anything. */
return WERR_ACCESS_DENIED;
case 502:
- share_name = talloc_strdup(ctx, r->in.info->info502->name);
+ share_name_in = 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 == (uint32_t)-1) ?
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 == (uint32_t)-1) ?
/* check for invalid share names */
/* check for invalid share names */
- if (!share_name || !validate_net_name(share_name,
+ if (!share_name_in || !validate_net_name(share_name_in,
+ strlen(share_name_in))) {
DEBUG(5,("_srvsvc_NetShareAdd: Bad sharename \"%s\"\n",
DEBUG(5,("_srvsvc_NetShareAdd: Bad sharename \"%s\"\n",
- share_name ? share_name : ""));
+ share_name_in ? share_name_in : ""));
return WERR_INVALID_NAME;
}
return WERR_INVALID_NAME;
}
- if (strequal(share_name,"IPC$") || strequal(share_name,"global")
+ if (strequal(share_name_in,"IPC$") || strequal(share_name_in,"global")
|| (lp_enable_asu_support() &&
|| (lp_enable_asu_support() &&
- strequal(share_name,"ADMIN$"))) {
+ strequal(share_name_in,"ADMIN$"))) {
return WERR_ACCESS_DENIED;
}
return WERR_ACCESS_DENIED;
}
- snum = find_service(share_name);
+ snum = find_service(share_name_in, share_name);
/* Share already exists. */
if (snum >= 0) {
/* Share already exists. */
if (snum >= 0) {
}
/* 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(share_name_in, '"', ' ');
string_replace(path, '"', ' ');
if (comment) {
string_replace(comment, '"', ' ');
string_replace(path, '"', ' ');
if (comment) {
string_replace(comment, '"', ' ');
"%s \"%s\" \"%s\" \"%s\" \"%s\" %d",
lp_add_share_cmd(),
get_dyn_CONFIGFILE(),
"%s \"%s\" \"%s\" \"%s\" \"%s\" %d",
lp_add_share_cmd(),
get_dyn_CONFIGFILE(),
path,
comment ? comment : "",
max_connections);
path,
comment ? comment : "",
max_connections);
return WERR_ACCESS_DENIED;
if (psd) {
return WERR_ACCESS_DENIED;
if (psd) {
+ /* Note we use share_name here, not share_name_in as
+ we need a canonicalized name for setting security. */
if (!set_share_security(share_name, psd)) {
DEBUG(0,("_srvsvc_NetShareAdd: Failed to add security info to share %s.\n",
share_name ));
if (!set_share_security(share_name, psd)) {
DEBUG(0,("_srvsvc_NetShareAdd: Failed to add security info to share %s.\n",
share_name ));
struct srvsvc_NetShareDel *r)
{
char *command = NULL;
struct srvsvc_NetShareDel *r)
{
char *command = NULL;
- char *share_name = NULL;
int ret;
int snum;
SE_PRIV se_diskop = SE_DISK_OPERATOR;
int ret;
int snum;
SE_PRIV se_diskop = SE_DISK_OPERATOR;
DEBUG(5,("_srvsvc_NetShareDel: %d\n", __LINE__));
DEBUG(5,("_srvsvc_NetShareDel: %d\n", __LINE__));
- share_name = talloc_strdup(p->mem_ctx, r->in.share_name);
- if (!share_name) {
+ if (!r->in.share_name) {
return WERR_NET_NAME_NOT_FOUND;
}
return WERR_NET_NAME_NOT_FOUND;
}
- 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;
}
{
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;
}
return WERR_NO_SUCH_SHARE;
}
- snum = find_service(share_name);
+ snum = find_service(r->in.share_name, share_name);
/* No change to printer shares. */
if (lp_print_ok(snum))
/* No change to printer shares. */
if (lp_print_ok(snum))
- fstrcpy(servicename, r->in.share);
+ if (!r->in.share) {
+ return WERR_INVALID_NAME;
+ }
- snum = find_service(servicename);
+ snum = find_service(r->in.share, servicename);
if (snum == -1) {
DEBUG(10, ("Could not find service %s\n", servicename));
werr = WERR_NET_NAME_NOT_FOUND;
if (snum == -1) {
DEBUG(10, ("Could not find service %s\n", servicename));
werr = WERR_NET_NAME_NOT_FOUND;
- fstrcpy(servicename, r->in.share);
+ if (!r->in.share) {
+ return WERR_INVALID_NAME;
+ }
- snum = find_service(servicename);
+ snum = find_service(r->in.share, servicename);
if (snum == -1) {
DEBUG(10, ("Could not find service %s\n", servicename));
werr = WERR_NET_NAME_NOT_FOUND;
if (snum == -1) {
DEBUG(10, ("Could not find service %s\n", servicename));
werr = WERR_NET_NAME_NOT_FOUND;
char *str2 = skip_string(param,tpscnt,str1);
char *p = skip_string(param,tpscnt,str2);
char *QueueName = p;
char *str2 = skip_string(param,tpscnt,str1);
char *p = skip_string(param,tpscnt,str2);
char *QueueName = p;
unsigned int uLevel;
int count=0;
int snum;
unsigned int uLevel;
int count=0;
int snum;
- snum = find_service(QueueName);
+ snum = find_service(QueueName, share_name);
if ( !(lp_snum_ok(snum) && lp_print_ok(snum)) )
return False;
if ( !(lp_snum_ok(snum) && lp_print_ok(snum)) )
return False;
char *p = skip_string(param,tpscnt,netname);
int uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
int snum;
char *p = skip_string(param,tpscnt,netname);
int uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
int snum;
if (!str1 || !str2 || !netname || !p) {
return False;
}
if (!str1 || !str2 || !netname || !p) {
return False;
}
- snum = find_service(netname);
+ snum = find_service(netname, share_name);
if (snum < 0) {
return False;
}
if (snum < 0) {
return False;
}
return False;
}
pull_ascii_fstring(sharename,data);
return False;
}
pull_ascii_fstring(sharename,data);
- snum = find_service(sharename);
+ snum = find_service(sharename, sharename);
if (snum >= 0) { /* already exists */
res = ERRfilexists;
goto error_exit;
if (snum >= 0) { /* already exists */
res = ERRfilexists;
goto error_exit;
struct pack_desc desc;
print_queue_struct *queue=NULL;
print_status_struct status;
struct pack_desc desc;
print_queue_struct *queue=NULL;
print_status_struct status;
if (!str1 || !str2 || !p) {
return False;
if (!str1 || !str2 || !p) {
return False;
- snum = find_service(name);
+ snum = find_service(name, share_name);
if ( !(lp_snum_ok(snum) && lp_print_ok(snum)) ) {
return False;
}
if ( !(lp_snum_ok(snum) && lp_print_ok(snum)) ) {
return False;
}
char *str2 = skip_string(param,tpscnt,str1);
char *p = skip_string(param,tpscnt,str2);
char* PrinterName = p;
char *str2 = skip_string(param,tpscnt,str1);
char *p = skip_string(param,tpscnt,str2);
char* PrinterName = p;
int uLevel;
struct pack_desc desc;
int snum;
int uLevel;
struct pack_desc desc;
int snum;
- snum = find_service(PrinterName);
+ snum = find_service(PrinterName, share_name);
if ( !(lp_snum_ok(snum) && lp_print_ok(snum)) ) {
*rdata_len = 0;
desc.errcode = NERR_DestNotFound;
if ( !(lp_snum_ok(snum) && lp_print_ok(snum)) ) {
*rdata_len = 0;
desc.errcode = NERR_DestNotFound;
snum = lp_servicenumber(jucn->service_name);
if(snum < 0) {
fstring service_name;
snum = lp_servicenumber(jucn->service_name);
if(snum < 0) {
fstring service_name;
- fstrcpy(service_name, jucn->service_name);
- if ((snum = find_service(service_name)) < 0) {
+ if ((snum = find_service(jucn->service_name, service_name)) < 0) {
return NT_STATUS_NOT_FOUND;
}
TALLOC_FREE(jucn->service_name);
return NT_STATUS_NOT_FOUND;
}
TALLOC_FREE(jucn->service_name);
/**
* Find a service entry.
*
/**
* Find a service entry.
*
- * @param service is modified (to canonical form??)
+ * @param service_in is modified (to canonical form??)
+ * and returned in return parameter service.
-int find_service(fstring service)
+int find_service(const char *service_in, fstring service)
{
int iService;
struct smbd_server_connection *sconn = smbd_server_conn;
{
int iService;
struct smbd_server_connection *sconn = smbd_server_conn;
+ if (!service_in) {
+ return -1;
+ }
+
+ fstrcpy(service, service_in);
all_string_sub(service,"\\","/",0);
iService = lp_servicenumber(service);
all_string_sub(service,"\\","/",0);
iService = lp_servicenumber(service);
- iService = find_service(defservice);
+ iService = find_service(defservice, service);
if (iService >= 0) {
all_string_sub(service, "_","/",0);
iService = lp_add_service(service, iService);
if (iService >= 0) {
all_string_sub(service, "_","/",0);
iService = lp_add_service(service, iService);
fstrcpy(unix_username,
current_user_info.smb_name);
map_username(sconn, unix_username);
fstrcpy(unix_username,
current_user_info.smb_name);
map_username(sconn, unix_username);
- snum = find_service(unix_username);
+ snum = find_service(unix_username, unix_username);
}
if (snum != -1) {
DEBUG(5, ("making a connection to 'homes' "
}
if (snum != -1) {
DEBUG(5, ("making a connection to 'homes' "
- snum = find_service(service);
+ snum = find_service(service, service);
if (snum < 0) {
if (strequal(service,"IPC$") ||
if (snum < 0) {
if (strequal(service,"IPC$") ||
- snum = find_service(service);
+ snum = find_service(service, service);
if (snum < 0) {
DEBUG(3,("smbd_smb2_tree_connect: couldn't find service %s\n",
service));
if (snum < 0) {
DEBUG(3,("smbd_smb2_tree_connect: couldn't find service %s\n",
service));