[SCM] Samba Shared Repository - branch master updated

Andrew Bartlett abartlet at samba.org
Fri Dec 22 00:52:02 UTC 2023


The branch, master has been updated
       via  b4563a24904 fuzz: allow max size conditional ACE round-trip failure
       via  21853b01e65 libcli/security: sddl conditional ACE: write -0 when asked
       via  8f0c91f3a83 libcli/security: rearrange conditional ACE sddl_write_int
       via  46f61570714 libcli/security: tests for signed zeros in sddl condtional ACEs
       via  8a9f395821d librpc: Do not allow u16string to be encoded in a big‐endian context
       via  346844b730b librpc: Change type of ‘u16string’ from ‘const uint16_t *’ to ‘const unsigned char *’
       via  65db36ca327 librpc: Add missing spaces to error messages
       via  a38025b3a73 s3/lib: add log_panic_action()
       via  85c4d03e38a s3/lib: factor out call_panic_action() from smb_panic_s3()
      from  080a62bba87 tests/krb5: Add Python implementation and tests for Group Key Distribution Service

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


- Log -----------------------------------------------------------------
commit b4563a24904e823497552f6e4ef77e8041f2cc5d
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Dec 20 14:26:00 2023 +1300

    fuzz: allow max size conditional ACE round-trip failure
    
    The encoder, being cautious not to overstep the arbitrary 10000 byte
    boundary, might not encode an exactly 10000 byte condition. This
    is an off-by-one, but in the safe direction.
    
    Credit to OSS-Fuzz.
    
    REF: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=65118
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    
    Autobuild-User(master): Andrew Bartlett <abartlet at samba.org>
    Autobuild-Date(master): Fri Dec 22 00:51:13 UTC 2023 on atb-devel-224

commit 21853b01e65f8b79bdf478d4fe470dcb1639cc48
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Dec 20 13:40:15 2023 +1300

    libcli/security: sddl conditional ACE: write -0 when asked
    
    Credit to OSS-Fuzz.
    
    REF: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=65122
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 8f0c91f3a833b24c27e63721ca15838c92a1cea4
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Dec 20 13:38:53 2023 +1300

    libcli/security: rearrange conditional ACE sddl_write_int
    
    REF: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=65122
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 46f61570714fffe43f5328cd46e1d1848a4d5daa
Author: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
Date:   Wed Dec 20 13:37:29 2023 +1300

    libcli/security: tests for signed zeros in sddl condtional ACEs
    
    REF: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=65122
    
    Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 8a9f395821d62273e28f32895a4c3116a0606423
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date:   Fri Dec 22 09:58:53 2023 +1300

    librpc: Do not allow u16string to be encoded in a big‐endian context
    
    Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 346844b730b06fe5ad53dc93fc0f4d4470794cb5
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date:   Thu Dec 21 11:51:19 2023 +1300

    librpc: Change type of ‘u16string’ from ‘const uint16_t *’ to ‘const unsigned char *’
    
    A u16string is supposed to contain UTF‐16 code units, but
    ndr_pull_u16string() and ndr_push_u16string() fail to correctly ensure
    this on big‐endian systems. Code that relies on the u16string array
    containing correct values will then fail.
    
    Fix ndr_pull_u16string() and ndr_push_u16string() to work on big‐endian
    systems, ensuring that other code can use these strings without having
    to worry about first encoding them to little‐endian.
    
    Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 65db36ca327d10344566e2fb4330e19050d645ef
Author: Joseph Sutton <josephsutton at catalyst.net.nz>
Date:   Fri Dec 22 09:54:55 2023 +1300

    librpc: Add missing spaces to error messages
    
    Signed-off-by: Joseph Sutton <josephsutton at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit a38025b3a73b9fe96c9a99adf4dfa5536806c15f
