If we have an inline_data fast symlink, i_size can be larger than the size of i_block. In this case, debugfs prints off the end of the buffer, so fix that. Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> --- debugfs/debugfs.c | 15 ++++++++++----- tests/d_special_files/expect | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/debugfs/debugfs.c b/debugfs/debugfs.c index 51f386b..5eecabe 100644 --- a/debugfs/debugfs.c +++ b/debugfs/debugfs.c @@ -783,11 +783,16 @@ void internal_dump_inode(FILE *out, const char *prefix, } if (LINUX_S_ISLNK(inode->i_mode) && - ext2fs_inode_data_blocks(current_fs,inode) == 0 && - !(inode->i_flags & EXT4_INLINE_DATA_FL)) - fprintf(out, "%sFast_link_dest: %.*s\n", prefix, - (int) inode->i_size, (char *)inode->i_block); - else if (LINUX_S_ISBLK(inode->i_mode) || LINUX_S_ISCHR(inode->i_mode)) { + ext2fs_inode_data_blocks(current_fs, inode) == 0 && + !(inode->i_flags & EXT4_INLINE_DATA_FL)) { + int sz = EXT2_I_SIZE(inode); + + if (sz > sizeof(inode->i_block)) + sz = sizeof(inode->i_block); + fprintf(out, "%sFast link dest: \"%.*s\"\n", prefix, sz, + (char *)inode->i_block); + } else if (LINUX_S_ISBLK(inode->i_mode) || + LINUX_S_ISCHR(inode->i_mode)) { int major, minor; const char *devnote; diff --git a/tests/d_special_files/expect b/tests/d_special_files/expect index 2b2dbfa..f729b0f 100644 --- a/tests/d_special_files/expect +++ b/tests/d_special_files/expect @@ -11,7 +11,7 @@ Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x50f560e0 -- Tue Jan 15 14:00:00 2013 atime: 0x50f560e0 -- Tue Jan 15 14:00:00 2013 mtime: 0x50f560e0 -- Tue Jan 15 14:00:00 2013 -Fast_link_dest: bar +Fast link dest: "bar" Exit status is 0 debugfs -R ''stat foo2'' -w test.img Inode: 13 Type: symlink Mode: 0777 Flags: 0x0 -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html