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 <[EMAIL PROTECTED]> 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

Reply via email to