diff options
author | Phil Sutter <phil@nwl.cc> | 2018-09-24 19:25:24 +0200 |
---|---|---|
committer | Florian Westphal <fw@strlen.de> | 2018-09-25 16:26:28 +0200 |
commit | 9f075031a1973fc967cd90de96dc2e87696a2181 (patch) | |
tree | 74552de05b1cffb6989af70ac46b141385e6a62b /iptables/xtables-arp.c | |
parent | 7373297262eef6754570a5cb05c18332c801370f (diff) |
Combine parse_target() and command_jump() implementations
Merge these two functions from xtables, iptables, ip6tables and
arptables. Both functions were basically identical in the first three,
only the last one required a bit more attention.
To eliminate access to 'invflags' in variant-specific location, move the
call to set_option() into callers. This is actually consistent with
parsing of other options in them.
As with command_match(), use xt_params instead of the different
*_globals objects to refer to 'opts' and 'orig_opts'.
It was necessary to rename parse_target() as it otherwise clashes with a
static function of same name in libxt_SET.
In arptables, the maximum allowed target name is a bit larger, so
introduce xtables_globals.target_maxnamelen defining the value. It is
used in the shared xt_parse_target() implementation.
Implementation of command_jump() in arptables diverted from the others
for no obvious reason. The call to parse_target() was done outside of it
and a pointer to cs->arp was passed but not used inside.
Signed-off-by: Phil Sutter <phil@nwl.cc>
Signed-off-by: Florian Westphal <fw@strlen.de>
Diffstat (limited to 'iptables/xtables-arp.c')
-rw-r--r-- | iptables/xtables-arp.c | 60 |
1 files changed, 2 insertions, 58 deletions
diff --git a/iptables/xtables-arp.c b/iptables/xtables-arp.c index a457ea30..4a782148 100644 --- a/iptables/xtables-arp.c +++ b/iptables/xtables-arp.c @@ -158,6 +158,7 @@ struct xtables_globals arptables_globals = { .orig_opts = original_opts, .exit_err = xtables_exit_error, .compat_rev = nft_compatible_revision, + .target_maxnamelen = sizeof(arpt_chainlabel), }; /* Table of legal combinations of commands and options. If any of the @@ -755,27 +756,6 @@ parse_rulenumber(const char *rule) return rulenum; } -static const char * -parse_target(const char *targetname) -{ - const char *ptr; - - if (strlen(targetname) < 1) - xtables_error(PARAMETER_PROBLEM, - "Invalid target name (too short)"); - - if (strlen(targetname)+1 > sizeof(arpt_chainlabel)) - xtables_error(PARAMETER_PROBLEM, - "Invalid target name `%s' (%zu chars max)", - targetname, sizeof(arpt_chainlabel)-1); - - for (ptr = targetname; *ptr; ptr++) - if (isspace(*ptr)) - xtables_error(PARAMETER_PROBLEM, - "Invalid target name `%s'", targetname); - return targetname; -} - static void set_option(unsigned int *options, unsigned int option, u_int16_t *invflg, int invert) @@ -822,41 +802,6 @@ list_entries(struct nft_handle *h, const char *chain, const char *table, return nft_rule_list(h, chain, table, rulenum, format); } -static struct xtables_target *command_jump(struct arpt_entry *fw, - const char *jumpto) -{ - struct xtables_target *target; - size_t size; - - /* XTF_TRY_LOAD (may be chain name) */ - target = xtables_find_target(jumpto, XTF_TRY_LOAD); - - if (!target) - return NULL; - - size = XT_ALIGN(sizeof(struct xt_entry_target)) - + target->size; - - target->t = xtables_calloc(1, size); - target->t->u.target_size = size; - strncpy(target->t->u.user.name, jumpto, sizeof(target->t->u.user.name) - 1); - target->t->u.user.name[sizeof(target->t->u.user.name)-1] = '\0'; - target->t->u.user.revision = target->revision; - - xs_init_target(target); - - if (target->x6_options != NULL) - opts = xtables_options_xfrm(arptables_globals.orig_opts, - opts, target->x6_options, - &target->option_offset); - else - opts = xtables_merge_options(arptables_globals.orig_opts, - opts, target->extra_opts, - &target->option_offset); - - return target; -} - static int append_entry(struct nft_handle *h, const char *chain, @@ -1216,8 +1161,7 @@ int do_commandarp(struct nft_handle *h, int argc, char *argv[], char **table, case 'j': set_option(&options, OPT_JUMP, &cs.arp.arp.invflags, invert); - cs.jumpto = parse_target(optarg); - cs.target = command_jump(&cs.arp, cs.jumpto); + command_jump(&cs); break; case 'i': |