Author: Ralph Boehme <slow at samba.org>
Date:   Wed Dec 13 07:57:46 2023 +0100

    s3/lib: add log_panic_action()
    
    Can be used to log a nice stack backtrace with full debug symbols by setting
    "panic action" to something like
    
        panic action = cd /home/slow/git/samba/master && /home/slow/git/samba/master/selftest/gdb_backtrace %d
    
    This is similar to log_stack_trace(), but that doesn't come with debug symbols.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 85c4d03e38a5c983e7b99ca48c3e262465485a56
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Dec 15 07:15:22 2023 +0100

    s3/lib: factor out call_panic_action() from smb_panic_s3()
    
    No change in behaviour. Best viewed with git show -w.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

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

Summary of changes:
 lib/fuzzing/fuzz_conditional_ace_blob.c           | 11 ++++++
 lib/util/charset/charset.h                        |  6 +--
 lib/util/charset/util_unistr.c                    | 25 +++++-------
 libcli/security/sddl_conditional_ace.c            | 19 +++++----
 libcli/security/tests/test_sddl_conditional_ace.c |  2 +
 librpc/ABI/ndr-4.0.0.sigs                         |  6 +--
 librpc/ndr/libndr.h                               |  2 +-
 librpc/ndr/ndr_string.c                           | 44 +++++++++++++++------
 librpc/tests/test_ndr_gmsa.c                      | 47 +++++++++++++----------
 pidl/lib/Parse/Pidl/Samba4/Python.pm              |  2 +-
 pidl/lib/Parse/Pidl/Typelist.pm                   |  2 +-
 source3/include/proto.h                           |  1 +
 source3/lib/util.c                                | 43 +++++++++++++++------
 source4/librpc/rpc/pyrpc_util.c                   |  6 +--
 source4/librpc/rpc/pyrpc_util.h                   |  4 +-
 15 files changed, 142 insertions(+), 78 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/fuzzing/fuzz_conditional_ace_blob.c b/lib/fuzzing/fuzz_conditional_ace_blob.c
index ed0bbd536bc..ebbd90883aa 100644
--- a/lib/fuzzing/fuzz_conditional_ace_blob.c
+++ b/lib/fuzzing/fuzz_conditional_ace_blob.c
@@ -73,6 +73,17 @@ int LLVMFuzzerTestOneInput(const uint8_t *input, size_t len)
 	/* back to blob form */
 	ok = conditional_ace_encode_binary(mem_ctx, s1, &e2);
 	if (! ok) {
+		if (e1.length == CONDITIONAL_ACE_MAX_LENGTH) {
+			/*
+			 * This is an edge case where the encoder and
+			 * decoder treat the boundary slightly
+			 * differently, and the encoder refuses to
+			 * encode to the maximum length. This is not
+			 * an issue in the real world.
+			 */
+			TALLOC_FREE(mem_ctx);
+			return 0;
+		}
 		abort();
 	}
 
diff --git a/lib/util/charset/charset.h b/lib/util/charset/charset.h
index aa691734713..12dc348bdb7 100644
--- a/lib/util/charset/charset.h
+++ b/lib/util/charset/charset.h
@@ -129,9 +129,9 @@ limited by 'n' bytes
 **/
 size_t utf16_null_terminated_len_n(const void *src, size_t n);
 
