Commit 01a9a8a9 authored by Filipe Manana's avatar Filipe Manana Committed by Chris Mason

Btrfs: send, fix corrupted path strings for long paths

If a path has more than 230 characters, we allocate a new buffer to
use for the path, but we were forgotting to copy the contents of the
previous buffer into the new one, which has random content from the
kmalloc call.

Test:

    mkfs.btrfs -f /dev/sdd
    mount /dev/sdd /mnt

    TEST_PATH="/mnt/fdmanana/.config/google-chrome-mysetup/Default/Pepper_Data/Shockwave_Flash/WritableRoot/#SharedObjects/JSHJ4ZKN/s.wsj.net/[[IMPORT]]/players.edgesuite.net/flash/plugins/osmf/advanced-streaming-plugin/v2.7/osmf1.6/Ak#"
    mkdir -p $TEST_PATH
    echo "hello world" > $TEST_PATH/amaiAdvancedStreamingPlugin.txt

    btrfs subvolume snapshot -r /mnt /mnt/mysnap1
    btrfs send /mnt/mysnap1 -f /tmp/1.snap

A test for xfstests follows.
Signed-off-by: default avatarFilipe David Borba Manana <fdmanana@gmail.com>
Cc: Marc Merlin <marc@merlins.org>
Tested-by: default avatarMarc MERLIN <marc@merlins.org>
Signed-off-by: default avatarChris Mason <clm@fb.com>
parent fad01e86
...@@ -360,10 +360,13 @@ static int fs_path_ensure_buf(struct fs_path *p, int len) ...@@ -360,10 +360,13 @@ static int fs_path_ensure_buf(struct fs_path *p, int len)
/* /*
* First time the inline_buf does not suffice * First time the inline_buf does not suffice
*/ */
if (p->buf == p->inline_buf) if (p->buf == p->inline_buf) {
tmp_buf = kmalloc(len, GFP_NOFS); tmp_buf = kmalloc(len, GFP_NOFS);
else if (tmp_buf)
memcpy(tmp_buf, p->buf, old_buf_len);
} else {
tmp_buf = krealloc(p->buf, len, GFP_NOFS); tmp_buf = krealloc(p->buf, len, GFP_NOFS);
}
if (!tmp_buf) if (!tmp_buf)
return -ENOMEM; return -ENOMEM;
p->buf = tmp_buf; p->buf = tmp_buf;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment