diff --git a/ext/standard/dns.c b/ext/standard/dns.c index 64301ed04161..9028accb3fd5 100644 --- a/ext/standard/dns.c +++ b/ext/standard/dns.c @@ -441,7 +441,7 @@ PHP_FUNCTION(dns_check_record) #define CHECKCP(n) do { \ if (cp + n > end) { \ - return NULL; \ + goto fail; \ } \ } while (0) @@ -528,7 +528,7 @@ static uint8_t *php_parserr(uint8_t *cp, uint8_t *end, querybuf *answer, int typ } n = dn_expand(answer->qb2, end, cp, name, (sizeof name) - 2); if (n < 0) { - return NULL; + goto fail; } cp += n; add_assoc_string(subarray, "target", name); @@ -565,7 +565,7 @@ static uint8_t *php_parserr(uint8_t *cp, uint8_t *end, querybuf *answer, int typ add_assoc_stringl(subarray, "tag", (char*)cp, n); cp += n; if ( (size_t) dlen < ((size_t)n) + 2 ) { - return NULL; + goto fail; } n = dlen - n - 2; CHECKCP(n); @@ -608,13 +608,13 @@ static uint8_t *php_parserr(uint8_t *cp, uint8_t *end, querybuf *answer, int typ add_assoc_string(subarray, "type", "SOA"); n = dn_expand(answer->qb2, end, cp, name, (sizeof name) -2); if (n < 0) { - return NULL; + goto fail; } cp += n; add_assoc_string(subarray, "mname", name); n = dn_expand(answer->qb2, end, cp, name, (sizeof name) -2); if (n < 0) { - return NULL; + goto fail; } cp += n; add_assoc_string(subarray, "rname", name); @@ -735,7 +735,7 @@ static uint8_t *php_parserr(uint8_t *cp, uint8_t *end, querybuf *answer, int typ if (cp < p + dlen) { n = dn_expand(answer->qb2, end, cp, name, (sizeof name) - 2); if (n < 0) { - return NULL; + goto fail; } cp += n; add_assoc_string(subarray, "chain", name); @@ -752,7 +752,7 @@ static uint8_t *php_parserr(uint8_t *cp, uint8_t *end, querybuf *answer, int typ add_assoc_long(subarray, "port", n); n = dn_expand(answer->qb2, end, cp, name, (sizeof name) - 2); if (n < 0) { - return NULL; + goto fail; } cp += n; add_assoc_string(subarray, "target", name); @@ -788,7 +788,7 @@ static uint8_t *php_parserr(uint8_t *cp, uint8_t *end, querybuf *answer, int typ n = dn_expand(answer->qb2, end, cp, name, (sizeof name) - 2); if (n < 0) { - return NULL; + goto fail; } cp += n; add_assoc_string(subarray, "replacement", name); @@ -801,6 +801,12 @@ static uint8_t *php_parserr(uint8_t *cp, uint8_t *end, querybuf *answer, int typ } return cp; + +fail: + /* Drop the partially built record, so that the caller does not publish it. */ + zval_ptr_dtor(subarray); + ZVAL_UNDEF(subarray); + return NULL; } /* }}} */