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));
