[SCM] Samba Shared Repository - branch v3-2-test updated - release-3-2-0pre2-809-g5912438

Volker Lendecke vlendec at samba.org
Fri Apr 11 09:35:24 GMT 2008


The branch, v3-2-test has been updated
       via  59124382d2894a1b194b48dd82bc5f956959eb48 (commit)
       via  448a8fe6c15bc4e85149d1ae821f0ebc2e3edde5 (commit)
      from  e0947537e61cdc7aaaf1256a7f9a590f006cb3d9 (commit)

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


- Log -----------------------------------------------------------------
commit 59124382d2894a1b194b48dd82bc5f956959eb48
Author: Tim Prouty <tim.prouty at isilon.com>
Date:   Mon Mar 3 13:32:54 2008 -0800

    Cleanup size_t return values in convert_string_allocate
    
    This patch is the first iteration of an inside-out conversion to cleanup
    functions in charcnv.c returning size_t == -1 to indicate failure.

commit 448a8fe6c15bc4e85149d1ae821f0ebc2e3edde5
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Apr 11 11:34:33 2008 +0200

    Fix bug 5366

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

Summary of changes:
 source/lib/charcnv.c                 |  134 +++++++++++++++++++---------------
 source/lib/util_reg.c                |    6 +-
 source/libsmb/climessage.c           |    5 +-
 source/smbd/chgpasswd.c              |    7 ++-
 source/smbd/notify.c                 |    7 +-
 source/utils/ntlm_auth_diagnostics.c |    7 +-
 source/web/cgi.c                     |    8 +-
 7 files changed, 97 insertions(+), 77 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/lib/charcnv.c b/source/lib/charcnv.c