-uint16_t *talloc_utf16_strlendup(TALLOC_CTX *mem_ctx, const char *str, size_t len);
-uint16_t *talloc_utf16_strdup(TALLOC_CTX *mem_ctx, const char *str);
-uint16_t *talloc_utf16_strndup(TALLOC_CTX *mem_ctx, const char *str, size_t n);
+unsigned char *talloc_utf16_strlendup(TALLOC_CTX *mem_ctx, const char *str, size_t len);
+unsigned char *talloc_utf16_strdup(TALLOC_CTX *mem_ctx, const char *str);
+unsigned char *talloc_utf16_strndup(TALLOC_CTX *mem_ctx, const char *str, size_t n);
 
 char *strchr_m(const char *s, char c);
 /**
diff --git a/lib/util/charset/util_unistr.c b/lib/util/charset/util_unistr.c
index fa1a100e596..830b4808c54 100644
--- a/lib/util/charset/util_unistr.c
+++ b/lib/util/charset/util_unistr.c
@@ -243,9 +243,9 @@ size_t utf16_null_terminated_len_n(const void *src, size_t n)
 	return len;
 }
 
-uint16_t *talloc_utf16_strlendup(TALLOC_CTX *mem_ctx, const char *str, size_t len)
+unsigned char *talloc_utf16_strlendup(TALLOC_CTX *mem_ctx, const char *str, size_t len)
 {
-	uint16_t *new_str = NULL;
+	unsigned char *new_str = NULL;
 
 	/* Check for overflow. */
 	if (len > SIZE_MAX - 2) {
@@ -263,22 +263,17 @@ uint16_t *talloc_utf16_strlendup(TALLOC_CTX *mem_ctx, const char *str, size_t le
 
 	memcpy(new_str, str, len);
 
-	{
-		/*
-		 * Ensure that the UTF‐16 string is
-		 * null‐terminated.
-		 */
-
-		char *new_bytes = (char *)new_str;
-
-		new_bytes[len] = '\0';
-		new_bytes[len + 1] = '\0';
-	}
+	/*
+	 * Ensure that the UTF‐16 string is
+	 * null‐terminated.
+	 */
+	new_str[len] = '\0';
+	new_str[len + 1] = '\0';
 
 	return new_str;
 }
 
-uint16_t *talloc_utf16_strdup(TALLOC_CTX *mem_ctx, const char *str)
+unsigned char *talloc_utf16_strdup(TALLOC_CTX *mem_ctx, const char *str)
 {
 	if (str == NULL) {
 		return NULL;
@@ -286,7 +281,7 @@ uint16_t *talloc_utf16_strdup(TALLOC_CTX *mem_ctx, const char *str)
 	return talloc_utf16_strlendup(mem_ctx, str, utf16_len(str));
 }
 
-uint16_t *talloc_utf16_strndup(TALLOC_CTX *mem_ctx, const char *str, size_t n)
+unsigned char *talloc_utf16_strndup(TALLOC_CTX *mem_ctx, const char *str, size_t n)
 {
 	if (str == NULL) {
 		return NULL;
diff --git a/libcli/security/sddl_conditional_ace.c b/libcli/security/sddl_conditional_ace.c
index b5d0a3afa3a..e9d83b7f9c1 100644
--- a/libcli/security/sddl_conditional_ace.c
+++ b/libcli/security/sddl_conditional_ace.c
@@ -623,6 +623,7 @@ static bool sddl_write_int(struct sddl_write_context *ctx,
 	uint8_t sign = tok->data.int64.sign;
 	uint8_t base = tok->data.int64.base;
 	char buf[26]; /* oct(1<<63) + sign + \0 */
+	char sign_char;
 	if (sign > CONDITIONAL_ACE_INT_SIGN_NONE ||
 	    base > CONDITIONAL_ACE_INT_BASE_16) {
 		return false;
@@ -650,12 +651,18 @@ static bool sddl_write_int(struct sddl_write_context *ctx,
 		/* note we allow "-0", because we will parse it. */
 		return false;
 	}
+	sign_char = (sign == CONDITIONAL_ACE_INT_SIGN_NEGATIVE) ? '-' : '+';
 	/*
-	 * We can use "%+ld" for the decimal sign, but "%+lx" and "%+lo" are
-	 * invalid because %o and %x are unsigned.
+	 * We can use "%+ld" for the decimal sign (except -0), but
+	 * "%+lx" and "%+lo" are invalid because %o and %x are
+	 * unsigned.
 	 */
 	if (base == CONDITIONAL_ACE_INT_BASE_10) {
-		snprintf(buf, sizeof(buf), "%+"PRId64, v);
+		if (v == 0) {
+			snprintf(buf, sizeof(buf), "%c0", sign_char);
+		} else {
+			snprintf(buf, sizeof(buf), "%+"PRId64, v);
+		}
 		return sddl_write(ctx, buf);
 	}
 
@@ -670,12 +677,10 @@ static bool sddl_write_int(struct sddl_write_context *ctx,
 		return sddl_write(ctx, "-0x8000000000000000");
 	}
 
-	buf[0] = (sign == CONDITIONAL_ACE_INT_SIGN_NEGATIVE) ? '-' : '+';
-
 	if (base == CONDITIONAL_ACE_INT_BASE_8) {
-		snprintf(buf + 1, sizeof(buf) - 1, "0%llo", llabs(v));
+		snprintf(buf, sizeof(buf), "%c0%llo", sign_char, llabs(v));
 	} else {
-		snprintf(buf + 1, sizeof(buf) - 1, "0x%llx", llabs(v));
+		snprintf(buf, sizeof(buf), "%c0x%llx", sign_char, llabs(v));
 	}
 	return sddl_write(ctx, buf);
 }
diff --git a/libcli/security/tests/test_sddl_conditional_ace.c b/libcli/security/tests/test_sddl_conditional_ace.c
index 3ea9e23b2b8..fc9281d92f4 100644
--- a/libcli/security/tests/test_sddl_conditional_ace.c
+++ b/libcli/security/tests/test_sddl_conditional_ace.c
@@ -587,6 +587,8 @@ static void test_round_trips(void **state)
 	 * which then parses again into the same conditional ACE.
 	 */
 	static const char *sddl[] = {
+		"(0>-0)",
+		"(0>+0)",
 		("(Member_of{SID(AA)})"),
 		("(a Contains @USER.b == @device.c)"),
 		("(a == @user.b == @resource.c)"),
diff --git a/librpc/ABI/ndr-4.0.0.sigs b/librpc/ABI/ndr-4.0.0.sigs
index 66a1b64cf60..5474a5184b0 100644
--- a/librpc/ABI/ndr-4.0.0.sigs
+++ b/librpc/ABI/ndr-4.0.0.sigs
@@ -81,7 +81,7 @@ ndr_print_svcctl_ServerType: void (struct ndr_print *, const char *, uint32_t)
 ndr_print_time_t: void (struct ndr_print *, const char *, time_t)
 ndr_print_timespec: void (struct ndr_print *, const char *, const struct timespec *)
 ndr_print_timeval: void (struct ndr_print *, const char *, const struct timeval *)
-ndr_print_u16string: void (struct ndr_print *, const char *, const uint16_t *)
+ndr_print_u16string: void (struct ndr_print *, const char *, const unsigned char *)
 ndr_print_udlong: void (struct ndr_print *, const char *, uint64_t)
 ndr_print_udlongr: void (struct ndr_print *, const char *, uint64_t)
 ndr_print_uid_t: void (struct ndr_print *, const char *, uid_t)
@@ -158,7 +158,7 @@ ndr_pull_time_t: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, time_t *)
 ndr_pull_timespec: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, struct timespec *)
 ndr_pull_timeval: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, struct timeval *)
 ndr_pull_trailer_align: enum ndr_err_code (struct ndr_pull *, size_t)
-ndr_pull_u16string: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, const uint16_t **)
+ndr_pull_u16string: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, const unsigned char **)
 ndr_pull_udlong: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, uint64_t *)
 ndr_pull_udlongr: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, uint64_t *)
 ndr_pull_uid_t: enum ndr_err_code (struct ndr_pull *, ndr_flags_type, uid_t *)
