changeset: 75133:357e268e7c5f branch: 2.6 parent: 75124:04738f35e0ec user: Benjamin Peterson date: Tue Feb 21 11:08:50 2012 -0500 files: Include/object.h Objects/stringobject.c Objects/unicodeobject.c Python/random.c description: ensure no one tries to hash things before the random seed is found diff -r 04738f35e0ec -r 357e268e7c5f Include/object.h --- a/Include/object.h Tue Feb 21 10:22:34 2012 -0500 +++ b/Include/object.h Tue Feb 21 11:08:50 2012 -0500 @@ -512,6 +512,10 @@ } _Py_HashSecret_t; PyAPI_DATA(_Py_HashSecret_t) _Py_HashSecret; +#ifdef Py_DEBUG +PyAPI_DATA(int) _Py_HashSecret_Initialized; +#endif + /* Helper for passing objects to printf and the like */ #define PyObject_REPR(obj) PyString_AS_STRING(PyObject_Repr(obj)) diff -r 04738f35e0ec -r 357e268e7c5f Objects/stringobject.c --- a/Objects/stringobject.c Tue Feb 21 10:22:34 2012 -0500 +++ b/Objects/stringobject.c Tue Feb 21 11:08:50 2012 -0500 @@ -1209,6 +1209,7 @@ register unsigned char *p; register long x; + assert(_Py_HashSecret_Initialized); if (a->ob_shash != -1) return a->ob_shash; len = Py_SIZE(a); diff -r 04738f35e0ec -r 357e268e7c5f Objects/unicodeobject.c --- a/Objects/unicodeobject.c Tue Feb 21 10:22:34 2012 -0500 +++ b/Objects/unicodeobject.c Tue Feb 21 11:08:50 2012 -0500 @@ -6692,6 +6692,7 @@ register Py_UNICODE *p; register long x; + assert(_Py_HashSecret_Initialized); if (self->hash != -1) return self->hash; len = PyUnicode_GET_SIZE(self); diff -r 04738f35e0ec -r 357e268e7c5f Python/random.c --- a/Python/random.c Tue Feb 21 10:22:34 2012 -0500 +++ b/Python/random.c Tue Feb 21 11:08:50 2012 -0500 @@ -5,7 +5,11 @@ #include #endif -static int random_initialized = 0; +#ifdef Py_DEBUG +int _Py_HashSecret_Initialized = 0; +#else +static int _Py_HashSecret_Initialized = 0; +#endif #ifdef MS_WINDOWS typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTA)(HCRYPTPROV *phProv,\ @@ -246,11 +250,11 @@ { char *env; void *secret = &_Py_HashSecret; - Py_ssize_t secret_size = sizeof(_Py_HashSecret); + Py_ssize_t secret_size = sizeof(_Py_HashSecret_t); - if (random_initialized) + if (_Py_HashSecret_Initialized) return; - random_initialized = 1; + _Py_HashSecret_Initialized = 1; /* By default, hash randomization is disabled, and only

AltStyle によって変換されたページ (->オリジナル) /