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