From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-bw0-f46.google.com ([209.85.214.46]:33258 "EHLO mail-bw0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752582Ab1BDXQY (ORCPT ); Fri, 4 Feb 2011 18:16:24 -0500 Date: Sat, 5 Feb 2011 00:16:15 +0100 From: Ulf Magnusson Subject: [PATCH] kconfig: undefined symbols can crash dependency loop detection Message-ID: <20110204231611.GA9344@ulf> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Sender: linux-kbuild-owner@vger.kernel.org List-ID: To: linux-kbuild@vger.kernel.org Cc: zippel@linux-m68k.org, linux-kernel@vger.kernel.org The Kconfig config FOO bool "FOO" if BAR select BAR has a dependency loop involving an undefined symbol BAR. This causes a segfault in sym_check_print_recursive() as it assumes all symbols have a non-null 'prop', which is not the case for undefined symbols. This is a proposed fix. Signed-off-by: Ulf Magnusson --- scripts/kconfig/symbol.c | 32 ++++++++++++++++++++++++++++---- 1 files changed, 28 insertions(+), 4 deletions(-) diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c index a796c95..81a217f 100644 --- a/scripts/kconfig/symbol.c +++ b/scripts/kconfig/symbol.c @@ -5,6 +5,7 @@ #include #include +#include #include #include #include @@ -972,6 +973,10 @@ static void sym_check_print_recursive(struct symbol *last_sym) struct menu *menu = NULL; struct property *prop; struct dep_stack cv_stack; + const char *filename; + int lineno; + char undef_msg_buf[100]; + int snprintf_size; if (sym_is_choice_value(last_sym)) { dep_stack_insert(&cv_stack, last_sym); @@ -1001,18 +1006,37 @@ static void sym_check_print_recursive(struct symbol *last_sym) break; } } + + if (prop) { + filename = prop->file->name; + lineno = prop->lineno; + } else { + /* The dependency loop involves an undefined symbol. + * Checking sym->name is probably unnecessary here, but + * just to be on the safe side. */ + snprintf_size = snprintf(undef_msg_buf, + sizeof(undef_msg_buf), + "", + sym->name ? sym->name : + ""); + if (snprintf_size > sizeof(undef_msg_buf)) + undef_msg_buf[sizeof(undef_msg_buf) - 1] = '\0'; + filename = undef_msg_buf; + lineno = 0; + } + if (stack->sym == last_sym) fprintf(stderr, "%s:%d:error: recursive dependency detected!\n", - prop->file->name, prop->lineno); + filename, lineno); if (stack->expr) { fprintf(stderr, "%s:%d:\tsymbol %s %s value contains %s\n", - prop->file->name, prop->lineno, + filename, lineno, sym->name ? sym->name : "", prop_get_type_name(prop->type), next_sym->name ? next_sym->name : ""); } else if (stack->prop) { fprintf(stderr, "%s:%d:\tsymbol %s depends on %s\n", - prop->file->name, prop->lineno, + filename, lineno, sym->name ? sym->name : "", next_sym->name ? next_sym->name : ""); } else if (sym_is_choice(sym)) { @@ -1027,7 +1051,7 @@ static void sym_check_print_recursive(struct symbol *last_sym) next_sym->name ? next_sym->name : ""); } else { fprintf(stderr, "%s:%d:\tsymbol %s is selected by %s\n", - prop->file->name, prop->lineno, + filename, lineno, sym->name ? sym->name : "", next_sym->name ? next_sym->name : ""); } -- 1.7.0.4