|
Merry Christmas to you too...
This could be one good Christmas present - to not have to return to work to battle the firewall ;)
Thanks for looking into it. I'll give the patch a crack sometime in the next few days and let you know how I go.
I assume I apply it against a vanilla 4.1.16 version.
Again, have a great Christmas, and as usual, thanks for being so involved in the mailing list.
I really hope Sun are paying you enough ;)
corey
On 12/24/06, Darren Reed <darrenr@reed.wattle.id.au> wrote:
Corey Johnston wrote: > Update on IPF 4.1.16 > > - It seems that ipnat -sl crashes the network.
> > The system lists all the active ipnat rules and then tries to list the > active sessions and then the network drops-out. All interfaces die, > and even > the console locks-up as it appears all network services are unavailable.
> Reboot appears to be the only remedy. > > - happens consistently > > I ran into this when trying to discover the source of the ipnat slows i > mentioned earlier. > I'll try and be more specific, but it looks like there is a fairly
> significant problem, at least on the Solaris build, with NAT.
The attached patch should fix this (it has for me.)
Darren ------ Merry Christmas ===============
Index: ip_nat.c
=================================================================== RCS file: /devel/CVS/IP-Filter/ip_nat.c,v retrieving revision 2.195.2.69 diff -c -r2.195.2.69 ip_nat.c *** ip_nat.c 18 Dec 2006 17:04:33 -0000
2.195.2.69 --- ip_nat.c 23 Dec 2006 10:57:31 -0000 *************** *** 4900,4907 **** --- 4900,4910 ---- ipnat_t *ipn, *nextipnat = NULL, zeroipn; nat_t *nat, *nextnat = NULL, zeronat;
int error = 0, count; + ipftoken_t *freet; char *dst;
+ freet = NULL; + READ_ENTER(&ipf_nat);
switch (itp->igi_type) *************** *** 4933,4938 ****
--- 4936,4942 ---- } break; default : + RWLOCK_EXIT(&ipf_nat); return EINVAL; }
*************** *** 4942,4954 ****
{ case IPFGENITER_HOSTMAP : if (nexthm != NULL) { - /*MUTEX_ENTER(&nexthm->hm_lock);*/ - nexthm->hm_ref++;
- /*MUTEX_EXIT(&nextipnat->hm_lock);*/ if (nexthm->hm_next == NULL) { ! ipf_freetoken(t); hm = NULL;
} } else { bzero(&zerohm, sizeof(zerohm)); nexthm = &zerohm; --- 4946,4961 ----
{ case IPFGENITER_HOSTMAP : if (nexthm != NULL) { if (nexthm->hm_next == NULL) { ! freet = t;
! count = 1; hm = NULL; } + if (count == 1) { + /*MUTEX_ENTER(&nexthm->hm_lock);*/
+ nexthm->hm_ref++; + /*MUTEX_EXIT(&nextipnat->hm_lock);*/ + } } else {
bzero(&zerohm, sizeof(zerohm)); nexthm = &zerohm; *************** *** 4958,4970 ****
case IPFGENITER_IPNAT : if (nextipnat != NULL) {
- MUTEX_ENTER(&nextipnat->in_lock); - nextipnat->in_use++; - MUTEX_EXIT(&nextipnat->in_lock); if (nextipnat->in_next == NULL) {
! ipf_freetoken(t); ipn = NULL; ! } } else { bzero(&zeroipn, sizeof(zeroipn));
--- 4965,4979 ----
case IPFGENITER_IPNAT : if (nextipnat != NULL) { if (nextipnat->in_next == NULL) { ! freet = t;
! count = 1; ipn = NULL; ! } ! if (count == 1) { ! MUTEX_ENTER(&nextipnat->in_lock);
! nextipnat->in_use++; ! MUTEX_EXIT(&nextipnat->in_lock); } } else {
bzero(&zeroipn, sizeof(zeroipn)); *************** *** 4975,4987 ****
case IPFGENITER_NAT : if (nextnat != NULL) { - MUTEX_ENTER(&nextnat->nat_lock);
- nextnat->nat_ref++; - MUTEX_EXIT(&nextnat->nat_lock); if (nextnat->nat_next == NULL) { ! ipf_freetoken(t);
nat = NULL; } } else { bzero(&zeronat, sizeof(zeronat)); nextnat = &zeronat;
--- 4984,4999 ----
case IPFGENITER_NAT : if (nextnat != NULL) { if (nextnat->nat_next == NULL) { ! count = 1;
! freet = t; nat = NULL; } + if (count == 1) { + MUTEX_ENTER(&nextnat->nat_lock);
+ nextnat->nat_ref++; + MUTEX_EXIT(&nextnat->nat_lock); + } } else {
bzero(&zeronat, sizeof(zeronat)); nextnat = &zeronat; *************** *** 4993,4998 **** --- 5005,5015 ---- } RWLOCK_EXIT(&ipf_nat);
+ if (freet != NULL) { + ipf_freetoken(freet); + freet = NULL; + } + switch (itp->igi_type) {
case IPFGENITER_HOSTMAP :
-- -- Corey Johnston
|