Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 11 Mar 2003 13:42:09 -0500
From:      Don Bowman <don@sandvine.com>
To:        "'freebsd-stable@freebsd.org'" <freebsd-stable@freebsd.org>
Subject:   missing splx(s) in if_ethersubcr.c
Message-ID:  <FE045D4D9F7AED4CBFF1B3B813C8533701B35D42@mail.sandvine.com>

next in thread | raw e-mail | index | archive | help
It seems there is a missing trio of 'splx' in error cases in
if_ethersubr.c for 4.7 RELEASE. (pr submitted as well).

Index: /src/sys/net/if_ethersubr.c
===================================================================
RCS file: /usr/cvs/src/sys/net/if_ethersubr.c,v
retrieving revision 1.70.2.30
diff -c -5 -r1.70.2.30 if_ethersubr.c
*** /src/sys/net/if_ethersubr.c 	2 Jan 2003 18:07:51 -0000
1.70.2.30
--- /src/sys/net/if_ethersubr.c 	11 Mar 2003 16:55:08 -0000
***************
*** 412,434 ****
                save_eh = *eh;
                m_adj(m, ETHER_HDR_LEN);
                if (ether_ipfw_chk(&m, ifp, &rule, eh, 0) == 0) {
                        if (m) {
                                m_freem(m);
                                return ENOBUFS; /* pkt dropped */
!                       } else
                                return 0;       /* consumed e.g. in a pipe
*/
                }
                /* packet was ok, restore the ethernet header */
                if ( (void *)(eh + 1) == (void *)m->m_data) {
                        m->m_data -= ETHER_HDR_LEN ;
                        m->m_len += ETHER_HDR_LEN ;
                        m->m_pkthdr.len += ETHER_HDR_LEN ;
                } else {
                        M_PREPEND(m, ETHER_HDR_LEN, M_DONTWAIT);
                        if (m == NULL) /* nope... */
!                               return ENOBUFS;
                        bcopy(&save_eh, mtod(m, struct ether_header *),
                            ETHER_HDR_LEN);
                }
        }
  
--- 412,440 ----
                save_eh = *eh;
                m_adj(m, ETHER_HDR_LEN);
                if (ether_ipfw_chk(&m, ifp, &rule, eh, 0) == 0) {
                        if (m) {
                                m_freem(m);
+                               splx(s);
                                return ENOBUFS; /* pkt dropped */
!                       } else {
!                               splx(s);
                                return 0;       /* consumed e.g. in a pipe
*/
+                       }
                }
                /* packet was ok, restore the ethernet header */
                if ( (void *)(eh + 1) == (void *)m->m_data) {
                        m->m_data -= ETHER_HDR_LEN ;
                        m->m_len += ETHER_HDR_LEN ;
                        m->m_pkthdr.len += ETHER_HDR_LEN ;
                } else {
                        M_PREPEND(m, ETHER_HDR_LEN, M_DONTWAIT);
                        if (m == NULL) /* nope... */
!                       {
!                           splx(s);
!                           return ENOBUFS;
!                       }
                        bcopy(&save_eh, mtod(m, struct ether_header *),
                            ETHER_HDR_LEN);
                }
        }


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-stable" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?FE045D4D9F7AED4CBFF1B3B813C8533701B35D42>