[SCM] Samba Shared Repository - branch v3-2-stable updated - release-3-2-4-61-gf8d4596

Karolin Seeger kseeger at samba.org
Tue Oct 21 13:05:44 GMT 2008


The branch, v3-2-stable has been updated
       via  f8d4596ec2b8f35dd3cc05aa7ee356abb9c0920b (commit)
       via  afed4929f9c707fb72b0e8dd12b1a1e8dcab9a84 (commit)
       via  feb057d4503118e519b5dbd9d2c3ca2c1ee55380 (commit)
       via  01fd94981e322da59ac2c00055220c89de135ebe (commit)
       via  f3b0e219f1a7660ff275db701935eecbe053fa25 (commit)
       via  520dcfffe78bb079bbdad6de5a4cdc392527f4b8 (commit)
      from  ec9f180390852a9356df11412bc7478f48f52b43 (commit)

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


- Log -----------------------------------------------------------------
commit f8d4596ec2b8f35dd3cc05aa7ee356abb9c0920b
Author: Günther Deschner <gd at samba.org>
Date:   Mon Oct 20 20:16:03 2008 +0200

    s3-samr-server: be consistent when reporting we do password complexity.
    
    Guenther
    (cherry picked from commit 7c2831c5872ad26e1e0cd7df59d6c0b88d566760)

commit afed4929f9c707fb72b0e8dd12b1a1e8dcab9a84
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Oct 17 15:25:58 2008 -0700

    Unify access checks for lsa server functions.
    Jeremy.
    (cherry picked from commit ef15ff6abec34377ab7fa75201e2799c0bb72aeb)

commit feb057d4503118e519b5dbd9d2c3ca2c1ee55380
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Oct 16 21:04:18 2008 -0700

    Cope with bad trans2mkdir requests from System i QNTC IBM SMB client.
    If total_data == 4 Windows doesn't care what values
    are placed in that field, it just ignores them.
    The System i QNTC IBM SMB client puts bad values here,
    so ignore them.
    Jeremy.
    (cherry picked from commit 5b1d8588d01d11251541829c5a3dff211fe925fd)

commit 01fd94981e322da59ac2c00055220c89de135ebe
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Oct 16 15:06:13 2008 -0700

    Unify the logic in pull_ascii_base_talloc() and pull_ucs2_base_talloc().
    Jeremy.
    (cherry picked from commit 5109bd33719a4bb1534cb0e012c92ec778fb26df)

commit f3b0e219f1a7660ff275db701935eecbe053fa25
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Oct 16 11:57:51 2008 -0700

    Fix bug 5826 - Directory/Filenames get truncated when 3.2.0 client acesses old server.
    Karolin this is a show-stopper for 3.2.5.
    There was some code in pull_ucs2_base_talloc() to cope with this case which
    hadn't been added to pull_ascii_base_talloc(). The older Samba returns non
    unicode names which is why you are seeing this codepath being executed.
    Jeremy.
    (cherry picked from commit 09fa53d927436310ae3c17096d42e2fa4de1dd2e)

commit 520dcfffe78bb079bbdad6de5a4cdc392527f4b8
Author: Jeremy Allison <jra at samba.org>
Date:   Wed Oct 15 18:08:07 2008 -0700

    Don't use debug level 1 to log a trivial message.
    Jeremy.
    (cherry picked from commit 7c53cde257515e7bfffc8f3c0b54b7c99554d240)

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

Summary of changes:
 source/include/rpc_lsa.h        |    1 +
 source/lib/charcnv.c            |   50 ++++++++++++++++++++++++++++++++------
 source/rpc_client/cli_pipe.c    |    2 +-
 source/rpc_server/srv_lsa_nt.c  |   21 +++++++++++++---
 source/rpc_server/srv_samr_nt.c |    4 +++
 source/smbd/trans2.c            |    7 +++--
 6 files changed, 69 insertions(+), 16 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/include/rpc_lsa.h b/source/include/rpc_lsa.h
index b4021af..1dc5ba4 100644
--- a/source/include/rpc_lsa.h
+++ b/source/include/rpc_lsa.h
@@ -39,6 +39,7 @@
 
 
 #define LSA_POLICY_READ       ( STANDARD_RIGHTS_READ_ACCESS      |\
+                            LSA_POLICY_VIEW_LOCAL_INFORMATION    |\
                             LSA_POLICY_VIEW_AUDIT_INFORMATION    |\
                             LSA_POLICY_GET_PRIVATE_INFORMATION)
 
