Jim Klimov wrote:
> Hello all,
>
> When IPF 4.1.32_rc5 module is loaded on Solaris 10u6 x86_64
> (even with empty rule files), the host running ipf drops out
> of traceroute's (UDP as well as ICMP ones)).
>
> My take (explained in detail below) is that this is because
> of some issues with byte-swapping in IP header.
>
> I haven't yet witnessed the likes of this error, so I guessed
> it's a relatively new regression. However I confirmed it also
> happens on IPF 4.1.29 on Solaris 10u4 x86_64.

I suspect that this is going to be a Solaris 10, update 4 and onwards
issue...

Try the patch below...

Darren


Index: solaris.c
===================================================================
RCS file: /devel/CVS/IP-Filter/solaris.c,v
retrieving revision 2.73.2.18
diff -u -r2.73.2.18 solaris.c
--- solaris.c   19 Aug 2008 05:35:29 -0000      2.73.2.18
+++ solaris.c   30 Apr 2009 10:04:00 -0000
@@ -644,6 +644,7 @@
 {
        hook_pkt_event_t *hpe;
        qpktinfo_t qpi;
+       ushort_t swap;
        int out, hlen;
        ip_t *ip;
 
@@ -666,8 +667,10 @@
        ip = hpe->hpe_hdr;
        if (ip->ip_v == 4) {
                hlen = ip->ip_hl << 2;
-               ip->ip_off = ntohs(ip->ip_off);
-               ip->ip_len = ntohs(ip->ip_len);
+               swap = ntohs(ip->ip_off);
+               ip->ip_off = swap;
+               swap = ntohs(ip->ip_len);
+               ip->ip_len = swap;
        } else {
                hlen = sizeof(ip6_t);
        }
@@ -676,8 +679,10 @@
                return -1;
        ip = hpe->hpe_hdr;
        if (ip->ip_v == 4) {
-               ip->ip_off = htons(ip->ip_off);
-               ip->ip_len = htons(ip->ip_len);
+               swap = htons(ip->ip_off);
+               ip->ip_off = swap;
+               swap = htons(ip->ip_len);
+               ip->ip_len = swap;
        }
        return 0;
 }

Reply via email to