catacomb.c: Handle Python's randomize hashing parameters properly.
authorMark Wooding <mdw@distorted.org.uk>
Fri, 10 Apr 2015 14:19:25 +0000 (15:19 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Mon, 20 Apr 2015 17:00:11 +0000 (18:00 +0100)
catacomb.c

index 3aebea3..015c5a7 100644 (file)
@@ -144,11 +144,27 @@ static PyMethodDef methods[] = {
   { 0 }
 };
 
+static void init_random(void)
+{
+#if PY_MAJOR_VERSION >= 3 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 6)
+  char *seed;
+  uint32 r;
+
+  if (!Py_HashRandomizationFlag) return;
+  seed = getenv("PYTHONHASHSEED");
+  if (!seed || strcmp(seed, "random") == 0) r = GR_WORD(&rand_global);
+  else r = strtoul(seed, 0, 0);
+  if (!r) r = 0xe011f220; /* zero doesn't work well */
+  unihash_setkey(&unihash_global, r);
+#endif
+}
+
 void init_base(void)
 {
   PyObject *mod;
   addmethods(methods);
   INIT_MODULES;
+  init_random();
   mod = Py_InitModule("catacomb._base", donemethods());
   INSERT_MODULES;
   INSERT("smallprimes", smallprimes());