[Dovecot] Dovecot + SSL + Fedora

Mark E. Mallett mem at mv.mv.com
Mon May 24 20:10:59 EEST 2004


On Mon, May 24, 2004 at 07:50:54PM +0300, Timo Sirainen wrote:
> 
> This could also be fixed by patching OpenSSL (I think). Patch in 
> https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=115284

That looks similar to a private patch I created some time back when
openssl changed its RAND_bytes logic .  I've moved it forward to
successive openssl releases as I've installed them.  This is pretty
specific to the environment here though-- particularly where you know
that you have a /dev/urandom.  That openssl change (the one that
necessitated this patch) also broke systems where the /dev/urandom was
implemented via a pipe to a command.

Anyway, just for grins.. here's that local patch as carried forward
to 0.9.7d 

*** rand_unix.c.orig	Sat Dec 27 11:01:52 2003
--- rand_unix.c	Wed Mar 17 23:13:25 2004
***************
*** 167,182 ****
--- 167,203 ----
  
  	for (randomfile = randomfiles; *randomfile && n < ENTROPY_NEEDED; randomfile++)
  		{
+ 
+ #ifndef MV_COMM
  		if ((fd = open(*randomfile, O_RDONLY|O_NONBLOCK
+ #else	/* mem 20030409 -- yes, let's block */
+ 		if ((fd = open(*randomfile, O_RDONLY
+ #endif	/* MV_COMM */
+ 
  #ifdef O_NOCTTY /* If it happens to be a TTY (god forbid), do not make it
  		   our controlling tty */
  			|O_NOCTTY
  #endif
+ 
+ #ifndef MV_COMM		/* mem 20030409 -- we don't have O_NOFOLLOW
+ 			   but let's not even accidently consider
+ 			   preventing following symbolic link here.
+ 			*/
  #ifdef O_NOFOLLOW /* Fail if the file is a symbolic link */
  			|O_NOFOLLOW
  #endif
+ #endif	/* MV_COMM */
  			)) >= 0)
  			{
+ 
+ #ifndef MV_COMM		/* mem 20030409 -- don't do this idiotic timeout
+ 			   stuff-- just read from the file.  I don't care
+ 			   if it hangs forever, it's better than failing.
+ 			   Besides we'll put /dev/urandom first in the
+ 			   list so if it hangs there are bigger problems
+ 			   anyway.
+ 			*/
+ 
  			struct timeval t = { 0, 10*1000 }; /* Spend 10ms on
  							      each file. */
  			int r;
***************
*** 208,213 ****
--- 229,251 ----
  				}
  			while ((r > 0 || (errno == EINTR || errno == EAGAIN))
  				&& t.tv_usec != 0 && n < ENTROPY_NEEDED);
+ 
+ #else		/* MV_COMM */
+ 
+ 			int r;
+ 			do {
+ 			    r = read(fd, (unsigned char*)tmpbuf+n,
+ 				         ENTROPY_NEEDED-n);
+ 			    if ( r > 0 )
+ 			        n += r;
+ 			}
+ 			while ( (r > 0) ||
+ 			        ( (errno == EINTR) || ( errno == EAGAIN ) ) );
+ 				/* yeah sure, check for AGAIN even though we
+ 				   should be blocking.
+ 				*/
+ 
+ #endif		/* MV_COMM */
  
  			close(fd);
  			}


More information about the dovecot mailing list