]> granicus.if.org Git - gc/commitdiff
Workaround 'insecure libc pseudo-random number generator used' code defect
authorIvan Maidanski <ivmai@mail.ru>
Fri, 28 Oct 2016 07:57:20 +0000 (10:57 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Fri, 28 Oct 2016 08:27:22 +0000 (11:27 +0300)
* dbg_mlc.c [LINT2] (GC_random): New function.
* dbg_mlc.c [KEEP_BACK_PTRS && LINT2] (RANDOM): Define to GC_random.
* dbg_mlc.c [KEEP_BACK_PTRS && LINT2]: Do not include stdlib.h.
* dbg_mlc.c [KEEP_BACK_PTRS && !LINT2] (GC_RAND_MAX): Define.
* dbg_mlc.c (GC_generate_random_heap_address): Replace RAND_MAX with
GC_RAND_MAX.
* include/private/gc_priv.h [LINT2] (GC_RAND_MAX): New macro.
* include/private/gc_priv.h [LINT2] (GC_random): Prototype (as
GC_API_PRIV).
* tests/disclaim_bench.c [LINT2] (rand): Redefine to GC_random.
* tests/disclaim_test.c [LINT2] (rand): Likewise.
* tests/disclaim_test.c [LINT2]: Include private/gc_priv.h instead of
config.h.

dbg_mlc.c
include/private/gc_priv.h
tests/disclaim_bench.c
tests/disclaim_test.c

index fbfa6bc4092f3e45f468f268580f30fc82cd750d..21d423daf3c7967c7cd4a3c10c8818a2f6ff902f 100644 (file)
--- a/dbg_mlc.c
+++ b/dbg_mlc.c
   }
 #endif /* !SHORT_DBG_HDRS */
 
+#ifdef LINT2
+  long GC_random(void)
+  {
+    static unsigned seed = 1; /* not thread-safe */
+
+    /* Linear congruential pseudo-random numbers generator.     */
+    seed = (seed * 1103515245U + 12345) & GC_RAND_MAX; /* overflow is ok */
+    return (long)seed;
+  }
+#endif
+
 #ifdef KEEP_BACK_PTRS
 
+#ifdef LINT2
+# define RANDOM() GC_random()
+#else
 # include <stdlib.h>
+# define GC_RAND_MAX RAND_MAX
 
 # if defined(__GLIBC__) || defined(SOLARIS) \
      || defined(HPUX) || defined(IRIX5) || defined(OSF1)
@@ -64,6 +79,7 @@
 # else
 #   define RANDOM() (long)rand()
 # endif
+#endif /* !LINT2 */
 
   /* Store back pointer to source in dest, if that appears to be possible. */
   /* This is not completely safe, since we may mistakenly conclude that    */
     size_t i;
     word heap_offset = RANDOM();
 
-    if (GC_heapsize > RAND_MAX) {
-        heap_offset *= RAND_MAX;
+    if (GC_heapsize > GC_RAND_MAX) {
+        heap_offset *= GC_RAND_MAX;
         heap_offset += RANDOM();
     }
     heap_offset %= GC_heapsize;
index 8370fc739269446301db1e49917f37a890d9c0ef..73eb48cdc67a74e36e4d2ea0b0ea2053347e4ddd 100644 (file)
@@ -2000,6 +2000,11 @@ GC_EXTERN GC_bool GC_have_errors; /* We saw a smashed or leaked object. */
   GC_INNER void GC_generate_random_backtrace_no_gc(void);
 #endif
 
+#ifdef LINT2
+# define GC_RAND_MAX (~0U >> 1)
+  GC_API_PRIV long GC_random(void);
+#endif
+
 GC_EXTERN GC_bool GC_print_back_height;
 
 #ifdef MAKE_BACK_GRAPH
index 1a1f5a1756773795782a562c074e6f06eafd879c..5e70cbbe557d280e37828ddf56d6e96e768b2f19 100644 (file)
 
 #include "gc_disclaim.h"
 
+#ifdef LINT2
+# undef rand
+# define rand() (int)GC_random()
+#endif
+
 #define my_assert(e) \
     if (!(e)) { \
         fprintf(stderr, "Assertion failure, line %d: " #e "\n", __LINE__); \
index f7f366f934e3a32789b5ac998d2d0c68edacd4db..16b94f4f048b5cc96595de1ef96f41e910d8f52d 100644 (file)
 #include <stdio.h>
 #include <string.h>
 
-#ifdef HAVE_CONFIG_H
+#ifdef LINT2
+  /* For GC_random() */
+# include "private/gc_priv.h"
+# undef rand
+# define rand() (int)GC_random()
+#elif defined(HAVE_CONFIG_H)
   /* For GC_[P]THREADS */
 # include "config.h"
 #endif