From: Antony Dovgal Date: Tue, 12 Dec 2006 07:36:37 +0000 (+0000) Subject: fix #39795 (build fails on AIX because crypt_r() uses different data struct) X-Git-Tag: RELEASE_1_0_0RC1~720 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ec53d3d18aa97653ad4f7ab57bd2d822c52aaf99;p=php fix #39795 (build fails on AIX because crypt_r() uses different data struct) --- diff --git a/acinclude.m4 b/acinclude.m4 index efc7ccca0f..d4af13aabf 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -2590,3 +2590,55 @@ AC_DEFUN([PHP_DETECT_ICC], ) ]) +dnl +dnl PHP_CRYPT_R_STYLE +dnl detect the style of crypt_r() is any is available +dnl see APR_CHECK_CRYPT_R_STYLE() for original version +dnl +AC_DEFUN([PHP_CRYPT_R_STYLE], +[ + AC_CACHE_CHECK([which data struct is used by crypt_r], php_cv_crypt_r_style,[ + php_cv_crypt_r_style=none + AC_TRY_COMPILE([ +#include +],[ +CRYPTD buffer; +crypt_r("passwd", "hash", &buffer); +], +php_cv_crypt_r_style=cryptd) + + if test "$php_cv_crypt_r_style" = "none"; then + AC_TRY_COMPILE([ +#include +],[ +struct crypt_data buffer; +crypt_r("passwd", "hash", &buffer); +], +php_cv_crypt_r_style=struct_crypt_data) + fi + + if test "$php_cv_crypt_r_style" = "none"; then + AC_TRY_COMPILE([ +#define _GNU_SOURCE +#include +],[ +struct crypt_data buffer; +crypt_r("passwd", "hash", &buffer); +], +php_cv_crypt_r_style=struct_crypt_data_gnu_source) + fi + ]) + + if test "$php_cv_crypt_r_style" = "cryptd"; then + AC_DEFINE(CRYPT_R_CRYPTD, 1, [Define if crypt_r has uses CRYPTD]) + fi + if test "$php_cv_crypt_r_style" = "struct_crypt_data" -o "$php_cv_crypt_r_style" = "struct_crypt_data_gnu_source"; then + AC_DEFINE(CRYPT_R_STRUCT_CRYPT_DATA, 1, [Define if crypt_r uses struct crypt_data]) + fi + if test "$php_cv_crypt_r_style" = "struct_crypt_data_gnu_source"; then + AC_DEFINE(CRYPT_R_GNU_SOURCE, 1, [Define if struct crypt_data requires _GNU_SOURCE]) + fi + if test "$php_cv_crypt_r_style" = "none"; then + AC_MSG_ERROR([Unable to detect data struct is used by crypt_r]) + fi +]) diff --git a/configure.in b/configure.in index 6e5b3fb9bd..5e2efd5b0b 100644 --- a/configure.in +++ b/configure.in @@ -465,7 +465,6 @@ chroot \ ctime_r \ cuserid \ crypt \ -crypt_r \ flock \ ftok \ funopen \ @@ -598,6 +597,11 @@ PHP_TIME_R_TYPE PHP_READDIR_R_TYPE PHP_CHECK_IN_ADDR_T +AC_CHECK_FUNCS(crypt_r, [ php_crypt_r="1" ], [ php_crypt_r="0" ]) +if test "x$php_crypt_r" = "x1"; then + PHP_CRYPT_R_STYLE +fi + divert(4) dnl ## In diversion 4 we check user-configurable general settings. diff --git a/ext/standard/crypt.c b/ext/standard/crypt.c index 47456be488..f119ec6e83 100644 --- a/ext/standard/crypt.c +++ b/ext/standard/crypt.c @@ -28,6 +28,9 @@ #include #endif #if HAVE_CRYPT_H +#if defined(CRYPT_R_GNU_SOURCE) && !defined(_GNU_SOURCE) +#define _GNU_SOURCE +#endif #include #endif #if TM_IN_SYS_TIME @@ -147,8 +150,15 @@ PHP_FUNCTION(crypt) } #ifdef HAVE_CRYPT_R { +#if defined(CRYPT_R_STRUCT_CRYPT_DATA) struct crypt_data buffer; memset(&buffer, 0, sizeof(buffer)); +#elif defined(CRYPT_R_CRYPTD) + CRYPTD buffer; +#else +#error Data struct used by crypt_r() is unknown. Please report. +#endif + RETURN_STRING(crypt_r(str, salt, &buffer), 1); } #else