@@ -234,7 +234,7 @@ ndr_push_time_t: enum ndr_err_code (struct ndr_push *, ndr_flags_type, time_t)
 ndr_push_timespec: enum ndr_err_code (struct ndr_push *, ndr_flags_type, const struct timespec *)
 ndr_push_timeval: enum ndr_err_code (struct ndr_push *, ndr_flags_type, const struct timeval *)
 ndr_push_trailer_align: enum ndr_err_code (struct ndr_push *, size_t)
-ndr_push_u16string: enum ndr_err_code (struct ndr_push *, ndr_flags_type, const uint16_t *)
+ndr_push_u16string: enum ndr_err_code (struct ndr_push *, ndr_flags_type, const unsigned char *)
 ndr_push_udlong: enum ndr_err_code (struct ndr_push *, ndr_flags_type, uint64_t)
 ndr_push_udlongr: enum ndr_err_code (struct ndr_push *, ndr_flags_type, uint64_t)
 ndr_push_uid_t: enum ndr_err_code (struct ndr_push *, ndr_flags_type, uid_t)
diff --git a/librpc/ndr/libndr.h b/librpc/ndr/libndr.h
index adcbdf18c0c..70dd01e49a6 100644
--- a/librpc/ndr/libndr.h
+++ b/librpc/ndr/libndr.h
@@ -806,7 +806,7 @@ NDR_SCALAR_PROTO(DATA_BLOB, DATA_BLOB)
 NDR_SCALAR_PROTO(ipv4address, const char *)
 NDR_SCALAR_PROTO(ipv6address, const char *)
 NDR_SCALAR_PROTO(string, const char *)
