| From 2ac56d3d4bd625450a54d4c3f9292d58f6b88232 Mon Sep 17 00:00:00 2001 |
| From: Eric Sandeen <sandeen@redhat.com> |
| Date: Mon, 22 Jun 2015 09:42:48 +1000 |
| Subject: xfs: fix remote symlinks on V5/CRC filesystems |
| |
| From: Eric Sandeen <sandeen@redhat.com> |
| |
| commit 2ac56d3d4bd625450a54d4c3f9292d58f6b88232 upstream. |
| |
| If we create a CRC filesystem, mount it, and create a symlink with |
| a path long enough that it can't live in the inode, we get a very |
| strange result upon remount: |
| |
| # ls -l mnt |
| total 4 |
| lrwxrwxrwx. 1 root root 929 Jun 15 16:58 link -> XSLM |
| |
| XSLM is the V5 symlink block header magic (which happens to be |
| followed by a NUL, so the string looks terminated). |
| |
| xfs_readlink_bmap() advanced cur_chunk by the size of the header |
| for CRC filesystems, but never actually used that pointer; it |
| kept reading from bp->b_addr, which is the start of the block, |
| rather than the start of the symlink data after the header. |
| |
| Looks like this problem goes back to v3.10. |
| |
| Fixing this gets us reading the proper link target, again. |
| |
| Signed-off-by: Eric Sandeen <sandeen@redhat.com> |
| Reviewed-by: Dave Chinner <dchinner@redhat.com> |
| Signed-off-by: Dave Chinner <david@fromorbit.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/xfs/xfs_symlink.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/fs/xfs/xfs_symlink.c |
| +++ b/fs/xfs/xfs_symlink.c |
| @@ -272,7 +272,7 @@ xfs_readlink_bmap( |
| cur_chunk += sizeof(struct xfs_dsymlink_hdr); |
| } |
| |
| - memcpy(link + offset, bp->b_addr, byte_cnt); |
| + memcpy(link + offset, cur_chunk, byte_cnt); |
| |
| pathlen -= byte_cnt; |
| offset += byte_cnt; |