]> granicus.if.org Git - php/commitdiff
fixed SIGSEGV in chgrp()
authorDmitry Stogov <dmitry@php.net>
Mon, 19 Nov 2007 15:55:48 +0000 (15:55 +0000)
committerDmitry Stogov <dmitry@php.net>
Mon, 19 Nov 2007 15:55:48 +0000 (15:55 +0000)
ext/standard/filestat.c
ext/standard/tests/file/chgrp.phpt

index 8836b0e5d791e925218807f5505c151f98b85f21..7797705ed721f282420ef935db6f4d4816b3b5e8 100644 (file)
@@ -428,12 +428,16 @@ static void php_do_chgrp(INTERNAL_FUNCTION_PARAMETERS, int do_lchgrp) /* {{{ */
        int ret;
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "tz/", &filename, &filename_len, &filename_type, &group) == FAILURE) {
-               return;
+               RETURN_FALSE;
        }
 
        if (Z_TYPE_P(group) == IS_LONG) {
                gid = (gid_t)Z_LVAL_P(group);
-       } else {
+       } else if (Z_TYPE_P(group) == IS_STRING ||
+                  Z_TYPE_P(group) == IS_UNICODE) {
+               if (Z_TYPE_P(group) == IS_UNICODE) {
+                       zval_unicode_to_string(group TSRMLS_CC);
+               }
 #if defined(ZTS) && defined(HAVE_GETGRNAM_R) && defined(_SC_GETGR_R_SIZE_MAX)
                struct group gr;
                struct group *retgrptr;
@@ -461,6 +465,9 @@ static void php_do_chgrp(INTERNAL_FUNCTION_PARAMETERS, int do_lchgrp) /* {{{ */
                }
                gid = gr->gr_gid;
 #endif
+       } else {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "parameter 2 should be string or integer, %s given",zend_zval_type_name(group));
+               RETURN_FALSE;
        }
 
        if (filename_type == IS_UNICODE) {
index d0ebce36a6b2913e045586feabb34d15e54c24f0..4eaa908b52d9eb92d9c7fd71b392b475d5239e9b 100644 (file)
@@ -5,5 +5,6 @@ chgrp() with NULL as group name
 chgrp("sjhgfskhagkfdgskjfhgskfsdgfkdsajf", NULL);
 echo "ALIVE\n";
 ?>
---EXPECT--
+--EXPECTF--
+Warning: chgrp(): parameter 2 should be string or integer, null given in %schgrp.php on line 2
 ALIVE