More check_parameters improvements

* Allow / on everything but lLdb (on which it will work, but makes
  no sense).
* For ! on lLdb add additional zend_bool* parameter.
* For optional s and p only require one of the variables to be
  initialized. The length is usually not initialized.
This commit is contained in:
Nikita Popov 2015-10-01 20:22:55 +02:00
parent 06dde16a6a
commit 5c1b627458

View file

@ -45,13 +45,12 @@ $API_params = array(
//TODO 'L' => array('zend_long*, '), // long //TODO 'L' => array('zend_long*, '), // long
'o' => array('zval**'), //object 'o' => array('zval**'), //object
'O' => array('zval**', 'zend_class_entry*'), // object of given type 'O' => array('zval**', 'zend_class_entry*'), // object of given type
'p' => array('char**', 'size_t*'), // valid path
'P' => array('zend_string**'), // valid path 'P' => array('zend_string**'), // valid path
'r' => array('zval**'), // resource 'r' => array('zval**'), // resource
's' => array('char**', 'size_t*'), // string
'S' => array('zend_string**'), // string 'S' => array('zend_string**'), // string
'z' => array('zval**'), // zval* 'z' => array('zval**'), // zval*
'Z' => array('zval***') // zval** 'Z' => array('zval***') // zval**
// 's', 'p' handled separately
); );
/** reports an error, according to its level */ /** reports an error, according to its level */
@ -131,7 +130,7 @@ function get_vars($txt)
/** run diagnostic checks against one var. */ /** run diagnostic checks against one var. */
function check_param($db, $idx, $exp, $optional) function check_param_allow_uninit($db, $idx, $exp, $optional)
{ {
global $error_few_vars_given; global $error_few_vars_given;
@ -149,14 +148,18 @@ function check_param($db, $idx, $exp, $optional)
error("{$db[$idx][0]}: expected '$exp' but got '{$db[$idx][1]}' [".($idx+1).']'); error("{$db[$idx][0]}: expected '$exp' but got '{$db[$idx][1]}' [".($idx+1).']');
} }
if ($optional && !$db[$idx][2]) { if (!$optional && $db[$idx][2]) {
error("optional var not initialized: {$db[$idx][0]} [".($idx+1).']', 1);
} elseif (!$optional && $db[$idx][2]) {
error("not optional var is initialized: {$db[$idx][0]} [".($idx+1).']', 2); error("not optional var is initialized: {$db[$idx][0]} [".($idx+1).']', 2);
} }
} }
function check_param($db, $idx, $exp, $optional)
{
check_param_allow_uninit($db, $idx, $exp, $optional);
if ($optional && !$db[$idx][2]) {
error("optional var not initialized: {$db[$idx][0]} [".($idx+1).']', 1);
}
}
/** fetch params passed to zend_parse_params*() */ /** fetch params passed to zend_parse_params*() */
function get_params($vars, $str) function get_params($vars, $str)
@ -227,15 +230,15 @@ function check_function($name, $txt, $offset)
// separate_zval_if_not_ref // separate_zval_if_not_ref
case '/': case '/':
if (!in_array($last_char, array('r', 'z'))) { if (in_array($last_char, array('l', 'L', 'd', 'b'))) {
error("the '/' specifier cannot be applied to '$last_char'"); error("the '/' specifier should not be applied to '$last_char'");
} }
break; break;
// nullable arguments // nullable arguments
case '!': case '!':
if (!in_array($last_char, array('a', 'C', 'f', 'h', 'o', 'O', 'r', 's', 't', 'z', 'Z'))) { if (in_array($last_char, array('l', 'L', 'd', 'b'))) {
error("the '!' specifier cannot be applied to '$last_char'"); check_param($params, ++$j, 'zend_bool*', $optional);
} }
break; break;
@ -251,6 +254,15 @@ function check_function($name, $txt, $offset)
} }
break; break;
case 's':
case 'p':
check_param_allow_uninit($params, ++$j, 'char**', $optional);
check_param_allow_uninit($params, ++$j, 'size_t*', $optional);
if ($optional && !$params[$j-1][2] && !$params[$j][2]) {
error("one of optional vars {$params[$j-1][0]} or {$params[$j][0]} must be initialized", 1);
}
break;
default: default:
if (isset($API_params[$char])) { if (isset($API_params[$char])) {
foreach($API_params[$char] as $exp) { foreach($API_params[$char] as $exp) {