public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
* [patch] xfsprogs: repair pagefault due to missed out sanity NULL check
@ 2011-01-28 11:13 Ajeet Yadav
  2011-01-31  2:39 ` Ajeet Yadav
  2011-01-31  4:17 ` Dave Chinner
  0 siblings, 2 replies; 5+ messages in thread
From: Ajeet Yadav @ 2011-01-28 11:13 UTC (permalink / raw)
  To: xfs


[-- Attachment #1.1: Type: text/plain, Size: 1012 bytes --]

libxfs_putbuf() is called with bp = NULL, resulting in pagefault in
libpthread.

Function da_read_buf() allocate array of xfs_buf_t *

   * xfs_buf_t       **bplist;*

*    bplist = calloc(nex, sizeof(*bplist));*

Read and fill it using

*for (i = 0; i < nex; i++) {
    bplist[i] = libxfs_readbuf()*

*    if (!bplist[i]){
        goto failed;
    }  *

*}*

*failed:
        for (i = 0; i < nex; i++)
                libxfs_putbuf(bplist[i]);*

Now assume nex = 10,

1. Will create bplist for 10 array elements.

3. Reading from disk 0,1, 2, 3

4. When reading from disk 4, USB is removed

5. libxfs_readbuf() will at fail, pblist[4] = NULL, goto failed.

6. Since only 4 buffers were read successfully, so only 4 are in lock state.

7.  Error handling will unlock buffer from 1-10

8. Buffer 0-3 were read successfully, hence will have valid pdlist[i]

9. Access pblist[4] == NULL, therefore unlocking will set bp == NULL in
libxfs_putbuf(bp);
10. Page fault in libpthread


Solution patch attached with mail

[-- Attachment #1.2: Type: text/html, Size: 3608 bytes --]

[-- Attachment #2: xfs_repair_da_read_buf_failed_unlock_fix.patch --]
[-- Type: application/octet-stream, Size: 581 bytes --]

diff -Nurp xfsprogs-3.0.5/repair/dir2.c xfsprogs-3.0.5-dirty/repair/dir2.c
--- xfsprogs-3.0.5/repair/dir2.c	2010-07-16 13:07:09.000000000 +0900
+++ xfsprogs-3.0.5-dirty/repair/dir2.c	2011-01-28 18:49:21.000000000 +0900
@@ -110,9 +110,10 @@ da_read_buf(
 		bplist[i] = libxfs_readbuf(mp->m_dev,
 				XFS_FSB_TO_DADDR(mp, bmp[i].startblock),
 				XFS_FSB_TO_BB(mp, bmp[i].blockcount), 0);
-		if (!bplist[i])
+		if (!bplist[i]){
+			nex = i;
 			goto failed;
-
+		}
 		pftrace("readbuf %p (%llu, %d)", bplist[i],
 			(long long)XFS_BUF_ADDR(bplist[i]),
 			XFS_BUF_COUNT(bplist[i]));

[-- Attachment #3: Type: text/plain, Size: 121 bytes --]

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2011-02-01 21:32 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-01-28 11:13 [patch] xfsprogs: repair pagefault due to missed out sanity NULL check Ajeet Yadav
2011-01-31  2:39 ` Ajeet Yadav
2011-01-31  4:17 ` Dave Chinner
2011-02-01  2:56   ` Ajeet Yadav
2011-02-01 21:34     ` Christoph Hellwig

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox