svn commit: r309650 - head/lib/libc/gen

Ed Schouten ed at FreeBSD.org
Tue Dec 6 19:08:30 UTC 2016


Author: ed
Date: Tue Dec  6 19:08:29 2016
New Revision: 309650
URL: https://svnweb.freebsd.org/changeset/base/309650

Log:
  Properly sign extend the result of jrand48() and mrand48().
  
  These functions are supposed to return a value between [_2^31, 2^31).
  This doesn't seem to work on 64-bit systems, where we return a value
  between [0, 3^32). Patch up the function to use proper casts to int32_t.
  While there, fix some other style bugs.
  
  MFC after:	2 weeks

Modified:
  head/lib/libc/gen/jrand48.c
  head/lib/libc/gen/mrand48.c

Modified: head/lib/libc/gen/jrand48.c
==============================================================================
--- head/lib/libc/gen/jrand48.c	Tue Dec  6 18:58:42 2016	(r309649)
+++ head/lib/libc/gen/jrand48.c	Tue Dec  6 19:08:29 2016	(r309650)
@@ -14,11 +14,14 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <stdint.h>
+
 #include "rand48.h"
 
 long
 jrand48(unsigned short xseed[3])
 {
+
 	_dorand48(xseed);
-	return ((long) xseed[2] << 16) + (long) xseed[1];
+	return ((int32_t)(((uint32_t)xseed[2] << 16) | (uint32_t)xseed[1]));
 }

Modified: head/lib/libc/gen/mrand48.c
==============================================================================
--- head/lib/libc/gen/mrand48.c	Tue Dec  6 18:58:42 2016	(r309649)
+++ head/lib/libc/gen/mrand48.c	Tue Dec  6 19:08:29 2016	(r309650)
@@ -14,6 +14,8 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <stdint.h>
+
 #include "rand48.h"
 
 extern unsigned short _rand48_seed[3];
@@ -21,6 +23,8 @@ extern unsigned short _rand48_seed[3];
 long
 mrand48(void)
 {
+
 	_dorand48(_rand48_seed);
-	return ((long) _rand48_seed[2] << 16) + (long) _rand48_seed[1];
+	return ((int32_t)(((uint32_t)_rand48_seed[2] << 16) |
+	    (uint32_t)_rand48_seed[1]));
 }


More information about the svn-src-head mailing list