From fe125bd55f67c1706b5556c28ed646a512032581 Mon Sep 17 00:00:00 2001 From: Michael Heimpold Date: Sun, 4 Jun 2017 21:29:20 +0200 Subject: [PATCH] php7-pecl-http: add a patch to fix a segfault during php startup The extensions tries to register some string constants after quering version strings from underlaying libcurl. However, depending on libcurl's configuration these strings could also be NULL, which was not handled properly. An upstream pull request for this patch is waiting for review. Signed-off-by: Michael Heimpold --- lang/php7-pecl-http/Makefile | 2 +- .../patches/200-string_or_null_register.patch | 57 +++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 lang/php7-pecl-http/patches/200-string_or_null_register.patch diff --git a/lang/php7-pecl-http/Makefile b/lang/php7-pecl-http/Makefile index be9267a74..f909bac6a 100644 --- a/lang/php7-pecl-http/Makefile +++ b/lang/php7-pecl-http/Makefile @@ -9,7 +9,7 @@ PECL_NAME:=pecl_http PECL_LONGNAME:=Extended HTTP Support PKG_VERSION:=3.1.0 -PKG_RELEASE:=2 +PKG_RELEASE:=3 PKG_MD5SUM:=e3de67b156e7d5f6c2e5eb1e2b5f0acceb7004f1260d68c9f8b2c0f9629aabf0 PKG_NAME:=php7-pecl-http diff --git a/lang/php7-pecl-http/patches/200-string_or_null_register.patch b/lang/php7-pecl-http/patches/200-string_or_null_register.patch new file mode 100644 index 000000000..f2d37eebc --- /dev/null +++ b/lang/php7-pecl-http/patches/200-string_or_null_register.patch @@ -0,0 +1,57 @@ +From ab5b4e3acd2b0379e5d8bc95a8d4f83ce5c91fb7 Mon Sep 17 00:00:00 2001 +From: Michael Heimpold +Date: Sun, 4 Jun 2017 15:00:33 +0200 +Subject: [PATCH] Handle NULL strings gracefully during constant registration + +When libcurl is compiled not using e.g. libz or SSL, then a call to +curl_version_info could return NULL in the corresponding fields of +curl_version_info_data. + +Passing such NULL pointers down to REGISTER_NS_STRING_CONSTANT results +in a segfault during php startup, so let's check for this special case +and register a NULL constant in this case. + +Signed-off-by: Michael Heimpold +--- + src/php_http_client_curl.c | 16 ++++++++++++---- + 1 file changed, 12 insertions(+), 4 deletions(-) + +diff --git a/src/php_http_client_curl.c b/src/php_http_client_curl.c +index f286324..f07bb8f 100644 +--- a/src/php_http_client_curl.c ++++ b/src/php_http_client_curl.c +@@ -2429,6 +2429,14 @@ php_http_client_ops_t *php_http_client_curl_get_ops(void) + return &php_http_client_curl_ops; + } + ++#define REGISTER_NS_STRING_OR_NULL_CONSTANT(ns, name, str, flags) \ ++ do { \ ++ if ((str) != NULL) { \ ++ REGISTER_NS_STRING_CONSTANT(ns, name, str, flags); \ ++ } else { \ ++ REGISTER_NS_NULL_CONSTANT(ns, name, flags); \ ++ } \ ++ } while (0) + + PHP_MINIT_FUNCTION(http_client_curl) + { +@@ -2509,12 +2517,12 @@ PHP_MINIT_FUNCTION(http_client_curl) + REGISTER_NS_STRING_CONSTANT("http\\Client\\Curl", "VERSIONS", curl_version(), CONST_CS|CONST_PERSISTENT); + #if CURLVERSION_NOW >= 0 + REGISTER_NS_STRING_CONSTANT("http\\Client\\Curl\\Versions", "CURL", (char *) info->version, CONST_CS|CONST_PERSISTENT); +- REGISTER_NS_STRING_CONSTANT("http\\Client\\Curl\\Versions", "SSL", (char *) info->ssl_version, CONST_CS|CONST_PERSISTENT); +- REGISTER_NS_STRING_CONSTANT("http\\Client\\Curl\\Versions", "LIBZ", (char *) info->libz_version, CONST_CS|CONST_PERSISTENT); ++ REGISTER_NS_STRING_OR_NULL_CONSTANT("http\\Client\\Curl\\Versions", "SSL", (char *) info->ssl_version, CONST_CS|CONST_PERSISTENT); ++ REGISTER_NS_STRING_OR_NULL_CONSTANT("http\\Client\\Curl\\Versions", "LIBZ", (char *) info->libz_version, CONST_CS|CONST_PERSISTENT); + # if CURLVERSION_NOW >= 1 +- REGISTER_NS_STRING_CONSTANT("http\\Client\\Curl\\Versions", "ARES", (char *) info->ares, CONST_CS|CONST_PERSISTENT); ++ REGISTER_NS_STRING_OR_NULL_CONSTANT("http\\Client\\Curl\\Versions", "ARES", (char *) info->ares, CONST_CS|CONST_PERSISTENT); + # if CURLVERSION_NOW >= 2 +- REGISTER_NS_STRING_CONSTANT("http\\Client\\Curl\\Versions", "IDN", (char *) info->libidn, CONST_CS|CONST_PERSISTENT); ++ REGISTER_NS_STRING_OR_NULL_CONSTANT("http\\Client\\Curl\\Versions", "IDN", (char *) info->libidn, CONST_CS|CONST_PERSISTENT); + # endif + # endif + #endif +-- +2.7.4 +