]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
metadump: Zero unused tail of symlink blocks
authorEric Sandeen <sandeen@sandeen.net>
Wed, 29 Jul 2015 23:21:08 +0000 (09:21 +1000)
committerDave Chinner <david@fromorbit.com>
Wed, 29 Jul 2015 23:21:08 +0000 (09:21 +1000)
Symlink blocks may contain stale data past the end
of their content; zero it out.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
db/metadump.c

index 462623652b6ffe4a4c6834d30877c131546ddab0..c40c896e05f60938925265dd3cc60260c4ddffc8 100644 (file)
@@ -1282,15 +1282,27 @@ process_dir_data_block(
 }
 
 static void
-obfuscate_symlink_block(
+process_symlink_block(
        char                    *block)
 {
+       char *link = block;
+
        if (xfs_sb_version_hascrc(&(mp)->m_sb))
-               block += sizeof(struct xfs_dsymlink_hdr);
+               link += sizeof(struct xfs_dsymlink_hdr);
+
+       if (obfuscate)
+               obfuscate_path_components(link, XFS_SYMLINK_BUF_SPACE(mp,
+                                                       mp->m_sb.sb_blocksize));
+       if (zero_stale_data) {
+               size_t  linklen, zlen;
 
-       obfuscate_path_components(block,
-                                 XFS_SYMLINK_BUF_SPACE(mp,
-                                       mp->m_sb.sb_blocksize));
+               linklen = strlen(link);
+               zlen = mp->m_sb.sb_blocksize - linklen;
+               if (xfs_sb_version_hascrc(&mp->m_sb))
+                       zlen -= sizeof(struct xfs_dsymlink_hdr);
+               if (zlen < mp->m_sb.sb_blocksize)
+                       memset(link + linklen, 0, zlen);
+       }
 }
 
 #define MAX_REMOTE_VALS                4095
@@ -1444,10 +1456,8 @@ process_single_fsb_objects(
                        iocur_top->need_crc = 1;
                        break;
                case TYP_SYMLINK:
-                       if (obfuscate) {
-                               obfuscate_symlink_block(dp);
-                               iocur_top->need_crc = 1;
-                       }
+                       process_symlink_block(dp);
+                       iocur_top->need_crc = 1;
                        break;
                case TYP_ATTR:
                        if (obfuscate) {