projects
/
carl9170fw.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
kconfig: Don't leak 'option' arguments during parsing
[carl9170fw.git]
/
config
/
zconf.y
diff --git
a/config/zconf.y
b/config/zconf.y
index efa93e9d030a6b24f4a475c1669a167efad45c55..d49ed3ae5d3e0889aa74fba98b7a5b8b6f5238c3 100644
(file)
--- a/
config/zconf.y
+++ b/
config/zconf.y
@@
-31,7
+31,7
@@
struct symbol *symbol_hash[SYMBOL_HASHSIZE];
static struct menu *current_menu, *current_entry;
%}
static struct menu *current_menu, *current_entry;
%}
-%expect 3
0
+%expect 3
2
%union
{
%union
{
@@
-62,6
+62,7
@@
static struct menu *current_menu, *current_entry;
%token <id>T_TYPE
%token <id>T_DEFAULT
%token <id>T_SELECT
%token <id>T_TYPE
%token <id>T_DEFAULT
%token <id>T_SELECT
+%token <id>T_IMPLY
%token <id>T_RANGE
%token <id>T_VISIBLE
%token <id>T_OPTION
%token <id>T_RANGE
%token <id>T_VISIBLE
%token <id>T_OPTION
@@
-84,6
+85,7
@@
static struct menu *current_menu, *current_entry;
%nonassoc T_NOT
%type <string> prompt
%nonassoc T_NOT
%type <string> prompt
+%type <symbol> nonconst_symbol
%type <symbol> symbol
%type <expr> expr
%type <expr> if_expr
%type <symbol> symbol
%type <expr> expr
%type <expr> if_expr
@@
-100,8
+102,8
@@
static struct menu *current_menu, *current_entry;
} if_entry menu_entry choice_entry
%{
} if_entry menu_entry choice_entry
%{
-/* Include
zconf.hash
.c here so it can see the token constants. */
-#include "
zconf.hash
.c"
+/* Include
kconf_id
.c here so it can see the token constants. */
+#include "
kconf_id
.c"
%}
%%
%}
%%
@@
-118,13
+120,13
@@
stmt_list:
| stmt_list T_WORD error T_EOL { zconf_error("unknown statement \"%s\"", $2); }
| stmt_list option_name error T_EOL
{
| stmt_list T_WORD error T_EOL { zconf_error("unknown statement \"%s\"", $2); }
| stmt_list option_name error T_EOL
{
- zconf_error("unexpected option \"%s\"",
kconf_id_strings +
$2->name);
+ zconf_error("unexpected option \"%s\"", $2->name);
}
| stmt_list error T_EOL { zconf_error("invalid statement"); }
;
option_name:
}
| stmt_list error T_EOL { zconf_error("invalid statement"); }
;
option_name:
- T_DEPENDS | T_PROMPT | T_TYPE | T_SELECT | T_OPTIONAL | T_RANGE | T_DEFAULT | T_VISIBLE
+ T_DEPENDS | T_PROMPT | T_TYPE | T_SELECT | T_
IMPLY | T_
OPTIONAL | T_RANGE | T_DEFAULT | T_VISIBLE
;
common_stmt:
;
common_stmt:
@@
-144,12
+146,11
@@
option_error:
/* config/menuconfig entry */
/* config/menuconfig entry */
-config_entry_start: T_CONFIG
T_WORD
T_EOL
+config_entry_start: T_CONFIG
nonconst_symbol
T_EOL
{
{
- struct symbol *sym = sym_lookup($2, 0);
- sym->flags |= SYMBOL_OPTIONAL;
- menu_add_entry(sym);
- printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), $2);
+ $2->flags |= SYMBOL_OPTIONAL;
+ menu_add_entry($2);
+ printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), $2->name);
};
config_stmt: config_entry_start config_option_list
};
config_stmt: config_entry_start config_option_list
@@
-158,12
+159,11
@@
config_stmt: config_entry_start config_option_list
printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
};
printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
};
-menuconfig_entry_start: T_MENUCONFIG
T_WORD
T_EOL
+menuconfig_entry_start: T_MENUCONFIG
nonconst_symbol
T_EOL
{
{
- struct symbol *sym = sym_lookup($2, 0);
- sym->flags |= SYMBOL_OPTIONAL;
- menu_add_entry(sym);
- printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), $2);
+ $2->flags |= SYMBOL_OPTIONAL;
+ menu_add_entry($2);
+ printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), $2->name);
};
menuconfig_stmt: menuconfig_entry_start config_option_list
};
menuconfig_stmt: menuconfig_entry_start config_option_list
@@
-210,12
+210,18
@@
config_option: T_DEFAULT expr if_expr T_EOL
$1->stype);
};
$1->stype);
};
-config_option: T_SELECT
T_WORD
if_expr T_EOL
+config_option: T_SELECT
nonconst_symbol
if_expr T_EOL
{
{
- menu_add_symbol(P_SELECT,
sym_lookup($2, 0)
, $3);
+ menu_add_symbol(P_SELECT,
$2
, $3);
printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
};
printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
};
+config_option: T_IMPLY nonconst_symbol if_expr T_EOL
+{
+ menu_add_symbol(P_IMPLY, $2, $3);
+ printd(DEBUG_PARSE, "%s:%d:imply\n", zconf_curname(), zconf_lineno());
+};
+
config_option: T_RANGE symbol symbol if_expr T_EOL
{
menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,$2, $3), $4);
config_option: T_RANGE symbol symbol if_expr T_EOL
{
menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,$2, $3), $4);
@@
-230,8
+236,10
@@
symbol_option_list:
| symbol_option_list T_WORD symbol_option_arg
{
const struct kconf_id *id = kconf_id_lookup($2, strlen($2));
| symbol_option_list T_WORD symbol_option_arg
{
const struct kconf_id *id = kconf_id_lookup($2, strlen($2));
- if (id && id->flags & TF_OPTION)
+ if (id && id->flags & TF_OPTION)
{
menu_add_option(id->token, $3);
menu_add_option(id->token, $3);
+ free($3);
+ }
else
zconfprint("warning: ignoring unknown option %s", $2);
free($2);
else
zconfprint("warning: ignoring unknown option %s", $2);
free($2);
@@
-301,10
+309,10
@@
choice_option: T_OPTIONAL T_EOL
printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno());
};
printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno());
};
-choice_option: T_DEFAULT
T_WORD
if_expr T_EOL
+choice_option: T_DEFAULT
nonconst_symbol
if_expr T_EOL
{
if ($1->stype == S_UNKNOWN) {
{
if ($1->stype == S_UNKNOWN) {
- menu_add_symbol(P_DEFAULT,
sym_lookup($2, 0)
, $3);
+ menu_add_symbol(P_DEFAULT,
$2
, $3);
printd(DEBUG_PARSE, "%s:%d:default\n",
zconf_curname(), zconf_lineno());
} else
printd(DEBUG_PARSE, "%s:%d:default\n",
zconf_curname(), zconf_lineno());
} else
@@
-387,6
+395,7
@@
source_stmt: T_SOURCE prompt T_EOL
{
printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2);
zconf_nextfile($2);
{
printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2);
zconf_nextfile($2);
+ free($2);
};
/* comment entry */
};
/* comment entry */
@@
-484,7
+493,10
@@
expr: symbol { $$ = expr_alloc_symbol($1); }
| expr T_AND expr { $$ = expr_alloc_two(E_AND, $1, $3); }
;
| expr T_AND expr { $$ = expr_alloc_two(E_AND, $1, $3); }
;
-symbol: T_WORD { $$ = sym_lookup($1, 0); free($1); }
+/* For symbol definitions, selects, etc., where quotes are not accepted */
+nonconst_symbol: T_WORD { $$ = sym_lookup($1, 0); free($1); };
+
+symbol: nonconst_symbol
| T_WORD_QUOTE { $$ = sym_lookup($1, SYMBOL_CONST); free($1); }
;
| T_WORD_QUOTE { $$ = sym_lookup($1, SYMBOL_CONST); free($1); }
;
@@
-544,13
+556,13
@@
static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtok
{
if (id->token != endtoken) {
zconf_error("unexpected '%s' within %s block",
{
if (id->token != endtoken) {
zconf_error("unexpected '%s' within %s block",
-
kconf_id_strings +
id->name, zconf_tokenname(starttoken));
+ id->name, zconf_tokenname(starttoken));
zconfnerrs++;
return false;
}
if (current_menu->file != current_file) {
zconf_error("'%s' in different file than '%s'",
zconfnerrs++;
return false;
}
if (current_menu->file != current_file) {
zconf_error("'%s' in different file than '%s'",
-
kconf_id_strings +
id->name, zconf_tokenname(starttoken));
+ id->name, zconf_tokenname(starttoken));
fprintf(stderr, "%s:%d: location of the '%s'\n",
current_menu->file->name, current_menu->lineno,
zconf_tokenname(starttoken));
fprintf(stderr, "%s:%d: location of the '%s'\n",
current_menu->file->name, current_menu->lineno,
zconf_tokenname(starttoken));
@@
-664,6
+676,11
@@
static void print_symbol(FILE *out, struct menu *menu)
expr_fprint(prop->expr, out);
fputc('\n', out);
break;
expr_fprint(prop->expr, out);
fputc('\n', out);
break;
+ case P_IMPLY:
+ fputs( " imply ", out);
+ expr_fprint(prop->expr, out);
+ fputc('\n', out);
+ break;
case P_RANGE:
fputs( " range ", out);
expr_fprint(prop->expr, out);
case P_RANGE:
fputs( " range ", out);
expr_fprint(prop->expr, out);