From nobody@FreeBSD.org  Wed Jan 27 18:57:45 2010
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 431CC106566C
	for <freebsd-gnats-submit@FreeBSD.org>; Wed, 27 Jan 2010 18:57:45 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (www.freebsd.org [IPv6:2001:4f8:fff6::21])
	by mx1.freebsd.org (Postfix) with ESMTP id 192998FC14
	for <freebsd-gnats-submit@FreeBSD.org>; Wed, 27 Jan 2010 18:57:45 +0000 (UTC)
Received: from www.freebsd.org (localhost [127.0.0.1])
	by www.freebsd.org (8.14.3/8.14.3) with ESMTP id o0RIviiS090817
	for <freebsd-gnats-submit@FreeBSD.org>; Wed, 27 Jan 2010 18:57:44 GMT
	(envelope-from nobody@www.freebsd.org)
Received: (from nobody@localhost)
	by www.freebsd.org (8.14.3/8.14.3/Submit) id o0RIviL6090816;
	Wed, 27 Jan 2010 18:57:44 GMT
	(envelope-from nobody)
Message-Id: <201001271857.o0RIviL6090816@www.freebsd.org>
Date: Wed, 27 Jan 2010 18:57:44 GMT
From: James Juran <james.juran@baesystems.com>
To: freebsd-gnats-submit@FreeBSD.org
Subject: random_yarrow_block() doesn't actually block when not seeded
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         143298
>Category:       kern
>Synopsis:       [random] [patch] random_yarrow_block() doesn't actually block when not seeded
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    delphij
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Wed Jan 27 19:00:01 UTC 2010
>Closed-Date:    Fri Mar 01 00:47:19 UTC 2013
>Last-Modified:  Fri Mar  1 00:50:03 UTC 2013
>Originator:     James Juran
>Release:        FreeBSD-8.0
>Organization:
BAE Systems
>Environment:
FreeBSD freebsd8.goldlnk.rootlnka.net 8.0-RELEASE FreeBSD 8.0-RELEASE #0: Sat Nov 21 15:48:17 UTC 2009     root@almeida.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  i386
>Description:
I believe r153575 introduced a problem with the /dev/random yarrow random number generator's blocking when it is not seeded.

This has likely not been noticed until now because yarrow is marked as seeded when it is loaded by default, so someone would have to change the sysctl value from the default.  This problem likely only affects users who want to do "better" seeding of /dev/random than is provided by /etc/rc.d/initrandom.

In this change the blocking logic was moved from random_read() into a .block method for the particular random number generation method so that the GIANT lock could be removed.  In doing this though, the loop guard appears to have been inadvertently changed from

while (!random_systat.seeded && !error)

to 

while (random_systat.seeded && !error)

>How-To-Repeat:
In FreeBSD 8.0, this incorrect behavior can be observed by doing:

// By default it is seeded and outputs data; no problem here
[root@freebsd8 ~]# sysctl kern.random.sys.seeded
kern.random.sys.seeded: 1
[root@freebsd8 ~]# time dd if=/dev/random bs=1 count=1
=1+0 records in
1+0 records out
1 bytes transferred in 0.000006 secs (167772 bytes/sec)

real    0m0.005s
user    0m0.000s
sys     0m0.006s


// Now mark it as unseeded.  It still produces data and is still marked
// as unseeded after the data is produced.  It should block until the
// seeding is complete.
[root@freebsd8 ~]# sysctl kern.random.sys.seeded=0
kern.random.sys.seeded: 1 -> 0
[root@freebsd8 ~]# time dd if=/dev/random bs=1 count=1
1+0 records in
1+0 records out
1 bytes transferred in 0.000006 secs (167772 bytes/sec)

real    0m0.006s
user    0m0.000s
sys     0m0.006s
[root@freebsd8 ~]# sysctl kern.random.sys.seeded
kern.random.sys.seeded: 0

>Fix:
I have not tested this fix and am not able to do so, but I think this will solve the problem and restore the intended behavior.




Patch attached with submission follows:

Index: sys/dev/random/randomdev_soft.c
===================================================================
--- sys/dev/random/randomdev_soft.c	(revision 203082)
+++ sys/dev/random/randomdev_soft.c	(working copy)
@@ -391,7 +391,7 @@ random_yarrow_block(int flag)
 	mtx_lock(&random_reseed_mtx);
 
 	/* Blocking logic */
