Change _gcry_burn_stack take burn depth as unsigned integer
authorJussi Kivilinna <jussi.kivilinna@iki.fi>
Thu, 5 Sep 2013 06:34:25 +0000 (09:34 +0300)
committerJussi Kivilinna <jussi.kivilinna@iki.fi>
Thu, 5 Sep 2013 07:05:24 +0000 (10:05 +0300)
* src/misc.c (_gcry_burn_stack): Change to handle 'unsigned int' bytes.
--

Unsigned integer is better here for code generation because we can now avoid
possible branching caused by (bytes <= 0) check.

Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
src/g10lib.h
src/misc.c

index 2d84dd3..4c34ae5 100644 (file)
@@ -242,7 +242,7 @@ int strcasecmp (const char *a, const char *b) _GCRY_GCC_ATTR_PURE;
 
 /* Stack burning.  */
 
-void _gcry_burn_stack (int bytes);
+void _gcry_burn_stack (unsigned int bytes);
 
 
 /* To avoid that a compiler optimizes certain memset calls away, these
index 135aeb4..dece1d0 100644 (file)
@@ -288,10 +288,11 @@ _gcry_log_printhex (const char *text, const void *buffer, size_t length)
 
 
 void
-_gcry_burn_stack (int bytes)
+_gcry_burn_stack (unsigned int bytes)
 {
 #ifdef HAVE_VLA
-    int buflen = (((bytes <= 0) ? 1 : bytes) + 63) & ~63;
+    /* (bytes == 0 ? 1 : bytes) == (!bytes + bytes) */
+    unsigned int buflen = ((!bytes + bytes) + 63) & ~63;
     volatile char buf[buflen];
 
     wipememory (buf, sizeof buf);
@@ -300,9 +301,8 @@ _gcry_burn_stack (int bytes)
 
     wipememory (buf, sizeof buf);
 
-    bytes -= sizeof buf;
-    if (bytes > 0)
-        _gcry_burn_stack (bytes);
+    if (bytes > sizeof buf)
+        _gcry_burn_stack (bytes - sizeof buf);
 #endif
 }