From: Alex Elder <aelder@sgi.com>
To: xfs@oss.sgi.com
Subject: [PATCH 02/12] xfsprogs: simplify leading '/' handling in generate_obfuscated_name()
Date: Thu, 30 Dec 2010 14:40:12 -0600 [thread overview]
Message-ID: <1293741612.2294.354.camel@doink> (raw)
In generate_obfuscated_name(), the incoming file name is allowed to
start with a '/' character, in which case it is copied over to the
new file name and ignored for the remainder of the hash calculation.
Simplify the affected code by processing the '/' right away, and
using a pointer thereafter for the start of the new file name.
Signed-off-by: Alex Elder <aelder@sgi.com>
---
db/metadump.c | 67 ++++++++++++++++++++++++++++++++++++----------------------
1 file changed, 42 insertions(+), 25 deletions(-)
Index: b/db/metadump.c
===================================================================
--- a/db/metadump.c
+++ b/db/metadump.c
@@ -419,6 +419,7 @@ generate_obfuscated_name(
int dup;
xfs_dahash_t newhash;
uchar_t newname[NAME_MAX];
+ uchar_t *newp = &newname[0];
/*
* Our obfuscation algorithm requires at least 5-character
@@ -438,39 +439,55 @@ generate_obfuscated_name(
hash = libxfs_da_hashname((char *) name, namelen);
- /* create a random name with the same hash value */
-
+ /*
+ * If the name starts with a slash, just skip over it. We
+ * will copy our obfuscated name back into space following
+ * the slash when we're done. Our new name will not have
+ * the '/', and that's the version we'll keep in our
+ * duplicates table. Note that the namelen value passed in
+ * does not include the leading slash (if any).
+ */
+ if (*name == '/')
+ name++;
do {
dup = 0;
- newname[0] = '/';
-
for (;;) {
- /* if the first char is a "/", preserve it */
- i = (name[0] == '/');
-
- for (newhash = 0; i < namelen - 5; i++) {
- newname[i] = random_filename_char();
- newhash = newname[i] ^ rol32(newhash, 7);
+ /*
+ * The beginning of the obfuscated name can
+ * be pretty much anything, so fill it in
+ * with random characters. Accumulate its
+ * new hash value as we go.
+ */
+ newhash = 0;
+ for (i = 0; i < namelen - 5; i++) {
+ newp[i] = random_filename_char();
+ newhash = newp[i] ^ rol32(newhash, 7);
}
+
+ /*
+ * Compute which five bytes need to be used
+ * at the end of the name so the hash of the
+ * obfuscated name is the same as the hash
+ * of the original.
+ */
newhash = rol32(newhash, 3) ^ hash;
- if (name[0] != '/' || namelen > 5) {
- newname[namelen - 5] = (newhash >> 28) |
- (random_filename_char() & 0xf0);
- if (is_invalid_char(newname[namelen - 5]))
- continue;
- }
- newname[namelen - 4] = (newhash >> 21) & 0x7f;
- if (is_invalid_char(newname[namelen - 4]))
+
+ newp[namelen - 5] = (newhash >> 28) |
+ (random_filename_char() & 0xf0);
+ if (is_invalid_char(newp[namelen - 5]))
+ continue;
+ newp[namelen - 4] = (newhash >> 21) & 0x7f;
+ if (is_invalid_char(newp[namelen - 4]))
continue;
- newname[namelen - 3] = (newhash >> 14) & 0x7f;
- if (is_invalid_char(newname[namelen - 3]))
+ newp[namelen - 3] = (newhash >> 14) & 0x7f;
+ if (is_invalid_char(newp[namelen - 3]))
continue;
- newname[namelen - 2] = (newhash >> 7) & 0x7f;
- if (is_invalid_char(newname[namelen - 2]))
+ newp[namelen - 2] = (newhash >> 7) & 0x7f;
+ if (is_invalid_char(newp[namelen - 2]))
continue;
- newname[namelen - 1] = ((newhash >> 0) ^
- (newname[namelen - 5] >> 4)) & 0x7f;
- if (is_invalid_char(newname[namelen - 1]))
+ newp[namelen - 1] = ((newhash >> 0) ^
+ (newp[namelen - 5] >> 4)) & 0x7f;
+ if (is_invalid_char(newp[namelen - 1]))
continue;
break;
}
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
next reply other threads:[~2010-12-30 20:38 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-30 20:40 Alex Elder [this message]
2011-01-10 20:13 ` [PATCH 02/12] xfsprogs: simplify leading '/' handling in generate_obfuscated_name() Christoph Hellwig
2011-01-10 20:23 ` Alex Elder
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1293741612.2294.354.camel@doink \
--to=aelder@sgi.com \
--cc=xfs@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox