Jelajahi Sumber

Try reopening /dev/urandom if there is a problem.

Adam Ierymenko 9 tahun lalu
induk
melakukan
598a1d8dd7
1 mengubah file dengan 11 tambahan dan 5 penghapusan
  1. 11 5
      node/Utils.cpp

+ 11 - 5
node/Utils.cpp

@@ -181,7 +181,7 @@ void Utils::getSecureRandom(void *buf,unsigned int bytes)
 
 
 #ifdef __UNIX_LIKE__
 #ifdef __UNIX_LIKE__
 
 
-	static char randomBuf[65536];
+	static char randomBuf[131072];
 	static unsigned int randomPtr = sizeof(randomBuf);
 	static unsigned int randomPtr = sizeof(randomBuf);
 	static int devURandomFd = -1;
 	static int devURandomFd = -1;
 	static Mutex globalLock;
 	static Mutex globalLock;
@@ -199,10 +199,16 @@ void Utils::getSecureRandom(void *buf,unsigned int bytes)
 
 
 	for(unsigned int i=0;i<bytes;++i) {
 	for(unsigned int i=0;i<bytes;++i) {
 		if (randomPtr >= sizeof(randomBuf)) {
 		if (randomPtr >= sizeof(randomBuf)) {
-			if ((int)::read(devURandomFd,randomBuf,sizeof(randomBuf)) != (int)sizeof(randomBuf)) {
-				fprintf(stderr,"FATAL ERROR: Utils::getSecureRandom() unable to read from /dev/urandom\n");
-				exit(1);
-				return;
+			for(;;) {
+				if ((int)::read(devURandomFd,randomBuf,sizeof(randomBuf)) != (int)sizeof(randomBuf)) {
+					::close(devURandomFd);
+					devURandomFd = ::open("/dev/urandom",O_RDONLY);
+					if (devURandomFd <= 0) {
+						fprintf(stderr,"FATAL ERROR: Utils::getSecureRandom() unable to open /dev/urandom\n");
+						exit(1);
+						return;
+					}
+				} else break;
 			}
 			}
 			randomPtr = 0;
 			randomPtr = 0;
 		}
 		}