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 /intrpvar.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 'intrpvar.h')
-rw-r--r-- | intrpvar.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/intrpvar.h b/intrpvar.h index b5902a5a41..274e7af040 100644 --- a/intrpvar.h +++ b/intrpvar.h @@ -64,6 +64,7 @@ PERLVAR(I, markstack, I32 *) /* stack_sp locations we're PERLVAR(I, markstack_ptr, I32 *) PERLVAR(I, markstack_max, I32 *) +PERLVARI(I, hash_rand_bits, UV, 0) /* used to randomize hash stuff */ PERLVAR(I, strtab, HV *) /* shared string table */ /* Fields used by magic variables such as $@, $/ and so on */ |