Skip to content

Commit cfaecc6

Browse files
authored
Fix an undefined read during module cleanup after parse error (#3181)
JerryScript-DCO-1.0-Signed-off-by: Dániel Bátyai [email protected]
1 parent 2180d97 commit cfaecc6

File tree

6 files changed

+22
-33
lines changed

6 files changed

+22
-33
lines changed

jerry-core/ecma/base/ecma-module.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -907,7 +907,7 @@ ecma_module_check_indirect_exports (void)
907907
/**
908908
* Cleans up a list of module names.
909909
*/
910-
void
910+
static void
911911
ecma_module_release_module_names (ecma_module_names_t *module_name_p) /**< first module name */
912912
{
913913
while (module_name_p != NULL)
@@ -925,7 +925,7 @@ ecma_module_release_module_names (ecma_module_names_t *module_name_p) /**< first
925925
/**
926926
* Cleans up a list of module nodes.
927927
*/
928-
static void
928+
void
929929
ecma_module_release_module_nodes (ecma_module_node_t *module_node_p) /**< first module node */
930930
{
931931
while (module_node_p != NULL)

jerry-core/ecma/base/ecma-module.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ ecma_value_t ecma_module_connect_imports (void);
137137
ecma_value_t ecma_module_parse_modules (void);
138138
ecma_value_t ecma_module_check_indirect_exports (void);
139139

140-
void ecma_module_release_module_names (ecma_module_names_t *module_name_p);
140+
void ecma_module_release_module_nodes (ecma_module_node_t *module_node_p);
141141
void ecma_module_cleanup (void);
142142
#endif /* ENABLED (JERRY_ES2015_MODULE_SYSTEM) */
143143

jerry-core/parser/js/js-parser-internal.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -631,8 +631,7 @@ void parser_module_handle_requests (parser_context_t *context_p);
631631
void parser_module_parse_export_clause (parser_context_t *context_p);
632632
void parser_module_parse_import_clause (parser_context_t *context_p);
633633
void parser_module_set_default (parser_context_t *context_p);
634-
ecma_module_node_t *parser_module_create_module_node (parser_context_t *context_p,
635-
ecma_module_node_t *template_node_p);
634+
ecma_module_node_t *parser_module_create_module_node (parser_context_t *context_p);
636635
bool parser_module_check_duplicate_import (parser_context_t *context_p, ecma_string_t *local_name_p);
637636
bool parser_module_check_duplicate_export (parser_context_t *context_p, ecma_string_t *export_name_p);
638637
void parser_module_add_names_to_node (parser_context_t *context_p,

jerry-core/parser/js/js-parser-module.c

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ void
142142
parser_module_add_export_node_to_context (parser_context_t *context_p) /**< parser context */
143143
{
144144
ecma_module_node_t *module_node_p = context_p->module_current_node_p;
145+
context_p->module_current_node_p = NULL;
145146
ecma_module_node_t **export_list_p;
146147

147148
/* Check which list we should add it to. */
@@ -181,16 +182,18 @@ parser_module_add_export_node_to_context (parser_context_t *context_p) /**< pars
181182

182183
module_names_p->next_p = stored_exports_p->module_names_p;
183184
stored_exports_p->module_names_p = module_node_p->module_names_p;
185+
module_node_p->module_names_p = NULL;
184186
}
187+
188+
ecma_module_release_module_nodes (module_node_p);
185189
return;
186190
}
187191

188192
stored_exports_p = stored_exports_p->next_p;
189193
}
190194

191-
ecma_module_node_t *export_node_p = parser_module_create_module_node (context_p, module_node_p);
192-
export_node_p->next_p = *export_list_p;
193-
*export_list_p = export_node_p;
195+
module_node_p->next_p = *export_list_p;
196+
*export_list_p = module_node_p;
194197
} /* parser_module_add_export_node_to_context */
195198

196199
/**
@@ -200,6 +203,7 @@ void
200203
parser_module_add_import_node_to_context (parser_context_t *context_p) /**< parser context */
201204
{
202205
ecma_module_node_t *module_node_p = context_p->module_current_node_p;
206+
context_p->module_current_node_p = NULL;
203207
ecma_module_node_t *stored_imports = JERRY_CONTEXT (module_top_context_p)->imports_p;
204208

205209
/* Check if we have a node with the same module request, append to it if we do. */
@@ -218,16 +222,18 @@ parser_module_add_import_node_to_context (parser_context_t *context_p) /**< pars
218222

219223
module_names_p->next_p = stored_imports->module_names_p;
220224
stored_imports->module_names_p = module_node_p->module_names_p;
225+
module_node_p->module_names_p = NULL;
221226
}
227+
228+
ecma_module_release_module_nodes (module_node_p);
222229
return;
223230
}
224231

225232
stored_imports = stored_imports->next_p;
226233
}
227234

228-
ecma_module_node_t *permanent_node_p = parser_module_create_module_node (context_p, module_node_p);
229-
permanent_node_p->next_p = JERRY_CONTEXT (module_top_context_p)->imports_p;
230-
JERRY_CONTEXT (module_top_context_p)->imports_p = permanent_node_p;
235+
module_node_p->next_p = JERRY_CONTEXT (module_top_context_p)->imports_p;
236+
JERRY_CONTEXT (module_top_context_p)->imports_p = module_node_p;
231237
} /* parser_module_add_import_node_to_context */
232238

233239
/**
@@ -305,21 +311,10 @@ parser_module_context_init (void)
305311
* - otherwise: an empty node.
306312
*/
307313
ecma_module_node_t *
308-
parser_module_create_module_node (parser_context_t *context_p, /**< parser context */
309-
ecma_module_node_t *template_node_p) /**< template node for the new node */
314+
parser_module_create_module_node (parser_context_t *context_p) /**< parser context */
310315
{
311316
ecma_module_node_t *node_p = (ecma_module_node_t *) parser_malloc (context_p, sizeof (ecma_module_node_t));
312-
313-
if (template_node_p != NULL)
314-
{
315-
node_p->module_names_p = template_node_p->module_names_p;
316-
node_p->module_request_p = template_node_p->module_request_p;
317-
node_p->next_p = NULL;
318-
}
319-
else
320-
{
321-
memset (node_p, 0, sizeof (ecma_module_node_t));
322-
}
317+
memset (node_p, 0, sizeof (ecma_module_node_t));
323318

324319
return node_p;
325320
} /* parser_module_create_module_node */

jerry-core/parser/js/js-parser-statm.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1815,9 +1815,7 @@ parser_parse_import_statement (parser_context_t *context_p) /**< parser context
18151815
parser_module_check_request_place (context_p);
18161816
parser_module_context_init ();
18171817

1818-
ecma_module_node_t module_node;
1819-
memset (&module_node, 0, sizeof (ecma_module_node_t));
1820-
context_p->module_current_node_p = &module_node;
1818+
context_p->module_current_node_p = parser_module_create_module_node (context_p);
18211819

18221820
lexer_next_token (context_p);
18231821

@@ -1933,9 +1931,7 @@ parser_parse_export_statement (parser_context_t *context_p) /**< context */
19331931
parser_module_check_request_place (context_p);
19341932
parser_module_context_init ();
19351933

1936-
ecma_module_node_t module_node;
1937-
memset (&module_node, 0, sizeof (ecma_module_node_t));
1938-
context_p->module_current_node_p = &module_node;
1934+
context_p->module_current_node_p = parser_module_create_module_node (context_p);
19391935

19401936
lexer_next_token (context_p);
19411937
switch (context_p->token.type)

jerry-core/parser/js/js-parser.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2581,10 +2581,9 @@ parser_parse_source (const uint8_t *arg_list_p, /**< function argument list */
25812581
scanner_cleanup (&context);
25822582

25832583
#if ENABLED (JERRY_ES2015_MODULE_SYSTEM)
2584-
if (context.module_current_node_p != NULL
2585-
&& context.module_current_node_p->module_names_p != NULL)
2584+
if (context.module_current_node_p != NULL)
25862585
{
2587-
ecma_module_release_module_names (context.module_current_node_p->module_names_p);
2586+
ecma_module_release_module_nodes (context.module_current_node_p);
25882587
}
25892588
#endif
25902589

0 commit comments

Comments
 (0)