Fix an undefined read during module cleanup after parse error (#3181)
JerryScript-DCO-1.0-Signed-off-by: Dániel Bátyai dbatyai@inf.u-szeged.hu
This commit is contained in:
@@ -907,7 +907,7 @@ ecma_module_check_indirect_exports (void)
|
|||||||
/**
|
/**
|
||||||
* Cleans up a list of module names.
|
* Cleans up a list of module names.
|
||||||
*/
|
*/
|
||||||
void
|
static void
|
||||||
ecma_module_release_module_names (ecma_module_names_t *module_name_p) /**< first module name */
|
ecma_module_release_module_names (ecma_module_names_t *module_name_p) /**< first module name */
|
||||||
{
|
{
|
||||||
while (module_name_p != NULL)
|
while (module_name_p != NULL)
|
||||||
@@ -925,7 +925,7 @@ ecma_module_release_module_names (ecma_module_names_t *module_name_p) /**< first
|
|||||||
/**
|
/**
|
||||||
* Cleans up a list of module nodes.
|
* Cleans up a list of module nodes.
|
||||||
*/
|
*/
|
||||||
static void
|
void
|
||||||
ecma_module_release_module_nodes (ecma_module_node_t *module_node_p) /**< first module node */
|
ecma_module_release_module_nodes (ecma_module_node_t *module_node_p) /**< first module node */
|
||||||
{
|
{
|
||||||
while (module_node_p != NULL)
|
while (module_node_p != NULL)
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ ecma_value_t ecma_module_connect_imports (void);
|
|||||||
ecma_value_t ecma_module_parse_modules (void);
|
ecma_value_t ecma_module_parse_modules (void);
|
||||||
ecma_value_t ecma_module_check_indirect_exports (void);
|
ecma_value_t ecma_module_check_indirect_exports (void);
|
||||||
|
|
||||||
void ecma_module_release_module_names (ecma_module_names_t *module_name_p);
|
void ecma_module_release_module_nodes (ecma_module_node_t *module_node_p);
|
||||||
void ecma_module_cleanup (void);
|
void ecma_module_cleanup (void);
|
||||||
#endif /* ENABLED (JERRY_ES2015_MODULE_SYSTEM) */
|
#endif /* ENABLED (JERRY_ES2015_MODULE_SYSTEM) */
|
||||||
|
|
||||||
|
|||||||
@@ -631,8 +631,7 @@ void parser_module_handle_requests (parser_context_t *context_p);
|
|||||||
void parser_module_parse_export_clause (parser_context_t *context_p);
|
void parser_module_parse_export_clause (parser_context_t *context_p);
|
||||||
void parser_module_parse_import_clause (parser_context_t *context_p);
|
void parser_module_parse_import_clause (parser_context_t *context_p);
|
||||||
void parser_module_set_default (parser_context_t *context_p);
|
void parser_module_set_default (parser_context_t *context_p);
|
||||||
ecma_module_node_t *parser_module_create_module_node (parser_context_t *context_p,
|
ecma_module_node_t *parser_module_create_module_node (parser_context_t *context_p);
|
||||||
ecma_module_node_t *template_node_p);
|
|
||||||
bool parser_module_check_duplicate_import (parser_context_t *context_p, ecma_string_t *local_name_p);
|
bool parser_module_check_duplicate_import (parser_context_t *context_p, ecma_string_t *local_name_p);
|
||||||
bool parser_module_check_duplicate_export (parser_context_t *context_p, ecma_string_t *export_name_p);
|
bool parser_module_check_duplicate_export (parser_context_t *context_p, ecma_string_t *export_name_p);
|
||||||
void parser_module_add_names_to_node (parser_context_t *context_p,
|
void parser_module_add_names_to_node (parser_context_t *context_p,
|
||||||
|
|||||||
@@ -142,6 +142,7 @@ void
|
|||||||
parser_module_add_export_node_to_context (parser_context_t *context_p) /**< parser context */
|
parser_module_add_export_node_to_context (parser_context_t *context_p) /**< parser context */
|
||||||
{
|
{
|
||||||
ecma_module_node_t *module_node_p = context_p->module_current_node_p;
|
ecma_module_node_t *module_node_p = context_p->module_current_node_p;
|
||||||
|
context_p->module_current_node_p = NULL;
|
||||||
ecma_module_node_t **export_list_p;
|
ecma_module_node_t **export_list_p;
|
||||||
|
|
||||||
/* Check which list we should add it to. */
|
/* 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
|
|||||||
|
|
||||||
module_names_p->next_p = stored_exports_p->module_names_p;
|
module_names_p->next_p = stored_exports_p->module_names_p;
|
||||||
stored_exports_p->module_names_p = module_node_p->module_names_p;
|
stored_exports_p->module_names_p = module_node_p->module_names_p;
|
||||||
|
module_node_p->module_names_p = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ecma_module_release_module_nodes (module_node_p);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
stored_exports_p = stored_exports_p->next_p;
|
stored_exports_p = stored_exports_p->next_p;
|
||||||
}
|
}
|
||||||
|
|
||||||
ecma_module_node_t *export_node_p = parser_module_create_module_node (context_p, module_node_p);
|
module_node_p->next_p = *export_list_p;
|
||||||
export_node_p->next_p = *export_list_p;
|
*export_list_p = module_node_p;
|
||||||
*export_list_p = export_node_p;
|
|
||||||
} /* parser_module_add_export_node_to_context */
|
} /* parser_module_add_export_node_to_context */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -200,6 +203,7 @@ void
|
|||||||
parser_module_add_import_node_to_context (parser_context_t *context_p) /**< parser context */
|
parser_module_add_import_node_to_context (parser_context_t *context_p) /**< parser context */
|
||||||
{
|
{
|
||||||
ecma_module_node_t *module_node_p = context_p->module_current_node_p;
|
ecma_module_node_t *module_node_p = context_p->module_current_node_p;
|
||||||
|
context_p->module_current_node_p = NULL;
|
||||||
ecma_module_node_t *stored_imports = JERRY_CONTEXT (module_top_context_p)->imports_p;
|
ecma_module_node_t *stored_imports = JERRY_CONTEXT (module_top_context_p)->imports_p;
|
||||||
|
|
||||||
/* Check if we have a node with the same module request, append to it if we do. */
|
/* 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
|
|||||||
|
|
||||||
module_names_p->next_p = stored_imports->module_names_p;
|
module_names_p->next_p = stored_imports->module_names_p;
|
||||||
stored_imports->module_names_p = module_node_p->module_names_p;
|
stored_imports->module_names_p = module_node_p->module_names_p;
|
||||||
|
module_node_p->module_names_p = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ecma_module_release_module_nodes (module_node_p);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
stored_imports = stored_imports->next_p;
|
stored_imports = stored_imports->next_p;
|
||||||
}
|
}
|
||||||
|
|
||||||
ecma_module_node_t *permanent_node_p = parser_module_create_module_node (context_p, module_node_p);
|
module_node_p->next_p = JERRY_CONTEXT (module_top_context_p)->imports_p;
|
||||||
permanent_node_p->next_p = JERRY_CONTEXT (module_top_context_p)->imports_p;
|
JERRY_CONTEXT (module_top_context_p)->imports_p = module_node_p;
|
||||||
JERRY_CONTEXT (module_top_context_p)->imports_p = permanent_node_p;
|
|
||||||
} /* parser_module_add_import_node_to_context */
|
} /* parser_module_add_import_node_to_context */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -305,21 +311,10 @@ parser_module_context_init (void)
|
|||||||
* - otherwise: an empty node.
|
* - otherwise: an empty node.
|
||||||
*/
|
*/
|
||||||
ecma_module_node_t *
|
ecma_module_node_t *
|
||||||
parser_module_create_module_node (parser_context_t *context_p, /**< parser context */
|
parser_module_create_module_node (parser_context_t *context_p) /**< parser context */
|
||||||
ecma_module_node_t *template_node_p) /**< template node for the new node */
|
|
||||||
{
|
{
|
||||||
ecma_module_node_t *node_p = (ecma_module_node_t *) parser_malloc (context_p, sizeof (ecma_module_node_t));
|
ecma_module_node_t *node_p = (ecma_module_node_t *) parser_malloc (context_p, sizeof (ecma_module_node_t));
|
||||||
|
memset (node_p, 0, sizeof (ecma_module_node_t));
|
||||||
if (template_node_p != NULL)
|
|
||||||
{
|
|
||||||
node_p->module_names_p = template_node_p->module_names_p;
|
|
||||||
node_p->module_request_p = template_node_p->module_request_p;
|
|
||||||
node_p->next_p = NULL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
memset (node_p, 0, sizeof (ecma_module_node_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
return node_p;
|
return node_p;
|
||||||
} /* parser_module_create_module_node */
|
} /* parser_module_create_module_node */
|
||||||
|
|||||||
@@ -1815,9 +1815,7 @@ parser_parse_import_statement (parser_context_t *context_p) /**< parser context
|
|||||||
parser_module_check_request_place (context_p);
|
parser_module_check_request_place (context_p);
|
||||||
parser_module_context_init ();
|
parser_module_context_init ();
|
||||||
|
|
||||||
ecma_module_node_t module_node;
|
context_p->module_current_node_p = parser_module_create_module_node (context_p);
|
||||||
memset (&module_node, 0, sizeof (ecma_module_node_t));
|
|
||||||
context_p->module_current_node_p = &module_node;
|
|
||||||
|
|
||||||
lexer_next_token (context_p);
|
lexer_next_token (context_p);
|
||||||
|
|
||||||
@@ -1933,9 +1931,7 @@ parser_parse_export_statement (parser_context_t *context_p) /**< context */
|
|||||||
parser_module_check_request_place (context_p);
|
parser_module_check_request_place (context_p);
|
||||||
parser_module_context_init ();
|
parser_module_context_init ();
|
||||||
|
|
||||||
ecma_module_node_t module_node;
|
context_p->module_current_node_p = parser_module_create_module_node (context_p);
|
||||||
memset (&module_node, 0, sizeof (ecma_module_node_t));
|
|
||||||
context_p->module_current_node_p = &module_node;
|
|
||||||
|
|
||||||
lexer_next_token (context_p);
|
lexer_next_token (context_p);
|
||||||
switch (context_p->token.type)
|
switch (context_p->token.type)
|
||||||
|
|||||||
@@ -2581,10 +2581,9 @@ parser_parse_source (const uint8_t *arg_list_p, /**< function argument list */
|
|||||||
scanner_cleanup (&context);
|
scanner_cleanup (&context);
|
||||||
|
|
||||||
#if ENABLED (JERRY_ES2015_MODULE_SYSTEM)
|
#if ENABLED (JERRY_ES2015_MODULE_SYSTEM)
|
||||||
if (context.module_current_node_p != NULL
|
if (context.module_current_node_p != NULL)
|
||||||
&& context.module_current_node_p->module_names_p != NULL)
|
|
||||||
{
|
{
|
||||||
ecma_module_release_module_names (context.module_current_node_p->module_names_p);
|
ecma_module_release_module_nodes (context.module_current_node_p);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user