xfs_metadump attempts to zero out unused regions of metadata blocks to prevent data leaks when sharing metadata images. However, Stefan Ring reported a significant number of leaked strings when dumping his 1T filesystem. Based on a reduced metadata set, I was able to identify "leaf" directories (with XFS_DIR2_LEAF1_MAGIC magic) as the primary culprit; the region between the end of the entries array and the start of the bests array was not getting zeroed out. This patch seems to remedy that problem. Reported-by: Stefan Ring <stefanrin@xxxxxxxxx> Signed-off-by: Eric Sandeen <sandeen@xxxxxxxxxx> --- I may have missed some handy macro to work out some of the math below, if so I'd be perfectly happy to hear about it ;) diff --git a/db/metadump.c b/db/metadump.c index 96641e0..6d77d61 100644 --- a/db/metadump.c +++ b/db/metadump.c @@ -1459,6 +1459,37 @@ process_dir_data_block( int wantmagic; struct xfs_dir2_data_hdr *datahdr; + if (offset >= mp->m_dir_geo->freeblk) { + /* TODO */ + return; + } else if (offset >= mp->m_dir_geo->leafblk) { + struct xfs_dir2_leaf *leaf; + struct xfs_dir2_leaf_tail *ltp; + struct xfs_dir3_icleaf_hdr leafhdr; + + if (!zero_stale_data) + return; + + leaf = (struct xfs_dir2_leaf *)block; + ltp = xfs_dir2_leaf_tail_p(mp->m_dir_geo, leaf); + M_DIROPS(mp)->leaf_hdr_from_disk(&leafhdr, leaf); + + /* Zero out space from end of ents[] to bests */ + if (leafhdr.magic == XFS_DIR2_LEAF1_MAGIC) { + struct xfs_dir2_leaf_entry *ents; + __be16 *lbp; + char *start; /* end of ents */ + + ents = M_DIROPS(mp)->leaf_ents_p(leaf); + start = (char *)&ents[leafhdr.count + leafhdr.stale]; + lbp = xfs_dir2_leaf_bests_p(ltp); + memset(start, 0, (char *)lbp - start); + iocur_top->need_crc = 1; + } + return; + } + + /* It's a data block. */ datahdr = (struct xfs_dir2_data_hdr *)block; if (is_block_format) { @@ -1800,9 +1831,6 @@ process_single_fsb_objects( dp = iocur_top->data; switch (btype) { case TYP_DIR2: - if (o >= mp->m_dir_geo->leafblk) - break; - process_dir_data_block(dp, o, last == mp->m_dir_geo->fsbcount); iocur_top->need_crc = 1; -- To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html