]> git.ipfire.org Git - thirdparty/iptables.git/commitdiff
libxtables: Promote xtopt_esize_by_type() as xtopt_psize getter
authorPhil Sutter <phil@nwl.cc>
Wed, 14 May 2025 17:36:01 +0000 (19:36 +0200)
committerPhil Sutter <phil@nwl.cc>
Tue, 22 Jul 2025 08:34:19 +0000 (10:34 +0200)
Apart from supporting range-types, this getter is convenient to sanitize
array out of bounds access. Use it in xtables_option_metavalidate() to
simplify the code a bit.

Signed-off-by: Phil Sutter <phil@nwl.cc>
Reviewed-by: Florian Westphal <fw@strlen.de>
libxtables/xtoptions.c

index 64d6599af904bc6331167a2491003fad01c27bb5..ecaea4ec16cc946bb39f8892511c4000e79aa0d2 100644 (file)
@@ -145,8 +145,11 @@ static size_t xtopt_esize_by_type(enum xt_option_type type)
        case XTTYPE_UINT64RC:
                return xtopt_psize[XTTYPE_UINT64];
        default:
-               return xtopt_psize[type];
+               break;
        }
+       if (type < ARRAY_SIZE(xtopt_psize))
+               return xtopt_psize[type];
+       return 0;
 }
 
 static uint64_t htonll(uint64_t val)
@@ -886,6 +889,8 @@ void xtables_option_parse(struct xt_option_call *cb)
 void xtables_option_metavalidate(const char *name,
                                 const struct xt_option_entry *entry)
 {
+       size_t psize;
+
        for (; entry->name != NULL; ++entry) {
                if (entry->id >= CHAR_BIT * sizeof(unsigned int) ||
                    entry->id >= XT_OPTION_OFFSET_SCALE)
@@ -900,19 +905,18 @@ void xtables_option_metavalidate(const char *name,
                                        "Oversight?", name, entry->name);
                        continue;
                }
-               if (entry->type >= ARRAY_SIZE(xtopt_psize) ||
-                   xtopt_psize[entry->type] == 0)
+
+               psize = xtopt_esize_by_type(entry->type);
+               if (!psize)
                        xt_params->exit_err(OTHER_PROBLEM,
                                "%s: entry type of option \"--%s\" cannot be "
                                "combined with XTOPT_PUT\n",
                                name, entry->name);
-               if (xtopt_psize[entry->type] != -1 &&
-                   xtopt_psize[entry->type] != entry->size)
+               else if (psize != -1 && psize != entry->size)
                        xt_params->exit_err(OTHER_PROBLEM,
                                "%s: option \"--%s\" points to a memory block "
                                "of wrong size (expected %zu, got %zu)\n",
-                               name, entry->name,
-                               xtopt_psize[entry->type], entry->size);
+                               name, entry->name, psize, entry->size);
        }
 }