diff options
author | Pauli <paul.dale@oracle.com> | 2019-03-25 11:52:58 +1000 |
---|---|---|
committer | Pauli <paul.dale@oracle.com> | 2019-03-28 08:05:18 +1000 |
commit | 045162e52c7eabe241cc831f3fb0f81ba47b8e48 (patch) | |
tree | 406e766e432215c60d83a41c6af4778807965033 | |
parent | 2500c093aa1e9c90c11c415053c0a27a00661d0d (diff) |
Detect endian without relying on defined symbols.
Reviewed-by: Richard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/8572)
-rw-r--r-- | test/endian.h | 22 | ||||
-rw-r--r-- | test/params_api_test.c | 23 |
2 files changed, 35 insertions, 10 deletions
diff --git a/test/endian.h b/test/endian.h new file mode 100644 index 0000000000..0bcec047e6 --- /dev/null +++ b/test/endian.h @@ -0,0 +1,22 @@ +/* + * Copyright 2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#ifndef HEADER_INTERNAL_ENDIAN_H +# define HEADER_INTERNAL_ENDIAN_H + +# define DECLARE_IS_ENDIAN \ + const union { \ + long one; \ + char little; \ + } ossl_is_endian = { 1 } + +# define IS_LITTLE_ENDIAN (ossl_is_endian.little != 0) +# define IS_BIG_ENDIAN (ossl_is_endian.little == 0) + +#endif diff --git a/test/params_api_test.c b/test/params_api_test.c index e59266152b..c99af3d58b 100644 --- a/test/params_api_test.c +++ b/test/params_api_test.c @@ -11,6 +11,7 @@ #include <string.h> #include "testutil.h" #include "internal/nelem.h" +#include "endian.h" #include <openssl/params.h> #include <openssl/bn.h> @@ -27,20 +28,22 @@ static void swap_copy(unsigned char *out, const void *in, size_t len) static void copy_to_le(unsigned char *out, const void *in, size_t len) { -#ifdef B_ENDIAN - swap_copy(out, in, len); -#else - memcpy(out, in, len); -#endif + DECLARE_IS_ENDIAN; + + if (IS_LITTLE_ENDIAN) + memcpy(out, in, len); + else + swap_copy(out, in, len); } static void copy_be_to_native(unsigned char *out, const void *in, size_t len) { -#ifdef B_ENDIAN - memcpy(out, in, len); -#else - swap_copy(out, in, len); -#endif + DECLARE_IS_ENDIAN; + + if (IS_LITTLE_ENDIAN) + swap_copy(out, in, len); + else + memcpy(out, in, len); } static const struct { |