Author: tridge Date: 2005-08-17 12:28:47 +0000 (Wed, 17 Aug 2005) New Revision: 9356
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=9356 Log: a better way of coping with NULL arrays in the array bounds checking. This copes with the case of size_is(*size) where size is NULL, and the array is NULL Modified: branches/SAMBA_4_0/source/build/pidl/Parse/Pidl/Samba/NDR/Parser.pm branches/SAMBA_4_0/source/librpc/ndr/ndr.c Changeset: Modified: branches/SAMBA_4_0/source/build/pidl/Parse/Pidl/Samba/NDR/Parser.pm =================================================================== --- branches/SAMBA_4_0/source/build/pidl/Parse/Pidl/Samba/NDR/Parser.pm 2005-08-17 12:27:28 UTC (rev 9355) +++ branches/SAMBA_4_0/source/build/pidl/Parse/Pidl/Samba/NDR/Parser.pm 2005-08-17 12:28:47 UTC (rev 9356) @@ -319,14 +319,18 @@ 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}) { Modified: branches/SAMBA_4_0/source/librpc/ndr/ndr.c =================================================================== --- branches/SAMBA_4_0/source/librpc/ndr/ndr.c 2005-08-17 12:27:28 UTC (rev 9355) +++ branches/SAMBA_4_0/source/librpc/ndr/ndr.c 2005-08-17 12:28:47 UTC (rev 9356) @@ -493,10 +493,6 @@ 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 @@ 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,
