Fix a sign bug causing invalid memory access in the ino_paths ioctl.
authorGabriel de Perthuis <g2p.code@gmail.com>
Wed, 10 Oct 2012 14:50:47 +0000 (08:50 -0600)
committerChris Mason <chris.mason@fusionio.com>
Thu, 25 Oct 2012 19:39:47 +0000 (15:39 -0400)
To see the problem, create many hardlinks to the same file (120 should do it),
then look up paths by inode with:

  ls -i
  btrfs inspect inode-resolve -v $ino /mnt/btrfs

I noticed the memory layout of the fspath->val data had some irregularities
(some unnecessary gaps that stop appearing about halfway),
so I'm not sure there aren't any bugs left in it.

fs/btrfs/backref.c

index f3187938e081c7dcbf842d424f5de6ed06d3f93f..2bcbea3f630824272825e4a3bdb60fdc616f8c0e 100644 (file)
@@ -1186,7 +1186,7 @@ static char *ref_to_path(struct btrfs_root *fs_root,
        int slot;
        u64 next_inum;
        int ret;
-       s64 bytes_left = size - 1;
+       s64 bytes_left = ((s64)size) - 1;
        struct extent_buffer *eb = eb_in;
        struct btrfs_key found_key;
        int leave_spinning = path->leave_spinning;