xfs
[Top] [All Lists]

[PATCH V2] xfsprogs: fix use after free in inode_item_done()

To: Eric Sandeen <sandeen@xxxxxxxxxx>, xfs-oss <xfs@xxxxxxxxxxx>
Subject: [PATCH V2] xfsprogs: fix use after free in inode_item_done()
From: Eric Sandeen <sandeen@xxxxxxxxxxx>
Date: Mon, 03 Mar 2014 16:58:44 -0600
Delivered-to: xfs@xxxxxxxxxxx
In-reply-to: <5314E912.9080708@xxxxxxxxxx>
References: <5314E912.9080708@xxxxxxxxxx>
User-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.3.0
Commit "3a19fb7 libxfs: stop caching inode structures"
introduced a use after free.

libxfs_iput() already does the check for ip->i_itemp, and a
kmem_zone_free() if it's present, and then frees the ip pointer.
Re-checking ip->i_itemp after the libxfs_iput call will access
the freed ip pointer, as will setting ip_>i_itemp to NULL.

Simply remove the offending code to fix this up.

Signed-off-by: Eric Sandeen <sandeen@xxxxxxxxxx>
---

V2: Make it prettier based on Dave's comments.

diff --git a/libxfs/trans.c b/libxfs/trans.c
index 6c9d202..c443863 100644
--- a/libxfs/trans.c
+++ b/libxfs/trans.c
@@ -694,7 +694,6 @@ inode_item_done(
        xfs_mount_t             *mp;
        xfs_buf_t               *bp;
        int                     error;
-       extern kmem_zone_t      *xfs_ili_zone;
 
        ip = iip->ili_inode;
        mp = iip->ili_item.li_mountp;
@@ -736,15 +735,9 @@ ili_done:
        if (iip->ili_lock_flags) {
                iip->ili_lock_flags = 0;
                return;
-       } else {
-               libxfs_iput(ip, 0);
        }
-
-       if (ip->i_itemp)
-               kmem_zone_free(xfs_ili_zone, ip->i_itemp);
-       else
-               ASSERT(0);
-       ip->i_itemp = NULL;
+       /* free the inode */
+       libxfs_iput(ip, 0);
 }
 
 static void

<Prev in Thread] Current Thread [Next in Thread>