]> granicus.if.org Git - php/commitdiff
Fix #60192 SegFault when Collator not constructed properly
authorFlorian Anderiasch <fa@php.net>
Wed, 2 Nov 2011 07:36:52 +0000 (07:36 +0000)
committerFlorian Anderiasch <fa@php.net>
Wed, 2 Nov 2011 07:36:52 +0000 (07:36 +0000)
ext/intl/collator/collator_compare.c
ext/intl/collator/collator_locale.c
ext/intl/collator/collator_sort.c
ext/intl/tests/bug60192-compare.phpt [new file with mode: 0644]
ext/intl/tests/bug60192-getlocale.phpt [new file with mode: 0644]
ext/intl/tests/bug60192-getsortkey.phpt [new file with mode: 0644]
ext/intl/tests/bug60192-sort.phpt [new file with mode: 0644]
ext/intl/tests/bug60192-sortwithsortkeys.phpt [new file with mode: 0644]

index 840855661cd63433a0a8bd53a7434de3d637a7fe..f7d01949ccdb615e0af3b1cb96fa5894e3bc2c1f 100755 (executable)
@@ -99,6 +99,10 @@ PHP_FUNCTION( collator_compare )
                RETURN_FALSE;
        }
 
+       if (!co || !co->ucoll) {
+       php_error_docref(NULL TSRMLS_CC, E_ERROR, "Object not initialized");
+       }
+
        /* Then compare them. */
        result = ucol_strcoll(
                co->ucoll,
index 331fed22fcbfc16292e101c8115f3a2b8538d9c2..eaa7e6ba3543e37fe67e2890f63cf65834ee57a7 100755 (executable)
@@ -51,6 +51,10 @@ PHP_FUNCTION( collator_get_locale )
        /* Fetch the object. */
        COLLATOR_METHOD_FETCH_OBJECT;
 
+       if (!co || !co->ucoll) {
+               php_error_docref(NULL TSRMLS_CC, E_ERROR, "Object not initialized");
+       }
+
        /* Get locale by specified type. */
        locale_name = (char*) ucol_getLocaleByType(
                co->ucoll, type, COLLATOR_ERROR_CODE_P( co ) );
index 929a9c09d51430f2b05f6fc0290dc2b680e6b4b2..a8fbd18e5ec81ed17d472db1c884f74a9e44fa97 100755 (executable)
@@ -73,6 +73,10 @@ static int collator_regular_compare_function(zval *result, zval *op1, zval *op2
                /* Fetch collator object. */
                co = (Collator_object *) zend_object_store_get_object( INTL_G(current_collator) TSRMLS_CC );
 
+       if (!co || !co->ucoll) {
+               php_error_docref(NULL TSRMLS_CC, E_ERROR, "Object not initialized");
+       }
+
                /* Compare the strings using ICU. */
                result->value.lval = ucol_strcoll(
                                co->ucoll,
@@ -441,6 +445,10 @@ PHP_FUNCTION( collator_sort_with_sort_keys )
                /* Get sort key, reallocating the buffer if needed. */
                bufLeft = sortKeyBufSize - sortKeyBufOffset;
 
+               if (!co || !co->ucoll) {
+                       php_error_docref(NULL TSRMLS_CC, E_ERROR, "Object not initialized");
+               }
+
                sortKeyLen = ucol_getSortKey( co->ucoll,
                                                                          utf16_buf,
                                                                          utf16_len,
@@ -571,6 +579,10 @@ PHP_FUNCTION( collator_get_sort_key )
                RETURN_FALSE;
        }
 
+       if (!co || !co->ucoll) {
+               php_error_docref(NULL TSRMLS_CC, E_ERROR, "Object not initialized");
+       }
+
        key_len = ucol_getSortKey(co->ucoll, ustr, ustr_len, key, 0);
        if(!key_len) {
                efree( ustr );
diff --git a/ext/intl/tests/bug60192-compare.phpt b/ext/intl/tests/bug60192-compare.phpt
new file mode 100644 (file)
index 0000000..d1db015
--- /dev/null
@@ -0,0 +1,20 @@
+--TEST--
+Bug #60192 (SegFault when Collator not constructed properly)
+--SKIPIF--
+<?php
+       if (!extension_loaded('intl')) { die('skip intl extension not available'); }
+?>
+--FILE--
+<?php
+
+class Collator2 extends Collator{
+       public function __construct() {
+               // ommitting parent::__construct($someLocale);
+       }
+}
+
+$c = new Collator2();
+$c->compare('h', 'H');
+--EXPECTF--
+
+Fatal error: Collator::compare(): Object not initialized in %s on line %d
diff --git a/ext/intl/tests/bug60192-getlocale.phpt b/ext/intl/tests/bug60192-getlocale.phpt
new file mode 100644 (file)
index 0000000..0adb092
--- /dev/null
@@ -0,0 +1,20 @@
+--TEST--
+Bug #60192 (SegFault when Collator not constructed properly)
+--SKIPIF--
+<?php
+       if (!extension_loaded('intl')) { die('skip intl extension not available'); }
+?>
+--FILE--
+<?php
+
+class Collator2 extends Collator{
+       public function __construct() {
+               // ommitting parent::__construct($someLocale);
+       }
+}
+
+$c = new Collator2();
+$c->getLocale(Locale::ACTUAL_LOCALE);
+--EXPECTF--
+
+Fatal error: Collator::getLocale(): Object not initialized in %s on line %d
diff --git a/ext/intl/tests/bug60192-getsortkey.phpt b/ext/intl/tests/bug60192-getsortkey.phpt
new file mode 100644 (file)
index 0000000..dedcfab
--- /dev/null
@@ -0,0 +1,20 @@
+--TEST--
+Bug #60192 (SegFault when Collator not constructed properly)
+--SKIPIF--
+<?php
+       if (!extension_loaded('intl')) { die('skip intl extension not available'); }
+?>
+--FILE--
+<?php
+
+class Collator2 extends Collator{
+       public function __construct() {
+               // ommitting parent::__construct($someLocale);
+       }
+}
+
+$c = new Collator2();
+$c->getSortKey('h');
+--EXPECTF--
+
+Fatal error: Collator::getSortKey(): Object not initialized in %s on line %d
diff --git a/ext/intl/tests/bug60192-sort.phpt b/ext/intl/tests/bug60192-sort.phpt
new file mode 100644 (file)
index 0000000..3515899
--- /dev/null
@@ -0,0 +1,21 @@
+--TEST--
+Bug #60192 (SegFault when Collator not constructed properly)
+--SKIPIF--
+<?php
+       if (!extension_loaded('intl')) { die('skip intl extension not available'); }
+?>
+--FILE--
+<?php
+
+class Collator2 extends Collator{
+       public function __construct() {
+               // ommitting parent::__construct($someLocale);
+       }
+}
+
+$c = new Collator2();
+$a = array('a', 'b');
+$c->sort($a);
+--EXPECTF--
+
+Fatal error: Collator::sort(): Object not initialized in %s on line %d
diff --git a/ext/intl/tests/bug60192-sortwithsortkeys.phpt b/ext/intl/tests/bug60192-sortwithsortkeys.phpt
new file mode 100644 (file)
index 0000000..a82fdda
--- /dev/null
@@ -0,0 +1,21 @@
+--TEST--
+Bug #60192 (SegFault when Collator not constructed properly)
+--SKIPIF--
+<?php
+       if (!extension_loaded('intl')) { die('skip intl extension not available'); }
+?>
+--FILE--
+<?php
+
+class Collator2 extends Collator{
+       public function __construct() {
+               // ommitting parent::__construct($someLocale);
+       }
+}
+
+$c = new Collator2();
+$a = array('a', 'b');
+$c->sortWithSortKeys($a);
+--EXPECTF--
+
+Fatal error: Collator::sortWithSortKeys(): Object not initialized in %s on line %d