summaryrefslogtreecommitdiff
path: root/hv.h
diff options
context:
space:
mode:
authorYves Orton <demerphq@gmail.com>2013-03-17 20:19:09 +0100
committerYves Orton <demerphq@gmail.com>2013-03-19 00:23:11 +0100
commit0e0ab62106f892a1b7f00ad117493064bf9d72d1 (patch)
treefdd83225227f4b59da3cb0fbb7e21e702f515e56 /hv.h
parentb716320d9d4e3483bbddcbf6c6977a2a6a0efa1e (diff)
downloadperl-0e0ab62106f892a1b7f00ad117493064bf9d72d1.tar.gz
Harden hashes against hash seed discovery by randomizing hash iteration
Adds: S_ptr_hash() - A new static function in hv.c which can be used to hash a pointer or integer. PL_hash_rand_bits - A new interpreter variable used as a cheap provider of "semi-random" state for use by the hash infrastructure. xpvhv_aux.xhv_rand - Used as a mask which is xored against the xpvhv_aux.riter during iteration to randomize the order the actual buckets are visited. PL_hash_rand_bits is initialized as interpreter start from the random hash seed, and then modified by "mixing in" the result of ptr_hash() on the bucket array pointer in the hv (HvARRAY(hv)) every time hv_auxinit() allocates a new iterator structure. The net result is that every hash has its own iteration order, which should make it much more difficult to determine what the current hash seed is. This required some test to be restructured, as they tested for something that was not necessarily true, we never guaranteed that two hashes with the same keys would produce the same key order, we merely promised that using keys(), values(), or each() on the same hash, without any insertions in between, would produce the same order of visiting the key/values.
Diffstat (limited to 'hv.h')
-rw-r--r--hv.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/hv.h b/hv.h
index dddeb027e9..f2dd8e131f 100644
--- a/hv.h
+++ b/hv.h
@@ -92,6 +92,7 @@ struct xpvhv_aux {
I32 xhv_name_count;
struct mro_meta *xhv_mro_meta;
HV * xhv_super; /* SUPER method cache */
+ U32 xhv_rand; /* random value for hash traversal */
};
/* hash structure: */