svn commit: samba r1847 - in branches/SAMBA_4_0/source/librpc: idl ndr

metze at samba.org metze at samba.org
Tue Aug 17 09:14:47 GMT 2004


Author: metze
Date: 2004-08-17 09:14:46 +0000 (Tue, 17 Aug 2004)
New Revision: 1847

WebSVN: http://websvn.samba.org/websvn/changeset.php?rep=samba&path=/branches/SAMBA_4_0/source/librpc&rev=1847&nolog=1

Log:
add STR_BYTESIZE flag, to handle cases where
the size is in bytes not in unicode chars

metze

Modified:
   branches/SAMBA_4_0/source/librpc/idl/idl_types.h
   branches/SAMBA_4_0/source/librpc/ndr/libndr.h
   branches/SAMBA_4_0/source/librpc/ndr/ndr_basic.c


Changeset:
Modified: branches/SAMBA_4_0/source/librpc/idl/idl_types.h
===================================================================
--- branches/SAMBA_4_0/source/librpc/idl/idl_types.h	2004-08-17 09:09:01 UTC (rev 1846)
+++ branches/SAMBA_4_0/source/librpc/idl/idl_types.h	2004-08-17 09:14:46 UTC (rev 1847)
@@ -4,6 +4,7 @@
 #define STR_SIZE2    LIBNDR_FLAG_STR_SIZE2
 #define STR_NOTERM   LIBNDR_FLAG_STR_NOTERM
 #define STR_NULLTERM LIBNDR_FLAG_STR_NULLTERM
+#define STR_BYTESIZE LIBNDR_FLAG_STR_BYTESIZE
 
 /*
   a UCS2 string prefixed with [size] [offset] [length], all 32 bits

Modified: branches/SAMBA_4_0/source/librpc/ndr/libndr.h
===================================================================
--- branches/SAMBA_4_0/source/librpc/ndr/libndr.h	2004-08-17 09:09:01 UTC (rev 1846)
+++ branches/SAMBA_4_0/source/librpc/ndr/libndr.h	2004-08-17 09:14:46 UTC (rev 1847)
@@ -98,6 +98,7 @@
 #define LIBNDR_FLAG_STR_NOTERM   (1<<5)
 #define LIBNDR_FLAG_STR_NULLTERM (1<<6)
 #define LIBNDR_FLAG_STR_SIZE2    (1<<7)
+#define LIBNDR_FLAG_STR_BYTESIZE (1<<8)
 #define LIBNDR_STRING_FLAGS      (0xFC)
 
 #define LIBNDR_FLAG_REF_ALLOC    (1<<10)

Modified: branches/SAMBA_4_0/source/librpc/ndr/ndr_basic.c
===================================================================
--- branches/SAMBA_4_0/source/librpc/ndr/ndr_basic.c	2004-08-17 09:09:01 UTC (rev 1846)
+++ branches/SAMBA_4_0/source/librpc/ndr/ndr_basic.c	2004-08-17 09:14:46 UTC (rev 1847)
@@ -472,6 +472,7 @@
 		break;
 
 	case LIBNDR_FLAG_STR_SIZE4:
+	case LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_NOTERM:
 		NDR_CHECK(ndr_pull_uint32(ndr, &len1));
 		NDR_PULL_NEED_BYTES(ndr, len1*2);
 		if (len1 == 0) {
@@ -487,9 +488,40 @@
 					      "Bad character conversion");
 		}
 		NDR_CHECK(ndr_pull_advance(ndr, len1*2));
+
+		/* this is a way of detecting if a string is sent with the wrong
+		   termination */
+		if (ndr->flags & LIBNDR_FLAG_STR_NOTERM) {
+			if (strlen(as) < len1) {
+				DEBUG(6,("short string '%s'\n", as));
+			}
+		} else {
+			if (strlen(as) == len1) {
+				DEBUG(6,("long string '%s'\n", as));
+			}
+		}
 		*s = as;
 		break;
 
+	case LIBNDR_FLAG_STR_SIZE2|LIBNDR_FLAG_STR_NOTERM|LIBNDR_FLAG_STR_BYTESIZE:
+		NDR_CHECK(ndr_pull_uint16(ndr, &len3));
+		NDR_PULL_NEED_BYTES(ndr, len3);
+		if (len3 == 0) {
+			*s = talloc_strdup(ndr->mem_ctx, "");
+			break;
+		}
+		ret = convert_string_talloc(ndr->mem_ctx, chset, CH_UNIX, 
+					    ndr->data+ndr->offset, 
+					    len3,
+					    (const 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;
+
 	case LIBNDR_FLAG_STR_NULLTERM:
 		len1 = strnlen_w(ndr->data+ndr->offset, 
 				 (ndr->data_size - ndr->offset)/2);
@@ -499,12 +531,13 @@
 		ret = convert_string_talloc(ndr->mem_ctx, chset, CH_UNIX, 
 					    ndr->data+ndr->offset, 
 					    len1*2,
-					    (const void **)s);
+					    (const void **)&as);
 		if (ret == -1) {
 			return ndr_pull_error(ndr, NDR_ERR_CHARCNV, 
 					      "Bad character conversion");
 		}
 		NDR_CHECK(ndr_pull_advance(ndr, len1*2));
+		*s = as;
 		break;
 
 	case LIBNDR_FLAG_STR_ASCII|LIBNDR_FLAG_STR_LEN4|LIBNDR_FLAG_STR_SIZE4:
@@ -520,7 +553,7 @@
 		NDR_ALLOC_N(ndr, as, (len2+1));
 		NDR_CHECK(ndr_pull_bytes(ndr, as, len2));
 		as[len2] = 0;
-		(*s) = as;
+		*s = as;
 		break;
 
 	case LIBNDR_FLAG_STR_ASCII|LIBNDR_FLAG_STR_LEN4:
@@ -529,7 +562,7 @@
 		NDR_ALLOC_N(ndr, as, (len2+1));
 		NDR_CHECK(ndr_pull_bytes(ndr, as, len2));
 		as[len2] = 0;
-		(*s) = as;
+		*s = as;
 		break;
 
 	case LIBNDR_FLAG_STR_ASCII|LIBNDR_FLAG_STR_SIZE2:
@@ -537,7 +570,7 @@
 		NDR_ALLOC_N(ndr, as, (len3+1));
 		NDR_CHECK(ndr_pull_bytes(ndr, as, len3));
 		as[len3] = 0;
-		(*s) = as;
+		*s = as;
 		break;
 
 	case LIBNDR_FLAG_STR_ASCII|LIBNDR_FLAG_STR_NULLTERM:
@@ -548,7 +581,7 @@
 		NDR_ALLOC_N(ndr, as, (len1+1));
 		NDR_CHECK(ndr_pull_bytes(ndr, as, len1));
 		as[len1] = 0;
-		(*s) = as;
+		*s = as;
 		break;
 
 	default:
@@ -635,7 +668,20 @@
 		}
 		ndr->offset += c_len*2 + 2;
 		break;
-		
+
+	case LIBNDR_FLAG_STR_SIZE2|LIBNDR_FLAG_STR_NOTERM|LIBNDR_FLAG_STR_BYTESIZE:
+		NDR_CHECK(ndr_push_uint16(ndr, c_len*2));
+		NDR_PUSH_NEED_BYTES(ndr, c_len*2);
+		ret = convert_string(CH_UNIX, chset, 
+				     s, s_len,
+				     ndr->data+ndr->offset, c_len*2);
+		if (ret == -1) {
+			return ndr_push_error(ndr, NDR_ERR_CHARCNV, 
+					      "Bad character conversion");
+		}
+		ndr->offset += c_len*2;
+		break;
+
 	case LIBNDR_FLAG_STR_ASCII|LIBNDR_FLAG_STR_LEN4|LIBNDR_FLAG_STR_SIZE4:
 		NDR_CHECK(ndr_push_uint32(ndr, c_len+1));
 		NDR_CHECK(ndr_push_uint32(ndr, 0));



More information about the samba-cvs mailing list