Skip to content

Commit

Permalink
merge 294825: Detect if we can rely on compiler-specific alignment fe…
Browse files Browse the repository at this point in the history
…atures else

use custom workarounds. Fixes #50753 (johannes)
  • Loading branch information
johannes committed Feb 9, 2010
1 parent a1da67e commit ef916d7
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 10 deletions.
35 changes: 35 additions & 0 deletions ext/standard/config.m4
Expand Up @@ -235,6 +235,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])
Expand Down
16 changes: 11 additions & 5 deletions ext/standard/crypt_sha256.c
Expand Up @@ -19,7 +19,15 @@
# elif HAVE_STDINT_H
# include <stdint.h>
# endif
# include <stdbool.h>
# 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>
Expand Down Expand Up @@ -344,10 +352,8 @@ char * php_sha256_crypt_r(const char *key, const char *salt, char *buffer, int b
__declspec(align(32)) unsigned char temp_result[32];
# endif
#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;
Expand Down
16 changes: 11 additions & 5 deletions ext/standard/crypt_sha512.c
Expand Up @@ -18,7 +18,15 @@
# elif HAVE_STDINT_H
# include <stdint.h>
# endif
# include <stdbool.h>
# 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>
Expand Down Expand Up @@ -372,10 +380,8 @@ php_sha512_crypt_r(const char *key, const char *salt, char *buffer, int buflen)
__declspec(align(64)) unsigned char temp_result[64];
# endif
#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;
Expand Down

0 comments on commit ef916d7

Please sign in to comment.