Skip to content

Instantly share code, notes, and snippets.

@sgolemon
Created March 7, 2017 19:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sgolemon/fb1c3b9782987f7a7b10c11a6baafcd4 to your computer and use it in GitHub Desktop.
Save sgolemon/fb1c3b9782987f7a7b10c11a6baafcd4 to your computer and use it in GitHub Desktop.
diff --git a/main/streams/xp_socket.c b/main/streams/xp_socket.c
index 8efc4cd..2acfc82 100644
--- a/main/streams/xp_socket.c
+++ b/main/streams/xp_socket.c
@@ -571,37 +571,44 @@ static inline char *parse_ip_address_ex(const char *str, size_t str_len, int *po
char *host = NULL;
#ifdef HAVE_IPV6
- char *p;
-
if (*(str) == '[' && str_len > 1) {
/* IPV6 notation to specify raw address with port (i.e. [fe80::1]:80) */
- p = memchr(str + 1, ']', str_len - 2);
+ char *p = memchr(str + 1, ']', str_len - 2), *e = NULL;
if (!p || *(p + 1) != ':') {
if (get_err) {
*err = strpprintf(0, "Failed to parse IPv6 address \"%s\"", str);
}
return NULL;
}
- *portno = atoi(p + 2);
+ *portno = strtol(p + 2, &e, 10);
+ if (e && *e) {
+ if (get_err) {
+ *err = strpprintf(0, "Failed to parse address \"%s\"", str);
+ }
+ return NULL;
+ }
return estrndup(str + 1, p - str - 1);
}
#endif
+
if (str_len) {
colon = memchr(str, ':', str_len - 1);
} else {
colon = NULL;
}
+
if (colon) {
- *portno = atoi(colon + 1);
- host = estrndup(str, colon - str);
- } else {
- if (get_err) {
- *err = strpprintf(0, "Failed to parse address \"%s\"", str);
+ char *e = NULL;
+ *portno = strtol(colon + 1, &e, 10);
+ if (!e || !*e) {
+ return estrndup(str, colon - str);
}
- return NULL;
}
- return host;
+ if (get_err) {
+ *err = strpprintf(0, "Failed to parse address \"%s\"", str);
+ }
+ return NULL;
}
static inline char *parse_ip_address(php_stream_xport_param *xparam, int *portno)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment