Bug 3747 - mrand48 and it's friends return values outside of [-2^31, 2^31] on 64-bit platforms
Summary: mrand48 and it's friends return values outside of [-2^31, 2^31] on 64-bit pla...
Status: RESOLVED FIXED
Alias: None
Product: glibc
Classification: Unclassified
Component: libc (show other bugs)
Version: unspecified
: P2 normal
Target Milestone: ---
Assignee: Ulrich Drepper
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2006-12-18 00:57 UTC by Nicholas Miell
Modified: 2014-07-17 14:54 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:
fweimer: security-


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Nicholas Miell 2006-12-18 00:57:04 UTC
A simple test program which aborts immediately:

#include <stdlib.h>
#include <limits.h>

int main(void)
{
     while(1) {
	  long x = mrand48();
	  if (x > 2147483648 || x < -2147483648)
	       abort();
     }
}
Comment 1 segher@kernel.crashing.org 2006-12-18 09:37:31 UTC
Subject: Re:  New: mrand48 and it's friends return values outside of [-2^31, 2^31] on 64-bit platforms

> 	  if (x > 2147483648

Invalid testcase; this number is negative with default GCC -std flag.


Segher

Comment 2 Nicholas Miell 2006-12-19 02:32:13 UTC
Since you're too lazy to do the obvious:

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
     while(1) {
          long x = mrand48();
          if (x > 2147483648L || x < -2147483648L) {
               printf("long: %ld, int: %d\n", x, (int) x);
               abort();
          }
     }
}
Comment 3 Ulrich Drepper 2006-12-19 08:18:46 UTC
Fixed in cvs.
Comment 4 cvs-commit@gcc.gnu.org 2007-01-12 17:52:17 UTC
Subject: Bug 3747

CVSROOT:	/cvs/glibc
Module name:	libc
Branch: 	glibc-2_5-branch
Changes by:	jakub@sourceware.org	2007-01-12 17:52:07

Modified files:
	.              : ChangeLog 
	stdlib         : Makefile jrand48_r.c tst-rand48.c 
Added files:
	stdlib         : tst-rand48-2.c 

Log message:
	[BZ #3747]
	* stdlib/jrand48_r.c (__jrand48_r): Make sure result is in the
	[-231 .. 231) range.
	* stdlib/tst-rand48.c (main): Fix expected values for 64-bit
	targets.
	* stdlib/tst-rand48-2.c: New test.
	* stdlib/Makefile (tests): Add tst-rand48-2.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/libc/ChangeLog.diff?cvsroot=glibc&only_with_tag=glibc-2_5-branch&r1=1.10362.2.23&r2=1.10362.2.24
http://sourceware.org/cgi-bin/cvsweb.cgi/libc/stdlib/tst-rand48-2.c.diff?cvsroot=glibc&only_with_tag=glibc-2_5-branch&r1=NONE&r2=1.1.4.1
http://sourceware.org/cgi-bin/cvsweb.cgi/libc/stdlib/Makefile.diff?cvsroot=glibc&only_with_tag=glibc-2_5-branch&r1=1.109&r2=1.109.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/libc/stdlib/jrand48_r.c.diff?cvsroot=glibc&only_with_tag=glibc-2_5-branch&r1=1.9&r2=1.9.10.1
http://sourceware.org/cgi-bin/cvsweb.cgi/libc/stdlib/tst-rand48.c.diff?cvsroot=glibc&only_with_tag=glibc-2_5-branch&r1=1.1&r2=1.1.10.1