[SCM] Samba Shared Repository - branch master updated

Volker Lendecke vlendec at samba.org
Thu Jan 28 18:04:02 UTC 2021


The branch, master has been updated
       via  e14fc159a2f librpc: Simplify find_interface_by_binding()
       via  ecd95fc55eb librpc: Simplify find_interface_by_syntax_id()
       via  9c1d7632e35 librpc: Convert find_interface_by_uuid to search by syntax_id
       via  230a89332f5 lib: Fix file_ploadv_send()/_recv()
       via  7528b7886b9 librpc: Fix a typo
       via  9d512a099a7 librpc: Simplify dcesrv_check_or_create_context()
       via  38ebfe2e1f1 epmapper: Simplify endpoints_match()
       via  ce91a899a60 librpc: Simplify dcerpc_binding_string()
       via  4df6c594c68 librpc: Simplify dcerpc_binding_string()
       via  895f459b4b2 epmapper: Simplify _epm_Map()
       via  08757d213ee rpc_server: Introduce "goto nomem;" to dcesrv_endpoint_connect()
       via  c1614edf292 libwbclient: Fix wbcStringToGuid
       via  2b9ba992b61 lib: Simplify parse_guid_string() and ndr_syntax_id_from_string()
       via  522ef9e6a57 s4-torture: Add a test for ndr_syntax_id_from_string()
       via  15934ace717 s4-torture: Add a test for GUID_from_data_blob
       via  064eab8b257 dsdb: Avoid an unneeded #include
       via  fcf60f155a2 librpc: Simplify dcerpc_binding_set_abstract_syntax()
       via  eed1257268e librpc: Use ndr_syntax_id_buf_string() in dcerpc_binding_set_abstract_syntax()
       via  243ce602129 librpc: Use ndr_syntax_id_buf_string() in dcerpc_sec_vt_pctx_check()
       via  a35c8a0ec23 librpc: Add ndr_syntax_id_buf_string()
       via  2e3e297b259 librpc: Add a NULL check to dcerpc_binding_build_tower()
       via  9374313f033 libndr: Simplify ndr_print_GUID()
      from  c8c2aef0ac6 vfs: restore platform specific POSIX sys_acl_set_file() functions

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


- Log -----------------------------------------------------------------
commit e14fc159a2fab69612c6922406a9614a7c2d55ee
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Jan 27 14:00:06 2021 +0100

    librpc: Simplify find_interface_by_binding()
    
    Use find_interface_by_syntax_id() instead of duplicating the loop.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Samuel Cabrero <scabrero at samba.org>
    
    Autobuild-User(master): Volker Lendecke <vl at samba.org>
    Autobuild-Date(master): Thu Jan 28 18:03:53 UTC 2021 on sn-devel-184

commit ecd95fc55eb793cfbbe233bd91664b6d646d430f
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Jan 27 13:54:25 2021 +0100

    librpc: Simplify find_interface_by_syntax_id()
    
    Directly use ndr_syntax_id_equal() instead of duplicating it with
    interface_match_by_uuid().
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Samuel Cabrero <scabrero at samba.org>

commit 9c1d7632e35dc28061ff8bce51f162af35bfa4cb
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Jan 27 13:51:33 2021 +0100

    librpc: Convert find_interface_by_uuid to search by syntax_id
    
    All callers manually dissected the syntax id for this API.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Samuel Cabrero <scabrero at samba.org>

commit 230a89332f51b21384d140f5f6d1fb25f593ccb4
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Jan 26 16:39:29 2021 +0100

    lib: Fix file_ploadv_send()/_recv()
    
    When reading more than 1024 bytes, don't insert '\0' bytes in between
    those chunks.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Samuel Cabrero <scabrero at samba.org>

commit 7528b7886b9b4fb99816711ad4a21afffb20f3fa
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Jan 26 15:44:47 2021 +0100

    librpc: Fix a typo
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Samuel Cabrero <scabrero at samba.org>

commit 9d512a099a7f80893ba8fbbff81e83b67dc08301
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Jan 27 09:49:33 2021 +0100

    librpc: Simplify dcesrv_check_or_create_context()
    
    Use ndr_syntax_id_buf_string(), avoid a talloc/talloc_free
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Samuel Cabrero <scabrero at samba.org>

