[SCM] Samba Shared Repository - branch master updated

Günther Deschner gd at samba.org
Tue Nov 24 07:55:06 MST 2009


The branch, master has been updated
       via  846aa18... s3-spoolss: fixes for _spoolss_EnumPrinterKey client and server.
       via  2707dfb... s3-registry: use push_reg_multi_sz() in registry_push_value().
       via  d4e0659... s3-registry: remove reg_pull_multi_sz().
      from  be90385... s3:torture: use timeval_current/timeval_elapsed instead of start_timer/end_timer

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 846aa18648f3b34ab5cbc4dc4ba334bbedeab2f4
Author: Günther Deschner <gd at samba.org>
Date:   Tue Nov 24 15:22:04 2009 +0100

    s3-spoolss: fixes for _spoolss_EnumPrinterKey client and server.
    
    Thanks Metze for review!
    
    Guenther

commit 2707dfb441801e753c74657f20b5ca22a274778f
Author: Günther Deschner <gd at samba.org>
Date:   Tue Nov 24 15:26:32 2009 +0100

    s3-registry: use push_reg_multi_sz() in registry_push_value().
    
    Guenther

commit d4e06596d50e008425b9d346c3814a03eea8309a
Author: Günther Deschner <gd at samba.org>
Date:   Tue Nov 24 15:26:08 2009 +0100

    s3-registry: remove reg_pull_multi_sz().
    
    Guenther

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

Summary of changes:
 source3/include/proto.h             |    2 -
 source3/lib/util_reg.c              |   23 ---------
 source3/lib/util_reg_api.c          |   85 +++++++++--------------------------
 source3/rpc_client/cli_spoolss.c    |    4 +-
 source3/rpc_server/srv_spoolss_nt.c |    2 +-
 5 files changed, 24 insertions(+), 92 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/proto.h b/source3/include/proto.h
index 8951e73..6b68f95 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -1261,8 +1261,6 @@ struct passwd *getpwuid_alloc(TALLOC_CTX *mem_ctx, uid_t uid) ;
 /* The following definitions come from lib/util_reg.c  */
 
 const char *reg_type_lookup(enum winreg_Type type);
-WERROR reg_pull_multi_sz(TALLOC_CTX *mem_ctx, const void *buf, size_t len,
-			 uint32 *num_values, char ***values);
 bool push_reg_sz(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, const char *s);
 bool push_reg_multi_sz(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, const char **a);
 bool pull_reg_sz(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob, const char **s);
diff --git a/source3/lib/util_reg.c b/source3/lib/util_reg.c
index ca46f86..850dbfa 100644
--- a/source3/lib/util_reg.c
+++ b/source3/lib/util_reg.c
@@ -73,29 +73,6 @@ const char *reg_type_lookup(enum winreg_Type type)
 	return result;
 }
 
-WERROR reg_pull_multi_sz(TALLOC_CTX *mem_ctx, const void *buf, size_t len,
-			 uint32 *num_values, char ***values)
-{
-	DATA_BLOB blob;
-	const char **vals;
-	int i;
-
-	blob = data_blob_const((uint8_t *)buf, len);
-
-	if (!pull_reg_multi_sz(mem_ctx, &blob, &vals)) {
-		return WERR_NOMEM;
-	}
-
-	for (i=0; vals[i]; i++) {
-		;;
-	}
-
-	*num_values = i;
-	*values = (char **)vals;
-
-	return WERR_OK;
-}
-
 /*******************************************************************
  push a string in unix charset into a REG_SZ UCS2 null terminated blob
  ********************************************************************/
diff --git a/source3/lib/util_reg_api.c b/source3/lib/util_reg_api.c
index 56ecc54..309fa62 100644
--- a/source3/lib/util_reg_api.c
+++ b/source3/lib/util_reg_api.c
@@ -102,14 +102,27 @@ WERROR registry_pull_value(TALLOC_CTX *mem_ctx,
 		SAFE_FREE(tmp);
 		break;
 	}
