Mesa (mesa_7_6_branch): glx: Use initstate_r / random_r instead of corrupting global random number state

Nicolai Hähnle nh at kemper.freedesktop.org
Sun Sep 20 15:03:14 UTC 2009


Module: Mesa
Branch: mesa_7_6_branch
Commit: 9666529b5a5be1fcde82caadc2fe2efa5ea81e49
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=9666529b5a5be1fcde82caadc2fe2efa5ea81e49

Author: Ian Romanick <ian.d.romanick at intel.com>
Date:   Wed Sep 16 16:43:50 2009 -0700

glx: Use initstate_r / random_r instead of corrupting global random number state

Previously srandom and random were used.  This cause the global random
number generator state to be modified.  This caused problems for
applications that called srandom before calling into GLX.  By using
local state the global state is left unmodified.

This should fix bug #23774.

---

 src/glx/x11/glxhash.c |   10 +++++++---
 1 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/glx/x11/glxhash.c b/src/glx/x11/glxhash.c
index 74cd4f3..7d28ada 100644
--- a/src/glx/x11/glxhash.c
+++ b/src/glx/x11/glxhash.c
@@ -87,9 +87,13 @@
 
 #define HASH_ALLOC malloc
 #define HASH_FREE  free
-#define HASH_RANDOM_DECL
-#define HASH_RANDOM_INIT(seed)  srandom(seed)
-#define HASH_RANDOM             random()
+#define HASH_RANDOM_DECL	struct random_data rd; int32_t rv; char rs[256]
+#define HASH_RANDOM_INIT(seed)					\
+   do {								\
+      (void) memset(&rd, 0, sizeof(rd));			\
+      (void) initstate_r(seed, rs, sizeof(rs), &rd);		\
+   } while(0)
+#define HASH_RANDOM             ((void) random_r(&rd, &rv), rv)
 #define HASH_RANDOM_DESTROY
 
 typedef struct __glxHashBucket




More information about the mesa-commit mailing list