diff options
Diffstat (limited to 'ext/standard')
-rw-r--r-- | ext/standard/dns.c | 23 | ||||
-rw-r--r-- | ext/standard/string.c | 2 |
2 files changed, 19 insertions, 6 deletions
diff --git a/ext/standard/dns.c b/ext/standard/dns.c index 6e856842f9..e5ce3ceeb5 100644 --- a/ext/standard/dns.c +++ b/ext/standard/dns.c @@ -248,14 +248,21 @@ PHP_FUNCTION(gethostbynamel) } hp = php_network_gethostbyname(hostname); - if (hp == NULL || hp->h_addr_list == NULL) { + if (!hp) { RETURN_FALSE; } array_init(return_value); - for (i = 0 ; hp->h_addr_list[i] != 0 ; i++) { - in = *(struct in_addr *) hp->h_addr_list[i]; + for (i = 0; hp->h_addr_list[i] != 0 ; i++) { + /* On macos h_addr_list entries may be misaligned. */ + struct in_addr *h_addr_entry; /* Don't call this h_addr, it's a macro! */ + memcpy(&h_addr_entry, &hp->h_addr_list[i], sizeof(struct in_addr *)); + if (!h_addr_entry) { + return; + } + + in = *h_addr_entry; add_next_index_string(return_value, inet_ntoa(in)); } } @@ -265,16 +272,22 @@ PHP_FUNCTION(gethostbynamel) static zend_string *php_gethostbyname(char *name) { struct hostent *hp; + struct in_addr *h_addr_0; /* Don't call this h_addr, it's a macro! */ struct in_addr in; char *address; hp = php_network_gethostbyname(name); + if (!hp) { + return zend_string_init(name, strlen(name), 0); + } - if (!hp || !*(hp->h_addr_list)) { + /* On macos h_addr_list entries may be misaligned. */ + memcpy(&h_addr_0, &hp->h_addr_list[0], sizeof(struct in_addr *)); + if (!h_addr_0) { return zend_string_init(name, strlen(name), 0); } - memcpy(&in.s_addr, *(hp->h_addr_list), sizeof(in.s_addr)); + memcpy(&in.s_addr, h_addr_0, sizeof(in.s_addr)); address = inet_ntoa(in); return zend_string_init(address, strlen(address), 0); diff --git a/ext/standard/string.c b/ext/standard/string.c index 5c56bb4f62..bf2891c690 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2057,7 +2057,7 @@ PHP_FUNCTION(strripos) php_error_docref(NULL, E_WARNING, "Offset is greater than the length of haystack string"); RETURN_FALSE; } - e = ZSTR_VAL(haystack) + ZSTR_LEN(haystack) + (size_t)offset; + e = ZSTR_VAL(haystack) + (ZSTR_LEN(haystack) + (size_t)offset); } /* Borrow that ord_needle buffer to avoid repeatedly tolower()ing needle */ lowered = tolower(*ZSTR_VAL(needle)); |