xfsprogs: don't loop on too many dups
PATCH 9/12 xfsprogs: don't loop on too many dups
Don't just loop indefinitely when an obfuscated name comes up as a duplicate. Count the number of times we've found a duplicate, and if it gets excessive just give up and use the original name without obfuscation.
Signed-off-by Alex Elder <[email protected]>
--- db/metadump.c | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-)
db/metadump.c +26 -9
@@ -29,6 +29,14 @@#define DEFAULT_MAX_EXT_SIZE 1000 +/* +* It's possible that more than one file in a directory produce the +* same obfuscated name. If that happens, we try to create another +* one. After several rounds of this though, we just give up and +* leave the original name as-is. +*/ +#define DUP_MAX 5/* Max duplicates before we give up */ +/* copy all metadata structures to/from a file */ static int metadump_f (int argc,char **argv);
@@ -415,7 +423,7 @@ generate_obfuscated_name( {xfs_dahash_t hash;name_ent_t *p; -int dup; +int dup =0 ;uchar_t newname[NAME_MAX ];/*
@@ -454,8 +462,6 @@ generate_obfuscated_name(uchar_t high_bit;int shift; - dup =0 ; -/* * The beginning of the obfuscated name can be * pretty much anything, so fill it in with random
@@ -510,14 +516,24 @@ generate_obfuscated_name(ASSERT (libxfs_da_hashname ((char *) newname, namelen) == hash); +/* +* Search the name table to be sure we don't produce +* a name that's already been used. +*/ for (p = nametable[hash %NAME_TABLE_SIZE ]; p; p = p->next) {if (p->hash == hash && p->namelen == namelen && - !memcmp (p->name, newname, namelen)) { - dup =1 ; + !memcmp (p->name, newname, namelen))break ; - } } - }while (dup); +if (p) + dup++; +else + dup =0 ; + }while (dup && dup <DUP_MAX ); + +/* Use the original name if we got too many dups. */ + + newp = dup ? name : newname;/* Create an entry for the name in the name table */
@@ -526,7 +542,7 @@ generate_obfuscated_name(return ; p->namelen = namelen; -memcpy (p->name, newname, namelen); +memcpy (p->name, newp, namelen); p->hash = hash; p->next = nametable[hash %NAME_TABLE_SIZE ];
@@ -534,7 +550,8 @@ generate_obfuscated_name(/* Update the caller's copy with the obfuscated name */ -memcpy (name, newname, namelen); +if (newp != name) +memcpy (name, newp, namelen); } static void
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs