Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 6 Dec 2016 19:08:29 +0000 (UTC)
From:      Ed Schouten <ed@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r309650 - head/lib/libc/gen
Message-ID:  <201612061908.uB6J8TMS025860@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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]));
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201612061908.uB6J8TMS025860>