com php-src: Fix bug #67397 (Buffer overflow in locale_get_ display_name->uloc_getDisplayName (libicu 4.8 .1)): ext/intl/locale/locale_methods.c
ext/in tl/tests/bug67397.phpt
| From: | Johannes Schlüter | Date: | Fri, 18 Jul 2014 23:26:51 +0000 |
| Subject: | com php-src: Fix bug #67397 (Buffer overflow in locale_get_ display_name->uloc_getDisplayName (libicu 4.8 .1)): ext/intl/locale/locale_methods.c ext/in tl/tests/bug67397.phpt |
||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-79620@lists.php.net to get a copy of this message | ||
Commit: e644aad3f9138bbb2e77520f033ba902f236b8b5
Author: Stanislav Malyshev <stas@php.net> Sun, 8 Jun 2014 13:44:40 -0700
Parents: 8ab4e2e90de44db0ee56b53e956b2b23f3c1cfa8
Branches: PHP-5.3
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=e644aad3f9138bbb2e77520f033ba902f236b8b5
Log:
Fix bug #67397 (Buffer overflow in locale_get_display_name->uloc_getDisplayName (libicu 4.8.1))
Bugs:
https://bugs.php.net/67397
Changed paths:
M ext/intl/locale/locale_methods.c
A ext/intl/tests/bug67397.phpt
Diff:
diff --git a/ext/intl/locale/locale_methods.c b/ext/intl/locale/locale_methods.c
index 0afbba2..881e356 100644
--- a/ext/intl/locale/locale_methods.c
+++ b/ext/intl/locale/locale_methods.c
@@ -497,8 +497,16 @@ static void get_icu_disp_value_src_php( char* tag_name,
INTERNAL_FUNCTION_PARAME
RETURN_FALSE;
}
+ if(loc_name_len > ULOC_FULLNAME_CAPACITY) {
+ /* See bug 67397: overlong locale names cause trouble in uloc_getDisplayName */
+ spprintf(&msg , 0, "locale_get_display_%s : name too long", tag_name );
+ intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, msg , 1 TSRMLS_CC );
+ efree(msg);
+ RETURN_FALSE;
+ }
+
if(loc_name_len == 0) {
- loc_name = INTL_G(default_locale);
+ loc_name = INTL_G(default_locale);
}
if( strcmp(tag_name, DISP_NAME) != 0 ){
diff --git a/ext/intl/tests/bug67397.phpt b/ext/intl/tests/bug67397.phpt
new file mode 100644
index 0000000..b2b2911
--- /dev/null
+++ b/ext/intl/tests/bug67397.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Bug #67397 (Buffer overflow in locale_get_display_name->uloc_getDisplayName (libicu 4.8.1))
+--SKIPIF--
+<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
+--FILE--
+<?php
+
+function ut_main()
+{
+ $ret = var_export(ut_loc_get_display_name(str_repeat('*', 256), 'en_us'),
true);
+ $ret .= "\n";
+ $ret .= var_export(intl_get_error_message(), true);
+ return $ret;
+}
+
+include_once( 'ut_common.inc' );
+ut_run();
+?>
+--EXPECTF--
+false
+'locale_get_display_name : name too long: U_ILLEGAL_ARGUMENT_ERROR'