commit 38ebfe2e1f16909700c60281f28d374448f0b801
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Jan 24 15:40:11 2021 +0100

    epmapper: Simplify endpoints_match()
    
    strequal() deals fine with either string being NULL. We only have to
    take of the case where both are NULL.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Samuel Cabrero <scabrero at samba.org>

commit ce91a899a60059c9d495bf37ec5e3a8b4bf6afdc
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Jan 24 15:14:58 2021 +0100

    librpc: Simplify dcerpc_binding_string()
    
    Make it follow a more conventional memory handling style for reallocs.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Samuel Cabrero <scabrero at samba.org>

commit 4df6c594c68dc5c2bfeb8e897f2226304da4848b
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Jan 24 15:07:47 2021 +0100

    librpc: Simplify dcerpc_binding_string()
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Samuel Cabrero <scabrero at samba.org>

commit 895f459b4b2f347223f5b524d6b79090654cd1f4
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Jan 24 12:35:07 2021 +0100

    epmapper: Simplify _epm_Map()
    
    We have a routine to compare ndr_syntax_id, don't do it manually.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Samuel Cabrero <scabrero at samba.org>

commit 08757d213ee016dfa958d393ef41d7aa66756132
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Jan 20 14:30:57 2021 +0100

    rpc_server: Introduce "goto nomem;" to dcesrv_endpoint_connect()
    
    Avoid the control-flow changing NT_STATUS_HAVE_NO_MEMORY macro.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Samuel Cabrero <scabrero at samba.org>

commit c1614edf292ce907b5cecad56ad1643c51256269
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Jan 24 09:36:15 2021 +0100

    libwbclient: Fix wbcStringToGuid
    
    The "x" sscanf conversion specifier requires an unsigned int. It is
    likely that this is actually a uint32_t, don't rely on that.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Samuel Cabrero <scabrero at samba.org>

commit 2b9ba992b610ebc600f573d8b3f46568d5347cec
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Jan 24 09:15:29 2021 +0100

    lib: Simplify parse_guid_string() and ndr_syntax_id_from_string()
    
    Return "bool" instead of NTSTATUS, use hex_byte() instead of
    read_hex_bytes(). And parse directly into a struct GUID instead of the
    components. 99 lines less code.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Samuel Cabrero <scabrero at samba.org>

commit 522ef9e6a57ba46c6c097c088deb27fe12f3b300
Author: Samuel Cabrero <scabrero at samba.org>
Date:   Thu Jan 28 13:14:49 2021 +0100

    s4-torture: Add a test for ndr_syntax_id_from_string()
    
    Signed-off-by: Samuel Cabrero <scabrero at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 15934ace717a73e270c2e5ac4fb3d306885b195c
Author: Samuel Cabrero <scabrero at samba.org>
Date:   Thu Jan 28 12:37:30 2021 +0100

    s4-torture: Add a test for GUID_from_data_blob
    
    Signed-off-by: Samuel Cabrero <scabrero at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>

commit 064eab8b2579290c8f363d68727ea4fedf4e6305
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Jan 24 09:21:23 2021 +0100

    dsdb: Avoid an unneeded #include
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Samuel Cabrero <scabrero at samba.org>

commit fcf60f155a24bea97395b7ee0200543440782a74
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Jan 22 20:01:27 2021 +0100

    librpc: Simplify dcerpc_binding_set_abstract_syntax()
    
    It might be a question of style, but I find it simpler this way.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Samuel Cabrero <scabrero at samba.org>

commit eed1257268e96123d9655527071c00d0ab38f803
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Jan 22 19:59:52 2021 +0100

    librpc: Use ndr_syntax_id_buf_string() in dcerpc_binding_set_abstract_syntax()
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Samuel Cabrero <scabrero at samba.org>

commit 243ce602129232e50313099f094cf09a848a2ab0
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Jan 22 19:56:20 2021 +0100

    librpc: Use ndr_syntax_id_buf_string() in dcerpc_sec_vt_pctx_check()
    
    "mem_ctx" is no longer needed
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Samuel Cabrero <scabrero at samba.org>

commit a35c8a0ec233175fd677a40ad72ac707a5c45915
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Jan 22 19:50:04 2021 +0100

    librpc: Add ndr_syntax_id_buf_string()
    
    Same pattern as GUID_buf_string()
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Samuel Cabrero <scabrero at samba.org>

commit 2e3e297b259ff32094db6fb4114726201f08ca2a
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Jan 22 19:40:37 2021 +0100

    librpc: Add a NULL check to dcerpc_binding_build_tower()
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Samuel Cabrero <scabrero at samba.org>

