From 045162e52c7eabe241cc831f3fb0f81ba47b8e48 Mon Sep 17 00:00:00 2001 From: Pauli Date: Mon, 25 Mar 2019 11:52:58 +1000 Subject: [PATCH] Detect endian without relying on defined symbols. Reviewed-by: Richard Levitte (Merged from https://github.com/openssl/openssl/pull/8572) --- test/endian.h | 22 ++++++++++++++++++++++ test/params_api_test.c | 23 +++++++++++++---------- 2 files changed, 35 insertions(+), 10 deletions(-) create mode 100644 test/endian.h 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 #include "testutil.h" #include "internal/nelem.h" +#include "endian.h" #include #include @@ -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 { -- 2.25.1