From 92bd768ed56585c2a45d0ca41eec9e6a1e3701ae 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 --- 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.34.1