Author: ae
Date: Fri Mar  3 20:22:42 2017
New Revision: 314614
URL: https://svnweb.freebsd.org/changeset/base/314614

Log:
  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
  Reviewed by:  melifaro
  MFC after:    1 week
  Sponsored by: Yandex LLC

Modified:
  head/sys/netpfil/ipfw/ip_fw2.c

Modified: head/sys/netpfil/ipfw/ip_fw2.c
==============================================================================
--- head/sys/netpfil/ipfw/ip_fw2.c      Fri Mar  3 20:15:22 2017        
(r314613)
+++ head/sys/netpfil/ipfw/ip_fw2.c      Fri Mar  3 20:22:42 2017        
(r314614)
@@ -1511,8 +1511,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) {
@@ -1524,7 +1524,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;
                                }
@@ -1536,7 +1537,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;
                                }
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to