Fix chain numbering bug when the highest line number installed >= 65435
and the rule being added has no explicit line number set. Submitted by: Archie Cobbs <archie@whistle.com>
This commit is contained in:
+27
-16
@@ -12,7 +12,7 @@
|
||||
*
|
||||
* This software is provided ``AS IS'' without any warranties of any kind.
|
||||
*
|
||||
* $Id: ip_fw.c,v 1.38 1996/06/12 19:34:33 gpalmer Exp $
|
||||
* $Id: ip_fw.c,v 1.39 1996/06/13 17:35:28 gpalmer Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -499,29 +499,40 @@ add_entry(struct ip_fw_head *chainptr, struct ip_fw *frwl)
|
||||
|
||||
if (!chainptr->lh_first) {
|
||||
LIST_INSERT_HEAD(chainptr, fwc, chain);
|
||||
splx(s);
|
||||
return(0);
|
||||
} else if (ftmp->fw_number == (u_short)-1) {
|
||||
if (fwc) free(fwc, M_IPFW);
|
||||
if (ftmp) free(ftmp, M_IPFW);
|
||||
splx(s);
|
||||
return (EINVAL);
|
||||
} else {
|
||||
nbr=0;
|
||||
for (fcp = chainptr->lh_first; fcp; fcp = fcp->chain.le_next)
|
||||
if (fcp->rule->fw_number == (u_short)-1 ||
|
||||
( ftmp->fw_number &&
|
||||
fcp->rule->fw_number > ftmp->fw_number)) {
|
||||
if (!ftmp->fw_number)
|
||||
ftmp->fw_number = nbr + 100;
|
||||
if (fcpl) {
|
||||
LIST_INSERT_AFTER(fcpl, fwc, chain);
|
||||
} else {
|
||||
LIST_INSERT_HEAD(chainptr, fwc, chain);
|
||||
}
|
||||
}
|
||||
|
||||
/* If entry number is 0, find highest numbered rule and add 100 */
|
||||
if (ftmp->fw_number == 0) {
|
||||
for (fcp = chainptr->lh_first; fcp; fcp = fcp->chain.le_next) {
|
||||
if (fcp->rule->fw_number != (u_short)-1)
|
||||
nbr = fcp->rule->fw_number;
|
||||
else
|
||||
break;
|
||||
}
|
||||
if (nbr < (u_short)-1 - 100)
|
||||
nbr += 100;
|
||||
ftmp->fw_number = nbr;
|
||||
}
|
||||
|
||||
/* Got a valid number; now insert it, keeping the list ordered */
|
||||
for (fcp = chainptr->lh_first; fcp; fcp = fcp->chain.le_next) {
|
||||
if (fcp->rule->fw_number > ftmp->fw_number) {
|
||||
if (fcpl) {
|
||||
LIST_INSERT_AFTER(fcpl, fwc, chain);
|
||||
} else {
|
||||
nbr=fcp->rule->fw_number;
|
||||
fcpl = fcp;
|
||||
LIST_INSERT_HEAD(chainptr, fwc, chain);
|
||||
}
|
||||
break;
|
||||
} else {
|
||||
fcpl = fcp;
|
||||
}
|
||||
}
|
||||
|
||||
splx(s);
|
||||
|
||||
Reference in New Issue
Block a user