diff options
author | Antony Dovgal <tony2001@php.net> | 2006-10-11 12:53:56 +0000 |
---|---|---|
committer | Antony Dovgal <tony2001@php.net> | 2006-10-11 12:53:56 +0000 |
commit | 1cc0339d403c06321fd0ee057a4efb4b8ef92704 (patch) | |
tree | c2d7179909d35ca069c16b26bd4e6496759ebd6f | |
parent | 2f467baf946eae829ff874a1a1516837e5b6e623 (diff) | |
download | php-git-1cc0339d403c06321fd0ee057a4efb4b8ef92704.tar.gz |
MFH: fix crash when parsing invalid hostnames/IPs
-rw-r--r-- | ext/standard/tests/file/stream_002.phpt | 53 | ||||
-rw-r--r-- | main/streams/xp_socket.c | 9 |
2 files changed, 59 insertions, 3 deletions
diff --git a/ext/standard/tests/file/stream_002.phpt b/ext/standard/tests/file/stream_002.phpt new file mode 100644 index 0000000000..ae10abf2d6 --- /dev/null +++ b/ext/standard/tests/file/stream_002.phpt @@ -0,0 +1,53 @@ +--TEST-- +stream_socket_client() and invalid arguments +--FILE-- +<?php + +$a = NULL; +$b = NULL; +var_dump(stream_socket_client("", $a, $b)); +var_dump($a, $b); +var_dump(stream_socket_client("[", $a, $b)); +var_dump($a, $b); +var_dump(stream_socket_client("[ ", $a, $b)); +var_dump($a, $b); +var_dump(stream_socket_client(".", $a, $b)); +var_dump($a, $b); +var_dump(stream_socket_client(1, $a, $b)); +var_dump($a, $b); +var_dump(stream_socket_client(array(), $a, $b)); +var_dump($a, $b); + +echo "Done\n"; +?> +--EXPECTF-- +Warning: stream_socket_client(): unable to connect to (Failed to parse address "") in %s on line %d +bool(false) +int(0) +string(26) "Failed to parse address """ + +Warning: stream_socket_client(): unable to connect to [ (Failed to parse address "[") in %s on line %d +bool(false) +int(0) +string(27) "Failed to parse address "["" + +Warning: stream_socket_client(): unable to connect to [ (Failed to parse IPv6 address "[ ") in %s on line %d +bool(false) +int(0) +string(33) "Failed to parse IPv6 address "[ "" + +Warning: stream_socket_client(): unable to connect to . (Failed to parse address ".") in %s on line %d +bool(false) +int(0) +string(27) "Failed to parse address "."" + +Warning: stream_socket_client(): unable to connect to 1 (Failed to parse address "1") in %s on line %d +bool(false) +int(0) +string(27) "Failed to parse address "1"" + +Warning: stream_socket_client() expects parameter 1 to be string, array given in %s on line %d +bool(false) +int(0) +string(27) "Failed to parse address "1"" +Done diff --git a/main/streams/xp_socket.c b/main/streams/xp_socket.c index fe6fa16b9f..af2a060cff 100644 --- a/main/streams/xp_socket.c +++ b/main/streams/xp_socket.c @@ -495,7 +495,7 @@ static inline char *parse_ip_address_ex(const char *str, int str_len, int *portn #ifdef HAVE_IPV6 char *p; - if (*(str) == '[') { + 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); if (!p || *(p + 1) != ':') { @@ -508,8 +508,11 @@ static inline char *parse_ip_address_ex(const char *str, int str_len, int *portn return estrndup(str + 1, p - str - 1); } #endif - - colon = memchr(str, ':', str_len - 1); + if (str_len) { + colon = memchr(str, ':', str_len - 1); + } else { + colon = NULL; + } if (colon) { *portno = atoi(colon + 1); host = estrndup(str, colon - str); |