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 diff --git a/libcpp/lex.c b/libcpp/lex.c --- a/libcpp/lex.c +++ b/libcpp/lex.c @@ -3229,11 +3229,27 @@ 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;