From 3985669176ad4989133f9a7a8995ce6c69504bf2 Mon Sep 17 00:00:00 2001 From: Karolin Seeger Date: Wed, 31 Oct 2012 11:40:26 +0100 Subject: [PATCH] Revert "Fix bug #7781 (Samba transforms "ShareName" to lowercase when adding new share via MMC)" This reverts commit 157b88da4db727eafa682c7fc7eab11d5955f57b. This one seems to break make test on my system. Karolin (cherry picked from commit 92bd768ed56585c2a45d0ca41eec9e6a1e3701ae) --- source3/include/proto.h | 2 +- source3/lib/dummysmbd.c | 2 +- source3/lib/util_str.c | 4 -- source3/modules/vfs_xattr_tdb.c | 3 +- source3/param/loadparm.c | 9 +++- source3/printing/nt_printing.c | 12 ++++-- source3/registry/reg_backend_printing.c | 7 ++- source3/rpc_server/srv_srvsvc_nt.c | 75 +++++++++++++++------------------ source3/smbd/lanman.c | 14 +++--- source3/smbd/msdfs.c | 3 +- source3/smbd/service.c | 16 +++---- source3/smbd/smb2_tcon.c | 2 +- 12 files changed, 70 insertions(+), 79 deletions(-) diff --git a/source3/include/proto.h b/source3/include/proto.h index cee5d6af7f3..785cc303877 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -7002,7 +7002,7 @@ bool set_conn_connectpath(connection_struct *conn, const char *connectpath); 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(const char *service_in, fstring service); +int find_service(fstring service); connection_struct *make_connection_snum(struct smbd_server_connection *sconn, int snum, user_struct *vuser, DATA_BLOB password, diff --git a/source3/lib/dummysmbd.c b/source3/lib/dummysmbd.c index 28c6f0effe4..a41e6dc033a 100644 --- a/source3/lib/dummysmbd.c +++ b/source3/lib/dummysmbd.c @@ -28,7 +28,7 @@ int get_client_fd(void) return -1; } -int find_service(const char *service_in, fstring service) +int find_service(fstring service) { return -1; } diff --git a/source3/lib/util_str.c b/source3/lib/util_str.c index 17a4a8f2c4e..d86963702e0 100644 --- a/source3/lib/util_str.c +++ b/source3/lib/util_str.c @@ -2301,10 +2301,6 @@ bool validate_net_name( const char *name, { int i; - if (!name) { - return false; - } - for ( i=0; idriver_name, r->version)); - printdollar_snum = find_service("print$", printdollar); + fstrcpy(printdollar, "print$"); + + printdollar_snum = find_service(printdollar); if (printdollar_snum == -1) { return false; } diff --git a/source3/registry/reg_backend_printing.c b/source3/registry/reg_backend_printing.c index cba4f798d38..90ccc33c4c9 100644 --- a/source3/registry/reg_backend_printing.c +++ b/source3/registry/reg_backend_printing.c @@ -278,7 +278,7 @@ done: static bool add_printers_by_registry( struct regsubkey_ctr *subkeys ) { int i, num_keys, snum; - char *printername_in; + char *printername; NT_PRINTER_INFO_LEVEL_2 info2; NT_PRINTER_INFO_LEVEL printer; @@ -289,9 +289,8 @@ static bool add_printers_by_registry( struct regsubkey_ctr *subkeys ) become_root(); for ( i=0; iin.share_name) { - return WERR_INVALID_NAME; - } + fstrcpy(share_name, r->in.share_name); - snum = find_service(r->in.share_name, share_name); + snum = find_service(share_name); if (snum < 0) { return WERR_INVALID_NAME; } @@ -1509,7 +1507,7 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, struct srvsvc_NetShareSetInfo *r) { char *command = NULL; - fstring share_name; + char *share_name = NULL; char *comment = NULL; const char *pathname = NULL; int type; @@ -1525,25 +1523,26 @@ WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, DEBUG(5,("_srvsvc_NetShareSetInfo: %d\n", __LINE__)); - if (!r->in.share_name) { - return WERR_INVALID_NAME; + share_name = talloc_strdup(p->mem_ctx, r->in.share_name); + if (!share_name) { + return WERR_NOMEM; } if (r->out.parm_error) { *r->out.parm_error = 0; } - if ( strequal(r->in.share_name,"IPC$") - || ( lp_enable_asu_support() && strequal(r->in.share_name,"ADMIN$") ) - || strequal(r->in.share_name,"global") ) + if ( strequal(share_name,"IPC$") + || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") ) + || strequal(share_name,"global") ) { DEBUG(5,("_srvsvc_NetShareSetInfo: share %s cannot be " "modified by a remote user.\n", - r->in.share_name )); + share_name )); return WERR_ACCESS_DENIED; } - snum = find_service(r->in.share_name, share_name); + snum = find_service(share_name); /* Does this share exist ? */ if (snum < 0) @@ -1738,8 +1737,7 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, struct srvsvc_NetShareAdd *r) { char *command = NULL; - char *share_name_in = NULL; - fstring share_name; + char *share_name = NULL; char *comment = NULL; char *pathname = NULL; int type; @@ -1776,7 +1774,7 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, /* Not enough info in a level 1 to do anything. */ return WERR_ACCESS_DENIED; case 2: - share_name_in = talloc_strdup(ctx, r->in.info->info2->name); + 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 == (uint32_t)-1) ? @@ -1787,7 +1785,7 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, /* No path. Not enough info in a level 501 to do anything. */ return WERR_ACCESS_DENIED; case 502: - share_name_in = talloc_strdup(ctx, r->in.info->info502->name); + 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 == (uint32_t)-1) ? @@ -1815,21 +1813,21 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, /* check for invalid share names */ - if (!share_name_in || !validate_net_name(share_name_in, + if (!share_name || !validate_net_name(share_name, INVALID_SHARENAME_CHARS, - strlen(share_name_in))) { + strlen(share_name))) { DEBUG(5,("_srvsvc_NetShareAdd: Bad sharename \"%s\"\n", - share_name_in ? share_name_in : "")); + share_name ? share_name : "")); return WERR_INVALID_NAME; } - if (strequal(share_name_in,"IPC$") || strequal(share_name_in,"global") + if (strequal(share_name,"IPC$") || strequal(share_name,"global") || (lp_enable_asu_support() && - strequal(share_name_in,"ADMIN$"))) { + strequal(share_name,"ADMIN$"))) { return WERR_ACCESS_DENIED; } - snum = find_service(share_name_in, share_name); + snum = find_service(share_name); /* Share already exists. */ if (snum >= 0) { @@ -1847,7 +1845,7 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, } /* Ensure share name, pathname and comment don't contain '"' characters. */ - string_replace(share_name_in, '"', ' '); + string_replace(share_name, '"', ' '); string_replace(path, '"', ' '); if (comment) { string_replace(comment, '"', ' '); @@ -1857,7 +1855,7 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, "%s \"%s\" \"%s\" \"%s\" \"%s\" %d", lp_add_share_cmd(), get_dyn_CONFIGFILE(), - share_name_in, + share_name, path, comment ? comment : "", max_connections); @@ -1894,8 +1892,6 @@ WERROR _srvsvc_NetShareAdd(pipes_struct *p, 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 )); @@ -1923,7 +1919,7 @@ WERROR _srvsvc_NetShareDel(pipes_struct *p, struct srvsvc_NetShareDel *r) { char *command = NULL; - fstring share_name; + char *share_name = NULL; int ret; int snum; SE_PRIV se_diskop = SE_DISK_OPERATOR; @@ -1933,21 +1929,22 @@ WERROR _srvsvc_NetShareDel(pipes_struct *p, DEBUG(5,("_srvsvc_NetShareDel: %d\n", __LINE__)); - if (!r->in.share_name) { + share_name = talloc_strdup(p->mem_ctx, r->in.share_name); + if (!share_name) { return WERR_NET_NAME_NOT_FOUND; } - if ( strequal(r->in.share_name,"IPC$") - || ( lp_enable_asu_support() && strequal(r->in.share_name,"ADMIN$") ) - || strequal(r->in.share_name,"global") ) + 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))) { + if (!(params = get_share_params(p->mem_ctx, share_name))) { return WERR_NO_SUCH_SHARE; } - snum = find_service(r->in.share_name, share_name); + snum = find_service(share_name); /* No change to printer shares. */ if (lp_print_ok(snum)) @@ -2090,11 +2087,9 @@ WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, ZERO_STRUCT(st); - if (!r->in.share) { - return WERR_INVALID_NAME; - } + fstrcpy(servicename, r->in.share); - snum = find_service(r->in.share, servicename); + snum = find_service(servicename); if (snum == -1) { DEBUG(10, ("Could not find service %s\n", servicename)); werr = WERR_NET_NAME_NOT_FOUND; @@ -2222,11 +2217,9 @@ WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, ZERO_STRUCT(st); - if (!r->in.share) { - return WERR_INVALID_NAME; - } + fstrcpy(servicename, r->in.share); - snum = find_service(r->in.share, servicename); + snum = find_service(servicename); if (snum == -1) { DEBUG(10, ("Could not find service %s\n", servicename)); werr = WERR_NET_NAME_NOT_FOUND; diff --git a/source3/smbd/lanman.c b/source3/smbd/lanman.c index 9b173d4d7f4..7b01968a1f0 100644 --- a/source3/smbd/lanman.c +++ b/source3/smbd/lanman.c @@ -849,7 +849,6 @@ static bool api_DosPrintQGetInfo(connection_struct *conn, uint16 vuid, char *str2 = skip_string(param,tpscnt,str1); char *p = skip_string(param,tpscnt,str2); char *QueueName = p; - fstring share_name; unsigned int uLevel; int count=0; int snum; @@ -900,7 +899,7 @@ static bool api_DosPrintQGetInfo(connection_struct *conn, uint16 vuid, return(True); } - snum = find_service(QueueName, share_name); + snum = find_service(QueueName); if ( !(lp_snum_ok(snum) && lp_print_ok(snum)) ) return False; @@ -1930,13 +1929,12 @@ static bool api_RNetShareGetInfo(connection_struct *conn,uint16 vuid, char *p = skip_string(param,tpscnt,netname); int uLevel = get_safe_SVAL(param,tpscnt,p,0,-1); int snum; - fstring share_name; if (!str1 || !str2 || !netname || !p) { return False; } - snum = find_service(netname, share_name); + snum = find_service(netname); if (snum < 0) { return False; } @@ -2128,7 +2126,7 @@ static bool api_RNetShareAdd(connection_struct *conn,uint16 vuid, return False; } pull_ascii_fstring(sharename,data); - snum = find_service(sharename, sharename); + snum = find_service(sharename); if (snum >= 0) { /* already exists */ res = ERRfilexists; goto error_exit; @@ -4184,7 +4182,6 @@ static bool api_WPrintJobEnumerate(connection_struct *conn, uint16 vuid, struct pack_desc desc; print_queue_struct *queue=NULL; print_status_struct status; - fstring share_name; if (!str1 || !str2 || !p) { return False; @@ -4214,7 +4211,7 @@ static bool api_WPrintJobEnumerate(connection_struct *conn, uint16 vuid, return False; } - snum = find_service(name, share_name); + snum = find_service(name); if ( !(lp_snum_ok(snum) && lp_print_ok(snum)) ) { return False; } @@ -4335,7 +4332,6 @@ static bool api_WPrintDestGetInfo(connection_struct *conn, uint16 vuid, char *str2 = skip_string(param,tpscnt,str1); char *p = skip_string(param,tpscnt,str2); char* PrinterName = p; - fstring share_name; int uLevel; struct pack_desc desc; int snum; @@ -4363,7 +4359,7 @@ static bool api_WPrintDestGetInfo(connection_struct *conn, uint16 vuid, return False; } - snum = find_service(PrinterName, share_name); + snum = find_service(PrinterName); if ( !(lp_snum_ok(snum) && lp_print_ok(snum)) ) { *rdata_len = 0; desc.errcode = NERR_DestNotFound; diff --git a/source3/smbd/msdfs.c b/source3/smbd/msdfs.c index 718d0def721..0480b585503 100644 --- a/source3/smbd/msdfs.c +++ b/source3/smbd/msdfs.c @@ -822,7 +822,8 @@ NTSTATUS get_referred_path(TALLOC_CTX *ctx, snum = lp_servicenumber(jucn->service_name); if(snum < 0) { fstring service_name; - if ((snum = find_service(jucn->service_name, service_name)) < 0) { + fstrcpy(service_name, jucn->service_name); + if ((snum = find_service(service_name)) < 0) { return NT_STATUS_NOT_FOUND; } TALLOC_FREE(jucn->service_name); diff --git a/source3/smbd/service.c b/source3/smbd/service.c index 5281ef32c93..2de93848935 100644 --- a/source3/smbd/service.c +++ b/source3/smbd/service.c @@ -300,20 +300,14 @@ int add_home_service(const char *service, const char *username, const char *home /** * Find a service entry. * - * @param service_in is modified (to canonical form??) - * and returned in return parameter service. + * @param service is modified (to canonical form??) **/ -int find_service(const char *service_in, fstring service) +int find_service(fstring service) { 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); @@ -400,7 +394,7 @@ int find_service(const char *service_in, fstring service) goto fail; } - iService = find_service(defservice, service); + iService = find_service(defservice); if (iService >= 0) { all_string_sub(service, "_","/",0); iService = lp_add_service(service, iService); @@ -1183,7 +1177,7 @@ connection_struct *make_connection(struct smbd_server_connection *sconn, fstrcpy(unix_username, current_user_info.smb_name); map_username(sconn, unix_username); - snum = find_service(unix_username, unix_username); + snum = find_service(unix_username); } if (snum != -1) { DEBUG(5, ("making a connection to 'homes' " @@ -1211,7 +1205,7 @@ connection_struct *make_connection(struct smbd_server_connection *sconn, strlower_m(service); - snum = find_service(service, service); + snum = find_service(service); if (snum < 0) { if (strequal(service,"IPC$") || diff --git a/source3/smbd/smb2_tcon.c b/source3/smbd/smb2_tcon.c index f7b9bdb5929..70c5e8845e5 100644 --- a/source3/smbd/smb2_tcon.c +++ b/source3/smbd/smb2_tcon.c @@ -167,7 +167,7 @@ static NTSTATUS smbd_smb2_tree_connect(struct smbd_smb2_request *req, strlower_m(service); - snum = find_service(service, service); + snum = find_service(service); if (snum < 0) { DEBUG(3,("smbd_smb2_tree_connect: couldn't find service %s\n", service)); -- 2.11.4.GIT