hush: fix 'x=; echo ${x:-"$@"}' producing 'BUG in varexp2' message

function                                             old     new   delta
expand_string_to_string                              126     128      +2

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2018-07-18 16:02:25 +02:00
parent 8b08d5a502
commit 2e71101e31

View File

@ -6529,13 +6529,20 @@ static char *expand_string_to_string(const char *str, int EXP_flags, int do_unba
argv[0] = (char*)str; argv[0] = (char*)str;
argv[1] = NULL; argv[1] = NULL;
list = expand_variables(argv, EXP_flags | EXP_FLAG_SINGLEWORD); list = expand_variables(argv, EXP_flags | EXP_FLAG_SINGLEWORD);
if (HUSH_DEBUG) if (!list[0]) {
if (!list[0] || list[1]) /* Example where it happens:
bb_error_msg_and_die("BUG in varexp2"); * x=; echo ${x:-"$@"}
/* actually, just move string 2*sizeof(char*) bytes back */ */
overlapping_strcpy((char*)list, list[0]); ((char*)list)[0] = '\0';
if (do_unbackslash) } else {
unbackslash((char*)list); if (HUSH_DEBUG)
if (list[1])
bb_error_msg_and_die("BUG in varexp2");
/* actually, just move string 2*sizeof(char*) bytes back */
overlapping_strcpy((char*)list, list[0]);
if (do_unbackslash)
unbackslash((char*)list);
}
debug_printf_expand("string_to_string=>'%s'\n", (char*)list); debug_printf_expand("string_to_string=>'%s'\n", (char*)list);
return (char*)list; return (char*)list;
} }