commit 9374313f0333a1501d6fb823dbed86fb136f0766
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Jan 22 19:33:51 2021 +0100

    libndr: Simplify ndr_print_GUID()
    
    Fix a small memleak of the tmp GUID_string
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Samuel Cabrero <scabrero at samba.org>

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

Summary of changes:
 lib/util/util_str_hex.c                       | 101 ++++++---------
 lib/util/util_str_hex.h                       |  13 +-
 librpc/ABI/{ndr-1.0.1.sigs => ndr-1.0.2.sigs} |   1 +
 librpc/ndr/libndr.h                           |   5 +
 librpc/ndr/ndr.c                              |   2 +-
 librpc/ndr/ndr_misc.c                         |  66 ++++------
 librpc/ndr/uuid.c                             |  70 +++--------
 librpc/rpc/binding.c                          | 171 +++++++++++---------------
 librpc/rpc/dcerpc_util.c                      |  29 ++---
 librpc/rpc/dcesrv_core.c                      |  68 ++++------
 librpc/rpc/dcesrv_core.h                      |   6 +-
 librpc/wscript_build                          |   2 +-
 nsswitch/libwbclient/wbc_guid.c               |   8 +-
 source3/lib/util_file.c                       |   7 ++
 source3/rpc_server/epmapper/srv_epmapper.c    |  23 +---
 source3/rpc_server/rpc_ncacn_np.c             |   5 +-
 source3/winbindd/winbindd_dual_ndr.c          |   5 +-
 source4/dsdb/common/util.c                    |   1 -
 source4/rpc_server/epmapper/rpc_epmapper.c    |   3 +-
 source4/torture/ndr/ndr.c                     |  74 ++++++++++-
 20 files changed, 294 insertions(+), 366 deletions(-)
 copy librpc/ABI/{ndr-1.0.1.sigs => ndr-1.0.2.sigs} (99%)


Changeset truncated at 500 lines:

diff --git a/lib/util/util_str_hex.c b/lib/util/util_str_hex.c
index 792b4e8420b..553fb30681e 100644
--- a/lib/util/util_str_hex.c
+++ b/lib/util/util_str_hex.c
@@ -1,48 +1,27 @@
 #include "replace.h"
-#include "libcli/util/ntstatus.h"
 #include "util_str_hex.h"
+#include "lib/util/data_blob.h"
+#include "librpc/gen_ndr/misc.h"
 
-NTSTATUS read_hex_bytes(const char *s, uint hexchars, uint64_t *dest)
+static bool hex_uint16(const char *in, uint16_t *out)
 {
-	uint64_t x = 0;
-	uint i;
-	char c;
-
-	if ((hexchars & 1) || hexchars > 16) {
-		return NT_STATUS_INVALID_PARAMETER;
-	}
-
-	for (i = 0; i < hexchars; i++) {
-		x <<= 4;
-		c = s[i];
-		if (c >= '0' && c <= '9') {
-			x += c - '0';
-		}
-		else if (c >= 'a' && c <= 'f') {
-			x += c - 'a' + 10;
-		}
-		else if (c >= 'A' && c <= 'F') {
-			x += c - 'A' + 10;
-		}
-		else {
-			/* BAD character (including '\0') */
-			return NT_STATUS_INVALID_PARAMETER;
-		}
-	}
-	*dest = x;
-	return NT_STATUS_OK;
+	uint8_t hi=0, lo=0;
+	bool ok = hex_byte(in, &hi) && hex_byte(in+2, &lo);
+	*out = (((uint16_t)hi)<<8) + lo;
+	return ok;
 }
 
+bool hex_uint32(const char *in, uint32_t *out)
+{
+	uint16_t hi=0, lo=0;
+	bool ok = hex_uint16(in, &hi) && hex_uint16(in+4, &lo);
+	*out = (((uint32_t)hi)<<16) + lo;
+	return ok;
+}
 
