summaryrefslogtreecommitdiffstats
path: root/share/man/man9
diff options
context:
space:
mode:
authorwpaul <wpaul@FreeBSD.org>2001-08-14 21:56:53 +0000
committerwpaul <wpaul@FreeBSD.org>2001-08-14 21:56:53 +0000
commit6b7f805e471ad8a2b7cc943b9f0b9e5f08a5c26c (patch)
tree82c5b095a7ca550dfe5307249b7edd4193461291 /share/man/man9
parent0ae65492e23199bd2bfe04bac607d4c06c0be050 (diff)
downloadFreeBSD-src-6b7f805e471ad8a2b7cc943b9f0b9e5f08a5c26c.zip
FreeBSD-src-6b7f805e471ad8a2b7cc943b9f0b9e5f08a5c26c.tar.gz
Fix yet another "unconditionally free()ing memory without even checking
to see if it was malloc()ed first" bug. In bus_dmamap_create(), one of two things can happen: either we need to allocate a special map due to some manner of bounce buffering requirement, or we can DMA a buffer in place. On the x86 platform, the "in place" case results in bus_dmamap_create() returning a dmamap of NULL. The bus_dmamap_destroy() routine later checks for NULL and won't bother free()ing the map if it detects this condition. But on the alpha, we don't use NULL, we use a statically allocated map called nobounce_dmamap(). Unfortunately, bus_dmamap_destroy() does not handle the condition where we attempt to destroy such a map: it tries to free() the dmamap, which causes a panic. Fix: test that map != &nobounce_dmamap before trying to free() it. With this fix, my busdma-ified if_sis driver works on the alpha. I'm a bit alarmed that I'm the first person ever to trip over this bug, since we have been using busdma on the alpha for a while, and since it sort of screams out "Hi! I'm a bug! Booga-booga!" when you look at it. (Somewhere, somebody will say: "But Bill, why don't you just not bother destroying the maps in this case." Because the API is supposed to be a) symetrical and b) opaque to the caller. I can't know whether it's safe to skip the bus_dmamap_destroy() step or not without sticking my fingers into unsafe places, which is what I wanted to avoid in the first place.)
Diffstat (limited to 'share/man/man9')
0 files changed, 0 insertions, 0 deletions
OpenPOWER on IntegriCloud