index 69d1db0..81b7238 100644
--- a/source/lib/charcnv.c
+++ b/source/lib/charcnv.c
@@ -511,9 +511,12 @@ size_t convert_string(charset_t from, charset_t to,
  * (this is a bad interface and needs fixing. JRA).
  * @param srclen length of source buffer.
  * @param dest always set at least to NULL
+ * @param converted_size set to the size of the allocated buffer on return
+ * true
  * @note -1 is not accepted for srclen.
  *
- * @returns Size in bytes of the converted string; or -1 in case of error.
+ * @return True if new buffer was correctly allocated, and string was
+ * converted.
  *
  * Ensure the srclen contains the terminating zero.
  *
@@ -521,8 +524,9 @@ size_t convert_string(charset_t from, charset_t to,
  * There has to be a cleaner way to do this. JRA.
  **/
 
-size_t convert_string_allocate(TALLOC_CTX *ctx, charset_t from, charset_t to,
-			       void const *src, size_t srclen, void *dst, bool allow_bad_conv)
+bool convert_string_allocate(TALLOC_CTX *ctx, charset_t from, charset_t to,
+			     void const *src, size_t srclen, void *dst,
+			     size_t *converted_size, bool allow_bad_conv)
 {
 	size_t i_len, o_len, destlen = (srclen * 3) / 2;
 	size_t retval;
@@ -533,10 +537,19 @@ size_t convert_string_allocate(TALLOC_CTX *ctx, charset_t from, charset_t to,
 
 	*dest = NULL;
 
-	if (src == NULL || srclen == (size_t)-1)
-		return (size_t)-1;
-	if (srclen == 0)
-		return 0;
+	if (!converted_size) {
+		errno = EINVAL;
+		return false;
+	}
+
+	if (src == NULL || srclen == (size_t)-1) {
+		errno = EINVAL;
+		return false;
+	}
+	if (srclen == 0) {
+		*converted_size = 0;
+		return true;
+	}
 
 	lazy_initialize_conv();
 
@@ -545,7 +558,8 @@ size_t convert_string_allocate(TALLOC_CTX *ctx, charset_t from, charset_t to,
 	if (descriptor == (smb_iconv_t)-1 || descriptor == (smb_iconv_t)0) {
 		if (!conv_silent)
 			DEBUG(0,("convert_string_allocate: Conversion not supported.\n"));
-		return (size_t)-1;
+		errno = EOPNOTSUPP;
+		return false;
 	}
 
   convert:
@@ -557,7 +571,8 @@ size_t convert_string_allocate(TALLOC_CTX *ctx, charset_t from, charset_t to,
 			DEBUG(0, ("convert_string_allocate: destlen wrapped !\n"));
 		if (!ctx)
 			SAFE_FREE(outbuf);
-		return (size_t)-1;
+		errno = EOPNOTSUPP;
+		return false;
 	} else {
 		destlen = destlen * 2;
 	}
@@ -571,7 +586,8 @@ size_t convert_string_allocate(TALLOC_CTX *ctx, charset_t from, charset_t to,
 
 	if (!ob) {
 		DEBUG(0, ("convert_string_allocate: realloc failed!\n"));
-		return (size_t)-1;
+		errno = ENOMEM;
+		return false;
 	}
 	outbuf = ob;
 	i_len = srclen;
@@ -610,7 +626,7 @@ size_t convert_string_allocate(TALLOC_CTX *ctx, charset_t from, charset_t to,
 		} else {
 			SAFE_FREE(ob);
 		}
-		return (size_t)-1;
+		return false;
 	}
 
   out:
@@ -631,7 +647,8 @@ size_t convert_string_allocate(TALLOC_CTX *ctx, charset_t from, charset_t to,
 
 	if (destlen && !ob) {
 		DEBUG(0, ("convert_string_allocate: out of memory!\n"));
-		return (size_t)-1;
+		errno = ENOMEM;
+		return false;
 	}
 
 	*dest = ob;
@@ -640,7 +657,8 @@ size_t convert_string_allocate(TALLOC_CTX *ctx, charset_t from, charset_t to,
 	ob[destlen] = '\0';
 	ob[destlen+1] = '\0';
 
-	return destlen;
+	*converted_size = destlen;
+	return true;
 
  use_as_is:
 
@@ -743,8 +761,8 @@ size_t convert_string_talloc(TALLOC_CTX *ctx, charset_t from, charset_t to,
 	size_t dest_len;
 
 	*dest = NULL;
-	dest_len=convert_string_allocate(ctx, from, to, src, srclen, dest, allow_bad_conv);
-	if (dest_len == (size_t)-1)
+	if (!convert_string_allocate(ctx, from, to, src, srclen, dest,
+		&dest_len, allow_bad_conv))
 		return (size_t)-1;
 	if (*dest == NULL)
 		return (size_t)-1;
@@ -798,39 +816,28 @@ char *strdup_upper(const char *s)
 
 	if (*p) {
 		/* MB case. */
-		size_t size;
+		size_t size, size2;
 		smb_ucs2_t *buffer = NULL;
 
 		SAFE_FREE(out_buffer);
-		size = convert_string_allocate(NULL,
-					CH_UNIX,
-					CH_UTF16LE,
-					s,
-					strlen(s) + 1,
-					(void **)(void *)&buffer,
-					True);
-		if (size == (size_t)-1) {
+		if (!convert_string_allocate(NULL, CH_UNIX, CH_UTF16LE, s,
+			strlen(s) + 1, (void **)(void *)&buffer, &size,
+			True)) {
 			return NULL;
 		}
 
 		strupper_w(buffer);
 
-		size = convert_string_allocate(NULL,
-					CH_UTF16LE,
-					CH_UNIX,
-					buffer,
-					size,
-					(void **)(void *)&out_buffer,
-					True);
+		if (!convert_string_allocate(NULL, CH_UTF16LE, CH_UNIX, buffer,
+			size, (void **)(void *)&out_buffer, &size2, True)) {
+			TALLOC_FREE(buffer);
+			return NULL;
+		}
 
 		/* Don't need the intermediate buffer
  		 * anymore.
  		 */
-
 		TALLOC_FREE(buffer);
-		if (size == (size_t)-1) {
-			return NULL;
-		}
 	}
 
 	return out_buffer;
@@ -904,9 +911,8 @@ size_t unix_strlower(const char *src, size_t srclen, char *dest, size_t destlen)
 	size_t size;
 	smb_ucs2_t *buffer = NULL;
 
-	size = convert_string_allocate(NULL, CH_UNIX, CH_UTF16LE, src, srclen,
-				       (void **)(void *)&buffer, True);
-	if (size == (size_t)-1 || !buffer) {
+	if (!convert_string_allocate(NULL, CH_UNIX, CH_UTF16LE, src, srclen,
+		(void **)(void *)&buffer, &size, True)) {
 		smb_panic("failed to create UCS2 buffer");
 	}
 	if (!strlower_w(buffer) && (dest == src)) {
@@ -1077,10 +1083,14 @@ size_t push_ascii_nstring(void *dest, const char *src)
 
 size_t push_ascii_allocate(char **dest, const char *src)
 {
-	size_t src_len = strlen(src)+1;
+	size_t dest_len, src_len = strlen(src)+1;
 
 	*dest = NULL;
-	return convert_string_allocate(NULL, CH_UNIX, CH_DOS, src, src_len, (void **)dest, True);
+	if (!convert_string_allocate(NULL, CH_UNIX, CH_DOS, src, src_len,
+		(void **)dest, &dest_len, True))
+		return (size_t)-1;
+	else
+		return dest_len;
 }
 
 /**
@@ -1192,17 +1202,9 @@ static size_t pull_ascii_base_talloc(TALLOC_CTX *ctx,
 		}
 	}
 
-	dest_len = convert_string_allocate(ctx,
-				CH_DOS,
-				CH_UNIX,
-				src,
-				src_len,
-				&dest,
-				True);
-
-	if (dest_len == (size_t)-1) {
+	if (!convert_string_allocate(ctx, CH_DOS, CH_UNIX, src, src_len, &dest,
+		&dest_len, True))
 		dest_len = 0;
-	}
 
 	if (dest_len && dest) {
 		/* Did we already process the terminating zero ? */
@@ -1333,10 +1335,14 @@ size_t push_ucs2_talloc(TALLOC_CTX *ctx, smb_ucs2_t **dest, const char *src)
 
 size_t push_ucs2_allocate(smb_ucs2_t **dest, const char *src)
 {
-	size_t src_len = strlen(src)+1;
+	size_t dest_len, src_len = strlen(src)+1;
 
 	*dest = NULL;
-	return convert_string_allocate(NULL, CH_UNIX, CH_UTF16LE, src, src_len, (void **)dest, True);
+	if (!convert_string_allocate(NULL, CH_UNIX, CH_UTF16LE, src, src_len,
+		(void **)dest, &dest_len, True))
+		return (size_t)-1;
+	else
+		return dest_len;
 }
 
 /**
@@ -1410,10 +1416,14 @@ size_t push_utf8_talloc(TALLOC_CTX *ctx, char **dest, const char *src)
 
 size_t push_utf8_allocate(char **dest, const char *src)
 {
-	size_t src_len = strlen(src)+1;
+	size_t dest_len, src_len = strlen(src)+1;
 
 	*dest = NULL;
-	return convert_string_allocate(NULL, CH_UNIX, CH_UTF8, src, src_len, (void **)dest, True);	
+	if (!convert_string_allocate(NULL, CH_UNIX, CH_UTF8, src, src_len,
+		(void **)dest, &dest_len, True))
+		return (size_t)-1;
+	else
+		return dest_len;
 }
 
 /**
@@ -1625,9 +1635,13 @@ size_t pull_ucs2_talloc(TALLOC_CTX *ctx, char **dest, const smb_ucs2_t *src)
 
 size_t pull_ucs2_allocate(char **dest, const smb_ucs2_t *src)
 {
-	size_t src_len = (strlen_w(src)+1) * sizeof(smb_ucs2_t);
+	size_t dest_len, src_len = (strlen_w(src)+1) * sizeof(smb_ucs2_t);
 	*dest = NULL;
-	return convert_string_allocate(NULL, CH_UTF16LE, CH_UNIX, src, src_len, (void **)dest, True);
+	if (!convert_string_allocate(NULL, CH_UTF16LE, CH_UNIX, src, src_len,
+		(void **)dest, &dest_len, True))
+		return (size_t)-1;
+	else
+		return dest_len;
 }
 
 /**
@@ -1655,9 +1669,13 @@ size_t pull_utf8_talloc(TALLOC_CTX *ctx, char **dest, const char *src)
 
 size_t pull_utf8_allocate(char **dest, const char *src)
 {
-	size_t src_len = strlen(src)+1;
+	size_t dest_len, src_len = strlen(src)+1;
 	*dest = NULL;
-	return convert_string_allocate(NULL, CH_UTF8, CH_UNIX, src, src_len, (void **)dest, True);
+	if (!convert_string_allocate(NULL, CH_UTF8, CH_UNIX, src, src_len,
+		(void **)dest, &dest_len, True))
+		return (size_t)-1;
+	else
+		return dest_len;
 }
  
 /**
diff --git a/source/lib/util_reg.c b/source/lib/util_reg.c
index 7366dcb..7c0c42d 100644
--- a/source/lib/util_reg.c
+++ b/source/lib/util_reg.c
@@ -93,10 +93,8 @@ WERROR reg_pull_multi_sz(TALLOC_CTX *mem_ctx, const void *buf, size_t len,
 		size_t dstlen, thislen;
 
 		thislen = strnlen_w(p, len) + 1;
-		dstlen = convert_string_allocate(*values, CH_UTF16LE, CH_UNIX,
-						 p, thislen*2, (void *)&val,
-						 true);
-		if (dstlen == (size_t)-1) {
+		if (!convert_string_allocate(*values, CH_UTF16LE, CH_UNIX,
+			p, thislen*2, (void *)&val, &dstlen, true)) {
 			TALLOC_FREE(*values);
 			return WERR_NOMEM;
 		}
diff --git a/source/libsmb/climessage.c b/source/libsmb/climessage.c
index 00c25aa..808190e 100644
--- a/source/libsmb/climessage.c
+++ b/source/libsmb/climessage.c
@@ -71,7 +71,7 @@ bool cli_message_start(struct cli_state *cli, const char *host, const char *user
 int cli_message_text_build(struct cli_state *cli, const char *msg, int len, int grp)
 {
 	char *msgdos;
-	int lendos;
+	size_t lendos;
 	char *p;
 
 	memset(cli->outbuf,'\0',smb_size);
@@ -85,7 +85,8 @@ int cli_message_text_build(struct cli_state *cli, const char *msg, int len, int
 	p = smb_buf(cli->outbuf);
 	*p++ = 1;
 
-	if ((lendos = (int)convert_string_allocate(NULL,CH_UNIX, CH_DOS, msg,len, (void **)(void *)&msgdos, True)) < 0 || !msgdos) {
+	if (!convert_string_allocate(NULL, CH_UNIX, CH_DOS, msg, len,
+		(void **)(void *)&msgdos, &lendos, True) || !msgdos) {
 		DEBUG(3,("Conversion failed, sending message in UNIX charset\n"));
 		SSVAL(p, 0, len); p += 2;
 		if (len > cli->bufsize - PTR_DIFF(p,cli->outbuf)) {
diff --git a/source/smbd/chgpasswd.c b/source/smbd/chgpasswd.c
index e7ab60d..b2b0823 100644
--- a/source/smbd/chgpasswd.c
+++ b/source/smbd/chgpasswd.c
@@ -159,7 +159,12 @@ static int dochild(int master, const char *slavedev, const struct passwd *pass,
 		DEBUG(3, ("More weirdness, could not open %s\n", slavedev));
 		return (False);
 	}
-#if defined(TIOCSCTTY)
+#if defined(TIOCSCTTY) && !defined(SUNOS5)
+	/*
+	 * On patched Solaris 10 TIOCSCTTY is defined but seems not to work,
+	 * see the discussion under
+	 * https://bugzilla.samba.org/show_bug.cgi?id=5366.
+	 */
 	if (ioctl(slave, TIOCSCTTY, 0) < 0)
 	{
 		DEBUG(3, ("Error in ioctl call for slave pty\n"));
diff --git a/source/smbd/notify.c b/source/smbd/notify.c
index ffdf1c2..eb3384d 100644
--- a/source/smbd/notify.c
+++ b/source/smbd/notify.c
@@ -82,10 +82,9 @@ static bool notify_marshall_changes(int num_changes,
 
 		c = &changes[i];
 
-		namelen = convert_string_allocate(
-			NULL, CH_UNIX, CH_UTF16LE, c->name, strlen(c->name)+1,
-			&uni_name.buffer, True);
-		if ((namelen == -1) || (uni_name.buffer == NULL)) {
+		if (!convert_string_allocate(NULL, CH_UNIX, CH_UTF16LE,
+			c->name, strlen(c->name)+1, &uni_name.buffer,
+			&namelen, True) || (uni_name.buffer == NULL)) {
 			goto fail;
 		}
 
diff --git a/source/utils/ntlm_auth_diagnostics.c b/source/utils/ntlm_auth_diagnostics.c
index 846b5ef..dfd05ad 100644
--- a/source/utils/ntlm_auth_diagnostics.c
+++ b/source/utils/ntlm_auth_diagnostics.c
@@ -470,18 +470,17 @@ static bool test_plaintext(enum ntlm_break break_which)
 		exit(1);
 	}
 
-	if ((convert_string_allocate(NULL, CH_UNIX, 
+	if (!convert_string_allocate(NULL, CH_UNIX,
 				     CH_DOS, password,
 				     strlen(password)+1, 
-				     &lm_response.data,True)) == -1) {
+				     &lm_response.data,
+				     &lm_response.length, True)) {
 		DEBUG(0, ("convert_string_allocate failed!\n"));
 		exit(1);
 	}
 
 	SAFE_FREE(password);
 
-	lm_response.length = strlen((const char *)lm_response.data);
-
 	switch (break_which) {
 	case BREAK_NONE:
 		break;
diff --git a/source/web/cgi.c b/source/web/cgi.c
index c6233b0..28f64f8 100644
--- a/source/web/cgi.c
+++ b/source/web/cgi.c
@@ -202,19 +202,19 @@ void cgi_load_variables(void)
 	   to our internal unix charset before use */
 	for (i=0;i<num_variables;i++) {
 		TALLOC_CTX *frame = talloc_stackframe();
-		char *dest;
+		char *dest = NULL;
+		size_t dest_len;
 
-		dest = NULL;
 		convert_string_allocate(frame, CH_UTF8, CH_UNIX,
 			       variables[i].name, -1,
-			       &dest, True);
+			       &dest, &dest_len, True);
 		SAFE_FREE(variables[i].name);
 		variables[i].name = SMB_STRDUP(dest ? dest : "");
 
 		dest = NULL;
 		convert_string_allocate(frame, CH_UTF8, CH_UNIX,
 			       variables[i].value, -1,
-			       &dest, True);
+			       &dest, &dest_len, True);
 		SAFE_FREE(variables[i].value);
 		variables[i].value = SMB_STRDUP(dest ? dest : "");
 		TALLOC_FREE(frame);


-- 
Samba Shared Repository


More information about the samba-cvs mailing list