On Tue, 2009-08-04 at 11:25 -0500, Eric Sandeen wrote: > Ramon de Carvalho Valle wrote: > > On Mon, 2009-08-03 at 17:49 -0400, Christoph Hellwig wrote: > >> On Mon, Aug 03, 2009 at 05:03:28PM -0300, Ramon de Carvalho Valle wrote: > >>> The __xfs_get_blocks function does not check if the pointer to the target > >>> device is valid before dereferencing it. > >> It should never be zero. It's set by xfs_imap_to_bmap to either > >> mp->m_ddev_targp which is always allocated, or to mp->m_rtdev_targp > >> which is always allocated if we have a realtime device, and > >> XFS_IS_REALTIME_INODE should only be true in that case. > >> > > > > While testing XFS code with a modified version of fsfuzzer on SLES 10 > > SP3 (Kernel 2.6.16.60-0.49.3.ramon-ppc64), I came across the following > > Oops: > > ... > > ahah, useful information that would have been great in the original > patch submission. :) Sorry about that. :) > > > I added a printk() line just before the: > > > > bh_result->b_bdev = iomap.iomap_target->bt_bdev; > > > > and as we can see iomap.iomap_target is NULL. > > > > My guess is that the XFS_DIFLAG_REALTIME flag is being set incorrectly > > on the xfs inode structure, setting iomapp->iomap_target to the wrong > > device pointer (probably NULL). > > > > I don't know if this is the best place to add a check, neither if > > returning -XFS_ERROR(EIO) is correct at this point. Maybe doing: > > > > if (iomap.iomap_target && omap.iomap_flags & IOMAP_REALTIME) > > bh_result->b_bdev = iomap.iomap_target->bt_bdev; > > > > would be a better solution. > > Can you test hch's patch w/ your fuzzed image? I tested it on my SLES 10 SP3 (Kernel 2.6.16.60-0.49.3.ramon-ppc64) and it successfully fixed the NULL pointer dereference. I did some small modifications to the patch to xfs error print the flags value and fixed the xfs error report tags. I am submitting the Christoph patch again. Thanks Christoph and Eric. -Ramon > > Thanks, > -Eric