-NDR_SCALAR_PROTO(u16string, const uint16_t *)
+NDR_SCALAR_PROTO(u16string, const unsigned char *)
 NDR_SCALAR_PROTO(double, double)
 
 enum ndr_err_code ndr_pull_policy_handle(struct ndr_pull *ndr, ndr_flags_type ndr_flags, struct policy_handle *r);
diff --git a/librpc/ndr/ndr_string.c b/librpc/ndr/ndr_string.c
index 0d18354a5de..323886b2fe5 100644
--- a/librpc/ndr/ndr_string.c
+++ b/librpc/ndr/ndr_string.c
@@ -481,9 +481,9 @@ _PUBLIC_ uint32_t ndr_size_string(int ret, const char * const* string, ndr_flags
 */
 _PUBLIC_ enum ndr_err_code ndr_pull_u16string(struct ndr_pull *ndr,
 					      ndr_flags_type ndr_flags,
-					      const uint16_t **s)
+					      const unsigned char **s)
 {
-	uint16_t *as = NULL;
+	unsigned char *as = NULL;
 	const char *const src_str = (char *)ndr->data + ndr->offset;
 	size_t src_len = 0;
 
@@ -491,12 +491,23 @@ _PUBLIC_ enum ndr_err_code ndr_pull_u16string(struct ndr_pull *ndr,
 		return NDR_ERR_SUCCESS;
 	}
 
+	if (NDR_BE(ndr)) {
+		/*
+		 * It isn’t clear how this type should be encoded in a
+		 * big‐endian context.
+		 */
+		return ndr_pull_error(
+			ndr,
+			NDR_ERR_STRING,
+			"u16string does not support big‐endian encoding\n");
+	}
+
 	if (ndr->flags & LIBNDR_ENCODING_FLAGS) {
 		return ndr_pull_error(
 			ndr,
 			NDR_ERR_STRING,
 			"Unsupported string flags 0x%" PRI_LIBNDR_FLAGS
-			"passed to ndr_pull_u16string()\n",
+			" passed to ndr_pull_u16string()\n",
 			ndr->flags & LIBNDR_STRING_FLAGS);
 	}
 
@@ -518,7 +529,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_u16string(struct ndr_pull *ndr,
 			ndr,
 			NDR_ERR_STRING,
 			"Unsupported string flags 0x%" PRI_LIBNDR_FLAGS
-			"passed to ndr_pull_u16string()\n",
+			" passed to ndr_pull_u16string()\n",
 			ndr->flags & LIBNDR_STRING_FLAGS);
 	}
 
