[SCM] Samba Shared Repository - branch v3-5-test updated

Karolin Seeger kseeger at samba.org
Wed Oct 31 04:54:17 MDT 2012


The branch, v3-5-test has been updated
       via  92bd768 Revert "Fix bug #7781 (Samba transforms "ShareName" to lowercase when adding new share via MMC)"
       via  79564b8 Revert "Revert "s3-smbd: Don't segfault if user specified ports out for range.""
      from  fce3a18 Revert "s3-smbd: Don't segfault if user specified ports out for range."

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-5-test


- Log -----------------------------------------------------------------
commit 92bd768ed56585c2a45d0ca41eec9e6a1e3701ae
Author: Karolin Seeger <kseeger at samba.org>
Date:   Wed Oct 31 11:40:26 2012 +0100

    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

commit 79564b889dba69fa39d9839e5d45457657ab0950
Author: Karolin Seeger <kseeger at samba.org>
Date:   Wed Oct 31 11:39:34 2012 +0100

    Revert "Revert "s3-smbd: Don't segfault if user specified ports out for range.""
    
    This reverts commit fce3a18d3d5ed46f8e0d1653f862e46b5dff0e03.
    
    This patch does not seem to cause the issue. Sorry for the noise.
    
    Karolin

-----------------------------------------------------------------------

Summary of changes:
 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/server.c                   |   23 +++++-----
 source3/smbd/service.c                  |   16 ++-----
 source3/smbd/smb2_tcon.c                |    2 +-
 13 files changed, 82 insertions(+), 90 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/proto.h b/source3/include/proto.h
index cee5d6a..785cc30 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 28c6f0e..a41e6dc 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 17a4a8f..d869637 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; 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] ) ) {
diff --git a/source3/modules/vfs_xattr_tdb.c b/source3/modules/vfs_xattr_tdb.c
index fa8db04..f7fbfce 100644
--- a/source3/modules/vfs_xattr_tdb.c
+++ b/source3/modules/vfs_xattr_tdb.c
@@ -733,7 +733,8 @@ static int xattr_tdb_connect(vfs_handle_struct *handle, const char *service,
 		return res;
 	}
 
-	snum = find_service(service, sname);
+	fstrcpy(sname, service);
+	snum = find_service(sname);
 	if (snum == -1) {
 		/*
 		 * Should not happen, but we should not fail just *here*.
diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c
index eaff9e6..8c1cf09 100644
--- a/source3/param/loadparm.c
+++ b/source3/param/loadparm.c
@@ -9471,10 +9471,15 @@ struct share_params *get_share_params(TALLOC_CTX *mem_ctx,
 				      const char *sharename)
 {
 	struct share_params *result;
-	fstring sname;
+	char *sname;
 	int snum;
 
-	snum = find_service(sharename, sname);
+	if (!(sname = SMB_STRDUP(sharename))) {
+		return NULL;
+	}
+
+	snum = find_service(sname);
+	SAFE_FREE(sname);
 
 	if (snum < 0) {
 		return NULL;
diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c
index 85ce703..beaa9e5 100644
--- a/source3/printing/nt_printing.c
+++ b/source3/printing/nt_printing.c
@@ -1472,7 +1472,9 @@ static uint32 get_correct_cversion(struct pipes_struct *p,
 		return 3;
 	}
 
-	printdollar_snum = find_service("print$", printdollar);
+	fstrcpy(printdollar, "print$");
+
+	printdollar_snum = find_service(printdollar);
 	if (printdollar_snum == -1) {
 		*perr = WERR_NO_SUCH_SHARE;
 		return -1;
@@ -1862,7 +1864,9 @@ WERROR move_driver_to_download_area(struct pipes_struct *p,
 		return WERR_UNKNOWN_PRINTER_DRIVER;
 	}
 
-	printdollar_snum = find_service("print$", printdollar);
+	fstrcpy(printdollar, "print$");
+
+	printdollar_snum = find_service(printdollar);
 	if (printdollar_snum == -1) {
 		*perr = WERR_NO_SUCH_SHARE;
 		return WERR_NO_SUCH_SHARE;
@@ -5130,7 +5134,9 @@ static bool delete_driver_files(struct pipes_struct *rpc_pipe,
 	DEBUG(6,("delete_driver_files: deleting driver [%s] - version [%d]\n",
 		r->driver_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 cba4f79..90ccc33 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; i<num_keys; i++ ) {
-		fstring printername;
-		printername_in = regsubkey_ctr_specific_key( subkeys, i );
-		snum = find_service(printername_in, printername);
+		printername = regsubkey_ctr_specific_key( subkeys, i );
+		snum = find_service( printername );
 		
 		/* just verify a valied snum for now */
 		if ( snum == -1 ) {
diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c
index b51c7e2..a2d1d07 100644
--- a/source3/rpc_server/srv_srvsvc_nt.c
+++ b/source3/rpc_server/srv_srvsvc_nt.c
@@ -1397,11 +1397,9 @@ WERROR _srvsvc_NetShareGetInfo(pipes_struct *p,
 
 	DEBUG(5,("_srvsvc_NetShareGetInfo: %d\n", __LINE__));
 
-	if (!r->in.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 9b173d4..7b01968 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 718d0de..0480b58 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/server.c b/source3/smbd/server.c
index 63a9869..f34d9f6 100644
--- a/source3/smbd/server.c
+++ b/source3/smbd/server.c
@@ -560,6 +560,8 @@ static bool open_sockets_smbd(struct smbd_parent_context *parent,
 	int num_interfaces = iface_count();
 	int i;
 	char *ports;
+	char *tok;
+	const char *ptr;
 	unsigned dns_port = 0;
 
 #ifdef HAVE_ATEXIT
@@ -581,6 +583,16 @@ static bool open_sockets_smbd(struct smbd_parent_context *parent,
 		ports = talloc_strdup(talloc_tos(), smb_ports);
 	}
 
+	for (ptr = ports;
+	     next_token_talloc(talloc_tos(),&ptr, &tok, " \t,");) {
+		unsigned port = atoi(tok);
+
+		if (port == 0 || port > 0xffff) {
+			exit_server_cleanly("Invalid port in the config or on "
+					    "the commandline specified!");
+		}
+	}
+
 	if (lp_interfaces() && lp_bind_interfaces_only()) {
 		/* We have been given an interfaces line, and been
 		   told to only bind to those interfaces. Create a
@@ -592,8 +604,6 @@ static bool open_sockets_smbd(struct smbd_parent_context *parent,
 		for(i = 0; i < num_interfaces; i++) {
 			const struct sockaddr_storage *ifss =
 					iface_n_sockaddr_storage(i);
-			char *tok;
-			const char *ptr;
 
 			if (ifss == NULL) {
 				DEBUG(0,("open_sockets_smbd: "
@@ -605,9 +615,6 @@ static bool open_sockets_smbd(struct smbd_parent_context *parent,
 			for (ptr=ports;
 			     next_token_talloc(talloc_tos(),&ptr, &tok, " \t,");) {
 				unsigned port = atoi(tok);
-				if (port == 0 || port > 0xffff) {
-					continue;
-				}
 
 				/* Keep the first port for mDNS service
 				 * registration.
@@ -625,8 +632,6 @@ static bool open_sockets_smbd(struct smbd_parent_context *parent,
 		/* Just bind to 0.0.0.0 - accept connections
 		   from anywhere. */
 
-		char *tok;
-		const char *ptr;
 		const char *sock_addr = lp_socket_address();
 		char *sock_tok;
 		const char *sock_ptr;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list