From 6e0f8b58a679ce54bbe274e936056551066df7af Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Mon, 10 Jul 2006 12:47:22 +0000 Subject: [PATCH] - fix endless loop in http_build_url("..") - check for gethostname, getdomainname, getservbyport, getservbyname in configure --- config9.m4 | 41 ++++++++++++++++++++++++----------------- http_url_api.c | 22 +++++++++++++++------- 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/config9.m4 b/config9.m4 index 67d47a0..7bbb2c2 100644 --- a/config9.m4 +++ b/config9.m4 @@ -93,10 +93,14 @@ if test "$PHP_HTTP" != "no"; then fi ]) -dnl ------- -dnl HEADERS -dnl ------- +dnl ---- +dnl STDC +dnl ---- AC_CHECK_HEADERS([netdb.h unistd.h]) + PHP_CHECK_FUNC(gethostname, nsl) + PHP_CHECK_FUNC(getdomainname, nsl) + PHP_CHECK_FUNC(getservbyport, nsl) + PHP_CHECK_FUNC(getservbyname, nsl) dnl ---- dnl ZLIB @@ -112,7 +116,7 @@ dnl ---- done if test -z "$ZLIB_DIR"; then AC_MSG_RESULT([not found]) - AC_MSG_WARN([could not find zlib.h]) + AC_MSG_ERROR([could not find zlib.h]) else AC_MSG_RESULT([found in $ZLIB_DIR]) AC_MSG_CHECKING([for zlib version >= 1.2.0.4]) @@ -181,19 +185,22 @@ dnl ---- AC_MSG_CHECKING([for SSL library used]) CURL_SSL_FLAVOUR= for i in $CURL_LIBS; do - if test "$i" = "-lssl" -o "$i" = "-lssl_unversion"; then - CURL_SSL_FLAVOUR="openssl" - AC_MSG_RESULT([openssl]) - AC_DEFINE([HTTP_HAVE_OPENSSL], [1], [ ]) - AC_CHECK_HEADERS([openssl/crypto.h]) - break - elif test "$i" = "-lgnutls"; then - CURL_SSL_FLAVOUR="gnutls" - AC_MSG_RESULT([gnutls]) - AC_DEFINE([HTTP_HAVE_GNUTLS], [1], [ ]) - AC_CHECK_HEADERS([gcrypt.h]) - break - fi + case $i in + -lssl* | -lyassl*) + CURL_SSL_FLAVOUR="openssl" + AC_MSG_RESULT([openssl]) + AC_DEFINE([HTTP_HAVE_OPENSSL], [1], [ ]) + AC_CHECK_HEADERS([openssl/crypto.h]) + break + ;; + -lgnutls*) + CURL_SSL_FLAVOUR="gnutls" + AC_MSG_RESULT([gnutls]) + AC_DEFINE([HTTP_HAVE_GNUTLS], [1], [ ]) + AC_CHECK_HEADERS([gcrypt.h]) + break + ;; + esac done if test -z "$CURL_SSL_FLAVOUR"; then AC_MSG_RESULT([unknown!]) diff --git a/http_url_api.c b/http_url_api.c index fb7f0ae..9068378 100644 --- a/http_url_api.c +++ b/http_url_api.c @@ -32,10 +32,10 @@ static inline char *localhostname(void) if (SUCCESS == gethostname(hostname, lenof(hostname))) { return estrdup(hostname); } -#elif defined(HAVE_UNISTD_H) +#elif defined(HAVE_GETHOSTNAME) if (SUCCESS == gethostname(hostname, lenof(hostname))) { +# if defined(HAVE_GETDOMAINNAME) size_t hlen = strlen(hostname); - if (hlen <= lenof(hostname) - lenof("(none)")) { hostname[hlen++] = '.'; if (SUCCESS == getdomainname(&hostname[hlen], lenof(hostname) - hlen)) { @@ -45,6 +45,10 @@ static inline char *localhostname(void) return estrdup(hostname); } } +# endif + if (strcmp(hostname, "(none)")) { + return estrdup(hostname); + } } #endif return estrdup("localhost"); @@ -92,7 +96,7 @@ PHP_HTTP_API char *_http_absolute_url(const char *url TSRMLS_DC) /* {{{ void http_build_url(int flags, const php_url *, const php_url *, php_url **, char **, size_t *) */ PHP_HTTP_API void _http_build_url(int flags, const php_url *old_url, const php_url *new_url, php_url **url_ptr, char **url_str, size_t *url_len TSRMLS_DC) { -#ifdef HTTP_HAVE_NETDB +#if defined(HAVE_GETSERVBYPORT) || defined(HAVE_GETSERVBYNAME) struct servent *se; #endif php_url *url = ecalloc(1, sizeof(php_url)); @@ -165,14 +169,14 @@ PHP_HTTP_API void _http_build_url(int flags, const php_url *old_url, const php_u url->scheme = estrndup("https", lenof("https")); break; -#ifndef HTTP_HAVE_NETDB +#ifndef HAVE_GETSERVBYPORT default: #endif case 80: url->scheme = estrndup("http", lenof("http")); break; -#ifdef HTTP_HAVE_NETDB +#ifdef HAVE_GETSERVBYPORT default: if ((se = getservbyport(htons(url->port), "tcp")) && se->s_name) { url->scheme = estrdup(se->s_name); @@ -254,8 +258,12 @@ PHP_HTTP_API void _http_build_url(int flags, const php_url *old_url, const php_u } } memmove(&ptr[1], pos, end - pos); + break; + } else if (!ptr[3]) { + /* .. at the end */ + ptr[1] = '\0'; } - break; + /* fallthrough */ default: /* something else */ @@ -268,7 +276,7 @@ PHP_HTTP_API void _http_build_url(int flags, const php_url *old_url, const php_u if (url->port) { if ( ((url->port == 80) && !strcmp(url->scheme, "http")) || ((url->port ==443) && !strcmp(url->scheme, "https")) -#ifdef HTTP_HAVE_NETDB +#ifdef HAVE_GETSERVBYNAME || ((se = getservbyname(url->scheme, "tcp")) && se->s_port && (url->port == ntohs(se->s_port))) #endif -- 2.30.2