]> granicus.if.org Git - php/commitdiff
Detect if we can rely on compiler-specific alignment features else use custom
authorJohannes Schlüter <johannes@php.net>
Tue, 9 Feb 2010 21:58:13 +0000 (21:58 +0000)
committerJohannes Schlüter <johannes@php.net>
Tue, 9 Feb 2010 21:58:13 +0000 (21:58 +0000)
workarounds. Fixes #50753

ext/standard/config.m4
ext/standard/crypt_sha256.c
ext/standard/crypt_sha512.c

index a25f47a2b6306eea3f6d9084e2843817ffbd28e2..bc7c7a369e8280e7ee5a79bd155fd63fa8786230 100644 (file)
@@ -236,6 +236,41 @@ dnl
 dnl If one of them is missing, use our own implementation, portable code is then possible
 dnl
 if test "$ac_cv_crypt_blowfish" = "no" || test "$ac_cv_crypt_des" = "no" || test "$ac_cv_crypt_ext_des" = "no" || test "x$php_crypt_r" = "x0"; then
+
+  dnl
+  dnl Check for __alignof__ support in the compiler
+  dnl
+  AC_CACHE_CHECK(whether the compiler supports __alignof__,ac_cv_alignof_exists,[
+  AC_TRY_COMPILE([
+int main() {
+       int align = __alignof__(int);
+       return 0;
+}
+  ],[
+    ac_cv_alignof_exists=yes
+  ],[
+    ac_cv_alignof_exists=no
+  ])])
+  if test "$ac_cv_alignof_exists" = "yes"; then
+    AC_DEFINE([HAVE_ALIGNOF], 1, [whether the compiler supports __alignof__])
+  fi
+
+  dnl 
+  dnl Check for __attribute__ ((__aligned__)) support in the compiler
+  dnl
+  AC_CACHE_CHECK(whether the compiler supports aligned attribute,ac_cv_attribute_aligned,[
+  AC_TRY_COMPILE([
+    unsigned char test[32] __attribute__ ((__aligned__ (__alignof__ (int))));
+  ],[
+    ac_cv_attribute_aligned=yes
+  ],[
+    ac_cv_attribute_aligned=no
+  ])])
+  if test "$ac_cv_attribute_aligned" = "yes"; then
+    AC_DEFINE([HAVE_ATTRIBUTE_ALIGNED], 1, [wheter the compiler supports __attribute__ ((__aligned__))])
+  fi
+    
+
   AC_DEFINE_UNQUOTED(PHP_USE_PHP_CRYPT_R, 1, [Whether PHP has to use its own crypt_r for blowfish, des, ext des and md5])
   AC_DEFINE_UNQUOTED(PHP_STD_DES_CRYPT, 1, [Whether the system supports standard DES salt])
   AC_DEFINE_UNQUOTED(PHP_BLOWFISH_CRYPT, 1, [Whether the system supports BlowFish salt])
index c33855f5f5a04f06ab7b42612fe1e0a2f5c0366a..67429e467a7ec6281db0c774c1fc030ec592e4e3 100644 (file)
 # elif HAVE_STDINT_H
 #  include <stdint.h>
 # endif
+# ifndef HAVE_ALIGNOF
+#  include <stddef.h>
+#  define __alignof__(type) offsetof (struct { char c; type member;}, member)
+# endif
+# if HAVE_ATTRIBUTE_ALIGNED
+#  define ALIGNED(size) __attribute__ ((__aligned__ (size)))
+# else
+#  define ALIGNED(size)
+# endif
 #endif
 
 #include <stdio.h>
@@ -335,10 +344,8 @@ char * php_sha256_crypt_r(const char *key, const char *salt, char *buffer, int b
        __declspec(align(32)) unsigned char alt_result[32];
        __declspec(align(32)) unsigned char temp_result[32];
 #else
-       unsigned char alt_result[32]
-       __attribute__ ((__aligned__ (__alignof__ (uint32_t))));
-       unsigned char temp_result[32]
-       __attribute__ ((__aligned__ (__alignof__ (uint32_t))));
+       unsigned char alt_result[32] ALIGNED(__alignof__ (uint32_t));
+       unsigned char temp_result[32] ALIGNED(__alignof__ (uint32_t));
 #endif
 
        struct sha256_ctx ctx;
index f32e4a0f8af34097234edb76248e4657e94c80eb..1d76b3bbf44c3d7e75618c7edbe3e090cad7e052 100644 (file)
 # elif HAVE_STDINT_H
 #  include <stdint.h>
 # endif
+# ifndef HAVE_ALIGNOF
+#  include <stddef.h>
+#  define __alignof__(type) offsetof (struct { char c; type member;}, member)
+# endif
+# if HAVE_ATTRIBUTE_ALIGNED
+#  define ALIGNED(size) __attribute__ ((__aligned__ (size)))
+# else
+#  define ALIGNED(size)
+# endif
 #endif
 
 #include <stdio.h>
@@ -363,10 +372,8 @@ php_sha512_crypt_r(const char *key, const char *salt, char *buffer, int buflen)
        __declspec(align(64)) unsigned char alt_result[64];
        __declspec(align(64)) unsigned char temp_result[64];
 #else
-       unsigned char alt_result[64]
-               __attribute__ ((__aligned__ (__alignof__ (uint64_t))));
-       unsigned char temp_result[64]
-               __attribute__ ((__aligned__ (__alignof__ (uint64_t))));
+       unsigned char alt_result[64] ALIGNED(__alignof__ (uint64_t));
+       unsigned char temp_result[64] ALIGNED(__alignof__ (uint64_t));
 #endif
        struct sha512_ctx ctx;
        struct sha512_ctx alt_ctx;