From: Darrick J. Wong <djwong@xxxxxxxxxx> When someone wants to perform an obfuscated metadump of a filesystem where parent pointers are enabled, we have to use the *exact* same obfuscated name for both the directory entry and the parent pointer. Instead of using an RNG to influence the obfuscated name, use the dirent inode number to start the obfuscated name. This makes them consistent, though the resulting names aren't quite so full of control characters. Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx> --- db/metadump.c | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/db/metadump.c b/db/metadump.c index 27d1df43..bb441fbb 100644 --- a/db/metadump.c +++ b/db/metadump.c @@ -740,12 +740,14 @@ nametable_add(xfs_dahash_t hash, int namelen, unsigned char *name) #define rol32(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) static inline unsigned char -random_filename_char(void) +random_filename_char(xfs_ino_t ino) { static unsigned char filename_alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789-_"; + if (ino) + return filename_alphabet[ino % (sizeof filename_alphabet - 1)]; return filename_alphabet[random() % (sizeof filename_alphabet - 1)]; } @@ -815,6 +817,7 @@ in_lost_found( */ static void obfuscate_name( + xfs_ino_t ino, xfs_dahash_t hash, size_t name_len, unsigned char *name) @@ -842,7 +845,7 @@ obfuscate_name( * Accumulate its new hash value as we go. */ for (i = 0; i < name_len - 5; i++) { - *newp = random_filename_char(); + *newp = random_filename_char(ino); new_hash = *newp ^ rol32(new_hash, 7); newp++; } @@ -1207,7 +1210,10 @@ generate_obfuscated_name( /* Obfuscate the name (if possible) */ hash = libxfs_da_hashname(name, namelen); - obfuscate_name(hash, namelen, name); + if (xfs_has_parent(mp)) + obfuscate_name(ino, hash, namelen, name); + else + obfuscate_name(0, hash, namelen, name); /* * Make sure the name is not something already seen. If we @@ -1320,7 +1326,7 @@ obfuscate_path_components( /* last (or single) component */ namelen = strnlen((char *)comp, len); hash = libxfs_da_hashname(comp, namelen); - obfuscate_name(hash, namelen, comp); + obfuscate_name(0, hash, namelen, comp); break; } namelen = slash - (char *)comp; @@ -1331,7 +1337,7 @@ obfuscate_path_components( continue; } hash = libxfs_da_hashname(comp, namelen); - obfuscate_name(hash, namelen, comp); + obfuscate_name(0, hash, namelen, comp); comp += namelen + 1; len -= namelen + 1; } @@ -1407,10 +1413,15 @@ process_sf_attr( } if (obfuscate) { - generate_obfuscated_name(0, asfep->namelen, - &asfep->nameval[0]); - memset(&asfep->nameval[asfep->namelen], 'v', - asfep->valuelen); + if (asfep->flags & XFS_ATTR_PARENT) { + generate_obfuscated_name(cur_ino, asfep->valuelen, + &asfep->nameval[asfep->namelen]); + } else { + generate_obfuscated_name(0, asfep->namelen, + &asfep->nameval[0]); + memset(&asfep->nameval[asfep->namelen], 'v', + asfep->valuelen); + } } asfep = (struct xfs_attr_sf_entry *)((char *)asfep + @@ -1785,7 +1796,7 @@ process_attr_block( (long long)cur_ino); break; } - if (obfuscate) { + if (obfuscate && !(entry->flags & XFS_ATTR_PARENT)) { generate_obfuscated_name(0, local->namelen, &local->nameval[0]); memset(&local->nameval[local->namelen], 'v', @@ -1797,6 +1808,9 @@ process_attr_block( zlen = xfs_attr_leaf_entsize_local(nlen, vlen) - (sizeof(xfs_attr_leaf_name_local_t) - 1 + nlen + vlen); + if (obfuscate && (entry->flags & XFS_ATTR_PARENT)) + generate_obfuscated_name(cur_ino, vlen, + &local->nameval[nlen]); if (zero_stale_data) memset(&local->nameval[nlen + vlen], 0, zlen); } else {