about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2005-07-18 02:39:13 +0000
committerRoland McGrath <roland@gnu.org>2005-07-18 02:39:13 +0000
commit0f7a049f2f5bd7a79c589979736ffd0caee88447 (patch)
tree8279994a6b98b151b8ca8aa8bf0d75dec9d14315
parent02aa168a6a43f370e1aade8f404c6406c212c9fc (diff)
downloadglibc-0f7a049f2f5bd7a79c589979736ffd0caee88447.tar.gz
glibc-0f7a049f2f5bd7a79c589979736ffd0caee88447.tar.xz
glibc-0f7a049f2f5bd7a79c589979736ffd0caee88447.zip
2005-04-12 Ulrich Drepper <drepper@redhat.com>
	[BZ #1090]
	* stdlib/random_r.c (__initstate_r): Don't use non-existing state.
	* string/tst-strfry.c: New file.
	* string/Makefile (tests): Add tst-strfry.
-rw-r--r--stdlib/random_r.c29
-rw-r--r--string/Makefile2
-rw-r--r--string/tst-strfry.c15
3 files changed, 29 insertions, 17 deletions
diff --git a/stdlib/random_r.c b/stdlib/random_r.c
index e955ea576a..404006f2cd 100644
--- a/stdlib/random_r.c
+++ b/stdlib/random_r.c
@@ -236,23 +236,20 @@ __initstate_r (seed, arg_state, n, buf)
      size_t n;
      struct random_data *buf;
 {
-  int type;
-  int degree;
-  int separation;
-  int32_t *state;
-  int old_type;
-  int32_t *old_state;
-
   if (buf == NULL)
     goto fail;
 
-  old_type = buf->rand_type;
-  old_state = buf->state;
-  if (old_type == TYPE_0)
-    old_state[-1] = TYPE_0;
-  else
-    old_state[-1] = (MAX_TYPES * (buf->rptr - old_state)) + old_type;
+  int32_t *old_state = buf->state;
+  if (old_state != NULL)
+    {
+      int old_type = buf->rand_type;
+      if (old_type == TYPE_0)
+	old_state[-1] = TYPE_0;
+      else
+	old_state[-1] = (MAX_TYPES * (buf->rptr - old_state)) + old_type;
+    }
 
+  int type;
   if (n >= BREAK_3)
     type = n < BREAK_4 ? TYPE_3 : TYPE_4;
   else if (n < BREAK_1)
@@ -267,13 +264,13 @@ __initstate_r (seed, arg_state, n, buf)
   else
     type = n < BREAK_2 ? TYPE_1 : TYPE_2;
 
-  degree = random_poly_info.degrees[type];
-  separation = random_poly_info.seps[type];
+  int degree = random_poly_info.degrees[type];
+  int separation = random_poly_info.seps[type];
 
   buf->rand_type = type;
   buf->rand_sep = separation;
   buf->rand_deg = degree;
-  state = &((int32_t *) arg_state)[1];	/* First location.  */
+  int32_t *state = &((int32_t *) arg_state)[1];	/* First location.  */
   /* Must set END_PTR before srandom.  */
   buf->end_ptr = &state[degree];
 
diff --git a/string/Makefile b/string/Makefile
index 66469f586e..7a77e35732 100644
--- a/string/Makefile
+++ b/string/Makefile
@@ -52,7 +52,7 @@ strop-tests	:= memchr memcmp memcpy memmove mempcpy memset memccpy	\
 tests		:= tester inl-tester noinl-tester testcopy test-ffs	\
 		   tst-strlen stratcliff tst-svc tst-inlcall		\
 		   bug-strncat1 bug-strspn1 bug-strpbrk1 tst-bswap	\
-		   tst-strtok tst-strxfrm bug-strcoll1			\
+		   tst-strtok tst-strxfrm bug-strcoll1 tst-strfry	\
 		   $(addprefix test-,$(strop-tests))
 distribute	:= memcopy.h pagecopy.h tst-svc.expect test-string.h
 
diff --git a/string/tst-strfry.c b/string/tst-strfry.c
new file mode 100644
index 0000000000..2b40a39b13
--- /dev/null
+++ b/string/tst-strfry.c
@@ -0,0 +1,15 @@
+#include <stdio.h>
+#include <string.h>
+
+static int
+do_test (void)
+{
+  char str[] = "this is a test";
+
+  strfry (str);
+
+  return 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"