summaryrefslogtreecommitdiffstats
path: root/iptables/xtables-arp.c
diff options
context:
space:
mode:
authorPhil Sutter <phil@nwl.cc>2018-09-24 19:25:24 +0200
committerFlorian Westphal <fw@strlen.de>2018-09-25 16:26:28 +0200
commit9f075031a1973fc967cd90de96dc2e87696a2181 (patch)
tree74552de05b1cffb6989af70ac46b141385e6a62b /iptables/xtables-arp.c
parent7373297262eef6754570a5cb05c18332c801370f (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.c60
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':