]> source.dussan.org Git - tigervnc.git/commitdiff
[Bugfix] Use /dev/urandom when available for xauth cookie generation (alan dot cooper...
authorAdam Tkac <atkac@redhat.com>
Thu, 12 Nov 2009 10:39:54 +0000 (10:39 +0000)
committerAdam Tkac <atkac@redhat.com>
Thu, 12 Nov 2009 10:39:54 +0000 (10:39 +0000)
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@3921 3789f03b-4d11-0410-bbf8-ca57d06f2519

unix/vncserver

index 90ef0d24ddd9e3ad2439b5019ae91c139e9f8bae..28764cbe363deb531a62582efa528ce4768fa6cd 100755 (executable)
@@ -189,16 +189,25 @@ $vncPort = 5900 + $displayNumber;
 $desktopLog = "$vncUserDir/$host:$displayNumber.log";
 unlink($desktopLog);
 
-# Make an X server cookie - use as the seed the sum of the current time, our
-# PID and part of the encrypted form of the password.  Ideally we'd use
-# /dev/urandom, but that's only available on Linux.
-
-srand(time+$$+unpack("L",`cat $vncUserDir/passwd`));
-$cookie = "";
-for (1..16) {
+# Make an X server cookie - use /dev/urandom on systems that have it,
+# otherwise use perl's random number generator, seeded with the sum
+# of the current time, our PID and part of the encrypted form of the password.
+
+my $cookie = "";
+if (open(URANDOM, '<', '/dev/urandom')) {
+  my $randata;
+  if (sysread(URANDOM, $randata, 16) == 16) {
+    $cookie = unpack 'h*', $randata;
+  }
+  close(URANDOM);
+}
+if ($cookie eq "") {
+  srand(time+$$+unpack("L",`cat $vncUserDir/passwd`));
+  for (1..16) {
     $cookie .= sprintf("%02x", int(rand(256)) % 256);
+  }
 }
-    
+
 system("xauth -f $xauthorityFile add $host:$displayNumber . $cookie");
 system("xauth -f $xauthorityFile add $host/unix:$displayNumber . $cookie");