The branch, master has been updated via fe1d45cf1e9 s4:librpc: Add functions converting between bytes and UTF‐16 strings via 5f3f3c0cc3e s4:librpc: Remove trailing whitespace via df19006c782 tests/krb5: Allow creating Group Managed Service Accounts via 7a9ad610226 pidl: Don’t overwrite exception set by PyUnicode_AsEncodedString() via ddb98e7d611 pidl: Remove trailing whitespace via e04f627e4f2 librpc:ndr: Fix comment via 204a46b712c librpc:ndr: Don’t duplicate strings needlessly via e01e6202e60 librpc:ndr: Move call to convert_string_talloc() on to its own line via 2e2b80f895d librpc:ndr: Introduce common out path in ndr_push_string() via 5e580fadeed librpc:ndr: Fix error message via 4b03c6de54b librpc:ndr: Fix code formatting via 939ceb233ef util/charset: Add talloc_utf16_str[n]dup() via b6ff89f6fb3 util/charset: Include missing headers via 3f0809f1eef util/charset: Remove unnecessary cast from 3f908e19a04 s4-scripting: Remove repl_cleartext_pwd.py
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit fe1d45cf1e90e9d75f3a47d65b920e2a7e472c97 Author: Joseph Sutton <josephsut...@catalyst.net.nz> Date: Thu Nov 16 11:20:22 2023 +1300 s4:librpc: Add functions converting between bytes and UTF‐16 strings Signed-off-by: Joseph Sutton <josephsut...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> Autobuild-User(master): Andrew Bartlett <abart...@samba.org> Autobuild-Date(master): Thu Nov 16 06:23:35 UTC 2023 on atb-devel-224 commit 5f3f3c0cc3ef7ca5237ba1e4865259e02f41a12c Author: Joseph Sutton <josephsut...@catalyst.net.nz> Date: Wed Nov 8 21:09:14 2023 +1300 s4:librpc: Remove trailing whitespace Signed-off-by: Joseph Sutton <josephsut...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit df19006c7825609c18a6e21d3920696bc0955e70 Author: Joseph Sutton <josephsut...@catalyst.net.nz> Date: Mon Nov 13 17:07:02 2023 +1300 tests/krb5: Allow creating Group Managed Service Accounts Signed-off-by: Joseph Sutton <josephsut...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 7a9ad610226dfbdb5e645e6fe98fd266a960e2d1 Author: Joseph Sutton <josephsut...@catalyst.net.nz> Date: Wed Nov 15 12:10:36 2023 +1300 pidl: Don’t overwrite exception set by PyUnicode_AsEncodedString() Signed-off-by: Joseph Sutton <josephsut...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit ddb98e7d611f7c3160af4ea54bb6cf6bdf1ad0a3 Author: Joseph Sutton <josephsut...@catalyst.net.nz> Date: Thu Nov 9 14:08:19 2023 +1300 pidl: Remove trailing whitespace Signed-off-by: Joseph Sutton <josephsut...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit e04f627e4f2c6b2a2501634fd212e2527f4e0891 Author: Joseph Sutton <josephsut...@catalyst.net.nz> Date: Wed Nov 15 15:07:53 2023 +1300 librpc:ndr: Fix comment Signed-off-by: Joseph Sutton <josephsut...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 204a46b712cb025d2462b7e4319c04d451e2d550 Author: Joseph Sutton <josephsut...@catalyst.net.nz> Date: Thu Nov 16 10:15:36 2023 +1300 librpc:ndr: Don’t duplicate strings needlessly If the source string doesn’t need to be converted, there’s no reason for it to be talloc‐allocated. Signed-off-by: Joseph Sutton <josephsut...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit e01e6202e606476066231b0b84903c604db07a6e Author: Joseph Sutton <josephsut...@catalyst.net.nz> Date: Thu Nov 16 14:50:58 2023 +1300 librpc:ndr: Move call to convert_string_talloc() on to its own line Signed-off-by: Joseph Sutton <josephsut...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 2e2b80f895dbe436290321074464b54f2943640f Author: Joseph Sutton <josephsut...@catalyst.net.nz> Date: Thu Nov 16 10:22:26 2023 +1300 librpc:ndr: Introduce common out path in ndr_push_string() This ensures that ‘dest’ gets freed on failure. Signed-off-by: Joseph Sutton <josephsut...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 5e580fadeed52ab723c1f6252dd4a49d0824a229 Author: Joseph Sutton <josephsut...@catalyst.net.nz> Date: Mon Nov 13 17:04:34 2023 +1300 librpc:ndr: Fix error message Signed-off-by: Joseph Sutton <josephsut...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 4b03c6de54bfe7773ea97bf6707c6144433acf11 Author: Joseph Sutton <josephsut...@catalyst.net.nz> Date: Thu Nov 16 10:43:12 2023 +1300 librpc:ndr: Fix code formatting Signed-off-by: Joseph Sutton <josephsut...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 939ceb233ef94a0d2d45da39076ba3e78665c776 Author: Joseph Sutton <josephsut...@catalyst.net.nz> Date: Thu Nov 16 11:10:28 2023 +1300 util/charset: Add talloc_utf16_str[n]dup() Signed-off-by: Joseph Sutton <josephsut...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit b6ff89f6fb32a74365cc7116beb1ef949aaae021 Author: Joseph Sutton <josephsut...@catalyst.net.nz> Date: Wed Nov 15 15:26:56 2023 +1300 util/charset: Include missing headers Signed-off-by: Joseph Sutton <josephsut...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 3f0809f1eef116454584a84b270a1fd7feeebe64 Author: Joseph Sutton <josephsut...@catalyst.net.nz> Date: Mon Nov 13 12:21:20 2023 +1300 util/charset: Remove unnecessary cast Signed-off-by: Joseph Sutton <josephsut...@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abart...@samba.org> ----------------------------------------------------------------------- Summary of changes: lib/util/charset/charset.h | 6 ++ lib/util/charset/convert_string.c | 2 +- lib/util/charset/util_unistr.c | 44 ++++++++++ librpc/ndr/ndr_string.c | 129 +++++++++++++++++++---------- pidl/lib/Parse/Pidl/NDR.pm | 82 +++++++++---------- pidl/lib/Parse/Pidl/Samba4/Header.pm | 2 +- pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm | 134 +++++++++++++++---------------- pidl/lib/Parse/Pidl/Samba4/Python.pm | 1 - pidl/lib/Parse/Pidl/Typelist.pm | 8 +- python/samba/tests/krb5/kdc_base_test.py | 25 ++++-- source4/librpc/rpc/pyrpc_util.c | 49 ++++++++++- source4/librpc/rpc/pyrpc_util.h | 4 + 12 files changed, 319 insertions(+), 167 deletions(-) Changeset truncated at 500 lines: diff --git a/lib/util/charset/charset.h b/lib/util/charset/charset.h index 195655ba1e5..aa691734713 100644 --- a/lib/util/charset/charset.h +++ b/lib/util/charset/charset.h @@ -26,6 +26,8 @@ #define __CHARSET_H__ #include <talloc.h> +#include <stdbool.h> +#include <stdint.h> /* this defines the charset types used in samba */ typedef enum { @@ -127,6 +129,10 @@ 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); + char *strchr_m(const char *s, char c); /** * Calculate the number of units (8 or 16-bit, depending on the diff --git a/lib/util/charset/convert_string.c b/lib/util/charset/convert_string.c index 9fa721b6d12..859b002ecbc 100644 --- a/lib/util/charset/convert_string.c +++ b/lib/util/charset/convert_string.c @@ -354,7 +354,7 @@ bool convert_string_talloc_handle(TALLOC_CTX *ctx, struct smb_iconv_handle *ic, const char *inbuf = NULL; char *outbuf = NULL, *ob = NULL; smb_iconv_t descriptor; - void **dest = (void **)dst; + void **dest = dst; *dest = NULL; if (converted_size != NULL) { diff --git a/lib/util/charset/util_unistr.c b/lib/util/charset/util_unistr.c index 7d8ff68074b..54b7b939b1b 100644 --- a/lib/util/charset/util_unistr.c +++ b/lib/util/charset/util_unistr.c @@ -243,6 +243,50 @@ 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) +{ + uint16_t *new_str = NULL; + + /* Check for overflow. */ + if (len > SIZE_MAX - 2) { + return NULL; + } + + /* + * Allocate the new string, including space for the + * UTF‐16 null terminator. + */ + new_str = talloc_size(mem_ctx, len + 2); + if (new_str == NULL) { + return NULL; + } + + 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'; + } + + return new_str; +} + +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) +{ + return talloc_utf16_strlendup(mem_ctx, str, utf16_len_n(str, n)); +} /** * Determine the length and validity of a utf-8 string. diff --git a/librpc/ndr/ndr_string.c b/librpc/ndr/ndr_string.c index 1f7bfff2e71..80054fa9be6 100644 --- a/librpc/ndr/ndr_string.c +++ b/librpc/ndr/ndr_string.c @@ -138,7 +138,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_string(struct ndr_pull *ndr, ndr_flags_type case LIBNDR_FLAG_STR_NULLTERM: /* - * We ensure that conv_str_len cannot return 0 by + * We ensure that conv_src_len cannot equal 0 by * requiring that there be enough bytes for at least * the NULL terminator */ @@ -185,10 +185,10 @@ _PUBLIC_ enum ndr_err_code ndr_pull_string(struct ndr_pull *ndr, ndr_flags_type } converted_size = MIN(strlen(as)+1, conv_src_len); } else if (!convert_string_talloc(ndr->current_mem_ctx, chset, - CH_UNIX, ndr->data + ndr->offset, - conv_src_len * byte_mul, - &as, - &converted_size)) { + CH_UNIX, ndr->data + ndr->offset, + conv_src_len * byte_mul, + &as, + &converted_size)) { return ndr_pull_error(ndr, NDR_ERR_CHARCNV, "Bad character conversion with flags 0x%"PRI_LIBNDR_FLAGS, flags); } @@ -234,7 +234,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_string(struct ndr_pull *ndr, ndr_flags_type } } if (converted_size > 0 && as[converted_size-1] != '\0') { - DEBUG(6,("long string '%s', send without NULL termination (which was expected)\n", as)); + DEBUG(6,("long string '%s', sent without NULL termination (which was expected)\n", as)); } } @@ -255,7 +255,10 @@ _PUBLIC_ enum ndr_err_code ndr_push_string(struct ndr_push *ndr, ndr_flags_type int do_convert = 1, chset = CH_UTF16; libndr_flags flags = ndr->flags; unsigned byte_mul = 2; - uint8_t *dest = NULL; + const uint8_t *dest = NULL; + uint8_t *dest_to_free = NULL; + static const uint8_t null_byte[] = {0}; + enum ndr_err_code ndr_err = NDR_ERR_SUCCESS; if (!(ndr_flags & NDR_SCALARS)) { return NDR_ERR_SUCCESS; @@ -306,23 +309,21 @@ _PUBLIC_ enum ndr_err_code ndr_push_string(struct ndr_push *ndr, ndr_flags_type if (s_len == 0) { d_len = 0; - dest = (uint8_t *)talloc_strdup(ndr, ""); - if (dest == NULL) { - return ndr_push_error(ndr, NDR_ERR_ALLOC, - "Failed to talloc_strdup() in ndr_string_push()"); - } + dest = null_byte; } else if (!do_convert) { d_len = s_len; - dest = (uint8_t *)talloc_strndup(ndr, s, s_len); - if (dest == NULL) { - return ndr_push_error(ndr, NDR_ERR_ALLOC, - "Failed to talloc_strndup() in ndr_string_push()"); + dest = (const uint8_t *)s; + } else { + bool ok; + + ok = convert_string_talloc(ndr, CH_UNIX, chset, s, s_len, + &dest_to_free, &d_len); + if (!ok) { + return ndr_push_error(ndr, NDR_ERR_CHARCNV, + "Bad character push conversion with flags 0x%"PRI_LIBNDR_FLAGS, flags); } - } else if (!convert_string_talloc(ndr, CH_UNIX, chset, s, s_len, - &dest, &d_len)) - { - return ndr_push_error(ndr, NDR_ERR_CHARCNV, - "Bad character push conversion with flags 0x%"PRI_LIBNDR_FLAGS, flags); + + dest = dest_to_free; } if (flags & LIBNDR_FLAG_STR_BYTESIZE) { @@ -338,48 +339,88 @@ _PUBLIC_ enum ndr_err_code ndr_push_string(struct ndr_push *ndr, ndr_flags_type switch (flags & LIBNDR_STRING_FLAGS) { case LIBNDR_FLAG_STR_LEN4|LIBNDR_FLAG_STR_SIZE4: case LIBNDR_FLAG_STR_LEN4|LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_NOTERM: - NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, c_len)); - NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0)); - NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, c_len)); - NDR_CHECK(ndr_push_bytes(ndr, dest, d_len)); + ndr_err = ndr_push_uint32(ndr, NDR_SCALARS, c_len); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + goto out; + } + ndr_err = ndr_push_uint32(ndr, NDR_SCALARS, 0); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + goto out; + } + ndr_err = ndr_push_uint32(ndr, NDR_SCALARS, c_len); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + goto out; + } + ndr_err = ndr_push_bytes(ndr, dest, d_len); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + goto out; + } break; case LIBNDR_FLAG_STR_LEN4: case LIBNDR_FLAG_STR_LEN4|LIBNDR_FLAG_STR_NOTERM: - NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0)); - NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, c_len)); - NDR_CHECK(ndr_push_bytes(ndr, dest, d_len)); + ndr_err = ndr_push_uint32(ndr, NDR_SCALARS, 0); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + goto out; + } + ndr_err = ndr_push_uint32(ndr, NDR_SCALARS, c_len); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + goto out; + } + ndr_err = ndr_push_bytes(ndr, dest, d_len); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + goto out; + } break; case LIBNDR_FLAG_STR_SIZE4: case LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_NOTERM: - NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, c_len)); - NDR_CHECK(ndr_push_bytes(ndr, dest, d_len)); + ndr_err = ndr_push_uint32(ndr, NDR_SCALARS, c_len); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + goto out; + } + ndr_err = ndr_push_bytes(ndr, dest, d_len); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + goto out; + } break; case LIBNDR_FLAG_STR_SIZE2: case LIBNDR_FLAG_STR_SIZE2|LIBNDR_FLAG_STR_NOTERM: - NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, c_len)); - NDR_CHECK(ndr_push_bytes(ndr, dest, d_len)); + ndr_err = ndr_push_uint16(ndr, NDR_SCALARS, c_len); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + goto out; + } + ndr_err = ndr_push_bytes(ndr, dest, d_len); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + goto out; + } break; case LIBNDR_FLAG_STR_NULLTERM: - NDR_CHECK(ndr_push_bytes(ndr, dest, d_len)); + ndr_err = ndr_push_bytes(ndr, dest, d_len); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + goto out; + } break; default: if (ndr->flags & LIBNDR_FLAG_REMAINING) { - NDR_CHECK(ndr_push_bytes(ndr, dest, d_len)); + ndr_err = ndr_push_bytes(ndr, dest, d_len); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + goto out; + } break; } - return ndr_push_error(ndr, NDR_ERR_STRING, "Bad string flags 0x%"PRI_LIBNDR_FLAGS"\n", - ndr->flags & LIBNDR_STRING_FLAGS); + ndr_err = ndr_push_error(ndr, NDR_ERR_STRING, "Bad string flags 0x%"PRI_LIBNDR_FLAGS"\n", + ndr->flags & LIBNDR_STRING_FLAGS); + goto out; } - talloc_free(dest); - - return NDR_ERR_SUCCESS; +out: + talloc_free(dest_to_free); + return ndr_err; } /** @@ -753,11 +794,11 @@ _PUBLIC_ enum ndr_err_code ndr_check_string_terminator(struct ndr_pull *ndr, uin NDR_PULL_NEED_BYTES(ndr, element_size); for (i = 0; i < element_size; i++) { - if (ndr->data[ndr->offset+i] != 0) { + if (ndr->data[ndr->offset+i] != 0) { ndr->offset = save_offset; return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "String terminator not present or outside string boundaries"); - } + } } ndr->offset = save_offset; @@ -865,10 +906,10 @@ _PUBLIC_ enum ndr_err_code ndr_push_charset(struct ndr_push *ndr, ndr_flags_type } if (!convert_string(CH_UNIX, chset, - var, strlen(var), - ndr->data+ndr->offset, required, &size)) { + var, strlen(var), + ndr->data+ndr->offset, required, &size)) { return ndr_push_error(ndr, NDR_ERR_CHARCNV, - "Bad character conversion"); + "Bad character conversion"); } /* Make sure the remaining part of the string is filled with zeroes */ diff --git a/pidl/lib/Parse/Pidl/NDR.pm b/pidl/lib/Parse/Pidl/NDR.pm index 48fc2cb20c8..1f95cdfd739 100644 --- a/pidl/lib/Parse/Pidl/NDR.pm +++ b/pidl/lib/Parse/Pidl/NDR.pm @@ -198,7 +198,7 @@ sub GetElementLevelTable($$$) $length = $size; } - if ($e == $e->{PARENT}->{ELEMENTS}[-1] + if ($e == $e->{PARENT}->{ELEMENTS}[-1] and $e->{PARENT}->{TYPE} ne "FUNCTION") { $is_surrounding = 1; } @@ -257,7 +257,7 @@ sub GetElementLevelTable($$$) $pt = $pointer_default; } - push (@$order, { + push (@$order, { TYPE => "POINTER", POINTER_TYPE => $pt, POINTER_INDEX => $pointer_idx, @@ -265,13 +265,13 @@ sub GetElementLevelTable($$$) LEVEL => $level }); - warning($e, "top-level \[out\] pointer `$e->{NAME}' is not a \[ref\] pointer") + warning($e, "top-level \[out\] pointer `$e->{NAME}' is not a \[ref\] pointer") if ($i == 1 and $pt ne "ref" and - $e->{PARENT}->{TYPE} eq "FUNCTION" and + $e->{PARENT}->{TYPE} eq "FUNCTION" and not has_property($e, "in")); $pointer_idx++; - + # everything that follows will be deferred $is_deferred = 1 if ($level ne "TOP"); @@ -288,9 +288,9 @@ sub GetElementLevelTable($$$) $array_length = $array_size; $is_varying =0; } - } - - if (scalar(@size_is) == 0 and has_property($e, "string") and + } + + if (scalar(@size_is) == 0 and has_property($e, "string") and $i == $e->{POINTERS}) { $is_string = 1; $is_varying = $is_conformant = has_property($e, "noheader")?0:1; @@ -312,7 +312,7 @@ sub GetElementLevelTable($$$) }); $is_deferred = 0; - } + } } if ($is_pipe) { @@ -331,10 +331,10 @@ sub GetElementLevelTable($$$) if (defined(has_property($e, "subcontext"))) { my $hdr_size = has_property($e, "subcontext"); my $subsize = has_property($e, "subcontext_size"); - if (not defined($subsize)) { - $subsize = -1; + if (not defined($subsize)) { + $subsize = -1; } - + push (@$order, { TYPE => "SUBCONTEXT", HEADER_SIZE => $hdr_size, @@ -346,7 +346,7 @@ sub GetElementLevelTable($$$) if (my $switch = has_property($e, "switch_is")) { push (@$order, { - TYPE => "SWITCH", + TYPE => "SWITCH", SWITCH_IS => $switch, IS_DEFERRED => $is_deferred }); @@ -395,7 +395,7 @@ sub GetTypedefLevelTable($$$$) } ##################################################################### -# see if a type contains any deferred data +# see if a type contains any deferred data sub can_contain_deferred { sub can_contain_deferred; @@ -438,7 +438,7 @@ sub pointer_type($) my $e = shift; return undef unless $e->{POINTERS}; - + return "ref" if (has_property($e, "ref")); return "full" if (has_property($e, "ptr")); return "sptr" if (has_property($e, "sptr")); @@ -464,7 +464,7 @@ sub find_largest_alignment # the NDR layer translates this into # an alignment of 4 for NDR and 8 for NDR64 $a = 5; - } elsif (has_property($e, "subcontext")) { + } elsif (has_property($e, "subcontext")) { $a = 1; } elsif (has_property($e, "transmit_as")) { $a = align_type($e->{PROPERTIES}->{transmit_as}, @@ -497,7 +497,7 @@ sub align_type return 0 if ($e eq "EMPTY"); unless (hasType($e)) { - # it must be an external type - all we can do is guess + # it must be an external type - all we can do is guess # warning($e, "assuming alignment of unknown type '$e' is 4"); return 4; } @@ -592,10 +592,10 @@ sub ParseStruct($$$) CheckPointerTypes($struct, $pointer_default); - foreach my $x (@{$struct->{ELEMENTS}}) + foreach my $x (@{$struct->{ELEMENTS}}) { my $e = ParseElement($x, $pointer_default, $ms_union); - if ($x != $struct->{ELEMENTS}[-1] and + if ($x != $struct->{ELEMENTS}[-1] and $e->{LEVELS}[0]->{IS_SURROUNDING}) { fatal($x, "conformant member not at end of struct"); } @@ -617,7 +617,7 @@ sub ParseStruct($$$) if ($struct->{NAME}) { $align = align_type($struct->{NAME}); } - + return { TYPE => "STRUCT", NAME => $struct->{NAME}, @@ -654,7 +654,7 @@ sub ParseUnion($$) CheckPointerTypes($e, $pointer_default); - foreach my $x (@{$e->{ELEMENTS}}) + foreach my $x (@{$e->{ELEMENTS}}) { my $t; if ($x->{TYPE} eq "EMPTY") { @@ -846,7 +846,7 @@ sub ParseFunction($$$$) if ($d->{RETURN_TYPE} ne "void") { $rettype = expandAlias($d->{RETURN_TYPE}); } - + return { NAME => $d->{NAME}, TYPE => "FUNCTION", @@ -938,7 +938,7 @@ sub ParseInterface($) $version = "0.0"; - if(defined $idl->{PROPERTIES}->{version}) { + if(defined $idl->{PROPERTIES}->{version}) { my @if_version = split(/\./, $idl->{PROPERTIES}->{version}); if ($if_version[0] == $idl->{PROPERTIES}->{version}) { $version = $idl->{PROPERTIES}->{version}; @@ -954,7 +954,7 @@ sub ParseInterface($) @endpoints = split /,/, $idl->{PROPERTIES}->{endpoint}; } - return { + return { NAME => $idl->{NAME}, UUID => lc(has_property($idl, "uuid") // ''), VERSION => $version, @@ -978,7 +978,7 @@ sub Parse($) return undef unless (defined($idl)); Parse::Pidl::NDR::Validate($idl); - + my @ndr = (); foreach (@{$idl}) { @@ -1050,10 +1050,10 @@ sub ContainsDeferred($$) -- Samba Shared Repository