]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
libndr:ndr: Allow only one string encoding flag
authorJoseph Sutton <josephsutton@catalyst.net.nz>
Thu, 13 Jul 2023 02:59:52 +0000 (14:59 +1200)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 15 Nov 2023 22:07:36 +0000 (22:07 +0000)
Signed-off-by: Joseph Sutton <josephsutton@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
librpc/ndr/libndr.h
librpc/ndr/ndr_string.c

index 3a453b5b168e0d6bf7c8bf46151fc8d686cdea9b..5f84b0be7df54a30dc021d873bf10e8194e5e40b 100644 (file)
@@ -170,6 +170,12 @@ struct ndr_print {
                LIBNDR_FLAG_STR_RAW8 | \
                0)
 
+#define LIBNDR_ENCODING_FLAGS          (0U | \
+               LIBNDR_FLAG_STR_ASCII | \
+               LIBNDR_FLAG_STR_UTF8 | \
+               LIBNDR_FLAG_STR_RAW8 | \
+               0)
+
 /*
  * Mark an element as SECRET, it won't be printed by
  * via ndr_print* unless NDR_PRINT_SECRETS is specified.
index ab34324139d12b9c4e9ade5f47a4bd71bfdb4e3d..bb157b08492cce7f65cc2f1fd3d5c9834f9410d0 100644 (file)
@@ -44,29 +44,36 @@ _PUBLIC_ enum ndr_err_code ndr_pull_string(struct ndr_pull *ndr, ndr_flags_type
                chset = CH_UTF16BE;
        }
 
-       if (flags & LIBNDR_FLAG_STR_ASCII) {
-               chset = CH_DOS;
-               byte_mul = 1;
-               flags &= ~LIBNDR_FLAG_STR_ASCII;
-       }
-
        /*
         * We will check this flag, but from the unmodified
         * ndr->flags, so just remove it from flags
         */
        flags &= ~LIBNDR_FLAG_STR_NO_EMBEDDED_NUL;
 
-       if (flags & LIBNDR_FLAG_STR_UTF8) {
+       switch (flags & LIBNDR_ENCODING_FLAGS) {
+       case 0:
+               break;
+
+       case LIBNDR_FLAG_STR_ASCII:
+               chset = CH_DOS;
+               byte_mul = 1;
+               break;
+
+       case LIBNDR_FLAG_STR_UTF8:
                chset = CH_UTF8;
                byte_mul = 1;
-               flags &= ~LIBNDR_FLAG_STR_UTF8;
-       }
+               break;
 
-       if (flags & LIBNDR_FLAG_STR_RAW8) {
+       case LIBNDR_FLAG_STR_RAW8:
                do_convert = 0;
                byte_mul = 1;
-               flags &= ~LIBNDR_FLAG_STR_RAW8;
+               break;
+
+       default:
+               return ndr_pull_error(ndr, NDR_ERR_STRING, "Bad string flags 0x%"PRI_LIBNDR_FLAGS"\n",
+                                     ndr->flags & LIBNDR_STRING_FLAGS);
        }
+       flags &= ~LIBNDR_ENCODING_FLAGS;
 
        flags &= ~LIBNDR_FLAG_STR_CONFORMANT;
        if (flags & LIBNDR_FLAG_STR_CHARLEN) {
@@ -260,29 +267,36 @@ _PUBLIC_ enum ndr_err_code ndr_push_string(struct ndr_push *ndr, ndr_flags_type
 
        s_len = s?strlen(s):0;
 
-       if (flags & LIBNDR_FLAG_STR_ASCII) {
-               chset = CH_DOS;
-               byte_mul = 1;
-               flags &= ~LIBNDR_FLAG_STR_ASCII;
-       }
-
        /*
         * We will check this flag, but from the unmodified
         * ndr->flags, so just remove it from flags
         */
        flags &= ~LIBNDR_FLAG_STR_NO_EMBEDDED_NUL;
 
-       if (flags & LIBNDR_FLAG_STR_UTF8) {
+       switch (flags & LIBNDR_ENCODING_FLAGS) {
+       case 0:
+               break;
+
+       case LIBNDR_FLAG_STR_ASCII:
+               chset = CH_DOS;
+               byte_mul = 1;
+               break;
+
+       case LIBNDR_FLAG_STR_UTF8:
                chset = CH_UTF8;
                byte_mul = 1;
-               flags &= ~LIBNDR_FLAG_STR_UTF8;
-       }
+               break;
 
-       if (flags & LIBNDR_FLAG_STR_RAW8) {
+       case LIBNDR_FLAG_STR_RAW8:
                do_convert = 0;
                byte_mul = 1;
-               flags &= ~LIBNDR_FLAG_STR_RAW8;
+               break;
+
+       default:
+               return ndr_push_error(ndr, NDR_ERR_STRING, "Bad string flags 0x%"PRI_LIBNDR_FLAGS"\n",
+                                     ndr->flags & LIBNDR_STRING_FLAGS);
        }
+       flags &= ~LIBNDR_ENCODING_FLAGS;
 
        flags &= ~LIBNDR_FLAG_STR_CONFORMANT;