Changeset 051b634 in rtems-libbsd


Ignore:
Timestamp:
Apr 7, 2015, 11:54:23 AM (5 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
c1e05b9ea378b2971e3d7704779112b4bc4296da, 4a77611a223ea883fb548679b516d326a020d447
Children:
c07da01
Parents:
b99c023
git-author:
Sebastian Huber <sebastian.huber@…> (04/07/15 11:54:23)
git-committer:
Sebastian Huber <sebastian.huber@…> (01/10/17 08:53:33)
Message:

if_dwc: Avoid mbuf use after free

File:
1 edited

Legend:

Unmodified
Added
Removed
  • freebsd/sys/dev/dwc/if_dwc.c

    rb99c023 r051b634  
    807807                        break;
    808808
     809                sc->rx_idx = next_rxidx(sc, idx);
     810
     811                m = sc->rxbuf_map[idx].mbuf;
     812
     813                m0 = dwc_alloc_mbufcl(sc);
     814                if (m0 == NULL) {
     815                        m0 = m;
     816
     817                        /* Account for m_adj() in dwc_setup_rxbuf() */
     818                        m0->m_data = m0->m_ext.ext_buf;
     819                }
     820
     821                if ((error = dwc_setup_rxbuf(sc, idx, m0)) != 0) {
     822                        /*
     823                         * XXX Now what?
     824                         * We've got a hole in the rx ring.
     825                         */
     826                }
     827
     828                if (m0 == m) {
     829                        /* Discard frame and continue */
     830                        if_inc_counter(sc->ifp, IFCOUNTER_IQDROPS, 1);
     831                        continue;
     832                }
     833
    809834                bus_dmamap_sync(sc->rxbuf_tag, sc->rxbuf_map[idx].map,
    810835                    BUS_DMASYNC_POSTREAD);
     
    813838                len = (rdes0 >> DDESC_RDES0_FL_SHIFT) & DDESC_RDES0_FL_MASK;
    814839                if (len != 0) {
    815                         m = sc->rxbuf_map[idx].mbuf;
    816840                        m->m_pkthdr.rcvif = ifp;
    817841                        m->m_pkthdr.len = len;
     
    852876                        /* XXX Zero-length packet ? */
    853877                }
    854 
    855                 if ((m0 = dwc_alloc_mbufcl(sc)) != NULL) {
    856                         if ((error = dwc_setup_rxbuf(sc, idx, m0)) != 0) {
    857                                 /*
    858                                  * XXX Now what?
    859                                  * We've got a hole in the rx ring.
    860                                  */
    861                         }
    862                 } else
    863                         if_inc_counter(sc->ifp, IFCOUNTER_IQDROPS, 1);
    864 
    865                 sc->rx_idx = next_rxidx(sc, sc->rx_idx);
    866878        }
    867879}
Note: See TracChangeset for help on using the changeset viewer.