Skip to content

Commit 3d3f467

Browse files
committed
Fix leak in Array.prototype.indexOf() when 'fromIndex' can't coerce to primitive value.
JerryScript-DCO-1.0-Signed-off-by: Dániel Bátyai dbatyai.u-szeged@partner.samsung.com
1 parent c8a16f2 commit 3d3f467

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

jerry-core/ecma/builtin-objects/ecma-builtin-array-prototype.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -938,19 +938,21 @@ ecma_builtin_array_prototype_object_index_of (ecma_value_t this_arg, /**< this a
938938
/* 3. */
939939
uint32_t len = ecma_number_to_uint32 (len_number);
940940

941-
ecma_number_t* num_p = ecma_alloc_number ();
942-
*num_p = ecma_int32_to_number (-1);
943-
944941
/* 4. */
945942
if (len == 0)
946943
{
944+
ecma_number_t *num_p = ecma_alloc_number ();
945+
*num_p = ecma_int32_to_number (-1);
947946
ret_value = ecma_make_normal_completion_value (ecma_make_number_value (num_p));
948947
}
949948
else
950949
{
951950
/* 5. */
952951
ECMA_OP_TO_NUMBER_TRY_CATCH (arg_from_idx, arg2, ret_value);
953952

953+
ecma_number_t *num_p = ecma_alloc_number ();
954+
*num_p = ecma_int32_to_number (-1);
955+
954956
uint32_t from_idx = ecma_builtin_helper_array_index_normalize (arg_from_idx, len);
955957

956958
/* 6. */

tests/jerry/array-prototype-indexof.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,23 @@ assert(obj.indexOf("foo") === -1);
4545
var arr = [11, 22, 33, 44];
4646
assert(arr.indexOf(44, 4) === -1);
4747

48+
var fromIndex = {
49+
toString: function () {
50+
return {};
51+
},
52+
53+
valueOf: function () {
54+
return {};
55+
}
56+
};
57+
58+
try {
59+
[0, 1].indexOf(1, fromIndex);
60+
assert(false);
61+
} catch (e) {
62+
assert(e instanceof TypeError);
63+
}
64+
4865
// Checking behavior when unable to get length
4966
var obj = { indexOf : Array.prototype.indexOf}
5067
Object.defineProperty(obj, 'length', { 'get' : function () { throw new ReferenceError ("foo"); } });

0 commit comments

Comments
 (0)