Skip to content

Commit 6696128

Browse files
committed
Fix 'Segmentation fault on String.Replace'
Related issue: #747 JerryScript-DCO-1.0-Signed-off-by: László Langó [email protected]
1 parent 91a0514 commit 6696128

File tree

2 files changed

+26
-7
lines changed

2 files changed

+26
-7
lines changed

jerry-core/ecma/operations/ecma-regexp-object.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ re_match_regexp (re_matcher_ctx_t *re_ctx_p, /**< RegExp matcher context */
440440
if (str_curr_p <= re_ctx_p->input_start_p)
441441
{
442442
JERRY_DDLOG ("match\n");
443-
break;
443+
break; /* tail merge */
444444
}
445445

446446
if (!(re_ctx_p->flags & RE_FLAG_MULTILINE))
@@ -452,7 +452,7 @@ re_match_regexp (re_matcher_ctx_t *re_ctx_p, /**< RegExp matcher context */
452452
if (lit_char_is_line_terminator (lit_utf8_peek_prev (str_curr_p)))
453453
{
454454
JERRY_DDLOG ("match\n");
455-
break;
455+
break; /* tail merge */
456456
}
457457

458458
JERRY_DDLOG ("fail\n");
@@ -1261,20 +1261,21 @@ ecma_regexp_exec_helper (ecma_value_t regexp_value, /**< RegExp object */
12611261

12621262
MEM_DEFINE_LOCAL_ARRAY (input_buffer_p, input_string_size, lit_utf8_byte_t);
12631263

1264+
re_matcher_ctx_t re_ctx;
12641265
ssize_t sz = ecma_string_to_utf8_string (input_string_p, input_buffer_p, (ssize_t) input_string_size);
12651266
JERRY_ASSERT (sz >= 0);
12661267

12671268
lit_utf8_byte_t *input_curr_p = input_buffer_p;
1269+
re_ctx.input_start_p = input_buffer_p;
12681270

12691271
if (!input_string_size)
12701272
{
12711273
input_curr_p = (lit_utf8_byte_t *) lit_get_magic_string_utf8 (LIT_MAGIC_STRING__EMPTY);
1274+
re_ctx.input_start_p = input_curr_p;
12721275
}
1273-
lit_utf8_byte_t *input_end_p = input_buffer_p + input_string_size;
12741276

1275-
re_matcher_ctx_t re_ctx;
1276-
re_ctx.input_start_p = input_buffer_p;
1277-
re_ctx.input_end_p = input_buffer_p + input_string_size;
1277+
const lit_utf8_byte_t *input_end_p = re_ctx.input_start_p + input_string_size;
1278+
re_ctx.input_end_p = input_end_p;
12781279

12791280
/* 1. Read bytecode header and init regexp matcher context. */
12801281
re_ctx.flags = bc_p->flags;
@@ -1385,7 +1386,8 @@ ecma_regexp_exec_helper (ecma_value_t regexp_value, /**< RegExp object */
13851386
ecma_string_t *magic_str_p = ecma_get_magic_string (LIT_MAGIC_STRING_LASTINDEX_UL);
13861387
ecma_number_t *lastindex_num_p = ecma_alloc_number ();
13871388

1388-
if (sub_str_p)
1389+
if (sub_str_p != NULL
1390+
&& input_buffer_p != NULL)
13891391
{
13901392
*lastindex_num_p = lit_utf8_string_length (input_buffer_p,
13911393
(lit_utf8_size_t) (sub_str_p - input_buffer_p));
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Copyright 2016 Samsung Electronics Co., Ltd.
2+
// Copyright 2016 University of Szeged.
3+
//
4+
// Licensed under the Apache License, Version 2.0 (the "License");
5+
// you may not use this file except in compliance with the License.
6+
// You may obtain a copy of the License at
7+
//
8+
// http://www.apache.org/licenses/LICENSE-2.0
9+
//
10+
// Unless required by applicable law or agreed to in writing, software
11+
// distributed under the License is distributed on an "AS IS" BASIS
12+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
// See the License for the specific language governing permissions and
14+
// limitations under the License.
15+
16+
assert (''.replace(/$/g,"a") === "a");
17+
assert (''.replace(/^/g,"a") === "a");

0 commit comments

Comments
 (0)