- fix endless loop in http_build_url("..")
[m6w6/ext-http] / http_url_api.c
index fb7f0ae74f3581149ea811bb7a27362bf23f0553..9068378fcaebb17302cd81504a76139eeb3155dd 100644 (file)
@@ -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