mirror of
https://github.com/php/php-src.git
synced 2026-04-09 09:03:04 +02:00
Error-handling for the second parameter of [l|r]trim
This commit is contained in:
@@ -406,22 +406,48 @@ PHP_FUNCTION(strcoll)
|
||||
/* {{{ php_charmask
|
||||
* Fills a 256-byte bytemask with input. You can specify a range like 'a..z',
|
||||
* it needs to be incrementing.
|
||||
* Returns: FAILURE/SUCCESS wether the input was correct (i.e. no range errors)
|
||||
*/
|
||||
void php_charmask(unsigned char *input, int len, char *mask)
|
||||
int php_charmask(unsigned char *input, int len, char *mask)
|
||||
{
|
||||
unsigned char *end;
|
||||
unsigned char c;
|
||||
int result = SUCCESS;
|
||||
|
||||
memset(mask, 0, 256);
|
||||
for (end=input+len; input<end; input++) {
|
||||
c=*input;
|
||||
if (input+3<end && *(input+1) == '.' && *(input+2) == '.'
|
||||
&& *(input+3) >= c) {
|
||||
memset(mask+c, 1, *(input+3) - c + 1);
|
||||
if (input+3<end && input[1] == '.' && input[2] == '.'
|
||||
&& input[3] >= c) {
|
||||
memset(mask+c, 1, input[3] - c + 1);
|
||||
input+=3;
|
||||
} else
|
||||
} else if (input+1<end && input[0] == '.' && input[1] == '.') {
|
||||
/* Error, try to be as helpful as possible:
|
||||
(a range ending/starting with '.' won't be captured here) */
|
||||
if (end-len>=input) { /* there was no 'left' char */
|
||||
php_error(E_WARNING,"Invalid '..'-range passed to %s(), no character to the left of '..'",get_active_function_name(TSRMLS_C));
|
||||
result = FAILURE;
|
||||
continue;
|
||||
}
|
||||
if (input+2>=end) { /* there is no 'right' char */
|
||||
php_error(E_WARNING,"Invalid '..'-range passed to %s(), no character to the right of '..'",get_active_function_name(TSRMLS_C));
|
||||
result = FAILURE;
|
||||
continue;
|
||||
}
|
||||
if (input[-1] > input[2]) { /* wrong order */
|
||||
php_error(E_WARNING,"Invalid '..'-range passed to %s(), '..'-range needs to be incrementing",get_active_function_name(TSRMLS_C));
|
||||
result = FAILURE;
|
||||
continue;
|
||||
}
|
||||
/* FIXME: better error (a..b..c is the only left possibility?) */
|
||||
php_error(E_WARNING,"Invalid '..'-range passed to %s()",get_active_function_name(TSRMLS_C));
|
||||
result = FAILURE;
|
||||
continue;
|
||||
} else {
|
||||
mask[c]=1;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user