From d081a74d444149de2a83a2fd9120e4a3a2a8ccbc Mon Sep 17 00:00:00 2001 From: twosee Date: Fri, 18 Sep 2020 19:09:29 +0800 Subject: [PATCH] Another way How about this way, and it also needs to be applied to `//example.com:0` --- ext/standard/url.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/ext/standard/url.c b/ext/standard/url.c index 4aa8e78efc9c6..fde4ff5377967 100644 --- a/ext/standard/url.c +++ b/ext/standard/url.c @@ -194,10 +194,11 @@ PHPAPI php_url *php_url_parse_ex(char const *str, size_t length) if (pp - p > 0 && pp - p < 6 && (pp == ue || *pp == '/')) { zend_long port; + char *end; memcpy(port_buf, p, (pp - p)); port_buf[pp - p] = '\0'; - port = ZEND_STRTOL(port_buf, NULL, 10); - if (port > 0 && port <= 65535) { + port = ZEND_STRTOL(port_buf, &end, 10); + if (port >= 0 && port <= 65535 && end != port_buf) { ret->port = (unsigned short) port; if (s + 1 < ue && *s == '/' && *(s + 1) == '/') { /* relative-scheme URL */ s += 2; @@ -258,10 +259,11 @@ PHPAPI php_url *php_url_parse_ex(char const *str, size_t length) return NULL; } else if (e - p > 0) { zend_long port; + char *end; memcpy(port_buf, p, (e - p)); port_buf[e - p] = '\0'; - port = ZEND_STRTOL(port_buf, NULL, 10); - if ((port > 0 && port <= 65535) || (port == 0 && *port_buf == '0' && e - p == 1)) { + port = ZEND_STRTOL(port_buf, &end, 10); + if (port >= 0 && port <= 65535 && end != port_buf) { ret->port = (unsigned short)port; } else { php_url_free(ret);