[94a653a] | 1 | Submitted By: William Harrington (kb0iic at cross-lfs dot org) |
---|
| 2 | Date: 03-30-2014 |
---|
| 3 | Initial Package Version: 4.3 |
---|
| 4 | Origin: Upstream |
---|
| 5 | Upstream Status: Applied |
---|
| 6 | Description: Contains all upstream patches up to 4.3-011 |
---|
| 7 | |
---|
| 8 | diff -Naur bash-4.3.orig/arrayfunc.c bash-4.3/arrayfunc.c |
---|
| 9 | --- bash-4.3.orig/arrayfunc.c 2013-08-02 15:19:59.000000000 -0500 |
---|
| 10 | +++ bash-4.3/arrayfunc.c 2014-04-24 20:08:49.474314102 -0500 |
---|
| 11 | @@ -597,6 +597,11 @@ |
---|
| 12 | if (assoc_p (var)) |
---|
| 13 | { |
---|
| 14 | val = expand_assignment_string_to_string (val, 0); |
---|
| 15 | + if (val == 0) |
---|
| 16 | + { |
---|
| 17 | + val = (char *)xmalloc (1); |
---|
| 18 | + val[0] = '\0'; /* like do_assignment_internal */ |
---|
| 19 | + } |
---|
| 20 | free_val = 1; |
---|
| 21 | } |
---|
| 22 | |
---|
| 23 | diff -Naur bash-4.3.orig/externs.h bash-4.3/externs.h |
---|
| 24 | --- bash-4.3.orig/externs.h 2014-01-02 13:58:20.000000000 -0600 |
---|
| 25 | +++ bash-4.3/externs.h 2014-04-24 20:08:54.927367945 -0500 |
---|
| 26 | @@ -324,6 +324,7 @@ |
---|
| 27 | extern char *sh_backslash_quote __P((char *, const char *, int)); |
---|
| 28 | extern char *sh_backslash_quote_for_double_quotes __P((char *)); |
---|
| 29 | extern int sh_contains_shell_metas __P((char *)); |
---|
| 30 | +extern int sh_contains_quotes __P((char *)); |
---|
| 31 | |
---|
| 32 | /* declarations for functions defined in lib/sh/spell.c */ |
---|
| 33 | extern int spname __P((char *, char *)); |
---|
| 34 | diff -Naur bash-4.3.orig/jobs.c bash-4.3/jobs.c |
---|
| 35 | --- bash-4.3.orig/jobs.c 2014-01-10 08:05:34.000000000 -0600 |
---|
| 36 | +++ bash-4.3/jobs.c 2014-04-24 20:08:47.897732294 -0500 |
---|
| 37 | @@ -4374,7 +4374,7 @@ |
---|
| 38 | void |
---|
| 39 | end_job_control () |
---|
| 40 | { |
---|
| 41 | - if (interactive_shell) /* XXX - should it be interactive? */ |
---|
| 42 | + if (interactive_shell || job_control) /* XXX - should it be just job_control? */ |
---|
| 43 | { |
---|
| 44 | terminate_stopped_jobs (); |
---|
| 45 | |
---|
| 46 | diff -Naur bash-4.3.orig/lib/glob/glob.c bash-4.3/lib/glob/glob.c |
---|
| 47 | --- bash-4.3.orig/lib/glob/glob.c 2014-01-31 20:43:51.000000000 -0600 |
---|
| 48 | +++ bash-4.3/lib/glob/glob.c 2014-04-24 20:08:51.054232810 -0500 |
---|
| 49 | @@ -179,42 +179,50 @@ |
---|
| 50 | char *pat, *dname; |
---|
| 51 | int flags; |
---|
| 52 | { |
---|
| 53 | - char *pp, *pe, *t; |
---|
| 54 | - int n, r; |
---|
| 55 | + char *pp, *pe, *t, *se; |
---|
| 56 | + int n, r, negate; |
---|
| 57 | |
---|
| 58 | + negate = *pat == '!'; |
---|
| 59 | pp = pat + 2; |
---|
| 60 | - pe = pp + strlen (pp) - 1; /*(*/ |
---|
| 61 | - if (*pe != ')') |
---|
| 62 | - return 0; |
---|
| 63 | - if ((t = strchr (pp, '|')) == 0) /* easy case first */ |
---|
| 64 | + se = pp + strlen (pp) - 1; /* end of string */ |
---|
| 65 | + pe = glob_patscan (pp, se, 0); /* end of extglob pattern (( */ |
---|
| 66 | + /* we should check for invalid extglob pattern here */ |
---|
| 67 | + /* if pe != se we have more of the pattern at the end of the extglob |
---|
| 68 | + pattern. Check the easy case first ( */ |
---|
| 69 | + if (pe == se && *pe == ')' && (t = strchr (pp, '|')) == 0) |
---|
| 70 | { |
---|
| 71 | *pe = '\0'; |
---|
| 72 | +#if defined (HANDLE_MULTIBYTE) |
---|
| 73 | + r = mbskipname (pp, dname, flags); |
---|
| 74 | +#else |
---|
| 75 | r = skipname (pp, dname, flags); /*(*/ |
---|
| 76 | +#endif |
---|
| 77 | *pe = ')'; |
---|
| 78 | return r; |
---|
| 79 | } |
---|
| 80 | + |
---|
| 81 | + /* check every subpattern */ |
---|
| 82 | while (t = glob_patscan (pp, pe, '|')) |
---|
| 83 | { |
---|
| 84 | n = t[-1]; |
---|
| 85 | t[-1] = '\0'; |
---|
| 86 | +#if defined (HANDLE_MULTIBYTE) |
---|
| 87 | + r = mbskipname (pp, dname, flags); |
---|
| 88 | +#else |
---|
| 89 | r = skipname (pp, dname, flags); |
---|
| 90 | +#endif |
---|
| 91 | t[-1] = n; |
---|
| 92 | if (r == 0) /* if any pattern says not skip, we don't skip */ |
---|
| 93 | return r; |
---|
| 94 | pp = t; |
---|
| 95 | } /*(*/ |
---|
| 96 | |
---|
| 97 | - if (pp == pe) /* glob_patscan might find end of pattern */ |
---|
| 98 | + /* glob_patscan might find end of pattern */ |
---|
| 99 | + if (pp == se) |
---|
| 100 | return r; |
---|
| 101 | |
---|
| 102 | - *pe = '\0'; |
---|
| 103 | -# if defined (HANDLE_MULTIBYTE) |
---|
| 104 | - r = mbskipname (pp, dname, flags); /*(*/ |
---|
| 105 | -# else |
---|
| 106 | - r = skipname (pp, dname, flags); /*(*/ |
---|
| 107 | -# endif |
---|
| 108 | - *pe = ')'; |
---|
| 109 | - return r; |
---|
| 110 | + /* but if it doesn't then we didn't match a leading dot */ |
---|
| 111 | + return 0; |
---|
| 112 | } |
---|
| 113 | #endif |
---|
| 114 | |
---|
| 115 | @@ -277,20 +285,23 @@ |
---|
| 116 | int flags; |
---|
| 117 | { |
---|
| 118 | #if EXTENDED_GLOB |
---|
| 119 | - wchar_t *pp, *pe, *t, n; |
---|
| 120 | - int r; |
---|
| 121 | + wchar_t *pp, *pe, *t, n, *se; |
---|
| 122 | + int r, negate; |
---|
| 123 | |
---|
| 124 | + negate = *pat == L'!'; |
---|
| 125 | pp = pat + 2; |
---|
| 126 | - pe = pp + wcslen (pp) - 1; /*(*/ |
---|
| 127 | - if (*pe != L')') |
---|
| 128 | - return 0; |
---|
| 129 | - if ((t = wcschr (pp, L'|')) == 0) |
---|
| 130 | + se = pp + wcslen (pp) - 1; /*(*/ |
---|
| 131 | + pe = glob_patscan_wc (pp, se, 0); |
---|
| 132 | + |
---|
| 133 | + if (pe == se && *pe == ')' && (t = wcschr (pp, L'|')) == 0) |
---|
| 134 | { |
---|
| 135 | *pe = L'\0'; |
---|
| 136 | r = wchkname (pp, dname); /*(*/ |
---|
| 137 | *pe = L')'; |
---|
| 138 | return r; |
---|
| 139 | } |
---|
| 140 | + |
---|
| 141 | + /* check every subpattern */ |
---|
| 142 | while (t = glob_patscan_wc (pp, pe, '|')) |
---|
| 143 | { |
---|
| 144 | n = t[-1]; |
---|
| 145 | @@ -305,10 +316,8 @@ |
---|
| 146 | if (pp == pe) /* glob_patscan_wc might find end of pattern */ |
---|
| 147 | return r; |
---|
| 148 | |
---|
| 149 | - *pe = L'\0'; |
---|
| 150 | - r = wchkname (pp, dname); /*(*/ |
---|
| 151 | - *pe = L')'; |
---|
| 152 | - return r; |
---|
| 153 | + /* but if it doesn't then we didn't match a leading dot */ |
---|
| 154 | + return 0; |
---|
| 155 | #else |
---|
| 156 | return (wchkname (pat, dname)); |
---|
| 157 | #endif |
---|
| 158 | diff -Naur bash-4.3.orig/lib/glob/gmisc.c bash-4.3/lib/glob/gmisc.c |
---|
| 159 | --- bash-4.3.orig/lib/glob/gmisc.c 2013-10-28 13:45:25.000000000 -0500 |
---|
| 160 | +++ bash-4.3/lib/glob/gmisc.c 2014-04-24 20:08:51.054232810 -0500 |
---|
| 161 | @@ -210,6 +210,7 @@ |
---|
| 162 | case '+': |
---|
| 163 | case '!': |
---|
| 164 | case '@': |
---|
| 165 | + case '?': |
---|
| 166 | return (pat[1] == LPAREN); |
---|
| 167 | default: |
---|
| 168 | return 0; |
---|
| 169 | diff -Naur bash-4.3.orig/lib/readline/display.c bash-4.3/lib/readline/display.c |
---|
| 170 | --- bash-4.3.orig/lib/readline/display.c 2013-12-27 12:10:56.000000000 -0600 |
---|
| 171 | +++ bash-4.3/lib/readline/display.c 2014-04-24 20:08:56.493955444 -0500 |
---|
| 172 | @@ -2677,7 +2677,8 @@ |
---|
| 173 | { |
---|
| 174 | if (_rl_echoing_p) |
---|
| 175 | { |
---|
| 176 | - _rl_move_vert (_rl_vis_botlin); |
---|
| 177 | + if (_rl_vis_botlin > 0) /* minor optimization plus bug fix */ |
---|
| 178 | + _rl_move_vert (_rl_vis_botlin); |
---|
| 179 | _rl_vis_botlin = 0; |
---|
| 180 | fflush (rl_outstream); |
---|
| 181 | rl_restart_output (1, 0); |
---|
| 182 | diff -Naur bash-4.3.orig/lib/readline/readline.c bash-4.3/lib/readline/readline.c |
---|
| 183 | --- bash-4.3.orig/lib/readline/readline.c 2013-10-28 13:58:06.000000000 -0500 |
---|
| 184 | +++ bash-4.3/lib/readline/readline.c 2014-04-24 20:08:44.507909810 -0500 |
---|
| 185 | @@ -744,7 +744,8 @@ |
---|
| 186 | r = _rl_subseq_result (r, cxt->oldmap, cxt->okey, (cxt->flags & KSEQ_SUBSEQ)); |
---|
| 187 | |
---|
| 188 | RL_CHECK_SIGNALS (); |
---|
| 189 | - if (r == 0) /* success! */ |
---|
| 190 | + /* We only treat values < 0 specially to simulate recursion. */ |
---|
| 191 | + if (r >= 0 || (r == -1 && (cxt->flags & KSEQ_SUBSEQ) == 0)) /* success! or failure! */ |
---|
| 192 | { |
---|
| 193 | _rl_keyseq_chain_dispose (); |
---|
| 194 | RL_UNSETSTATE (RL_STATE_MULTIKEY); |
---|
| 195 | @@ -964,7 +965,7 @@ |
---|
| 196 | #if defined (VI_MODE) |
---|
| 197 | if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap && |
---|
| 198 | key != ANYOTHERKEY && |
---|
| 199 | - rl_key_sequence_length == 1 && /* XXX */ |
---|
| 200 | + _rl_dispatching_keymap == vi_movement_keymap && |
---|
| 201 | _rl_vi_textmod_command (key)) |
---|
| 202 | _rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign); |
---|
| 203 | #endif |
---|
| 204 | diff -Naur bash-4.3.orig/lib/sh/shquote.c bash-4.3/lib/sh/shquote.c |
---|
| 205 | --- bash-4.3.orig/lib/sh/shquote.c 2013-03-31 20:53:32.000000000 -0500 |
---|
| 206 | +++ bash-4.3/lib/sh/shquote.c 2014-04-24 20:08:54.927367945 -0500 |
---|
| 207 | @@ -311,3 +311,17 @@ |
---|
| 208 | |
---|
| 209 | return (0); |
---|
| 210 | } |
---|
| 211 | + |
---|
| 212 | +int |
---|
| 213 | +sh_contains_quotes (string) |
---|
| 214 | + char *string; |
---|
| 215 | +{ |
---|
| 216 | + char *s; |
---|
| 217 | + |
---|
| 218 | + for (s = string; s && *s; s++) |
---|
| 219 | + { |
---|
| 220 | + if (*s == '\'' || *s == '"' || *s == '\\') |
---|
| 221 | + return 1; |
---|
| 222 | + } |
---|
| 223 | + return 0; |
---|
| 224 | +} |
---|
| 225 | diff -Naur bash-4.3.orig/parse.y bash-4.3/parse.y |
---|
| 226 | --- bash-4.3.orig/parse.y 2014-02-11 08:42:10.000000000 -0600 |
---|
| 227 | +++ bash-4.3/parse.y 2014-04-24 20:08:52.607486462 -0500 |
---|
| 228 | @@ -2424,7 +2424,7 @@ |
---|
| 229 | not already end in an EOF character. */ |
---|
| 230 | if (shell_input_line_terminator != EOF) |
---|
| 231 | { |
---|
| 232 | - if (shell_input_line_size < SIZE_MAX && shell_input_line_len > shell_input_line_size - 3) |
---|
| 233 | + if (shell_input_line_size < SIZE_MAX-3 && (shell_input_line_len+3 > shell_input_line_size)) |
---|
| 234 | shell_input_line = (char *)xrealloc (shell_input_line, |
---|
| 235 | 1 + (shell_input_line_size += 2)); |
---|
| 236 | |
---|
| 237 | @@ -3398,7 +3398,7 @@ |
---|
| 238 | within a double-quoted ${...} construct "an even number of |
---|
| 239 | unescaped double-quotes or single-quotes, if any, shall occur." */ |
---|
| 240 | /* This was changed in Austin Group Interp 221 */ |
---|
| 241 | - if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'') |
---|
| 242 | + if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && dolbrace_state != DOLBRACE_QUOTE2 && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'') |
---|
| 243 | continue; |
---|
| 244 | |
---|
| 245 | /* Could also check open == '`' if we want to parse grouping constructs |
---|
| 246 | diff -Naur bash-4.3.orig/patchlevel.h bash-4.3/patchlevel.h |
---|
| 247 | --- bash-4.3.orig/patchlevel.h 2012-12-29 09:47:57.000000000 -0600 |
---|
| 248 | +++ bash-4.3/patchlevel.h 2014-04-24 20:08:56.493955444 -0500 |
---|
| 249 | @@ -25,6 +25,6 @@ |
---|
| 250 | regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh |
---|
| 251 | looks for to find the patch level (for the sccs version string). */ |
---|
| 252 | |
---|
| 253 | -#define PATCHLEVEL 0 |
---|
| 254 | +#define PATCHLEVEL 11 |
---|
| 255 | |
---|
| 256 | #endif /* _PATCHLEVEL_H_ */ |
---|
| 257 | diff -Naur bash-4.3.orig/pcomplete.c bash-4.3/pcomplete.c |
---|
| 258 | --- bash-4.3.orig/pcomplete.c 2013-08-26 14:23:45.000000000 -0500 |
---|
| 259 | +++ bash-4.3/pcomplete.c 2014-04-24 20:08:54.927367945 -0500 |
---|
| 260 | @@ -183,6 +183,7 @@ |
---|
| 261 | |
---|
| 262 | COMPSPEC *pcomp_curcs; |
---|
| 263 | const char *pcomp_curcmd; |
---|
| 264 | +const char *pcomp_curtxt; |
---|
| 265 | |
---|
| 266 | #ifdef DEBUG |
---|
| 267 | /* Debugging code */ |
---|
| 268 | @@ -753,6 +754,32 @@ |
---|
| 269 | quoted strings. */ |
---|
| 270 | dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character); |
---|
| 271 | } |
---|
| 272 | + /* Intended to solve a mismatched assumption by bash-completion. If |
---|
| 273 | + the text to be completed is empty, but bash-completion turns it into |
---|
| 274 | + a quoted string ('') assuming that this code will dequote it before |
---|
| 275 | + calling readline, do the dequoting. */ |
---|
| 276 | + else if (iscompgen && iscompleting && |
---|
| 277 | + pcomp_curtxt && *pcomp_curtxt == 0 && |
---|
| 278 | + text && (*text == '\'' || *text == '"') && text[1] == text[0] && text[2] == 0 && |
---|
| 279 | + rl_filename_dequoting_function) |
---|
| 280 | + dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character); |
---|
| 281 | + /* Another mismatched assumption by bash-completion. If compgen is being |
---|
| 282 | + run as part of bash-completion, and the argument to compgen is not |
---|
| 283 | + the same as the word originally passed to the programmable completion |
---|
| 284 | + code, dequote the argument if it has quote characters. It's an |
---|
| 285 | + attempt to detect when bash-completion is quoting its filename |
---|
| 286 | + argument before calling compgen. */ |
---|
| 287 | + /* We could check whether gen_shell_function_matches is in the call |
---|
| 288 | + stack by checking whether the gen-shell-function-matches tag is in |
---|
| 289 | + the unwind-protect stack, but there's no function to do that yet. |
---|
| 290 | + We could simply check whether we're executing in a function by |
---|
| 291 | + checking variable_context, and may end up doing that. */ |
---|
| 292 | + else if (iscompgen && iscompleting && rl_filename_dequoting_function && |
---|
| 293 | + pcomp_curtxt && text && |
---|
| 294 | + STREQ (pcomp_curtxt, text) == 0 && |
---|
| 295 | + variable_context && |
---|
| 296 | + sh_contains_quotes (text)) /* guess */ |
---|
| 297 | + dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character); |
---|
| 298 | else |
---|
| 299 | dfn = savestring (text); |
---|
| 300 | } |
---|
| 301 | @@ -1522,7 +1549,7 @@ |
---|
| 302 | COMPSPEC **lastcs; |
---|
| 303 | { |
---|
| 304 | COMPSPEC *cs, *oldcs; |
---|
| 305 | - const char *oldcmd; |
---|
| 306 | + const char *oldcmd, *oldtxt; |
---|
| 307 | STRINGLIST *ret; |
---|
| 308 | |
---|
| 309 | cs = progcomp_search (ocmd); |
---|
| 310 | @@ -1545,14 +1572,17 @@ |
---|
| 311 | |
---|
| 312 | oldcs = pcomp_curcs; |
---|
| 313 | oldcmd = pcomp_curcmd; |
---|
| 314 | + oldtxt = pcomp_curtxt; |
---|
| 315 | |
---|
| 316 | pcomp_curcs = cs; |
---|
| 317 | pcomp_curcmd = cmd; |
---|
| 318 | + pcomp_curtxt = word; |
---|
| 319 | |
---|
| 320 | ret = gen_compspec_completions (cs, cmd, word, start, end, foundp); |
---|
| 321 | |
---|
| 322 | pcomp_curcs = oldcs; |
---|
| 323 | pcomp_curcmd = oldcmd; |
---|
| 324 | + pcomp_curtxt = oldtxt; |
---|
| 325 | |
---|
| 326 | /* We need to conditionally handle setting *retryp here */ |
---|
| 327 | if (retryp) |
---|
| 328 | diff -Naur bash-4.3.orig/test.c bash-4.3/test.c |
---|
| 329 | --- bash-4.3.orig/test.c 2014-02-04 15:52:58.000000000 -0600 |
---|
| 330 | +++ bash-4.3/test.c 2014-04-24 20:08:39.174864532 -0500 |
---|
| 331 | @@ -646,8 +646,8 @@ |
---|
| 332 | return (v && invisible_p (v) == 0 && var_isset (v) ? TRUE : FALSE); |
---|
| 333 | |
---|
| 334 | case 'R': |
---|
| 335 | - v = find_variable (arg); |
---|
| 336 | - return (v && invisible_p (v) == 0 && var_isset (v) && nameref_p (v) ? TRUE : FALSE); |
---|
| 337 | + v = find_variable_noref (arg); |
---|
| 338 | + return ((v && invisible_p (v) == 0 && var_isset (v) && nameref_p (v)) ? TRUE : FALSE); |
---|
| 339 | } |
---|
| 340 | |
---|
| 341 | /* We can't actually get here, but this shuts up gcc. */ |
---|
| 342 | @@ -723,6 +723,7 @@ |
---|
| 343 | case 'o': case 'p': case 'r': case 's': case 't': |
---|
| 344 | case 'u': case 'v': case 'w': case 'x': case 'z': |
---|
| 345 | case 'G': case 'L': case 'O': case 'S': case 'N': |
---|
| 346 | + case 'R': |
---|
| 347 | return (1); |
---|
| 348 | } |
---|
| 349 | |
---|
| 350 | diff -Naur bash-4.3.orig/trap.c bash-4.3/trap.c |
---|
| 351 | --- bash-4.3.orig/trap.c 2014-02-05 09:03:21.000000000 -0600 |
---|
| 352 | +++ bash-4.3/trap.c 2014-04-24 20:08:41.401408370 -0500 |
---|
| 353 | @@ -920,7 +920,8 @@ |
---|
| 354 | subst_assign_varlist = 0; |
---|
| 355 | |
---|
| 356 | #if defined (JOB_CONTROL) |
---|
| 357 | - save_pipeline (1); /* XXX only provides one save level */ |
---|
| 358 | + if (sig != DEBUG_TRAP) /* run_debug_trap does this */ |
---|
| 359 | + save_pipeline (1); /* XXX only provides one save level */ |
---|
| 360 | #endif |
---|
| 361 | |
---|
| 362 | /* If we're in a function, make sure return longjmps come here, too. */ |
---|
| 363 | @@ -940,7 +941,8 @@ |
---|
| 364 | trap_exit_value = last_command_exit_value; |
---|
| 365 | |
---|
| 366 | #if defined (JOB_CONTROL) |
---|
| 367 | - restore_pipeline (1); |
---|
| 368 | + if (sig != DEBUG_TRAP) /* run_debug_trap does this */ |
---|
| 369 | + restore_pipeline (1); |
---|
| 370 | #endif |
---|
| 371 | |
---|
| 372 | subst_assign_varlist = save_subst_varlist; |
---|
| 373 | diff -Naur bash-4.3.orig/y.tab.c bash-4.3/y.tab.c |
---|
| 374 | --- bash-4.3.orig/y.tab.c 2014-02-11 09:57:47.000000000 -0600 |
---|
| 375 | +++ bash-4.3/y.tab.c 2014-04-24 20:08:52.607486462 -0500 |
---|
| 376 | @@ -4736,7 +4736,7 @@ |
---|
| 377 | not already end in an EOF character. */ |
---|
| 378 | if (shell_input_line_terminator != EOF) |
---|
| 379 | { |
---|
| 380 | - if (shell_input_line_size < SIZE_MAX && shell_input_line_len > shell_input_line_size - 3) |
---|
| 381 | + if (shell_input_line_size < SIZE_MAX-3 && (shell_input_line_len+3 > shell_input_line_size)) |
---|
| 382 | shell_input_line = (char *)xrealloc (shell_input_line, |
---|
| 383 | 1 + (shell_input_line_size += 2)); |
---|
| 384 | |
---|
| 385 | @@ -5710,7 +5710,7 @@ |
---|
| 386 | within a double-quoted ${...} construct "an even number of |
---|
| 387 | unescaped double-quotes or single-quotes, if any, shall occur." */ |
---|
| 388 | /* This was changed in Austin Group Interp 221 */ |
---|
| 389 | - if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'') |
---|
| 390 | + if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && dolbrace_state != DOLBRACE_QUOTE2 && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'') |
---|
| 391 | continue; |
---|
| 392 | |
---|
| 393 | /* Could also check open == '`' if we want to parse grouping constructs |
---|