diff --git a/source/lib/charcnv.c b/source/lib/charcnv.c
index cea234f..f4efcb2 100644
--- a/source/lib/charcnv.c
+++ b/source/lib/charcnv.c
@@ -1183,6 +1183,10 @@ static size_t pull_ascii_base_talloc(TALLOC_CTX *ctx,
 
 	*ppdest = NULL;
 
+	if (!src_len) {
+		return 0;
+	}
+
 	if (flags & STR_TERMINATE) {
 		if (src_len == (size_t)-1) {
 			src_len = strlen((const char *)src) + 1;
@@ -1200,16 +1204,41 @@ static size_t pull_ascii_base_talloc(TALLOC_CTX *ctx,
 					(unsigned int)src_len);
 			smb_panic(msg);
 		}
+	} else {
+		/* Can't have an unlimited length
+		 * non STR_TERMINATE'd.
+		 */
+		if (src_len == (size_t)-1) {
+			errno = EINVAL;
+			return 0;
+		}
 	}
 
+	/* src_len != -1 here. */
+
 	if (!convert_string_allocate(ctx, CH_DOS, CH_UNIX, src, src_len, &dest,
-		&dest_len, True))
+		&dest_len, True)) {
 		dest_len = 0;
+	}
 
 	if (dest_len && dest) {
 		/* Did we already process the terminating zero ? */
 		if (dest[dest_len-1] != 0) {
-			dest[dest_len-1] = 0;
+			size_t size = talloc_get_size(dest);
+			/* Have we got space to append the '\0' ? */
+			if (size <= dest_len) {
+				/* No, realloc. */
+				dest = TALLOC_REALLOC_ARRAY(ctx, dest, char,
+						dest_len+1);
+				if (!dest) {
+					/* talloc fail. */
+					dest_len = (size_t)-1;
+					return 0;
+				}
+			}
+			/* Yay - space ! */
+			dest[dest_len] = '\0';
+			dest_len++;
 		}
 	} else if (dest) {
 		dest[0] = 0;
@@ -1557,12 +1586,20 @@ size_t pull_ucs2_base_talloc(TALLOC_CTX *ctx,
 		if (src_len >= 1024*1024) {
 			smb_panic("Bad src length in pull_ucs2_base_talloc\n");
 		}
+	} else {
+		/* Can't have an unlimited length
+		 * non STR_TERMINATE'd.
+		 */
+		if (src_len == (size_t)-1) {
+			errno = EINVAL;
+			return 0;
+		}
 	}
 
+	/* src_len != -1 here. */
+
 	/* ucs2 is always a multiple of 2 bytes */
-	if (src_len != (size_t)-1) {
-		src_len &= ~1;
-	}
+	src_len &= ~1;
 
 	dest_len = convert_string_talloc(ctx,
 					CH_UTF16LE,
@@ -1575,9 +1612,6 @@ size_t pull_ucs2_base_talloc(TALLOC_CTX *ctx,
 		dest_len = 0;
 	}
 
-	if (src_len == (size_t)-1)
-		src_len = dest_len*2;
-
 	if (dest_len) {
 		/* Did we already process the terminating zero ? */
 		if (dest[dest_len-1] != 0) {
diff --git a/source/rpc_client/cli_pipe.c b/source/rpc_client/cli_pipe.c
index 35256d7..35b5a8d 100644
--- a/source/rpc_client/cli_pipe.c
+++ b/source/rpc_client/cli_pipe.c
@@ -2221,7 +2221,7 @@ static struct rpc_pipe_client *cli_rpc_pipe_open(struct cli_state *cli, int pipe
 	fnum = cli_nt_create(cli, result->pipe_name, DESIRED_ACCESS_PIPE);
 
 	if (fnum == -1) {
-		DEBUG(1,("cli_rpc_pipe_open: cli_nt_create failed on pipe %s "
+		DEBUG(3,("cli_rpc_pipe_open: cli_nt_create failed on pipe %s "
 			 "to machine %s.  Error was %s\n",
 			 result->pipe_name, cli->desthost,
 			 cli_errstr(cli)));
diff --git a/source/rpc_server/srv_lsa_nt.c b/source/rpc_server/srv_lsa_nt.c
index 79b6d46..9ce992c 100644
--- a/source/rpc_server/srv_lsa_nt.c
+++ b/source/rpc_server/srv_lsa_nt.c
@@ -434,7 +434,7 @@ NTSTATUS _lsa_OpenPolicy(pipes_struct *p,
 	lsa_get_generic_sd(p->mem_ctx, &psd, &sd_size);
 
 	if(!se_access_check(psd, p->pipe_user.nt_user_token, des_access, &acc_granted, &status)) {
-		if (geteuid() != 0) {
+		if (p->pipe_user.ut.uid != sec_initial_uid()) {
 			return status;
 		}
 		DEBUG(4,("ACCESS should be DENIED (granted: %#010x;  required: %#010x)\n",
@@ -1530,7 +1530,8 @@ NTSTATUS _lsa_CreateAccount(pipes_struct *p,
 	/* check to see if the pipe_user is a Domain Admin since
 	   account_pol.tdb was already opened as root, this is all we have */
 
-	if ( !nt_token_check_domain_rid( p->pipe_user.nt_user_token, DOMAIN_GROUP_RID_ADMINS ) )
+	if ( p->pipe_user.ut.uid != sec_initial_uid()
+		&& !nt_token_check_domain_rid( p->pipe_user.nt_user_token, DOMAIN_GROUP_RID_ADMINS ) )
 		return NT_STATUS_ACCESS_DENIED;
 
 	if ( is_privileged_sid( r->in.sid ) )
@@ -1616,6 +1617,9 @@ NTSTATUS _lsa_EnumPrivsAccount(pipes_struct *p,
 	if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&info))
 		return NT_STATUS_INVALID_HANDLE;
 
+	if (!(info->access & LSA_POLICY_VIEW_LOCAL_INFORMATION))
+		return NT_STATUS_ACCESS_DENIED;
+
 	if ( !get_privileges_for_sids( &mask, &info->sid, 1 ) )
 		return NT_STATUS_OBJECT_NAME_NOT_FOUND;
 
@@ -1676,6 +1680,9 @@ NTSTATUS _lsa_GetSystemAccessAccount(pipes_struct *p,
 	if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&info))
 		return NT_STATUS_INVALID_HANDLE;
 
+	if (!(info->access & LSA_POLICY_VIEW_LOCAL_INFORMATION))
+		return NT_STATUS_ACCESS_DENIED;
+
 	if (!lookup_sid(p->mem_ctx, &info->sid, NULL, NULL, NULL))
 		return NT_STATUS_ACCESS_DENIED;
 
@@ -1710,7 +1717,8 @@ NTSTATUS _lsa_SetSystemAccessAccount(pipes_struct *p,
 	/* check to see if the pipe_user is a Domain Admin since
 	   account_pol.tdb was already opened as root, this is all we have */
 
-	if ( !nt_token_check_domain_rid( p->pipe_user.nt_user_token, DOMAIN_GROUP_RID_ADMINS ) )
+	if ( p->pipe_user.ut.uid != sec_initial_uid()
+		&& !nt_token_check_domain_rid( p->pipe_user.nt_user_token, DOMAIN_GROUP_RID_ADMINS ) )
 		return NT_STATUS_ACCESS_DENIED;
 
 	if (!pdb_getgrsid(&map, info->sid))
@@ -1820,7 +1828,6 @@ NTSTATUS _lsa_QuerySecurity(pipes_struct *p,
 	if (!(handle->access & LSA_POLICY_VIEW_LOCAL_INFORMATION))
 		return NT_STATUS_ACCESS_DENIED;
 
-
 	switch (r->in.sec_info) {
 	case 1:
 		/* SD contains only the owner */
@@ -2078,6 +2085,9 @@ NTSTATUS _lsa_EnumAccountRights(pipes_struct *p,
 	if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&info))
 		return NT_STATUS_INVALID_HANDLE;
 
+	if (!(info->access & LSA_POLICY_VIEW_LOCAL_INFORMATION))
+		return NT_STATUS_ACCESS_DENIED;
+
 	/* according to an NT4 PDC, you can add privileges to SIDs even without
 	   call_lsa_create_account() first.  And you can use any arbitrary SID. */
 
@@ -2120,6 +2130,9 @@ NTSTATUS _lsa_LookupPrivValue(pipes_struct *p,
 	if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&info))
 		return NT_STATUS_INVALID_HANDLE;
 
+	if (!(info->access & LSA_POLICY_VIEW_LOCAL_INFORMATION))
+		return NT_STATUS_ACCESS_DENIED;
+
 	name = r->in.name->string;
 
 	DEBUG(10,("_lsa_lookup_priv_value: name = %s\n", name));
diff --git a/source/rpc_server/srv_samr_nt.c b/source/rpc_server/srv_samr_nt.c
index a89e00f..c59a46c 100644
--- a/source/rpc_server/srv_samr_nt.c
+++ b/source/rpc_server/srv_samr_nt.c
@@ -2910,6 +2910,10 @@ static NTSTATUS samr_QueryDomainInfo_internal(const char *fn_name,
 			unix_to_nt_time_abs(&nt_expire, u_expire);
 			unix_to_nt_time_abs(&nt_min_age, u_min_age);
 
+			if (lp_check_password_script() && *lp_check_password_script()) {
+				password_properties |= DOMAIN_PASSWORD_COMPLEX;
+			}
+
 			init_samr_DomInfo1(&dom_info->info1,
 					   (uint16)min_pass_len,
 					   (uint16)pass_hist,
diff --git a/source/smbd/trans2.c b/source/smbd/trans2.c
index f3b45ad..acc424f 100644
--- a/source/smbd/trans2.c
+++ b/source/smbd/trans2.c
@@ -7048,10 +7048,11 @@ static void call_trans2mkdir(connection_struct *conn, struct smb_request *req,
 			reply_nterror(req, NT_STATUS_INVALID_PARAMETER);
 			return;
 		}
-	} else if (IVAL(pdata,0) != 4) {
-		reply_nterror(req, NT_STATUS_INVALID_PARAMETER);
-		return;
 	}
+	/* If total_data == 4 Windows doesn't care what values
+	 * are placed in that field, it just ignores them.
+	 * The System i QNTC IBM SMB client puts bad values here,
+	 * so ignore them. */
 
 	status = create_directory(conn, req, directory);
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list