svn commit: samba r9795 - in branches/SAMBA_4_0/source/librpc/ndr: .

metze at samba.org metze at samba.org
Tue Aug 30 13:34:12 GMT 2005


Author: metze
Date: 2005-08-30 13:34:12 +0000 (Tue, 30 Aug 2005)
New Revision: 9795

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=9795

Log:
fix the ndr_pull_string code to handle, some special cases,
where the idl was something like this:

uint32 size;
[size_is(size+1)] wchar_t *string;

we always need a pair of NDR_PULL_NEEDED_BYTES() and ndr_pull_advance(),
with the same size passed in.

metze
Modified:
   branches/SAMBA_4_0/source/librpc/ndr/ndr_string.c


Changeset:
Modified: branches/SAMBA_4_0/source/librpc/ndr/ndr_string.c
===================================================================
--- branches/SAMBA_4_0/source/librpc/ndr/ndr_string.c	2005-08-30 12:51:05 UTC (rev 9794)
+++ branches/SAMBA_4_0/source/librpc/ndr/ndr_string.c	2005-08-30 13:34:12 UTC (rev 9795)
@@ -79,19 +79,19 @@
 					      "Bad string lengths len1=%u ofs=%u len2=%u\n", 
 					      len1, ofs, len2);
 		}
+		NDR_PULL_NEED_BYTES(ndr, (len2 + c_len_term)*byte_mul);
 		if (len2 == 0) {
-			*s = talloc_strdup(ndr, "");
-			break;
+			as = talloc_strdup(ndr, "");
+		} else {
+			ret = convert_string_talloc(ndr, chset, CH_UNIX, 
+						    ndr->data+ndr->offset, 
+						    (len2 + c_len_term)*byte_mul,
+						    (void **)&as);
+			if (ret == -1) {
+				return ndr_pull_error(ndr, NDR_ERR_CHARCNV, 
+						      "Bad character conversion");
+			}
 		}
-		NDR_PULL_NEED_BYTES(ndr, (len2 + c_len_term)*byte_mul);
-		ret = convert_string_talloc(ndr, chset, CH_UNIX, 
-					    ndr->data+ndr->offset, 
-					    (len2 + c_len_term)*byte_mul,
-					    (void **)&as);
-		if (ret == -1) {
-			return ndr_pull_error(ndr, NDR_ERR_CHARCNV, 
-					      "Bad character conversion");
-		}
 		NDR_CHECK(ndr_pull_advance(ndr, (len2 + c_len_term)*byte_mul));
 
 		if (ndr->flags & LIBNDR_FLAG_STR_LARGE_SIZE) {
@@ -125,17 +125,17 @@
 		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &len1));
 		NDR_PULL_NEED_BYTES(ndr, (len1 + c_len_term)*byte_mul);
 		if (len1 == 0) {
-			*s = talloc_strdup(ndr, "");
-			break;
+			as = talloc_strdup(ndr, "");
+		} else {
+			ret = convert_string_talloc(ndr, chset, CH_UNIX, 
+						    ndr->data+ndr->offset, 
+						    (len1 + c_len_term)*byte_mul,
+						    (void **)&as);
+			if (ret == -1) {
+				return ndr_pull_error(ndr, NDR_ERR_CHARCNV, 
+						      "Bad character conversion");
+			}
 		}
-		ret = convert_string_talloc(ndr, chset, CH_UNIX, 
-					    ndr->data+ndr->offset, 
-					    (len1 + c_len_term)*byte_mul,
-					    (void **)&as);
-		if (ret == -1) {
-			return ndr_pull_error(ndr, NDR_ERR_CHARCNV, 
-					      "Bad character conversion");
-		}
 		NDR_CHECK(ndr_pull_advance(ndr, (len1 + c_len_term)*byte_mul));
 
 		/* this is a way of detecting if a string is sent with the wrong
@@ -162,17 +162,17 @@
 		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &len1));
 		NDR_PULL_NEED_BYTES(ndr, (len1 + c_len_term)*byte_mul);
 		if (len1 == 0) {
-			*s = talloc_strdup(ndr, "");
-			break;
+			as = talloc_strdup(ndr, "");
+		} else {
+			ret = convert_string_talloc(ndr, chset, CH_UNIX, 
+						    ndr->data+ndr->offset, 
+						    (len1 + c_len_term)*byte_mul,
+						    (void **)&as);
+			if (ret == -1) {
+				return ndr_pull_error(ndr, NDR_ERR_CHARCNV, 
+						      "Bad character conversion");
+			}
 		}
-		ret = convert_string_talloc(ndr, chset, CH_UNIX, 
-					    ndr->data+ndr->offset, 
-					    (len1 + c_len_term)*byte_mul,
-					    (void **)&as);
-		if (ret == -1) {
-			return ndr_pull_error(ndr, NDR_ERR_CHARCNV, 
-					      "Bad character conversion");
-		}
 		NDR_CHECK(ndr_pull_advance(ndr, (len1 + c_len_term)*byte_mul));
 
 		/* this is a way of detecting if a string is sent with the wrong
@@ -195,17 +195,17 @@
 		NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &len3));
 		NDR_PULL_NEED_BYTES(ndr, (len3 + c_len_term)*byte_mul);
 		if (len3 == 0) {
-			*s = talloc_strdup(ndr, "");
-			break;
+			as = talloc_strdup(ndr, "");
+		} else {
+			ret = convert_string_talloc(ndr, chset, CH_UNIX, 
+						    ndr->data+ndr->offset, 
+						    (len3 + c_len_term)*byte_mul,
+						    (void **)&as);
+			if (ret == -1) {
+				return ndr_pull_error(ndr, NDR_ERR_CHARCNV, 
+						      "Bad character conversion");
+			}
 		}
-		ret = convert_string_talloc(ndr, chset, CH_UNIX, 
-					    ndr->data+ndr->offset, 
-					    (len3 + c_len_term)*byte_mul,
-					    (void **)&as);
-		if (ret == -1) {
-			return ndr_pull_error(ndr, NDR_ERR_CHARCNV, 
-					      "Bad character conversion");
-		}
 		NDR_CHECK(ndr_pull_advance(ndr, (len3 + c_len_term)*byte_mul));
 
 		/* this is a way of detecting if a string is sent with the wrong
@@ -226,17 +226,17 @@
 		NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &len3));
 		NDR_PULL_NEED_BYTES(ndr, len3);
 		if (len3 == 0) {
-			*s = talloc_strdup(ndr, "");
-			break;
+			as = talloc_strdup(ndr, "");
+		} else {
+			ret = convert_string_talloc(ndr, chset, CH_UNIX, 
+						    ndr->data+ndr->offset, 
+						    len3,
+						    (void **)&as);
+			if (ret == -1) {
+				return ndr_pull_error(ndr, NDR_ERR_CHARCNV, 
+						      "Bad character conversion");
+			}
 		}
-		ret = convert_string_talloc(ndr, chset, CH_UNIX, 
-					    ndr->data+ndr->offset, 
-					    len3,
-					    (void **)&as);
-		if (ret == -1) {
-			return ndr_pull_error(ndr, NDR_ERR_CHARCNV, 
-					      "Bad character conversion");
-		}
 		NDR_CHECK(ndr_pull_advance(ndr, len3));
 		*s = as;
 		break;



More information about the samba-cvs mailing list