On Tue, Aug 01, 2017 at 09:35:27PM -0500, Eric Sandeen wrote: > 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 ;) > Looks good to me. A couple nits... > 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; TODO what exactly? Zero from the end of the bests array to the end of the block? We could at least add the if (!zero_stale_data) check here too. > + } 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); ltp isn't used until the block of code below (which already has locally scoped vars). Brian > + 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 -- 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