← Commit list

cba79a87f

Denys Vlasenko
Denys Vlasenko
2018-01-25
SUCCESS Duration: 143s

Subject

hush: fix two corner cases in ${v/pattern/repl}. Closes 10686

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

shell/hush.c+11 -2
@@ -5643,6 +5643,10 @@ static char *replace_pattern(char *val, const char *pattern, const char *repl, c
unsigned res_len = 0;
unsigned repl_len = strlen(repl);
+ /* Null pattern never matches, including if "var" is empty */
+ if (!pattern[0])
+ return result; /* NULL, no replaces happened */
+
while (1) {
int size;
char *s = strstr_pattern(val, pattern, &size);
@@ -5809,8 +5813,6 @@ static NOINLINE const char *expand_one_var(char **to_be_freed_pp, char *arg, cha
* and if // is used, it is encoded as \:
* var\pattern<SPECIAL_VAR_SYMBOL>repl<SPECIAL_VAR_SYMBOL>
*/
- /* Empty variable always gives nothing: */
- // "v=''; echo ${v/*/w}" prints "", not "w"
if (val && val[0]) {
/* pattern uses non-standard expansion.
* repl should be unbackslashed and globbed
@@ -5846,6 +5848,13 @@ static NOINLINE const char *expand_one_var(char **to_be_freed_pp, char *arg, cha
val = to_be_freed;
free(pattern);
free(repl);
+ } else {
+ /* Empty variable always gives nothing */
+ // "v=''; echo ${v/*/w}" prints "", not "w"
+ /* Just skip "replace" part */
+ *p++ = SPECIAL_VAR_SYMBOL;
+ p = strchr(p, SPECIAL_VAR_SYMBOL);
+ *p = '\0';
}
}
#endif /* BASH_PATTERN_SUBST */
shell/hush_test/hush-vars/var_bash_repl_empty_pattern.right+2 -0
@@ -0,0 +1,2 @@
+v
+Ok:0
shell/hush_test/hush-vars/var_bash_repl_empty_pattern.tests+3 -0
@@ -0,0 +1,3 @@
+v=v
+echo ${v//}
+echo Ok:$?
shell/hush_test/hush-vars/var_bash_repl_empty_var.right+2 -0
@@ -0,0 +1,2 @@
+
+Ok:0
shell/hush_test/hush-vars/var_bash_repl_empty_var.tests+3 -0
@@ -0,0 +1,3 @@
+v=''
+echo ${v/*/w}
+echo Ok:$?