-NTSTATUS parse_guid_string(const char *s,
-			   uint32_t *time_low,
-			   uint32_t *time_mid,
-			   uint32_t *time_hi_and_version,
-			   uint32_t clock_seq[2],
-			   uint32_t node[6])
+bool parse_guid_string(const char *s, struct GUID *guid)
 {
-	uint64_t tmp;
-	NTSTATUS status;
+	bool ok;
 	int i;
 	/* "e12b56b6-0a95-11d1-adbb-00c04fd8d5cd"
                 |     |    |    |    |
@@ -52,49 +31,39 @@ NTSTATUS parse_guid_string(const char *s,
 		|     \_______________ time_mid
 		\_____________________ time_low
 	*/
-	status = read_hex_bytes(s, 8, &tmp);
-	if (!NT_STATUS_IS_OK(status) || s[8] != '-') {
-		return NT_STATUS_INVALID_PARAMETER;
+
+	ok = hex_uint32(s, &guid->time_low);
+	if (!ok || (s[8] != '-')) {
+		return false;
 	}
-	*time_low = tmp;
 	s += 9;
 
-	status = read_hex_bytes(s, 4, &tmp);
-	if (!NT_STATUS_IS_OK(status) || s[4] != '-') {
-		return NT_STATUS_INVALID_PARAMETER;
+	ok = hex_uint16(s, &guid->time_mid);
+	if (!ok || (s[4] != '-')) {
+		return false;
 	}
-	*time_mid = tmp;
 	s += 5;
 
-	status = read_hex_bytes(s, 4, &tmp);
-	if (!NT_STATUS_IS_OK(status) || s[4] != '-') {
-		return NT_STATUS_INVALID_PARAMETER;
+	ok = hex_uint16(s, &guid->time_hi_and_version);
+	if (!ok || (s[4] != '-')) {
+		return false;
 	}
-	*time_hi_and_version = tmp;
 	s += 5;
 
-	for (i = 0; i < 2; i++) {
-		status = read_hex_bytes(s, 2, &tmp);
-		if (!NT_STATUS_IS_OK(status)) {
-			return NT_STATUS_INVALID_PARAMETER;
-		}
-		clock_seq[i] = tmp;
-		s += 2;
-	}
-	if (s[0] != '-') {
-		return NT_STATUS_INVALID_PARAMETER;
+	ok = hex_byte(s, &guid->clock_seq[0]) &&
+		hex_byte(s+2, &guid->clock_seq[1]);
+	if (!ok || (s[4] != '-')) {
+		return false;
 	}
-
-	s++;
+	s += 5;
 
 	for (i = 0; i < 6; i++) {
-		status = read_hex_bytes(s, 2, &tmp);
-		if (!NT_STATUS_IS_OK(status)) {
-			return NT_STATUS_INVALID_PARAMETER;
+		ok = hex_byte(s, &guid->node[i]);
+		if (!ok) {
+			return false;
 		}
-		node[i] = tmp;
 		s += 2;
 	}
 
-	return NT_STATUS_OK;
+	return true;
 }
diff --git a/lib/util/util_str_hex.h b/lib/util/util_str_hex.h
index d0d53e3ed05..7dd527fcdab 100644
--- a/lib/util/util_str_hex.h
+++ b/lib/util/util_str_hex.h
@@ -1,10 +1,5 @@
-#include "../libcli/util/ntstatus.h"
+#include "replace.h"
 
-NTSTATUS read_hex_bytes(const char *s, uint hexchars, uint64_t *dest);
-
-NTSTATUS parse_guid_string(const char *s,
-			   uint32_t *time_low,
-			   uint32_t *time_mid,
-			   uint32_t *time_hi_and_version,
-			   uint32_t clock_seq[2],
-			   uint32_t node[6]);
+bool hex_uint32(const char *in, uint32_t *out);
+struct GUID;
+bool parse_guid_string(const char *s, struct GUID *guid);
diff --git a/librpc/ABI/ndr-1.0.1.sigs b/librpc/ABI/ndr-1.0.2.sigs
similarity index 99%
copy from librpc/ABI/ndr-1.0.1.sigs
copy to librpc/ABI/ndr-1.0.2.sigs
index 84150859c9c..0ec8575906a 100644
--- a/librpc/ABI/ndr-1.0.1.sigs
+++ b/librpc/ABI/ndr-1.0.2.sigs
@@ -251,6 +251,7 @@ ndr_size_union: size_t (const void *, int, uint32_t, ndr_push_flags_fn_t)
 ndr_size_winreg_Data_GPO: size_t (const union winreg_Data_GPO *, uint32_t, int)
 ndr_string_array_size: size_t (struct ndr_push *, const char *)
 ndr_string_length: uint32_t (const void *, uint32_t)
+ndr_syntax_id_buf_string: char *(const struct ndr_syntax_id *, struct ndr_syntax_id_buf *)
 ndr_syntax_id_equal: bool (const struct ndr_syntax_id *, const struct ndr_syntax_id *)
 ndr_syntax_id_from_string: bool (const char *, struct ndr_syntax_id *)
 ndr_syntax_id_null: uuid = {time_low = 0, time_mid = 0, time_hi_and_version = 0, clock_seq = "\000", node = "\000\000\000\000\000"}, if_version = 0
diff --git a/librpc/ndr/libndr.h b/librpc/ndr/libndr.h
index 8bb0def40c0..fd772b9b510 100644
--- a/librpc/ndr/libndr.h
+++ b/librpc/ndr/libndr.h
@@ -556,7 +556,12 @@ void ndr_print_GUID(struct ndr_print *ndr, const char *name, const struct GUID *
 void ndr_print_sockaddr_storage(struct ndr_print *ndr, const char *name, const struct sockaddr_storage *ss);
 void ndr_zero_memory(void *ptr, size_t len);
 bool ndr_syntax_id_equal(const struct ndr_syntax_id *i1, const struct ndr_syntax_id *i2);
+
+struct ndr_syntax_id_buf { char buf[39 /*GUID*/ + 3 /* "/0x" */ + 8]; };
+char *ndr_syntax_id_buf_string(
+	const struct ndr_syntax_id *id, struct ndr_syntax_id_buf *buf);
 char *ndr_syntax_id_to_string(TALLOC_CTX *mem_ctx, const struct ndr_syntax_id *id);
+
 bool ndr_syntax_id_from_string(const char *s, struct ndr_syntax_id *id);
 enum ndr_err_code ndr_push_struct_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, const void *p, ndr_push_flags_fn_t fn);
 enum ndr_err_code ndr_push_struct_into_fixed_blob(DATA_BLOB *blob,
diff --git a/librpc/ndr/ndr.c b/librpc/ndr/ndr.c
index afe22a28602..024634d0a09 100644
--- a/librpc/ndr/ndr.c
+++ b/librpc/ndr/ndr.c
@@ -37,7 +37,7 @@
 #define NDR_BASE_MARSHALL_SIZE 1024
 
 /*
- * This value is arbitary, but designed to reduce the memory a client
+ * This value is arbitrary, but designed to reduce the memory a client
  * can allocate and the work the client can force in processing a
  * malicious packet.
  *
diff --git a/librpc/ndr/ndr_misc.c b/librpc/ndr/ndr_misc.c
index 155ab8f21b8..d7ebb066b8a 100644
--- a/librpc/ndr/ndr_misc.c
+++ b/librpc/ndr/ndr_misc.c
@@ -28,7 +28,8 @@
 
 _PUBLIC_ void ndr_print_GUID(struct ndr_print *ndr, const char *name, const struct GUID *guid)
 {
-	ndr->print(ndr, "%-25s: %s", name, GUID_string(ndr, guid));
+	struct GUID_txt_buf buf;
+	ndr->print(ndr, "%-25s: %s", name, GUID_buf_string(guid, &buf));
 }
 
 bool ndr_syntax_id_equal(const struct ndr_syntax_id *i1,
@@ -38,38 +39,32 @@ bool ndr_syntax_id_equal(const struct ndr_syntax_id *i1,
 		&& (i1->if_version == i2->if_version);
 }
 
+char *ndr_syntax_id_buf_string(
+	const struct ndr_syntax_id *id, struct ndr_syntax_id_buf *dst)
+{
+	struct GUID_txt_buf guid_buf;
+
+	snprintf(dst->buf,
+		 sizeof(dst->buf),
+		 "%s/0x%08x",
+		 GUID_buf_string(&id->uuid, &guid_buf),
+		 (unsigned int)id->if_version);
+
+	return dst->buf;
+}
+
 _PUBLIC_ char *ndr_syntax_id_to_string(TALLOC_CTX *mem_ctx, const struct ndr_syntax_id *id)
 {
-	return talloc_asprintf(mem_ctx,
-			       "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x/0x%08x",
-			       id->uuid.time_low, id->uuid.time_mid,
-			       id->uuid.time_hi_and_version,
-			       id->uuid.clock_seq[0],
-			       id->uuid.clock_seq[1],
-			       id->uuid.node[0], id->uuid.node[1],
-			       id->uuid.node[2], id->uuid.node[3],
-			       id->uuid.node[4], id->uuid.node[5],
-			       (unsigned)id->if_version);
+	struct ndr_syntax_id_buf buf;
+	return talloc_strdup(mem_ctx, ndr_syntax_id_buf_string(id, &buf));
 }
 
 _PUBLIC_ bool ndr_syntax_id_from_string(const char *s, struct ndr_syntax_id *id)
 {
-	size_t i;
-	uint32_t time_low;
-	uint32_t time_mid, time_hi_and_version;
-	uint32_t clock_seq[2];
-	uint32_t node[6];
-	uint64_t if_version;
-	NTSTATUS status;
-
-	status =  parse_guid_string(s,
-				    &time_low,
-				    &time_mid,
-				    &time_hi_and_version,
-				    clock_seq,
-				    node);
+	bool ok;
 
-	if (!NT_STATUS_IS_OK(status)) {
+	ok =  parse_guid_string(s, &id->uuid);
+	if (!ok) {
 		return false;
 	}
 
@@ -77,21 +72,6 @@ _PUBLIC_ bool ndr_syntax_id_from_string(const char *s, struct ndr_syntax_id *id)
 		return false;
 	}
 
-	status = read_hex_bytes(s + 39, 8, &if_version);
-
-	if (!NT_STATUS_IS_OK(status)) {
-		return false;
-	}
-
-	id->uuid.time_low = time_low;
-	id->uuid.time_mid = time_mid;
-	id->uuid.time_hi_and_version = time_hi_and_version;
-	id->uuid.clock_seq[0] = clock_seq[0];
-	id->uuid.clock_seq[1] = clock_seq[1];
-	for (i=0; i<6; i++) {
-		id->uuid.node[i] = node[i];
-	}
-	id->if_version = (uint32_t)if_version;
-
-	return true;
+	ok = hex_uint32(s+39, &id->if_version);
+	return ok;
 }
diff --git a/librpc/ndr/uuid.c b/librpc/ndr/uuid.c
index ad5c9d37d11..2c16f5ad81c 100644
--- a/librpc/ndr/uuid.c
+++ b/librpc/ndr/uuid.c
@@ -77,78 +77,42 @@ _PUBLIC_ NTSTATUS GUID_from_ndr_blob(const DATA_BLOB *b, struct GUID *guid)
 */
 _PUBLIC_ NTSTATUS GUID_from_data_blob(const DATA_BLOB *s, struct GUID *guid)
 {
-	NTSTATUS status = NT_STATUS_INVALID_PARAMETER;
-	uint32_t time_low = 0;
-	uint32_t time_mid = 0;
-	uint32_t time_hi_and_version = 0;
-	uint32_t clock_seq[2] = {0};
-	uint32_t node[6] = {0};
-	uint8_t buf16[16] = {0};
-
-	DATA_BLOB blob16 = data_blob_const(buf16, sizeof(buf16));
-	int i;
+	bool ok;
 
 	if (s->data == NULL) {
 		return NT_STATUS_INVALID_PARAMETER;
 	}
 
-	switch(s->length) {
-	case 36:
-	{
-		status = parse_guid_string((char *)s->data,
-					   &time_low,
-					   &time_mid,
-					   &time_hi_and_version,
-					   clock_seq,
-					   node);
-		break;
+	if (s->length == 36) {
+		ok = parse_guid_string((char *)s->data, guid);
+		return ok ? NT_STATUS_OK : NT_STATUS_INVALID_PARAMETER;
 	}
-	case 38:
-	{
+
+	if (s->length == 38) {
 		if (s->data[0] != '{' || s->data[37] != '}') {
-			break;
+			return NT_STATUS_INVALID_PARAMETER;
 		}
-
-		status = parse_guid_string((char *)s->data + 1,
-					   &time_low,
-					   &time_mid,
-					   &time_hi_and_version,
-					   clock_seq,
-					   node);
-		break;
+		ok = parse_guid_string((char *)s->data + 1, guid);
+		return ok ? NT_STATUS_OK : NT_STATUS_INVALID_PARAMETER;
 	}
-	case 32:
-	{
+
+	if (s->length == 32) {
+		uint8_t buf16[16] = {0};
+		DATA_BLOB blob16 = { .data = buf16, .length = sizeof(buf16) };
 		size_t rlen = strhex_to_str((char *)blob16.data, blob16.length,
 					    (const char *)s->data, s->length);
 		if (rlen != blob16.length) {
 			return NT_STATUS_INVALID_PARAMETER;
 		}
 
-		s = &blob16;
-		return GUID_from_ndr_blob(s, guid);
-	}
-	case 16:
-		return GUID_from_ndr_blob(s, guid);
-	default:
-		status = NT_STATUS_INVALID_PARAMETER;
-		break;
-	}
-
-	if (!NT_STATUS_IS_OK(status)) {
-		return status;
+		return GUID_from_ndr_blob(&blob16, guid);
 	}
 
-	guid->time_low = time_low;
-	guid->time_mid = time_mid;
-	guid->time_hi_and_version = time_hi_and_version;
-	guid->clock_seq[0] = clock_seq[0];
-	guid->clock_seq[1] = clock_seq[1];
-	for (i=0;i<6;i++) {
-		guid->node[i] = node[i];
+	if (s->length == 16) {
+		return GUID_from_ndr_blob(s, guid);
 	}
 
-	return NT_STATUS_OK;
+	return NT_STATUS_INVALID_PARAMETER;
 }
 
 /**
diff --git a/librpc/rpc/binding.c b/librpc/rpc/binding.c
index 80ab1a45134..817498d8700 100644
--- a/librpc/rpc/binding.c
+++ b/librpc/rpc/binding.c
@@ -213,49 +213,50 @@ const char *epm_floor_string(TALLOC_CTX *mem_ctx, struct epm_floor *epm_floor)
 */
 _PUBLIC_ char *dcerpc_binding_string(TALLOC_CTX *mem_ctx, const struct dcerpc_binding *b)
 {
-	char *s = talloc_strdup(mem_ctx, "");
-	char *o = s;
+	char *s = NULL;
+	char *tmp = NULL;
 	size_t i;
 	const char *t_name = NULL;
 	bool option_section = false;
 	const char *target_hostname = NULL;
 
+	s = talloc_strdup(mem_ctx, "");
+	if (s == NULL) {
+		goto nomem;
+	}
+
 	if (b->transport != NCA_UNKNOWN) {
 		t_name = derpc_transport_string_by_transport(b->transport);
 		if (!t_name) {
-			talloc_free(o);
-			return NULL;
+			goto nomem;
 		}
 	}
 
 	if (!GUID_all_zero(&b->object)) {
 		struct GUID_txt_buf buf;
 
-		o = s;
-		s = talloc_asprintf_append_buffer(
+		tmp = talloc_asprintf_append_buffer(
 			s, "%s@", GUID_buf_string(&b->object, &buf));
-		if (s == NULL) {
-			talloc_free(o);
-			return NULL;
+		if (tmp == NULL) {
+			goto nomem;
 		}
+		s = tmp;
 	}
 
 	if (t_name != NULL) {
-		o = s;
-		s = talloc_asprintf_append_buffer(s, "%s:", t_name);
-		if (s == NULL) {
-			talloc_free(o);
-			return NULL;
+		tmp = talloc_asprintf_append_buffer(s, "%s:", t_name);
+		if (tmp == NULL) {
+			goto nomem;
 		}
+		s = tmp;
 	}
 
 	if (b->host) {
-		o = s;
-		s = talloc_asprintf_append_buffer(s, "%s", b->host);
-		if (s == NULL) {
-			talloc_free(o);
-			return NULL;
+		tmp = talloc_asprintf_append_buffer(s, "%s", b->host);
+		if (tmp == NULL) {
+			goto nomem;
 		}
+		s = tmp;
 	}
 
 	target_hostname = b->target_hostname;
@@ -265,38 +266,30 @@ _PUBLIC_ char *dcerpc_binding_string(TALLOC_CTX *mem_ctx, const struct dcerpc_bi
 		}
 	}
 
-	if (b->endpoint) {
-		option_section = true;
-	} else if (target_hostname) {
-		option_section = true;
-	} else if (b->target_principal) {
-		option_section = true;
-	} else if (b->assoc_group_id != 0) {
-		option_section = true;
-	} else if (b->options) {
-		option_section = true;
-	} else if (b->flags) {
-		option_section = true;
-	}
+	option_section =
+		(b->endpoint != NULL) ||
+		(target_hostname != NULL) ||
+		(b->target_principal != NULL) ||
+		(b->assoc_group_id != 0) ||
+		(b->options != NULL) ||
+		(b->flags != 0);
 
 	if (!option_section) {
 		return s;
 	}


-- 
Samba Shared Repository



More information about the samba-cvs mailing list