| To: | xfs-oss <xfs@xxxxxxxxxxx> |
|---|---|
| Subject: | Anyone grok pf_batch_read() in xfs_repair? |
| From: | Eric Sandeen <sandeen@xxxxxxxxxxx> |
| Date: | Tue, 27 Aug 2013 14:57:03 -0500 |
| Delivered-to: | xfs@xxxxxxxxxxx |
| User-agent: | Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 |
There's a pretty clear buffer overflow in pf_batch_read() but I'm having
a hard time wrapping my head around what it's supposed to be doing:
<snip>
num = 0;
if (which == PF_SECONDARY) {
bplist[0] = btree_find(args->io_queue, 0, &fsbno);
max_fsbno = MIN(fsbno + pf_max_fsbs,
args->last_bno_read);
} else {
bplist[0] = btree_find(args->io_queue,
args->last_bno_read, &fsbno);
max_fsbno = fsbno + pf_max_fsbs;
}
while (bplist[num] && num < MAX_BUFS && fsbno < max_fsbno) {
if (which != PF_META_ONLY ||
!B_IS_INODE(XFS_BUF_PRIORITY(bplist[num])))
num++;
bplist[num] = btree_lookup_next(args->io_queue, &fsbno);
}
<snip>
That while loop is busted; we can increase num from (MAX_BUFS-1) to MAX_BUFS,
and then index the bplist array with MAX_BUFS, which is 1 past its end -
this corrupts memory. Derp!
But I'm just not grokking what this is supposed to be doing.
If we come in w/ (which == PF_META_ONLY) we'll immediately overwrite
bplist[0] set in the if/else case above. It all seems weird.
Anybody understand this offhand or should I just keep digging?
-Eric
|
| <Prev in Thread] | Current Thread | [Next in Thread> |
|---|---|---|
| ||
| Previous by Date: | Re: [PATCH] xfs_db: add header to freesp -d output, Rich Johnston |
|---|---|
| Next by Date: | [PATCH] xfs: check correct status variable for xfs_inobt_get_rec() call, Brian Foster |
| Previous by Thread: | Re: [PATCH v2] xfstests/btrfs/308: add snapshot-aware defrag for partial extents testcases, Rich Johnston |
| Next by Thread: | Re: Anyone grok pf_batch_read() in xfs_repair?, Eric Sandeen |
| Indexes: | [Date] [Thread] [Top] [All Lists] |