summaryrefslogtreecommitdiff
path: root/Zend/zend_API.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_API.c')
-rw-r--r--Zend/zend_API.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index 0e186691d7..d4c1036a74 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -313,6 +313,7 @@ static char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, char **sp
switch (c) {
case 'l':
+ case 'L':
{
long *p = va_arg(*va, long *);
switch (Z_TYPE_PP(arg)) {
@@ -324,14 +325,33 @@ static char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, char **sp
if ((type = is_numeric_string(Z_STRVAL_PP(arg), Z_STRLEN_PP(arg), p, &d, -1)) == 0) {
return "long";
} else if (type == IS_DOUBLE) {
- *p = (long) d;
+ if (c == 'L') {
+ if (d > LONG_MAX) {
+ *p = LONG_MAX;
+ break;
+ } else if (d < LONG_MIN) {
+ *p = LONG_MIN;
+ break;
+ }
+ }
+
+ *p = zend_dval_to_lval(d);
}
}
break;
+ case IS_DOUBLE:
+ if (c == 'L') {
+ if (Z_DVAL_PP(arg) > LONG_MAX) {
+ *p = LONG_MAX;
+ break;
+ } else if (Z_DVAL_PP(arg) < LONG_MIN) {
+ *p = LONG_MIN;
+ break;
+ }
+ }
case IS_NULL:
case IS_LONG:
- case IS_DOUBLE:
case IS_BOOL:
convert_to_long_ex(arg);
*p = Z_LVAL_PP(arg);