Btrfs-progs: check return value of realpath(3)
authorEryu Guan <guaneryu@gmail.com>
Sat, 12 Oct 2013 15:47:52 +0000 (23:47 +0800)
committerChris Mason <chris.mason@fusionio.com>
Wed, 16 Oct 2013 12:23:13 +0000 (08:23 -0400)
commita7131ad1241470829fd5b836ce6cb6c74cdbef45
treedd0c0288bc5e19f2539cee0592b058e2bbf2f910
parent3fed284f931a60d58d7896c6e1d9d2d0b22da6c1
Btrfs-progs: check return value of realpath(3)

I hit a segfault when deleting a subvolume with very long name(>4096),
it's because cmd_subvol_delete() calls strdup() and passes NULL as
argument, which is returned by realpath(3).

I used the following script to reproduce

#!/bin/bash
mnt=$1
i=1
path=$mnt/subvol_$i

# Create very deep subvolumes
while btrfs sub create $path;do
      ((i++))
      path="$path/subvol_$i"
done
last_vol=$(dirname $path)
dir=$(dirname $last_vol)
vol=$(basename $last_vol)

# Try to delete tha last one, this would get segfault
pushd $dir
btrfs sub delete $vol
popd

Fix it by checking return value of realpath(3), also fix the one in
find_mount_root().

Signed-off-by: Eryu Guan <guaneryu@gmail.com>
Signed-off-by: David Sterba <dsterba@suse.cz>
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
cmds-send.c
cmds-subvolume.c