diff options
| author | Anatol Belski <ab@php.net> | 2018-09-01 01:12:06 +0200 |
|---|---|---|
| committer | Anatol Belski <ab@php.net> | 2018-09-01 01:12:06 +0200 |
| commit | 4a43e5fb4f59bd4679f5233cc39f1a5b79820fdf (patch) | |
| tree | cf4718e99cf1c7c36a7efafeda3a670979475eef | |
| parent | b9ca573a1bf62e7fb55e863e2073e29ae94d59eb (diff) | |
| download | php-git-4a43e5fb4f59bd4679f5233cc39f1a5b79820fdf.tar.gz | |
Improve fix for bug #76829
| -rw-r--r-- | ext/intl/idn/idn.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/ext/intl/idn/idn.c b/ext/intl/idn/idn.c index fd05600731..1ab1f3f552 100644 --- a/ext/intl/idn/idn.c +++ b/ext/intl/idn/idn.c @@ -138,8 +138,7 @@ static void php_intl_idn_to_46(INTERNAL_FUNCTION_PARAMETERS, UErrorCode status = U_ZERO_ERROR; UIDNA *uts46; int32_t len; - int32_t buffer_capac = 252*4; /* no domain name may exceed this */ - zend_string *buffer = zend_string_alloc(buffer_capac, 0); + zend_string *buffer; UIDNAInfo info = UIDNA_INFO_INITIALIZER; int buffer_used = 0; @@ -150,16 +149,25 @@ static void php_intl_idn_to_46(INTERNAL_FUNCTION_PARAMETERS, } if (mode == INTL_IDN_TO_ASCII) { + const int32_t buffer_capac = 255; + buffer = zend_string_alloc(buffer_capac, 0); len = uidna_nameToASCII_UTF8(uts46, ZSTR_VAL(domain), ZSTR_LEN(domain), ZSTR_VAL(buffer), buffer_capac, &info, &status); + if (len >= buffer_capac || php_intl_idn_check_status(status, "failed to convert name") == FAILURE) { + uidna_close(uts46); + zend_string_efree(buffer); + RETURN_FALSE; + } } else { + const int32_t buffer_capac = 252*4; + buffer = zend_string_alloc(buffer_capac, 0); len = uidna_nameToUnicodeUTF8(uts46, ZSTR_VAL(domain), ZSTR_LEN(domain), ZSTR_VAL(buffer), buffer_capac, &info, &status); - } - if (len >= 252*4 || php_intl_idn_check_status(status, "failed to convert name") == FAILURE) { - uidna_close(uts46); - zend_string_efree(buffer); - RETURN_FALSE; + if (len >= buffer_capac || php_intl_idn_check_status(status, "failed to convert name") == FAILURE) { + uidna_close(uts46); + zend_string_efree(buffer); + RETURN_FALSE; + } } ZSTR_VAL(buffer)[len] = '\0'; |
