From bdb55bcb9d020de89f3de16228d42dd2a7d7caad Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Thu, 4 Apr 2013 13:15:27 -0400 Subject: [PATCH] Handle make_node errors with TLS dummy node Neater than a segmentation fault when out of memory. Signed-off-by: Mathieu Desnoyers --- formats/ctf/metadata/ctf-parser.y | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/formats/ctf/metadata/ctf-parser.y b/formats/ctf/metadata/ctf-parser.y index 1ccc718a..5d2415c7 100644 --- a/formats/ctf/metadata/ctf-parser.y +++ b/formats/ctf/metadata/ctf-parser.y @@ -83,6 +83,11 @@ static const char *node_type_to_str[] = { #undef ENTRY }; +/* Static node for out of memory errors */ +static __thread struct ctf_node error_node = { + .type = NODE_ERROR, +}; + BT_HIDDEN const char *node_type(struct ctf_node *node) { @@ -327,8 +332,11 @@ static struct ctf_node *make_node(struct ctf_scanner *scanner, struct ctf_node *node; node = malloc(sizeof(*node)); - if (!node) - return NULL; + if (!node) { + error_node.lineno = yyget_lineno(scanner->scanner); + printfl_fatal(error_node.lineno, "out of memory"); + return &error_node; + } memset(node, 0, sizeof(*node)); node->type = type; node->lineno = yyget_lineno(scanner->scanner); @@ -338,6 +346,7 @@ static struct ctf_node *make_node(struct ctf_scanner *scanner, switch (type) { case NODE_ROOT: + node->type = NODE_ERROR; printfn_fatal(node, "trying to create root node"); break; @@ -418,6 +427,7 @@ static struct ctf_node *make_node(struct ctf_scanner *scanner, case NODE_UNKNOWN: default: + node->type = NODE_ERROR; printfn_fatal(node, "unknown node type '%d'", (int) type); break; } -- 2.34.1