From 0b25e26b4ec15dbd7ef69e89c1cda05fa005b4e6 Mon Sep 17 00:00:00 2001 From: Peter Kokot Date: Mon, 5 Aug 2024 15:54:50 +0200 Subject: [PATCH] Fix bug #51558: shared readline build fails (#15242) The 'rl_pending_input' is a variable in Readline library and checking it with PHP_CHECK_LIBRARY wouldn't find it on some systems. Library check works on most systems but not on the mentioned AIX in the bug as it exports variables and functions differently whereas the linker couldn't resolve the variable as a function. This should fix the build on systems where this caused issues, such as AIX. The is not self-contained header and needs to also have included before to have FILE type available. This fixes the issue on unpatched default readline installations, such as macOS. Checking this variable ensures that the found library is the correct library and also that it is of minimum version needed by current PHP code (https://bugs.php.net/48608). The library check: ```c | char rl_pending_input (); | int main (void) { | return rl_pending_input (); | } ``` The declaration check: ```c | #include | #include | int main (void) { | #ifndef rl_pending_input | #ifdef __cplusplus | (void) rl_pending_input; | #else | (void) rl_pending_input; | #endif | #endif | ; | return 0; | } ``` Closes https://bugs.php.net/51558 --- NEWS | 3 +++ ext/readline/config.m4 | 21 ++++++++++++++------- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/NEWS b/NEWS index 3cc017ad0fb..403e014f786 100644 --- a/NEWS +++ b/NEWS @@ -24,6 +24,9 @@ PHP NEWS - Random: . lcg_value() is now deprecated. (timwolla) +- Readline: + . Fixed bug #51558 (Shared readline build fails). (Peter Kokot) + - Session: . INI settings session.sid_length and session.sid_bits_per_character are now deprecated. (timwolla) diff --git a/ext/readline/config.m4 b/ext/readline/config.m4 index 0ba5fd55656..82a3646eb84 100644 --- a/ext/readline/config.m4 +++ b/ext/readline/config.m4 @@ -46,11 +46,6 @@ if test "$PHP_READLINE" && test "$PHP_READLINE" != "no"; then [AC_MSG_FAILURE([The readline library not found.])], [-L$READLINE_DIR/$PHP_LIBDIR $PHP_READLINE_LIBS]) - PHP_CHECK_LIBRARY([readline], [rl_pending_input], - [], - [AC_MSG_FAILURE([Invalid readline installation detected. Try --with-libedit instead.])], - [-L$READLINE_DIR/$PHP_LIBDIR $PHP_READLINE_LIBS]) - PHP_CHECK_LIBRARY([readline], [rl_callback_read_char], [AC_DEFINE([HAVE_RL_CALLBACK_READ_CHAR], [1], [ ])], [], @@ -72,9 +67,21 @@ if test "$PHP_READLINE" && test "$PHP_READLINE" != "no"; then CFLAGS="$CFLAGS $INCLUDES" LDFLAGS="$LDFLAGS -L$READLINE_DIR/$PHP_LIBDIR" LIBS="$LIBS -lreadline" + + dnl Sanity and minimum version check if readline library has variable + dnl rl_pending_input. + AC_CHECK_DECL([rl_pending_input],, [AC_MSG_FAILURE([ + Invalid readline installation detected. Try --with-libedit instead. + ])], [ + #include + #include + ]) + AC_CHECK_DECL([rl_erase_empty_line], - [AC_DEFINE([HAVE_ERASE_EMPTY_LINE], [1])],, - [#include ]) + [AC_DEFINE([HAVE_ERASE_EMPTY_LINE], [1])],, [ + #include + #include + ]) CFLAGS=$CFLAGS_SAVE LDFLAGS=$LDFLAGS_SAVE LIBS=$LIBS_SAVE