Comment "secure memcmp" implementation
authorDmitry-Me <wipedout@yandex.ru>
Mon, 1 Feb 2016 08:48:28 +0000 (11:48 +0300)
committerRich Salz <rsalz@openssl.org>
Mon, 1 Feb 2016 13:32:58 +0000 (08:32 -0500)
Signed-off-by: Rich Salz <rsalz@openssl.org>
Reviewed-by: Tim Hudson <tjh@openssl.org>
crypto/cryptlib.c

index d31734068ba85e6b198f2574972c4b81f5dd8c26..bd58d357570a14b3bbfbc89157dfc9922e8b18b3 100644 (file)
@@ -465,6 +465,23 @@ void OpenSSLDie(const char *file, int line, const char *assertion)
 #endif
 }
 
+/* volatile unsigned char* pointers are there because
+ * 1. Accessing a variable declared volatile via a pointer
+ *    that lacks a volatile qualifier causes undefined behavior.
+ * 2. When the variable itself is not volatile the compiler is
+ *    not required to keep all those reads and can convert
+ *    this into canonical memcmp() which doesn't read the whole block.
+ * Pointers to volatile resolve the first problem fully. The second
+ * problem cannot be resolved in any Standard-compliant way but this
+ * works the problem around. Compilers typically react to
+ * pointers to volatile by preserving the reads and writes through them.
+ * The latter is not required by the Standard if the memory pointed to
+ * is not volatile.
+ * Pointers themselves are volatile in the function signature to work
+ * around a subtle bug in gcc 4.6+ which causes writes through
+ * pointers to volatile to not be emitted in some rare,
+ * never needed in real life, pieces of code.
+ */
 int CRYPTO_memcmp(const volatile void * volatile in_a,
                   const volatile void * volatile in_b,
                   size_t len)