Make the CRYPTO_memcmp() prototype match memcmp()
Reviewed-by: Andy Polyakov <appro@openssl.org> GH: #2633
This commit is contained in:
parent
39176d4424
commit
497910833e
2 changed files with 9 additions and 22 deletions
|
@ -313,26 +313,15 @@ void OPENSSL_die(const char *message, const char *file, int line)
|
|||
}
|
||||
|
||||
#if !defined(OPENSSL_CPUID_OBJ)
|
||||
/* 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.
|
||||
/*
|
||||
* The volatile is used to to ensure that the compiler generates code that reads
|
||||
* all values from the array and doesn't try to optimize this away. The standard
|
||||
* doesn't actually require this behavior if the original data pointed to is
|
||||
* not volatile, but compilers do this in practice anyway.
|
||||
*
|
||||
* There are also assembler versions of this function.
|
||||
*/
|
||||
int CRYPTO_memcmp(const volatile void * volatile in_a,
|
||||
const volatile void * volatile in_b,
|
||||
size_t len)
|
||||
int CRYPTO_memcmp(const void * in_a, const void * in_b, size_t len)
|
||||
{
|
||||
size_t i;
|
||||
const volatile unsigned char *a = in_a;
|
||||
|
|
|
@ -347,9 +347,7 @@ int OPENSSL_gmtime_diff(int *pday, int *psec,
|
|||
* into a defined order as the return value when a != b is undefined, other
|
||||
* than to be non-zero.
|
||||
*/
|
||||
int CRYPTO_memcmp(const volatile void * volatile in_a,
|
||||
const volatile void * volatile in_b,
|
||||
size_t len);
|
||||
int CRYPTO_memcmp(const void * in_a, const void * in_b, size_t len);
|
||||
|
||||
/* Standard initialisation options */
|
||||
# define OPENSSL_INIT_NO_LOAD_CRYPTO_STRINGS 0x00000001L
|
||||
|
|
Loading…
Reference in a new issue