From 9f075031a1973fc967cd90de96dc2e87696a2181 Mon Sep 17 00:00:00 2001 From: Phil Sutter Date: Mon, 24 Sep 2018 19:25:24 +0200 Subject: 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 Signed-off-by: Florian Westphal --- iptables/ip6tables.c | 66 ++++------------------------------------------------ 1 file changed, 4 insertions(+), 62 deletions(-) (limited to 'iptables/ip6tables.c') diff --git a/iptables/ip6tables.c b/iptables/ip6tables.c index 1137256a..7a9cd643 100644 --- a/iptables/ip6tables.c +++ b/iptables/ip6tables.c @@ -125,6 +125,7 @@ struct xtables_globals ip6tables_globals = { .orig_opts = original_opts, .exit_err = ip6tables_exit_error, .compat_rev = xtables_compatible_revision, + .target_maxnamelen = XT_EXTENSION_MAXNAMELEN, }; /* Table of legal combinations of commands and options. If any of the @@ -420,27 +421,6 @@ parse_chain(const char *chainname) "Invalid chain name `%s'", chainname); } -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) >= XT_EXTENSION_MAXNAMELEN) - xtables_error(PARAMETER_PROBLEM, - "Invalid target name `%s' (%u chars max)", - targetname, XT_EXTENSION_MAXNAMELEN - 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, uint8_t *invflg, int invert) @@ -1221,46 +1201,6 @@ generate_entry(const struct ip6t_entry *fw, return e; } -static void command_jump(struct iptables_command_state *cs) -{ - size_t size; - - set_option(&cs->options, OPT_JUMP, &cs->fw6.ipv6.invflags, cs->invert); - cs->jumpto = parse_target(optarg); - /* TRY_LOAD (may be chain name) */ - cs->target = xtables_find_target(cs->jumpto, XTF_TRY_LOAD); - - if (cs->target == NULL) - return; - - size = XT_ALIGN(sizeof(struct xt_entry_target)) + cs->target->size; - - cs->target->t = xtables_calloc(1, size); - cs->target->t->u.target_size = size; - if (cs->target->real_name == NULL) { - strcpy(cs->target->t->u.user.name, cs->jumpto); - } else { - strcpy(cs->target->t->u.user.name, cs->target->real_name); - if (!(cs->target->ext_flags & XTABLES_EXT_ALIAS)) - fprintf(stderr, "Notice: The %s target is converted into %s target " - "in rule listing and saving.\n", - cs->jumpto, cs->target->real_name); - } - cs->target->t->u.user.revision = cs->target->revision; - - xs_init_target(cs->target); - if (cs->target->x6_options != NULL) - opts = xtables_options_xfrm(ip6tables_globals.orig_opts, opts, - cs->target->x6_options, - &cs->target->option_offset); - else - opts = xtables_merge_options(ip6tables_globals.orig_opts, opts, - cs->target->extra_opts, - &cs->target->option_offset); - if (opts == NULL) - xtables_error(OTHER_PROBLEM, "can't alloc memory!"); -} - int do_command6(int argc, char *argv[], char **table, struct xtc_handle **handle, bool restore) { @@ -1495,11 +1435,13 @@ int do_command6(int argc, char *argv[], char **table, set_option(&cs.options, OPT_JUMP, &cs.fw6.ipv6.invflags, cs.invert); cs.fw6.ipv6.flags |= IP6T_F_GOTO; - cs.jumpto = parse_target(optarg); + cs.jumpto = xt_parse_target(optarg); break; #endif case 'j': + set_option(&cs.options, OPT_JUMP, &cs.fw6.ipv6.invflags, + cs.invert); command_jump(&cs); break; -- cgit v1.2.3