-	while (random_systat.seeded && !error) {
+	while (!random_systat.seeded && !error) {
 		if (flag & O_NONBLOCK)
 			error = EWOULDBLOCK;
 		else {


>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: freebsd-bugs->secteam 
Responsible-Changed-By: bz 
Responsible-Changed-When: Thu Jan 28 07:17:32 UTC 2010 
Responsible-Changed-Why:  
. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=143298 
State-Changed-From-To: open->patched 
State-Changed-By: delphij 
State-Changed-When: Tue Feb 26 18:33:34 UTC 2013 
State-Changed-Why:  
Patch committed as r247334.  MFC reminder. 


Responsible-Changed-From-To: secteam->delphij 
Responsible-Changed-By: delphij 
Responsible-Changed-When: Tue Feb 26 18:33:34 UTC 2013 
Responsible-Changed-Why:  
Take. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=143298 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/143298: commit references a PR
Date: Tue, 26 Feb 2013 18:33:32 +0000 (UTC)

 Author: delphij
 Date: Tue Feb 26 18:33:23 2013
 New Revision: 247334
 URL: http://svnweb.freebsd.org/changeset/base/247334
 
 Log:
   Correct a typo introduced in r153575, which gives inverted logic when
   handling blocking semantics when seeding.
   
   PR:		kern/143298
   Submitted by:	James Juran <james juran baesystems com>
   Reviewed by:	markm
   MFC after:	3 days
 
 Modified:
   head/sys/dev/random/randomdev_soft.c
 
 Modified: head/sys/dev/random/randomdev_soft.c
 ==============================================================================
 --- head/sys/dev/random/randomdev_soft.c	Tue Feb 26 18:31:03 2013	(r247333)
 +++ head/sys/dev/random/randomdev_soft.c	Tue Feb 26 18:33:23 2013	(r247334)
 @@ -391,7 +391,7 @@ random_yarrow_block(int flag)
  	mtx_lock(&random_reseed_mtx);
  
  	/* Blocking logic */
 -	while (random_systat.seeded && !error) {
 +	while (!random_systat.seeded && !error) {
  		if (flag & O_NONBLOCK)
  			error = EWOULDBLOCK;
  		else {
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 
State-Changed-From-To: patched->closed 
State-Changed-By: delphij 
State-Changed-When: Fri Mar 1 00:46:57 UTC 2013 
State-Changed-Why:  
Patch applied to {6,7,8,9}-STABLE. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=143298 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/143298: commit references a PR
Date: Fri,  1 Mar 2013 00:47:46 +0000 (UTC)

 Author: delphij
 Date: Fri Mar  1 00:46:41 2013
 New Revision: 247511
 URL: http://svnweb.freebsd.org/changeset/base/247511
 
 Log:
   MFC r247334:
   
   Correct a typo introduced in r153575, which gives inverted logic when
   handling blocking semantics when seeding.
   
   PR:		kern/143298
   Submitted by:	James Juran <james juran baesystems com>
   Reviewed by:	markm
 
 Modified:
   stable/6/sys/dev/random/randomdev_soft.c
 Directory Properties:
   stable/6/sys/   (props changed)
 
 Changes in other areas also in this revision:
 Modified:
   stable/7/sys/dev/random/randomdev_soft.c
   stable/8/sys/dev/random/randomdev_soft.c
   stable/9/sys/dev/random/randomdev_soft.c
 Directory Properties:
   stable/7/sys/   (props changed)
   stable/8/sys/   (props changed)
   stable/8/sys/dev/   (props changed)
   stable/8/sys/dev/random/   (props changed)
   stable/9/sys/   (props changed)
   stable/9/sys/dev/   (props changed)
 
 Modified: stable/6/sys/dev/random/randomdev_soft.c
 ==============================================================================
 --- stable/6/sys/dev/random/randomdev_soft.c	Fri Mar  1 00:15:58 2013	(r247510)
 +++ stable/6/sys/dev/random/randomdev_soft.c	Fri Mar  1 00:46:41 2013	(r247511)
 @@ -400,7 +400,7 @@ random_yarrow_block(int flag)
  	mtx_lock(&random_reseed_mtx);
  
  	/* Blocking logic */
 -	while (random_systat.seeded && !error) {
 +	while (!random_systat.seeded && !error) {
  		if (flag & O_NONBLOCK)
  			error = EWOULDBLOCK;
  		else {
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/143298: commit references a PR
Date: Fri,  1 Mar 2013 00:46:48 +0000 (UTC)

 Author: delphij
 Date: Fri Mar  1 00:46:41 2013
 New Revision: 247511
 URL: http://svnweb.freebsd.org/changeset/base/247511
 
 Log:
   MFC r247334:
   
   Correct a typo introduced in r153575, which gives inverted logic when
   handling blocking semantics when seeding.
   
   PR:		kern/143298
   Submitted by:	James Juran <james juran baesystems com>
   Reviewed by:	markm
 
 Modified:
   stable/9/sys/dev/random/randomdev_soft.c
 Directory Properties:
   stable/9/sys/   (props changed)
   stable/9/sys/dev/   (props changed)
 
 Changes in other areas also in this revision:
 Modified:
   stable/6/sys/dev/random/randomdev_soft.c
   stable/7/sys/dev/random/randomdev_soft.c
   stable/8/sys/dev/random/randomdev_soft.c
 Directory Properties:
   stable/6/sys/   (props changed)
   stable/7/sys/   (props changed)
   stable/8/sys/   (props changed)
   stable/8/sys/dev/   (props changed)
   stable/8/sys/dev/random/   (props changed)
 
 Modified: stable/9/sys/dev/random/randomdev_soft.c
 ==============================================================================
 --- stable/9/sys/dev/random/randomdev_soft.c	Fri Mar  1 00:15:58 2013	(r247510)
 +++ stable/9/sys/dev/random/randomdev_soft.c	Fri Mar  1 00:46:41 2013	(r247511)
 @@ -391,7 +391,7 @@ random_yarrow_block(int flag)
  	mtx_lock(&random_reseed_mtx);
  
  	/* Blocking logic */
 -	while (random_systat.seeded && !error) {
 +	while (!random_systat.seeded && !error) {
  		if (flag & O_NONBLOCK)
  			error = EWOULDBLOCK;
  		else {
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/143298: commit references a PR
Date: Fri,  1 Mar 2013 00:47:10 +0000 (UTC)

 Author: delphij
 Date: Fri Mar  1 00:46:41 2013
 New Revision: 247511
 URL: http://svnweb.freebsd.org/changeset/base/247511
 
 Log:
   MFC r247334:
   
   Correct a typo introduced in r153575, which gives inverted logic when
   handling blocking semantics when seeding.
   
   PR:		kern/143298
   Submitted by:	James Juran <james juran baesystems com>
   Reviewed by:	markm
 
 Modified:
   stable/8/sys/dev/random/randomdev_soft.c
 Directory Properties:
   stable/8/sys/   (props changed)
   stable/8/sys/dev/   (props changed)
   stable/8/sys/dev/random/   (props changed)
 
 Changes in other areas also in this revision:
 Modified:
   stable/6/sys/dev/random/randomdev_soft.c
   stable/7/sys/dev/random/randomdev_soft.c
   stable/9/sys/dev/random/randomdev_soft.c
 Directory Properties:
   stable/6/sys/   (props changed)
   stable/7/sys/   (props changed)
   stable/9/sys/   (props changed)
   stable/9/sys/dev/   (props changed)
 
 Modified: stable/8/sys/dev/random/randomdev_soft.c
 ==============================================================================
 --- stable/8/sys/dev/random/randomdev_soft.c	Fri Mar  1 00:15:58 2013	(r247510)
 +++ stable/8/sys/dev/random/randomdev_soft.c	Fri Mar  1 00:46:41 2013	(r247511)
 @@ -391,7 +391,7 @@ random_yarrow_block(int flag)
  	mtx_lock(&random_reseed_mtx);
  
  	/* Blocking logic */
 -	while (random_systat.seeded && !error) {
 +	while (!random_systat.seeded && !error) {
  		if (flag & O_NONBLOCK)
  			error = EWOULDBLOCK;
  		else {
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/143298: commit references a PR
Date: Fri,  1 Mar 2013 00:47:20 +0000 (UTC)

 Author: delphij
 Date: Fri Mar  1 00:46:41 2013
 New Revision: 247511
 URL: http://svnweb.freebsd.org/changeset/base/247511
 
 Log:
   MFC r247334:
   
   Correct a typo introduced in r153575, which gives inverted logic when
   handling blocking semantics when seeding.
   
   PR:		kern/143298
   Submitted by:	James Juran <james juran baesystems com>
   Reviewed by:	markm
 
 Modified:
   stable/7/sys/dev/random/randomdev_soft.c
 Directory Properties:
   stable/7/sys/   (props changed)
 
 Changes in other areas also in this revision:
 Modified:
   stable/6/sys/dev/random/randomdev_soft.c
   stable/8/sys/dev/random/randomdev_soft.c
   stable/9/sys/dev/random/randomdev_soft.c
 Directory Properties:
   stable/6/sys/   (props changed)
   stable/8/sys/   (props changed)
   stable/8/sys/dev/   (props changed)
   stable/8/sys/dev/random/   (props changed)
   stable/9/sys/   (props changed)
   stable/9/sys/dev/   (props changed)
 
 Modified: stable/7/sys/dev/random/randomdev_soft.c
 ==============================================================================
 --- stable/7/sys/dev/random/randomdev_soft.c	Fri Mar  1 00:15:58 2013	(r247510)
 +++ stable/7/sys/dev/random/randomdev_soft.c	Fri Mar  1 00:46:41 2013	(r247511)
 @@ -394,7 +394,7 @@ random_yarrow_block(int flag)
  	mtx_lock(&random_reseed_mtx);
  
  	/* Blocking logic */
 -	while (random_systat.seeded && !error) {
 +	while (!random_systat.seeded && !error) {
  		if (flag & O_NONBLOCK)
  			error = EWOULDBLOCK;
  		else {
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 
>Unformatted:
