ssp.c (__guard_setup): For Windows...
authorGeorg Koppen <gk@torproject.org>
Tue, 10 Feb 2015 01:44:08 +0000 (01:44 +0000)
committerJeff Law <law@gcc.gnu.org>
Tue, 10 Feb 2015 01:44:08 +0000 (18:44 -0700)
       * ssp.c (__guard_setup): For Windows, use approved
       methods to get a suitable random number for the stack
       check guard rather than reading /dev/random.

From-SVN: r220559

libssp/ChangeLog
libssp/ssp.c

index d1580a37e98658c40c0bbe9632299b74a6d37f46..843992ebdb89efd9a5a2643fb9e47961fb771f9e 100644 (file)
@@ -1,3 +1,10 @@
+2015-02-09  Georg Koppen  <gk@torproject.org>
+
+       * ssp.c: Conditionally include <windows.h>
+       (__guard_setup): For Windows, use approved methods to get
+       a suitable random number for the stack check guard rather
+       than reading /dev/random.
+
 2015-01-22  Matthias Klose  <doko@ubuntu.com>
 
        * gets-chk.c: Declare prototype for gets in C11 mode.
index 96adf17ce3fe792801dca8aa5d62c88045b7872a..38e3ec83f6b5051770aa813a2b9a25bebd7f7402 100644 (file)
@@ -55,6 +55,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 /* Native win32 apps don't know about /dev/tty but can print directly
    to the console using  "CONOUT$"   */
 #if defined (_WIN32) && !defined (__CYGWIN__)
+#include <windows.h>
 # define _PATH_TTY "CONOUT$"
 #else
 # define _PATH_TTY "/dev/tty"
@@ -75,6 +76,20 @@ __guard_setup (void)
   if (__stack_chk_guard != 0)
     return;
 
+#if defined (_WIN32) && !defined (__CYGWIN__)
+  HCRYPTPROV hprovider = 0;
+  if (CryptAcquireContext(&hprovider, NULL, NULL, PROV_RSA_FULL,
+                          CRYPT_VERIFYCONTEXT | CRYPT_SILENT))
+    {
+      if (CryptGenRandom(hprovider, sizeof (__stack_chk_guard),
+          (BYTE *)&__stack_chk_guard) &&  __stack_chk_guard != 0)
+        {
+           CryptReleaseContext(hprovider, 0);
+           return;
+        }
+      CryptReleaseContext(hprovider, 0);
+    }
+#else
   fd = open ("/dev/urandom", O_RDONLY);
   if (fd != -1)
     {
@@ -85,6 +100,7 @@ __guard_setup (void)
         return;
     }
 
+#endif
   /* If a random generator can't be used, the protector switches the guard
      to the "terminator canary".  */
   p = (unsigned char *) &__stack_chk_guard;