diff options
author | Yves Orton <demerphq@gmail.com> | 2013-03-17 20:19:09 +0100 |
---|---|---|
committer | Yves Orton <demerphq@gmail.com> | 2013-03-19 00:23:11 +0100 |
commit | 0e0ab62106f892a1b7f00ad117493064bf9d72d1 (patch) | |
tree | fdd83225227f4b59da3cb0fbb7e21e702f515e56 /embedvar.h | |
parent | b716320d9d4e3483bbddcbf6c6977a2a6a0efa1e (diff) | |
download | perl-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 'embedvar.h')
-rw-r--r-- | embedvar.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/embedvar.h b/embedvar.h index 1731bde313..a738dd7f0f 100644 --- a/embedvar.h +++ b/embedvar.h @@ -154,6 +154,7 @@ #define PL_gensym (vTHX->Igensym) #define PL_globalstash (vTHX->Iglobalstash) #define PL_globhook (vTHX->Iglobhook) +#define PL_hash_rand_bits (vTHX->Ihash_rand_bits) #define PL_hintgv (vTHX->Ihintgv) #define PL_hints (vTHX->Ihints) #define PL_hv_fetch_ent_mh (vTHX->Ihv_fetch_ent_mh) |