]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
metadump: obfuscate attrs on CRC fs
authorEric Sandeen <sandeen@sandeen.net>
Wed, 29 Jul 2015 23:17:43 +0000 (09:17 +1000)
committerDave Chinner <david@fromorbit.com>
Wed, 29 Jul 2015 23:17:43 +0000 (09:17 +1000)
Lots of issues in xfs_metadump obfuscation of extended
attributes with CRC filesystems; this fixes it up.

The main issues are that the headers differ, and the
space in the remote blocks differ.

Tested with a script I'm using to do other metadump
work; I still owe an xfstest for this and other bits.

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 773d18c56cea27a67bcebf223edfd1af65846803..ffd1fe1f7288aa7f0c4d044fee8f5c445e828c3b 100644 (file)
@@ -1273,39 +1273,52 @@ add_remote_vals(
        }
 }
 
+/* Handle remote and leaf attributes */
 static void
 obfuscate_attr_block(
-       char                    *block,
-       xfs_dfiloff_t           offset)
+       char                            *block,
+       xfs_fileoff_t                   offset)
 {
-       xfs_attr_leafblock_t    *leaf;
-       int                     i;
-       int                     nentries;
-       xfs_attr_leaf_entry_t   *entry;
-       xfs_attr_leaf_name_local_t *local;
-       xfs_attr_leaf_name_remote_t *remote;
+       struct xfs_attr_leafblock       *leaf;
+       struct xfs_attr3_icleaf_hdr     hdr;
+       int                             i;
+       int                             nentries;
+       xfs_attr_leaf_entry_t           *entry;
+       xfs_attr_leaf_name_local_t      *local;
+       xfs_attr_leaf_name_remote_t     *remote;
+       __uint32_t                      bs = mp->m_sb.sb_blocksize;
+
 
        leaf = (xfs_attr_leafblock_t *)block;
 
-       if (be16_to_cpu(leaf->hdr.info.magic) != XFS_ATTR_LEAF_MAGIC) {
+       /* Remote attributes - attr3 has XFS_ATTR3_RMT_MAGIC, attr has none */
+       if ((be16_to_cpu(leaf->hdr.info.magic) != XFS_ATTR_LEAF_MAGIC) &&
+           (be16_to_cpu(leaf->hdr.info.magic) != XFS_ATTR3_LEAF_MAGIC)) {
                for (i = 0; i < attr_data.remote_val_count; i++) {
-                       /* XXX: need to handle CRC headers */
                        if (attr_data.remote_vals[i] == offset)
-                               memset(block, 0, XFS_LBSIZE(mp));
+                               /* Macros to handle both attr and attr3 */
+                               memset(block +
+                                       (bs - XFS_ATTR3_RMT_BUF_SPACE(mp, bs)),
+                                     0, XFS_ATTR3_RMT_BUF_SPACE(mp, bs));
                }
                return;
        }
 
-       nentries = be16_to_cpu(leaf->hdr.count);
+       /* Ok, it's a leaf - get header; accounts for crc & non-crc */
+       xfs_attr3_leaf_hdr_from_disk(&hdr, leaf);
+
+       nentries = hdr.count;
        if (nentries * sizeof(xfs_attr_leaf_entry_t) +
-                       sizeof(xfs_attr_leaf_hdr_t) > XFS_LBSIZE(mp)) {
+                       xfs_attr3_leaf_hdr_size(leaf) >
+                               XFS_ATTR3_RMT_BUF_SPACE(mp, bs)) {
                if (show_warnings)
                        print_warning("invalid attr count in inode %llu",
                                        (long long)cur_ino);
                return;
        }
 
-       for (i = 0, entry = &leaf->entries[0]; i < nentries; i++, entry++) {
+       entry = xfs_attr3_leaf_entryp(leaf);
+       for (i = 0; i < nentries; i++, entry++) {
                if (be16_to_cpu(entry->nameidx) > XFS_LBSIZE(mp)) {
                        if (show_warnings)
                                print_warning(