pfil_precheck on x86 Solaris may access a stale pointer due to
the refresh being too late.  The pointer is later used to modify
the byte ordering of a couple of fields.

-- John

*** SunOS/pfildrv.c.ORIGINAL    Sat May  8 13:25:55 2004
--- SunOS/pfildrv.c     Mon Feb 28 19:23:21 2005
*************** int pfil_precheck(queue_t *q, mblk_t **m
*** 829,837 ****
        for (; pfh; pfh = pfh->pfil_next)
                if (pfh->pfil_func) {
                        err = (*pfh->pfil_func)(ip, iphlen, qif, out, qpi, mp);
                        if (err || !*mp)
                                break;
-                       ip = qpi->qpi_data;
                }
        RW_EXIT(&ph->ph_lock);
  
--- 787,800 ----
        for (; pfh; pfh = pfh->pfil_next)
                if (pfh->pfil_func) {
                        err = (*pfh->pfil_func)(ip, iphlen, qif, out, qpi, mp);
+ 
+                       /*
+                        * fr_pullup may have allocated a new buffer.
+                        */
+                       ip = qpi->qpi_data;
+ 
                        if (err || !*mp)
                                break;
                }
        RW_EXIT(&ph->ph_lock);
  
-------------------------------------------------------------------------
|   Feith Systems  |   Voice: 1-215-646-8000  |  Email: [EMAIL PROTECTED]  |
|    John Wehle    |     Fax: 1-215-540-5495  |                         |
-------------------------------------------------------------------------

Reply via email to