-	case REG_MULTI_SZ:
-		err = reg_pull_multi_sz(value, (void *)data, length,
-					&value->v.multi_sz.num_strings,
-					&value->v.multi_sz.strings);
-		if (!(W_ERROR_IS_OK(err))) {
+	case REG_MULTI_SZ: {
+		int i;
+		const char **vals;
+		DATA_BLOB blob;
+
+		blob = data_blob_const(data, length);
+
+		if (!pull_reg_multi_sz(mem_ctx, &blob, &vals)) {
+			err = WERR_NOMEM;
 			goto error;
 		}
+
+		for (i=0; vals[i]; i++) {
+			;;
+		}
+
+		value->v.multi_sz.num_strings = i;
+		value->v.multi_sz.strings = (char **)vals;
+
 		break;
+	}
 	case REG_BINARY:
 		value->v.binary = data_blob_talloc(mem_ctx, data, length);
 		break;
@@ -142,74 +155,18 @@ WERROR registry_push_value(TALLOC_CTX *mem_ctx,
 	}
 	case REG_SZ:
 	case REG_EXPAND_SZ: {
-		if (!convert_string_talloc(mem_ctx, CH_UNIX, CH_UTF16LE,
-					   value->v.sz.str,
-					   MIN(value->v.sz.len,
-					       strlen(value->v.sz.str)+1),
-					   (void *)&(presult->data),
-					   &presult->length, False))
+		if (!push_reg_sz(mem_ctx, presult, value->v.sz.str))
 		{
 			return WERR_NOMEM;
 		}
 		break;
 	}
-	case REG_MULTI_SZ: {
-		uint32_t count;
-		size_t len = 0;
-		char **strings;
-		size_t *string_lengths;
-		uint32_t ofs;
-		TALLOC_CTX *tmp_ctx = talloc_stackframe();
-
-		strings = TALLOC_ARRAY(tmp_ctx, char *,
-				       value->v.multi_sz.num_strings);
-		if (strings == NULL) {
-			return WERR_NOMEM;
-		}
-
-		string_lengths = TALLOC_ARRAY(tmp_ctx, size_t,
-					      value->v.multi_sz.num_strings);
-		if (string_lengths == NULL) {
-			TALLOC_FREE(tmp_ctx);
-			return WERR_NOMEM;
-		}
-
-		/* convert the single strings */
-		for (count = 0; count < value->v.multi_sz.num_strings; count++)
+	case REG_MULTI_SZ:
+		if (!push_reg_multi_sz(mem_ctx, presult, (const char **)value->v.multi_sz.strings))
 		{
-			if (!convert_string_talloc(strings, CH_UNIX,
-				CH_UTF16LE, value->v.multi_sz.strings[count],
-				strlen(value->v.multi_sz.strings[count])+1,
-				(void *)&strings[count],
-				&string_lengths[count], false))
-			{
-
-				TALLOC_FREE(tmp_ctx);
-				return WERR_NOMEM;
-			}
-			len += string_lengths[count];
-		}
-
-		/* now concatenate all into the data blob */
-		presult->data = TALLOC_ARRAY(mem_ctx, uint8_t, len);
-		if (presult->data == NULL) {
-			TALLOC_FREE(tmp_ctx);
 			return WERR_NOMEM;
 		}
-		for (count = 0, ofs = 0;
-		     count < value->v.multi_sz.num_strings;
-		     count++)
-		{
-			memcpy(presult->data + ofs, strings[count],
-			       string_lengths[count]);
-			ofs += string_lengths[count];
-		}
-		presult->length = len;
-
-		TALLOC_FREE(tmp_ctx);
-
 		break;
-	}
 	case REG_BINARY:
 		*presult = data_blob_talloc(mem_ctx,
 					    value->v.binary.data,
diff --git a/source3/rpc_client/cli_spoolss.c b/source3/rpc_client/cli_spoolss.c
index 2dba103..6d6d5df 100644
--- a/source3/rpc_client/cli_spoolss.c
+++ b/source3/rpc_client/cli_spoolss.c
@@ -815,7 +815,7 @@ WERROR rpccli_spoolss_enumprinterkey(struct rpc_pipe_client *cli,
 	*key_buffer = NULL;
 
 	if (offered) {
-		buffer = talloc_array(mem_ctx, uint16_t, offered);
+		buffer = talloc_array(mem_ctx, uint16_t, offered/2);
 		W_ERROR_HAVE_NO_MEMORY(buffer);
 	}
 
@@ -829,7 +829,7 @@ WERROR rpccli_spoolss_enumprinterkey(struct rpc_pipe_client *cli,
 
 	if (W_ERROR_EQUAL(werror, WERR_MORE_DATA)) {
 		offered = needed;
-		buffer = talloc_realloc(mem_ctx, buffer, uint16_t, needed);
+		buffer = talloc_realloc(mem_ctx, buffer, uint16_t, needed/2);
 		W_ERROR_HAVE_NO_MEMORY(buffer);
 		status = rpccli_spoolss_EnumPrinterKey(cli, mem_ctx,
 						       handle,
diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c
index 072090b..703dca1 100644
--- a/source3/rpc_server/srv_spoolss_nt.c
+++ b/source3/rpc_server/srv_spoolss_nt.c
@@ -9203,7 +9203,7 @@ WERROR _spoolss_EnumPrinterKey(pipes_struct *p,
 		goto done;
 	}
 
-	if (r->in.offered == blob.length) {
+	if (r->in.offered >= blob.length) {
 		memcpy(r->out.key_buffer, blob.data, blob.length);
 	}
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list