Fix parseInt when passing empty string.

Before allocating buffer for the string first
we check that the length of it is greater then 0.
If not then the result is a NaN.

JerryScript-DCO-1.0-Signed-off-by: Peter Gal pgal.u-szeged@partner.samsung.com
This commit is contained in:
Peter Gal
2015-07-17 15:25:31 +02:00
parent 33be4883a2
commit ee8d65063f
2 changed files with 142 additions and 130 deletions
@@ -113,6 +113,8 @@ ecma_builtin_global_object_parse_int (ecma_value_t this_arg __attr_unused___, /*
ecma_string_t *number_str_p = ecma_get_string_from_value (string_var); ecma_string_t *number_str_p = ecma_get_string_from_value (string_var);
lit_utf8_size_t str_size = ecma_string_get_size (number_str_p); lit_utf8_size_t str_size = ecma_string_get_size (number_str_p);
if (str_size > 0)
{
MEM_DEFINE_LOCAL_ARRAY (utf8_string_buff, str_size, lit_utf8_byte_t); MEM_DEFINE_LOCAL_ARRAY (utf8_string_buff, str_size, lit_utf8_byte_t);
ssize_t bytes_copied = ecma_string_to_utf8_string (number_str_p, ssize_t bytes_copied = ecma_string_to_utf8_string (number_str_p,
@@ -138,13 +140,13 @@ ecma_builtin_global_object_parse_int (ecma_value_t this_arg __attr_unused___, /*
int sign = 1; int sign = 1;
/* 4. */ /* 4. */
if (utf8_string_buff[start] == '-') if (utf8_string_buff[start] == LIT_CHAR_MINUS)
{ {
sign = -1; sign = -1;
} }
/* 5. */ /* 5. */
if (utf8_string_buff[start] == '-' || utf8_string_buff[start] == '+') if (utf8_string_buff[start] == LIT_CHAR_MINUS || utf8_string_buff[start] == LIT_CHAR_PLUS)
{ {
start++; start++;
} }
@@ -184,8 +186,9 @@ ecma_builtin_global_object_parse_int (ecma_value_t this_arg __attr_unused___, /*
if (strip_prefix) if (strip_prefix)
{ {
if (end - start >= 2 if (end - start >= 2
&& utf8_string_buff[start] == '0' && utf8_string_buff[start] == LIT_CHAR_0
&& (utf8_string_buff[start + 1] == 'x' || utf8_string_buff[start + 1] == 'X')) && (utf8_string_buff[start + 1] == LIT_CHAR_LOWERCASE_X
|| utf8_string_buff[start + 1] == LIT_CHAR_UPPERCASE_X))
{ {
start += 2; start += 2;
@@ -196,17 +199,17 @@ ecma_builtin_global_object_parse_int (ecma_value_t this_arg __attr_unused___, /*
/* 11. Check if characters are in [0, Radix - 1]. We also convert them to number values in the process. */ /* 11. Check if characters are in [0, Radix - 1]. We also convert them to number values in the process. */
for (lit_utf8_size_t i = start; i < end; i++) for (lit_utf8_size_t i = start; i < end; i++)
{ {
if ((utf8_string_buff[i]) >= 'a' && utf8_string_buff[i] <= 'z') if ((utf8_string_buff[i]) >= LIT_CHAR_LOWERCASE_A && utf8_string_buff[i] <= LIT_CHAR_LOWERCASE_Z)
{ {
utf8_string_buff[i] = (lit_utf8_byte_t) (utf8_string_buff[i] - 'a' + 10); utf8_string_buff[i] = (lit_utf8_byte_t) (utf8_string_buff[i] - LIT_CHAR_LOWERCASE_A + 10);
} }
else if (utf8_string_buff[i] >= 'A' && utf8_string_buff[i] <= 'Z') else if (utf8_string_buff[i] >= LIT_CHAR_UPPERCASE_A && utf8_string_buff[i] <= LIT_CHAR_UPPERCASE_Z)
{ {
utf8_string_buff[i] = (lit_utf8_byte_t) (utf8_string_buff[i] - 'A' + 10); utf8_string_buff[i] = (lit_utf8_byte_t) (utf8_string_buff[i] - LIT_CHAR_UPPERCASE_A + 10);
} }
else if (lit_char_is_decimal_digit (utf8_string_buff[i])) else if (lit_char_is_decimal_digit (utf8_string_buff[i]))
{ {
utf8_string_buff[i] = (lit_utf8_byte_t) (utf8_string_buff[i] - '0'); utf8_string_buff[i] = (lit_utf8_byte_t) (utf8_string_buff[i] - LIT_CHAR_0);
} }
else else
{ {
@@ -254,6 +257,14 @@ ecma_builtin_global_object_parse_int (ecma_value_t this_arg __attr_unused___, /*
ECMA_OP_TO_NUMBER_FINALIZE (radix_num); ECMA_OP_TO_NUMBER_FINALIZE (radix_num);
MEM_FINALIZE_LOCAL_ARRAY (utf8_string_buff); MEM_FINALIZE_LOCAL_ARRAY (utf8_string_buff);
}
else
{
ecma_number_t *ret_num_p = ecma_alloc_number ();
*ret_num_p = ecma_number_make_nan ();
ret_value = ecma_make_normal_completion_value (ecma_make_number_value (ret_num_p));
}
ECMA_FINALIZE (string_var); ECMA_FINALIZE (string_var);
return ret_value; return ret_value;
} /* ecma_builtin_global_object_parse_int */ } /* ecma_builtin_global_object_parse_int */
+1
View File
@@ -27,6 +27,7 @@ assert(parseInt("ABC", 16) === 2748);
assert(parseInt("12A3") === 12); assert(parseInt("12A3") === 12);
assert(parseInt("12.34") === 12); assert(parseInt("12.34") === 12);
assert(isNaN(parseInt("AB"))); assert(isNaN(parseInt("AB")));
assert(isNaN(parseInt("")));
var bool = true; var bool = true;
var obj = new Object(); var obj = new Object();