Detect endian without relying on defined symbols.
authorPauli <paul.dale@oracle.com>
Mon, 25 Mar 2019 01:52:58 +0000 (11:52 +1000)
committerPauli <paul.dale@oracle.com>
Wed, 27 Mar 2019 22:05:18 +0000 (08:05 +1000)
Reviewed-by: Richard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/8572)

test/endian.h [new file with mode: 0644]
test/params_api_test.c

diff --git a/test/endian.h b/test/endian.h
new file mode 100644 (file)
index 0000000..0bcec04
--- /dev/null
@@ -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
index e59266152bf693244d65bc972931eeb9c2998a2f..c99af3d58b206237ed7b5716f0611636b2df3549 100644 (file)
@@ -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 {