summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPauli <paul.dale@oracle.com>2019-03-25 11:52:58 +1000
committerPauli <paul.dale@oracle.com>2019-03-28 08:05:18 +1000
commit045162e52c7eabe241cc831f3fb0f81ba47b8e48 (patch)
tree406e766e432215c60d83a41c6af4778807965033
parent2500c093aa1e9c90c11c415053c0a27a00661d0d (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.h22
-rw-r--r--test/params_api_test.c23
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 {