librpc:ndr: Prohibit STR_NULLTERM|STR_NOTERM flags combination
authorJoseph Sutton <josephsutton@catalyst.net.nz>
Thu, 13 Jul 2023 02:44:40 +0000 (14:44 +1200)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 15 Nov 2023 22:07:36 +0000 (22:07 +0000)
ndr_pull_string() prohibited this, but ndr_push_string() always masked
STR_NOTERM out. Now the set of allowed flags should be consistent
between the two functions.

Signed-off-by: Joseph Sutton <josephsutton@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
librpc/ndr/ndr_string.c

index 277304315b55906a0795c71bd6e8960f06245de4..ab34324139d12b9c4e9ade5f47a4bd71bfdb4e3d 100644 (file)
@@ -321,8 +321,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_string(struct ndr_push *ndr, ndr_flags_type
                c_len = d_len / byte_mul;
        }
 
-       switch ((flags & LIBNDR_STRING_FLAGS) & ~LIBNDR_FLAG_STR_NOTERM) {
+       switch (flags & LIBNDR_STRING_FLAGS) {
        case LIBNDR_FLAG_STR_LEN4|LIBNDR_FLAG_STR_SIZE4:
+       case LIBNDR_FLAG_STR_LEN4|LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_NOTERM:
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, c_len));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, c_len));
@@ -330,17 +331,20 @@ _PUBLIC_ enum ndr_err_code ndr_push_string(struct ndr_push *ndr, ndr_flags_type
                break;
 
        case LIBNDR_FLAG_STR_LEN4:
+       case LIBNDR_FLAG_STR_LEN4|LIBNDR_FLAG_STR_NOTERM:
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, c_len));
                NDR_CHECK(ndr_push_bytes(ndr, dest, d_len));
                break;
 
        case LIBNDR_FLAG_STR_SIZE4:
+       case LIBNDR_FLAG_STR_SIZE4|LIBNDR_FLAG_STR_NOTERM:
                NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, c_len));
                NDR_CHECK(ndr_push_bytes(ndr, dest, d_len));
                break;
 
        case LIBNDR_FLAG_STR_SIZE2:
+       case LIBNDR_FLAG_STR_SIZE2|LIBNDR_FLAG_STR_NOTERM:
                NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, c_len));
                NDR_CHECK(ndr_push_bytes(ndr, dest, d_len));
                break;