r9356: a better way of coping with NULL arrays in the array bounds checking. This...
authorAndrew Tridgell <tridge@samba.org>
Wed, 17 Aug 2005 12:28:47 +0000 (12:28 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:33:27 +0000 (13:33 -0500)
case of size_is(*size) where size is NULL, and the array is NULL
(This used to be commit 56769b4b1d900cce60cd35298b642a85e4eddfee)

source4/build/pidl/Parse/Pidl/Samba/NDR/Parser.pm
source4/librpc/ndr/ndr.c

index 65b9ed57bcf93ceac9af27662eecaeb74fe40bc0..4dd838bcb7316162360c8feff72d0d2e13d91b6c 100644 (file)
@@ -319,14 +319,18 @@ sub ParseArrayPullHeader($$$$$)
 
        if ($l->{IS_CONFORMANT} and not $l->{IS_ZERO_TERMINATED}) {
                my $size = ParseExpr($l->{SIZE_IS}, $env);
+               defer "if ($var_name) {";
                check_null_pointer_deferred($size);
                defer "NDR_CHECK(ndr_check_array_size(ndr, (void*)" . get_pointer_to($var_name) . ", $size));";
+               defer "}";
        }
 
        if ($l->{IS_VARYING} and not $l->{IS_ZERO_TERMINATED}) {
                my $length = ParseExpr($l->{LENGTH_IS}, $env);
+               defer "if ($var_name) {";
                check_null_pointer_deferred($length);
                defer "NDR_CHECK(ndr_check_array_length(ndr, (void*)" . get_pointer_to($var_name) . ", $length));";
+               defer "}"
        }
 
        if (!$l->{IS_FIXED}) {
index 2cbb83a0f42911376225c233fc6d7cd65bfd1e4b..3a291c2cf8f41ed81f4ecf12882cd34ba72dd8e8 100644 (file)
@@ -493,10 +493,6 @@ uint32_t ndr_get_array_size(struct ndr_pull *ndr, const void *p)
 NTSTATUS ndr_check_array_size(struct ndr_pull *ndr, void *p, uint32_t size)
 {
        uint32_t stored;
-       /* a NULL array is OK */
-       if (*(void **)p == NULL) {
-               return NT_STATUS_OK;
-       }
        stored = ndr_token_peek(&ndr->array_size_list, p);
        if (stored != size) {
                return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, 
@@ -535,10 +531,6 @@ uint32_t ndr_get_array_length(struct ndr_pull *ndr, const void *p)
 NTSTATUS ndr_check_array_length(struct ndr_pull *ndr, void *p, uint32_t length)
 {
        uint32_t stored;
-       /* a NULL array is OK */
-       if (*(void **)p == NULL) {
-               return NT_STATUS_OK;
-       }
        stored = ndr_token_peek(&ndr->array_length_list, p);
        if (stored != length) {
                return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE,