mailing list of musl libc
 help / color / mirror / code / Atom feed
From: Szabolcs Nagy <nsz@port70.net>
To: musl@lists.openwall.com
Subject: Re: Completeness status of musl
Date: Fri, 24 Jun 2011 14:12:46 +0200	[thread overview]
Message-ID: <20110624121246.GU27421@port70.net> (raw)
In-Reply-To: <20110623185041.GQ27421@port70.net>

[-- Attachment #1: Type: text/plain, Size: 229 bytes --]

* Szabolcs Nagy <nsz@port70.net> [2011-06-23 20:50:41 +0200]:
> * Szabolcs Nagy <nsz@port70.net> [2011-06-23 16:16:08 +0200]:
> > modified a bit to use uint32_t and uint64_t
> 
> i changed the seeding

added locking
(not tested)

[-- Attachment #2: random-lock.diff --]
[-- Type: text/x-diff, Size: 1715 bytes --]

diff --git a/src/prng/random.c b/src/prng/random.c
index 4b2daef..cc5702e 100644
--- a/src/prng/random.c
+++ b/src/prng/random.c
@@ -7,6 +7,7 @@
 
 #include <stdlib.h>
 #include <stdint.h>
+#include "libc.h"
 
 /*
 this code uses the same lagged fibonacci generator as the
@@ -32,6 +33,7 @@ static int n = 31;
 static int i = 3;
 static int j = 0;
 static uint32_t *x = init+1;
+static int lock;
 
 static uint32_t lcg31(uint32_t x) {
 	return (1103515245*x + 12345) & 0x7fffffff;
@@ -53,7 +55,7 @@ static void loadstate(uint32_t *state) {
 	j = x[-1]&0xff;
 }
 
-void srandom(unsigned seed) {
+static void __srandom(unsigned seed) {
 	int k;
 	uint64_t s = seed;
 
@@ -71,11 +73,20 @@ void srandom(unsigned seed) {
 	x[0] |= 1;
 }
 
+void srandom(unsigned seed) {
+	LOCK(&lock);
+	__srandom(seed);
+	UNLOCK(&lock);
+}
+
 char *initstate(unsigned seed, char *state, size_t size) {
-	void *old = savestate();
+	void *old;
+
 	if (size < 8)
 		return 0;
-	else if (size < 32)
+	LOCK(&lock);
+	old = savestate();
+	if (size < 32)
 		n = 0;
 	else if (size < 64)
 		n = 7;
@@ -86,26 +97,36 @@ char *initstate(unsigned seed, char *state, size_t size) {
 	else
 		n = 63;
 	x = (uint32_t*)state + 1;
-	srandom(seed);
+	__srandom(seed);
+	UNLOCK(&lock);
 	return old;
 }
 
 char *setstate(char *state) {
-	void *old = savestate();
+	void *old;
+
+	LOCK(&lock);
+	old = savestate();
 	loadstate((uint32_t*)state);
+	UNLOCK(&lock);
 	return old;
 }
 
 long random(void) {
 	long k;
 
-	if (n == 0)
-		return x[0] = lcg31(x[0]);
+	LOCK(&lock);
+	if (n == 0) {
+		k = x[0] = lcg31(x[0]);
+		goto end;
+	}
 	x[i] += x[j];
 	k = x[i]>>1;
 	if (++i == n)
 		i = 0;
 	if (++j == n)
 		j = 0;
+end:
+	UNLOCK(&lock);
 	return k;
 }

  reply	other threads:[~2011-06-24 12:12 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-05-28 23:41 Help assessing " Rich Felker
2011-05-29 16:19 ` gs
2011-05-29 16:44   ` gs
2011-05-29 17:32     ` gs
2011-05-29 18:08       ` Szabolcs Nagy
2011-05-30 10:30         ` Szabolcs Nagy
2011-05-30 15:47           ` Rich Felker
2011-05-30 17:27             ` Szabolcs Nagy
2011-06-08 23:58               ` Completeness " Rich Felker
2011-06-21  1:46                 ` Szabolcs Nagy
2011-06-23  6:54                   ` Rich Felker
2011-06-23 13:25                     ` Szabolcs Nagy
2011-06-23 14:16                       ` Szabolcs Nagy
2011-06-23 18:50                         ` Szabolcs Nagy
2011-06-24 12:12                           ` Szabolcs Nagy [this message]
2011-06-25 18:31                 ` Szabolcs Nagy
2011-06-26 10:30                   ` Szabolcs Nagy
2011-06-29 21:14                 ` Rich Felker
2011-07-05 15:40                   ` Hiltjo Posthuma
2011-06-18 21:32               ` Help assessing " Szabolcs Nagy

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20110624121246.GU27421@port70.net \
    --to=nsz@port70.net \
    --cc=musl@lists.openwall.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).