kern/155658: [amr] [patch] amr_ioctl(): call of malloc() causes
memory corruption and panic
Scott Long
scottl at samsco.org
Wed Apr 18 08:40:04 UTC 2012
The following reply was made to PR kern/155658; it has been noted by GNATS.
From: Scott Long <scottl at samsco.org>
To: bug-followup at FreeBSD.org, longwitz at incore.de
Cc:
Subject: Re: kern/155658: [amr] [patch] amr_ioctl(): call of malloc() causes memory corruption and panic
Date: Wed, 18 Apr 2012 02:37:27 -0600
Did a bit of history review. When an ioctl goes through the linux =
driver, it goes through a pool allocator to get a scratch buffer for the =
command. The pool sizes are PAGE_SIZE (4K) and power-of-2 multiples =
above that, up to 64k. So when an application requests a buffer size of =
0-4k, a 4k buffer gets sent to the card. A ~25k buffer request actually =
gets 32k sent to the card. The firmware seems to exploit this and =
basically ignores the specified length, happily filling the provided =
buffer with whatever power-of-2 data count it feels like. According to =
an old conversation with Dell and LSI, the LSI engineers consider this =
to be a necessary feature, not a bug.
As I mentioned previously, I fixed this as a special case of len=3D=3D0 =
in the linux ioctl emulation path. Based on the bug report here, the =
fix needs to be expanded to rounding up to power-of-2 sizes in both the =
native and emulated paths.
Anyone who wants to tackle this is welcome to do so. The existing hack =
also suffers from bug in the form of it copying the 4k buffer back to =
user land, even though userland specified a length of 0. This is =
probably a bad thing, and it's something that linux appears to handle =
correctly.=
More information about the freebsd-bugs
mailing list