From 3d59f763b824ac11f8360931092baf0bc1719562 Mon Sep 17 00:00:00 2001 From: Juro Bystricky Date: Mon, 19 Mar 2018 22:31:20 -0700 Subject: [PATCH] fix segmentation fault in precompiled header generation Prevent a segmentation fault which occurs when using incorrect structure trying to access name of some named operators, such as CPP_NOT, CPP_AND etc. "token->val.node.spelling" cannot be used in those cases, as is may not be initialized at all. [YOCTO #11738] Upstream-Status: Pending Signed-off-by: Juro Bystricky Signed-off-by: Khem Raj --- libcpp/lex.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/libcpp/lex.c b/libcpp/lex.c index 06bcc31c87e..24bed9a35fa 100644 --- a/libcpp/lex.c +++ b/libcpp/lex.c @@ -3531,11 +3531,27 @@ cpp_spell_token (cpp_reader *pfile, const cpp_token *token, spell_ident: case SPELL_IDENT: if (forstring) - { - memcpy (buffer, NODE_NAME (token->val.node.spelling), - NODE_LEN (token->val.node.spelling)); - buffer += NODE_LEN (token->val.node.spelling); - } + { + if (token->type == CPP_NAME) + { + memcpy (buffer, NODE_NAME (token->val.node.spelling), + NODE_LEN (token->val.node.spelling)); + buffer += NODE_LEN (token->val.node.spelling); + break; + } + /* NAMED_OP, cannot use node.spelling */ + if (token->flags & NAMED_OP) + { + const char *str = cpp_named_operator2name (token->type); + if (str) + { + size_t len = strlen(str); + memcpy(buffer, str, len); + buffer += len; + } + break; + } + } else buffer = _cpp_spell_ident_ucns (buffer, token->val.node.node); break;