diff options
author | ae <ae@FreeBSD.org> | 2017-03-10 05:44:14 +0000 |
---|---|---|
committer | Luiz Souza <luiz@netgate.com> | 2017-07-15 11:12:49 -0500 |
commit | 04e589832a53bf1825cbef8eff60fb041f3d9aae (patch) | |
tree | 609c109bc8913092acabee71374b53518739e142 | |
parent | 9bc5821e761c455a3a96702b34cdd745dc38a3fe (diff) | |
download | FreeBSD-src-04e589832a53bf1825cbef8eff60fb041f3d9aae.zip FreeBSD-src-04e589832a53bf1825cbef8eff60fb041f3d9aae.tar.gz |
MFC r314614:
Fix matching table entry value. Use real table value instead of its index
in valuestate array.
When opcode has size equal to ipfw_insn_u32, this means that it should
additionally match value specified in d[0] with table entry value.
ipfw_table_lookup() returns table value index, use TARG_VAL() macro to
convert it to its value. The actual 32-bit value stored in the tag field
of table_value structure, where all unspecified u32 values are kept.
PR: 217262
(cherry picked from commit 2a62e338590335911213425c6312fb6680dc4f08)
-rw-r--r-- | sys/netpfil/ipfw/ip_fw2.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/sys/netpfil/ipfw/ip_fw2.c b/sys/netpfil/ipfw/ip_fw2.c index 9a23f8d..e28863e 100644 --- a/sys/netpfil/ipfw/ip_fw2.c +++ b/sys/netpfil/ipfw/ip_fw2.c @@ -1522,8 +1522,8 @@ do { \ if (!match) break; if (cmdlen == F_INSN_SIZE(ipfw_insn_u32)) - match = - ((ipfw_insn_u32 *)cmd)->d[0] == v; + match = ((ipfw_insn_u32 *)cmd)->d[0] == + TARG_VAL(chain, v, tag); else tablearg = v; } else if (is_ipv6) { @@ -1535,7 +1535,8 @@ do { \ sizeof(struct in6_addr), pkey, &v); if (cmdlen == F_INSN_SIZE(ipfw_insn_u32)) - match = ((ipfw_insn_u32 *)cmd)->d[0] == v; + match = ((ipfw_insn_u32 *)cmd)->d[0] == + TARG_VAL(chain, v, tag); if (match) tablearg = v; } @@ -1547,7 +1548,8 @@ do { \ match = ipfw_lookup_table_extended(chain, cmd->arg1, 0, &args->f_id, &v); if (cmdlen == F_INSN_SIZE(ipfw_insn_u32)) - match = ((ipfw_insn_u32 *)cmd)->d[0] == v; + match = ((ipfw_insn_u32 *)cmd)->d[0] == + TARG_VAL(chain, v, tag); if (match) tablearg = v; } |