@@ -544,7 +555,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_u16string(struct ndr_pull *ndr,
 */
 _PUBLIC_ enum ndr_err_code ndr_push_u16string(struct ndr_push *ndr,
 					      ndr_flags_type ndr_flags,
-					      const uint16_t *s)
+					      const unsigned char *s)
 {
 	size_t s_len;
 
@@ -552,6 +563,17 @@ _PUBLIC_ enum ndr_err_code ndr_push_u16string(struct ndr_push *ndr,
 		return NDR_ERR_SUCCESS;
 	}
 
+	if (NDR_BE(ndr)) {
+		/*
+		 * It isn’t clear how this type should be encoded in a
+		 * big‐endian context.
+		 */
+		return ndr_push_error(
+			ndr,
+			NDR_ERR_STRING,
+			"u16string does not support big‐endian encoding\n");
+	}
+
 	if (s == NULL) {
 		return ndr_push_error(
 			ndr,
@@ -572,18 +594,18 @@ _PUBLIC_ enum ndr_err_code ndr_push_u16string(struct ndr_push *ndr,
 			ndr,
 			NDR_ERR_STRING,
 			"Unsupported string flags 0x%" PRI_LIBNDR_FLAGS
-			"passed to ndr_push_u16string()\n",
+			" passed to ndr_push_u16string()\n",
 			ndr->flags & LIBNDR_STRING_FLAGS);
 	}
 
 	switch (ndr->flags & LIBNDR_STRING_FLAGS) {
 	case LIBNDR_FLAG_STR_NULLTERM:
-		NDR_CHECK(ndr_push_bytes(ndr, (const uint8_t *)s, s_len));
+		NDR_CHECK(ndr_push_bytes(ndr, s, s_len));
 		break;
 
 	default:
 		if (ndr->flags & LIBNDR_FLAG_REMAINING) {
-			NDR_CHECK(ndr_push_bytes(ndr, (const uint8_t *)s, s_len));
+			NDR_CHECK(ndr_push_bytes(ndr, s, s_len));
 			break;
 		}
 
@@ -591,7 +613,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_u16string(struct ndr_push *ndr,
 			ndr,
 			NDR_ERR_STRING,
 			"Unsupported string flags 0x%" PRI_LIBNDR_FLAGS
-			"passed to ndr_push_u16string()\n",
+			" passed to ndr_push_u16string()\n",
 			ndr->flags & LIBNDR_STRING_FLAGS);
 	}
 
@@ -600,11 +622,11 @@ _PUBLIC_ enum ndr_err_code ndr_push_u16string(struct ndr_push *ndr,
 
 _PUBLIC_ void ndr_print_u16string(struct ndr_print *ndr,
 				  const char *name,
-				  const uint16_t *s)
+				  const unsigned char *s)
 {
 	return ndr_print_array_uint8(ndr,
 				     name,
-				     (const uint8_t *)s,
+				     s,
 				     utf16_len(s));
 }
 
diff --git a/librpc/tests/test_ndr_gmsa.c b/librpc/tests/test_ndr_gmsa.c
index 9834ce7249a..67aa7c2ba2e 100644
--- a/librpc/tests/test_ndr_gmsa.c
+++ b/librpc/tests/test_ndr_gmsa.c
@@ -27,21 +27,24 @@
 #include "lib/replace/replace.h"
 
 #include "lib/util/attr.h"
+#include "lib/util/bytearray.h"
 #include "librpc/gen_ndr/ndr_gmsa.h"
 #include "librpc/gen_ndr/gmsa.h"
 
-static void assert_utf16_equal(const uint16_t *s1, const uint16_t *s2)
+static void assert_utf16_equal(const unsigned char *s1, const unsigned char *s2)
 {
 	uint16_t c1;
 	uint16_t c2;
+	size_t n = 0;
 
 	assert_non_null(s1);
 	assert_non_null(s2);
 
 	do {
-		c1 = *s1++;
-		c2 = *s2++;
+		c1 = PULL_LE_U16(s1, n);
+		c2 = PULL_LE_U16(s2, n);
 		assert_int_equal(c1, c2);
+		n += 2;
 	} while (c1);
 }
 
@@ -82,23 +85,27 @@ static void test_managed_password_blob(void **state)
 	const DATA_BLOB blob = {data, sizeof data};
 
 	/* The UTF‐16 password contained in the blob. */
-	const uint16_t current_password[] = {
-		16781, 38893, 3992,  51373, 15923, 7932,  46125, 2558,	34452,
-		30290, 33629, 52175, 11237, 39662, 24149, 37397, 11132, 19333,
-		4008,  61917, 9782,  34431, 59396, 14004, 57456, 4643,	36018,
-		13809, 19377, 45615, 4500,  41906, 13134, 3922,	 30149, 14594,
-		62323, 37627, 63819, 14101, 32226, 28757, 21916, 10026, 4483,
-		50729, 41961, 43820, 37254, 34397, 24410, 18164, 35324, 51276,
-		5135,  22021, 60285, 770,   63905, 6660,  52725, 4490,	8697,
-		38539, 36481, 5923,  48763, 22745, 32851, 6331,	 17667, 14586,
-		22153, 50590, 31390, 25994, 64532, 26985, 7286,	 6379,	64476,
-		11322, 59188, 19010, 55290, 24783, 14809, 6553,	 1291,	20746,
-		50886, 62962, 23379, 44922, 7754,  6910,  29146, 63937, 24509,
-		38781, 60409, 17028, 43589, 36843, 39787, 8730,	 7072,	20390,
-		26656, 25846, 19514, 26258, 27121, 38664, 5283,	 59418, 35361,
-		47263, 48001, 31518, 4533,  21653, 63671, 65234, 25134, 3297,
-		50225, 38336, 0,
-	};
+	const unsigned char current_password[] = {
+		141, 65,  237, 151, 152, 15,  173, 200, 51,  62,  252, 30,  45,
+		180, 254, 9,   148, 134, 82,  118, 93,	131, 207, 203, 229, 43,
+		238, 154, 85,  94,  21,	 146, 124, 43,	133, 75,  168, 15,  221,
+		241, 54,  38,  127, 134, 4,   232, 180, 54,  112, 224, 35,  18,
+		178, 140, 241, 53,  177, 75,  47,  178, 148, 17,  178, 163, 78,
+		51,  82,  15,  197, 117, 2,   57,  115, 243, 251, 146, 75,  249,
+		21,  55,  226, 125, 85,	 112, 156, 85,	42,  39,  131, 17,  41,
+		198, 233, 163, 44,  171, 134, 145, 93,	134, 90,  95,  244, 70,
+		252, 137, 76,  200, 15,	 20,  5,   86,	125, 235, 2,   3,   161,
+		249, 4,	  26,  245, 205, 138, 17,  249, 33,  139, 150, 129, 142,
+		35,  23,  123, 190, 217, 88,  83,  128, 187, 24,  3,   69,  250,
+		56,  137, 86,  158, 197, 158, 122, 138, 101, 20,  252, 105, 105,
+		118, 28,  235, 24,  220, 251, 58,  44,	52,  231, 66,  74,  250,
+		215, 207, 96,  217, 57,	 153, 25,  11,	5,   10,  81,  198, 198,
+		242, 245, 83,  91,  122, 175, 74,  30,	254, 26,  218, 113, 193,
+		249, 189, 95,  125, 151, 249, 235, 132, 66,  69,  170, 235, 143,
+		107, 155, 26,  34,  160, 27,  166, 79,	32,  104, 246, 100, 58,
+		76,  146, 102, 241, 105, 8,   151, 163, 20,  26,  232, 33,  138,
+		159, 184, 129, 187, 30,	 123, 181, 17,	149, 84,  183, 248, 210,
+		254, 46,  98,  225, 12,	 49,  196, 192, 149, 0,	  0};
 
 	DATA_BLOB packed_blob = data_blob_null;
 
diff --git a/pidl/lib/Parse/Pidl/Samba4/Python.pm b/pidl/lib/Parse/Pidl/Samba4/Python.pm
index 57f8e8b5638..c09ee4b784d 100644
--- a/pidl/lib/Parse/Pidl/Samba4/Python.pm
+++ b/pidl/lib/Parse/Pidl/Samba4/Python.pm
@@ -1706,7 +1706,7 @@ sub ConvertU16StringFromPythonData($$$$$)
 
 	$self->pidl("{");
 	$self->indent;
-	$self->pidl("uint16_t *str = NULL;");
+	$self->pidl("unsigned char *str = NULL;");
 	$self->pidl("");
 	$self->pidl("str = PyUtf16String_FromBytes(");
 	$self->pidl("	$mem_ctx, $py_var);");
diff --git a/pidl/lib/Parse/Pidl/Typelist.pm b/pidl/lib/Parse/Pidl/Typelist.pm
index 09d416f7b20..31ea19e357c 100644
--- a/pidl/lib/Parse/Pidl/Typelist.pm
+++ b/pidl/lib/Parse/Pidl/Typelist.pm
@@ -56,7 +56,7 @@ my %scalars = (
 	"pointer"	=> "void*",
 	"DATA_BLOB"	=> "DATA_BLOB",
 	"string"	=> "const char *",
-	"u16string"	=> "const uint16_t *",
+	"u16string"	=> "const unsigned char *",
 	"string_array"	=> "const char **",
 	"time_t"	=> "time_t",
 	"uid_t"	        => "uid_t",
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 5c1ba851287..49b5a47a06b 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -317,6 +317,7 @@ char *gidtoname(gid_t gid);
 uid_t nametouid(const char *name);
 gid_t nametogid(const char *name);
 void smb_panic_s3(const char *why);
+void log_panic_action(const char *msg);
 const char *readdirname(DIR *p);
 bool is_in_path(const char *name, name_compare_entry *namelist, bool case_sensitive);
 void set_namearray(name_compare_entry **ppname_array, const char *namelist);
diff --git a/source3/lib/util.c b/source3/lib/util.c
index fa01f419d65..51dc50d0b66 100644
--- a/source3/lib/util.c
+++ b/source3/lib/util.c
@@ -675,13 +675,20 @@ gid_t nametogid(const char *name)
  Something really nasty happened - panic !
 ********************************************************************/
 
-void smb_panic_s3(const char *why)
+static void call_panic_action(const char *why, bool as_root)
 {
 	const struct loadparm_substitution *lp_sub =
 		loadparm_s3_global_substitution();
 	char *cmd;
 	int result;
 
+	cmd = lp_panic_action(talloc_tos(), lp_sub);
+	if (cmd == NULL || cmd[0] == '\0') {
+		return;
+	}
+
+	DBG_ERR("Calling panic action [%s]\n", cmd);
+
 #if defined(HAVE_PRCTL) && defined(PR_SET_PTRACER)
 	/*
 	 * Make sure all children can attach a debugger.
@@ -689,22 +696,36 @@ void smb_panic_s3(const char *why)
 	prctl(PR_SET_PTRACER, getpid(), 0, 0, 0);
 #endif
 
-	cmd = lp_panic_action(talloc_tos(), lp_sub);
-	if (cmd && *cmd) {
-		DEBUG(0, ("smb_panic(): calling panic action [%s]\n", cmd));
-		result = system(cmd);
+	if (as_root) {
+		become_root();
+	}
 
-		if (result == -1)
-			DEBUG(0, ("smb_panic(): fork failed in panic action: %s\n",
-					  strerror(errno)));
-		else
-			DEBUG(0, ("smb_panic(): action returned status %d\n",
-					  WEXITSTATUS(result)));
+	result = system(cmd);
+
+	if (as_root) {
+		unbecome_root();
 	}
 
+	if (result == -1)
+		DBG_ERR("fork failed in panic action: %s\n",
+			strerror(errno));
+	else
+		DBG_ERR("action returned status %d\n",
+			WEXITSTATUS(result));
+}
+
+void smb_panic_s3(const char *why)
+{
+	call_panic_action(why, false);
 	dump_core();
 }


-- 
Samba Shared Repository



More information about the samba-cvs mailing list