BZ#15380: Fix initstate error return

Andreas Jaeger aj@suse.com
Mon Apr 29 14:16:00 GMT 2013


 From Bugzilla:
"POSIX.1-2001 says:

     RETURN VALUE
        If initstate() is called with size less than 8, it shall return
        NULL.

glibc sets errno to EINVAL for this case, but does not return NULL, thus
violating the standard."

Here's a patch to fix this, ok to commit?

Andreas

2013-04-27  Andreas Jaeger  <aj@suse.de>

	[BZ #15380]
	* stdlib/random.c (weak_alias): Return NULL if
	__initstate fails.

diff --git a/stdlib/random.c b/stdlib/random.c
index 3ed610d..1083973 100644
--- a/stdlib/random.c
+++ b/stdlib/random.c
@@ -234,16 +234,17 @@ __initstate (seed, arg_state, n)
       size_t n;
  {
    int32_t *ostate;
+  int ret;

    __libc_lock_lock (lock);

    ostate = &unsafe_state.state[-1];

-  __initstate_r (seed, arg_state, n, &unsafe_state);
+  ret = __initstate_r (seed, arg_state, n, &unsafe_state);

    __libc_lock_unlock (lock);

-  return (char *) ostate;
+  return (ret == -1) ? NULL : (char *) ostate;
  }

  weak_alias (__initstate, initstate)

-- 
  Andreas Jaeger aj@{suse.com,opensuse.org} Twitter/Identica: jaegerandi
   SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
    GF: Jeff Hawn,Jennifer Guild,Felix Imendörffer,HRB16746 (AG Nürnberg)
     GPG fingerprint = 93A3 365E CE47 B889 DF7F  FED1 389A 563C C272 A126



More information about the Libc-alpha mailing list