[ba0a8be] | 1 | Submitted By: William Harrington (kb0iic at cross-lfs dot org)
|
---|
| 2 | Date: 05-03-2017
|
---|
| 3 | Initial Package Version: 4.4
|
---|
| 4 | Origin: Upstream
|
---|
| 5 | Upstream Status: Applied
|
---|
| 6 | Description: Contains all upstream patches up to 4.4-012
|
---|
| 7 |
|
---|
| 8 | diff -Naur bash-4.4.orig/bashline.c bash-4.4/bashline.c
|
---|
| 9 | --- bash-4.4.orig/bashline.c 2016-08-06 01:44:05.000000000 +0000
|
---|
| 10 | +++ bash-4.4/bashline.c 2017-04-13 23:33:07.549107403 +0000
|
---|
| 11 | @@ -142,7 +142,7 @@
|
---|
| 12 | static rl_icppfunc_t *save_directory_hook __P((void));
|
---|
| 13 | static void restore_directory_hook __P((rl_icppfunc_t));
|
---|
| 14 |
|
---|
| 15 | -static int directory_exists __P((const char *));
|
---|
| 16 | +static int directory_exists __P((const char *, int));
|
---|
| 17 |
|
---|
| 18 | static void cleanup_expansion_error __P((void));
|
---|
| 19 | static void maybe_make_readline_line __P((char *));
|
---|
| 20 | @@ -3102,18 +3102,20 @@
|
---|
| 21 | rl_directory_rewrite_hook = hookf;
|
---|
| 22 | }
|
---|
| 23 |
|
---|
| 24 | -/* Check whether not the (dequoted) version of DIRNAME, with any trailing slash
|
---|
| 25 | - removed, exists. */
|
---|
| 26 | +/* Check whether not DIRNAME, with any trailing slash removed, exists. If
|
---|
| 27 | + SHOULD_DEQUOTE is non-zero, we dequote the directory name first. */
|
---|
| 28 | static int
|
---|
| 29 | -directory_exists (dirname)
|
---|
| 30 | +directory_exists (dirname, should_dequote)
|
---|
| 31 | const char *dirname;
|
---|
| 32 | + int should_dequote;
|
---|
| 33 | {
|
---|
| 34 | char *new_dirname;
|
---|
| 35 | int dirlen, r;
|
---|
| 36 | struct stat sb;
|
---|
| 37 |
|
---|
| 38 | - /* First, dequote the directory name */
|
---|
| 39 | - new_dirname = bash_dequote_filename ((char *)dirname, rl_completion_quote_character);
|
---|
| 40 | + /* We save the string and chop the trailing slash because stat/lstat behave
|
---|
| 41 | + inconsistently if one is present. */
|
---|
| 42 | + new_dirname = should_dequote ? bash_dequote_filename ((char *)dirname, rl_completion_quote_character) : savestring (dirname);
|
---|
| 43 | dirlen = STRLEN (new_dirname);
|
---|
| 44 | if (new_dirname[dirlen - 1] == '/')
|
---|
| 45 | new_dirname[dirlen - 1] = '\0';
|
---|
| 46 | @@ -3145,7 +3147,7 @@
|
---|
| 47 | else if (t = mbschr (local_dirname, '`')) /* XXX */
|
---|
| 48 | should_expand_dirname = '`';
|
---|
| 49 |
|
---|
| 50 | - if (should_expand_dirname && directory_exists (local_dirname))
|
---|
| 51 | + if (should_expand_dirname && directory_exists (local_dirname, 0))
|
---|
| 52 | should_expand_dirname = 0;
|
---|
| 53 |
|
---|
| 54 | if (should_expand_dirname)
|
---|
| 55 | @@ -3155,7 +3157,7 @@
|
---|
| 56 | have to worry about restoring this setting. */
|
---|
| 57 | global_nounset = unbound_vars_is_error;
|
---|
| 58 | unbound_vars_is_error = 0;
|
---|
| 59 | - wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB|W_COMPLETE); /* does the right thing */
|
---|
| 60 | + wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB|W_NOPROCSUB|W_COMPLETE); /* does the right thing */
|
---|
| 61 | unbound_vars_is_error = global_nounset;
|
---|
| 62 | if (wl)
|
---|
| 63 | {
|
---|
| 64 | @@ -3244,13 +3246,13 @@
|
---|
| 65 | should_expand_dirname = '`';
|
---|
| 66 | }
|
---|
| 67 |
|
---|
| 68 | - if (should_expand_dirname && directory_exists (local_dirname))
|
---|
| 69 | + if (should_expand_dirname && directory_exists (local_dirname, 1))
|
---|
| 70 | should_expand_dirname = 0;
|
---|
| 71 |
|
---|
| 72 | if (should_expand_dirname)
|
---|
| 73 | {
|
---|
| 74 | new_dirname = savestring (local_dirname);
|
---|
| 75 | - wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB|W_COMPLETE); /* does the right thing */
|
---|
| 76 | + wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB|W_NOPROCSUB|W_COMPLETE); /* does the right thing */
|
---|
| 77 | if (wl)
|
---|
| 78 | {
|
---|
| 79 | *dirname = string_list (wl);
|
---|
| 80 | diff -Naur bash-4.4.orig/builtins/evalstring.c bash-4.4/builtins/evalstring.c
|
---|
| 81 | --- bash-4.4.orig/builtins/evalstring.c 2016-08-11 18:18:51.000000000 +0000
|
---|
| 82 | +++ bash-4.4/builtins/evalstring.c 2017-04-13 23:33:07.545107350 +0000
|
---|
| 83 | @@ -104,12 +104,9 @@
|
---|
| 84 | running_trap == 0 &&
|
---|
| 85 | *bash_input.location.string == '\0' &&
|
---|
| 86 | command->type == cm_simple &&
|
---|
| 87 | -#if 0
|
---|
| 88 | signal_is_trapped (EXIT_TRAP) == 0 &&
|
---|
| 89 | signal_is_trapped (ERROR_TRAP) == 0 &&
|
---|
| 90 | -#else
|
---|
| 91 | any_signals_trapped () < 0 &&
|
---|
| 92 | -#endif
|
---|
| 93 | command->redirects == 0 && command->value.Simple->redirects == 0 &&
|
---|
| 94 | ((command->flags & CMD_TIME_PIPELINE) == 0) &&
|
---|
| 95 | ((command->flags & CMD_INVERT_RETURN) == 0));
|
---|
| 96 | diff -Naur bash-4.4.orig/builtins/pushd.def bash-4.4/builtins/pushd.def
|
---|
| 97 | --- bash-4.4.orig/builtins/pushd.def 2016-01-25 18:31:49.000000000 +0000
|
---|
| 98 | +++ bash-4.4/builtins/pushd.def 2017-04-13 23:33:07.546107363 +0000
|
---|
| 99 | @@ -365,7 +365,7 @@
|
---|
| 100 | break;
|
---|
| 101 | }
|
---|
| 102 |
|
---|
| 103 | - if (which > directory_list_offset || (directory_list_offset == 0 && which == 0))
|
---|
| 104 | + if (which > directory_list_offset || (which < -directory_list_offset) || (directory_list_offset == 0 && which == 0))
|
---|
| 105 | {
|
---|
| 106 | pushd_error (directory_list_offset, which_word ? which_word : "");
|
---|
| 107 | return (EXECUTION_FAILURE);
|
---|
| 108 | @@ -387,6 +387,11 @@
|
---|
| 109 | remove that directory from the list and shift the remainder
|
---|
| 110 | of the list into place. */
|
---|
| 111 | i = (direction == '+') ? directory_list_offset - which : which;
|
---|
| 112 | + if (i < 0 || i > directory_list_offset)
|
---|
| 113 | + {
|
---|
| 114 | + pushd_error (directory_list_offset, which_word ? which_word : "");
|
---|
| 115 | + return (EXECUTION_FAILURE);
|
---|
| 116 | + }
|
---|
| 117 | free (pushd_directory_list[i]);
|
---|
| 118 | directory_list_offset--;
|
---|
| 119 |
|
---|
| 120 | diff -Naur bash-4.4.orig/builtins/read.def bash-4.4/builtins/read.def
|
---|
| 121 | --- bash-4.4.orig/builtins/read.def 2016-05-16 18:24:56.000000000 +0000
|
---|
| 122 | +++ bash-4.4/builtins/read.def 2017-04-13 23:33:07.609108202 +0000
|
---|
| 123 | @@ -181,7 +181,8 @@
|
---|
| 124 | WORD_LIST *list;
|
---|
| 125 | {
|
---|
| 126 | register char *varname;
|
---|
| 127 | - int size, i, nr, pass_next, saw_escape, eof, opt, retval, code, print_ps2;
|
---|
| 128 | + int size, nr, pass_next, saw_escape, eof, opt, retval, code, print_ps2;
|
---|
| 129 | + volatile int i;
|
---|
| 130 | int input_is_tty, input_is_pipe, unbuffered_read, skip_ctlesc, skip_ctlnul;
|
---|
| 131 | int raw, edit, nchars, silent, have_timeout, ignore_delim, fd, lastsig, t_errno;
|
---|
| 132 | unsigned int tmsec, tmusec;
|
---|
| 133 | diff -Naur bash-4.4.orig/expr.c bash-4.4/expr.c
|
---|
| 134 | --- bash-4.4.orig/expr.c 2015-10-11 18:46:36.000000000 +0000
|
---|
| 135 | +++ bash-4.4/expr.c 2017-04-13 23:33:07.552107443 +0000
|
---|
| 136 | @@ -578,24 +578,23 @@
|
---|
| 137 | rval = cval = explor ();
|
---|
| 138 | if (curtok == QUES) /* found conditional expr */
|
---|
| 139 | {
|
---|
| 140 | - readtok ();
|
---|
| 141 | - if (curtok == 0 || curtok == COL)
|
---|
| 142 | - evalerror (_("expression expected"));
|
---|
| 143 | if (cval == 0)
|
---|
| 144 | {
|
---|
| 145 | set_noeval = 1;
|
---|
| 146 | noeval++;
|
---|
| 147 | }
|
---|
| 148 |
|
---|
| 149 | + readtok ();
|
---|
| 150 | + if (curtok == 0 || curtok == COL)
|
---|
| 151 | + evalerror (_("expression expected"));
|
---|
| 152 | +
|
---|
| 153 | val1 = EXP_HIGHEST ();
|
---|
| 154 |
|
---|
| 155 | if (set_noeval)
|
---|
| 156 | noeval--;
|
---|
| 157 | if (curtok != COL)
|
---|
| 158 | evalerror (_("`:' expected for conditional expression"));
|
---|
| 159 | - readtok ();
|
---|
| 160 | - if (curtok == 0)
|
---|
| 161 | - evalerror (_("expression expected"));
|
---|
| 162 | +
|
---|
| 163 | set_noeval = 0;
|
---|
| 164 | if (cval)
|
---|
| 165 | {
|
---|
| 166 | @@ -603,7 +602,11 @@
|
---|
| 167 | noeval++;
|
---|
| 168 | }
|
---|
| 169 |
|
---|
| 170 | + readtok ();
|
---|
| 171 | + if (curtok == 0)
|
---|
| 172 | + evalerror (_("expression expected"));
|
---|
| 173 | val2 = expcond ();
|
---|
| 174 | +
|
---|
| 175 | if (set_noeval)
|
---|
| 176 | noeval--;
|
---|
| 177 | rval = cval ? val1 : val2;
|
---|
| 178 | diff -Naur bash-4.4.orig/jobs.c bash-4.4/jobs.c
|
---|
| 179 | --- bash-4.4.orig/jobs.c 2016-08-23 20:38:44.000000000 +0000
|
---|
| 180 | +++ bash-4.4/jobs.c 2017-04-13 23:33:07.542107310 +0000
|
---|
| 181 | @@ -453,6 +453,21 @@
|
---|
| 182 | discard_pipeline (disposer);
|
---|
| 183 | }
|
---|
| 184 |
|
---|
| 185 | +void
|
---|
| 186 | +discard_last_procsub_child ()
|
---|
| 187 | +{
|
---|
| 188 | + PROCESS *disposer;
|
---|
| 189 | + sigset_t set, oset;
|
---|
| 190 | +
|
---|
| 191 | + BLOCK_CHILD (set, oset);
|
---|
| 192 | + disposer = last_procsub_child;
|
---|
| 193 | + last_procsub_child = (PROCESS *)NULL;
|
---|
| 194 | + UNBLOCK_CHILD (oset);
|
---|
| 195 | +
|
---|
| 196 | + if (disposer)
|
---|
| 197 | + discard_pipeline (disposer);
|
---|
| 198 | +}
|
---|
| 199 | +
|
---|
| 200 | struct pipeline_saver *
|
---|
| 201 | alloc_pipeline_saver ()
|
---|
| 202 | {
|
---|
| 203 | diff -Naur bash-4.4.orig/jobs.h bash-4.4/jobs.h
|
---|
| 204 | --- bash-4.4.orig/jobs.h 2016-04-27 14:35:51.000000000 +0000
|
---|
| 205 | +++ bash-4.4/jobs.h 2017-04-13 23:33:07.542107310 +0000
|
---|
| 206 | @@ -190,6 +190,7 @@
|
---|
| 207 | extern void making_children __P((void));
|
---|
| 208 | extern void stop_making_children __P((void));
|
---|
| 209 | extern void cleanup_the_pipeline __P((void));
|
---|
| 210 | +extern void discard_last_procsub_child __P((void));
|
---|
| 211 | extern void save_pipeline __P((int));
|
---|
| 212 | extern PROCESS *restore_pipeline __P((int));
|
---|
| 213 | extern void start_pipeline __P((void));
|
---|
| 214 | diff -Naur bash-4.4.orig/lib/glob/sm_loop.c bash-4.4/lib/glob/sm_loop.c
|
---|
| 215 | --- bash-4.4.orig/lib/glob/sm_loop.c 2016-04-10 15:23:21.000000000 +0000
|
---|
| 216 | +++ bash-4.4/lib/glob/sm_loop.c 2017-04-13 23:33:07.540107283 +0000
|
---|
| 217 | @@ -330,6 +330,12 @@
|
---|
| 218 | for (pc = 0; p[pc]; pc++)
|
---|
| 219 | if (p[pc] == L('.') && p[pc+1] == L(']'))
|
---|
| 220 | break;
|
---|
| 221 | + if (p[pc] == 0)
|
---|
| 222 | + {
|
---|
| 223 | + if (vp)
|
---|
| 224 | + *vp = INVALID;
|
---|
| 225 | + return (p + pc);
|
---|
| 226 | + }
|
---|
| 227 | val = COLLSYM (p, pc);
|
---|
| 228 | if (vp)
|
---|
| 229 | *vp = val;
|
---|
| 230 | @@ -483,6 +489,9 @@
|
---|
| 231 | c = *p++;
|
---|
| 232 | c = FOLD (c);
|
---|
| 233 |
|
---|
| 234 | + if (c == L('\0'))
|
---|
| 235 | + return ((test == L('[')) ? savep : (CHAR *)0);
|
---|
| 236 | +
|
---|
| 237 | if ((flags & FNM_PATHNAME) && c == L('/'))
|
---|
| 238 | /* [/] can never match when matching a pathname. */
|
---|
| 239 | return (CHAR *)0;
|
---|
| 240 | diff -Naur bash-4.4.orig/lib/readline/history.c bash-4.4/lib/readline/history.c
|
---|
| 241 | --- bash-4.4.orig/lib/readline/history.c 2015-12-28 18:50:31.000000000 +0000
|
---|
| 242 | +++ bash-4.4/lib/readline/history.c 2017-04-13 23:33:07.607108175 +0000
|
---|
| 243 | @@ -57,6 +57,8 @@
|
---|
| 244 | /* How big to make the_history when we first allocate it. */
|
---|
| 245 | #define DEFAULT_HISTORY_INITIAL_SIZE 502
|
---|
| 246 |
|
---|
| 247 | +#define MAX_HISTORY_INITIAL_SIZE 8192
|
---|
| 248 | +
|
---|
| 249 | /* The number of slots to increase the_history by. */
|
---|
| 250 | #define DEFAULT_HISTORY_GROW_SIZE 50
|
---|
| 251 |
|
---|
| 252 | @@ -277,6 +279,7 @@
|
---|
| 253 | const char *string;
|
---|
| 254 | {
|
---|
| 255 | HIST_ENTRY *temp;
|
---|
| 256 | + int new_length;
|
---|
| 257 |
|
---|
| 258 | if (history_stifled && (history_length == history_max_entries))
|
---|
| 259 | {
|
---|
| 260 | @@ -293,13 +296,9 @@
|
---|
| 261 |
|
---|
| 262 | /* Copy the rest of the entries, moving down one slot. Copy includes
|
---|
| 263 | trailing NULL. */
|
---|
| 264 | -#if 0
|
---|
| 265 | - for (i = 0; i < history_length; i++)
|
---|
| 266 | - the_history[i] = the_history[i + 1];
|
---|
| 267 | -#else
|
---|
| 268 | memmove (the_history, the_history + 1, history_length * sizeof (HIST_ENTRY *));
|
---|
| 269 | -#endif
|
---|
| 270 |
|
---|
| 271 | + new_length = history_length;
|
---|
| 272 | history_base++;
|
---|
| 273 | }
|
---|
| 274 | else
|
---|
| 275 | @@ -307,11 +306,13 @@
|
---|
| 276 | if (history_size == 0)
|
---|
| 277 | {
|
---|
| 278 | if (history_stifled && history_max_entries > 0)
|
---|
| 279 | - history_size = history_max_entries + 2;
|
---|
| 280 | + history_size = (history_max_entries > MAX_HISTORY_INITIAL_SIZE)
|
---|
| 281 | + ? MAX_HISTORY_INITIAL_SIZE
|
---|
| 282 | + : history_max_entries + 2;
|
---|
| 283 | else
|
---|
| 284 | history_size = DEFAULT_HISTORY_INITIAL_SIZE;
|
---|
| 285 | the_history = (HIST_ENTRY **)xmalloc (history_size * sizeof (HIST_ENTRY *));
|
---|
| 286 | - history_length = 1;
|
---|
| 287 | + new_length = 1;
|
---|
| 288 | }
|
---|
| 289 | else
|
---|
| 290 | {
|
---|
| 291 | @@ -321,14 +322,15 @@
|
---|
| 292 | the_history = (HIST_ENTRY **)
|
---|
| 293 | xrealloc (the_history, history_size * sizeof (HIST_ENTRY *));
|
---|
| 294 | }
|
---|
| 295 | - history_length++;
|
---|
| 296 | + new_length = history_length + 1;
|
---|
| 297 | }
|
---|
| 298 | }
|
---|
| 299 |
|
---|
| 300 | temp = alloc_history_entry ((char *)string, hist_inittime ());
|
---|
| 301 |
|
---|
| 302 | - the_history[history_length] = (HIST_ENTRY *)NULL;
|
---|
| 303 | - the_history[history_length - 1] = temp;
|
---|
| 304 | + the_history[new_length] = (HIST_ENTRY *)NULL;
|
---|
| 305 | + the_history[new_length - 1] = temp;
|
---|
| 306 | + history_length = new_length;
|
---|
| 307 | }
|
---|
| 308 |
|
---|
| 309 | /* Change the time stamp of the most recent history entry to STRING. */
|
---|
| 310 | diff -Naur bash-4.4.orig/patchlevel.h bash-4.4/patchlevel.h
|
---|
| 311 | --- bash-4.4.orig/patchlevel.h 2016-06-22 18:51:03.000000000 +0000
|
---|
| 312 | +++ bash-4.4/patchlevel.h 2017-04-13 23:33:07.612108242 +0000
|
---|
| 313 | @@ -25,6 +25,6 @@
|
---|
| 314 | regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
---|
| 315 | looks for to find the patch level (for the sccs version string). */
|
---|
| 316 |
|
---|
| 317 | -#define PATCHLEVEL 0
|
---|
| 318 | +#define PATCHLEVEL 12
|
---|
| 319 |
|
---|
| 320 | #endif /* _PATCHLEVEL_H_ */
|
---|
| 321 | diff -Naur bash-4.4.orig/sig.c bash-4.4/sig.c
|
---|
| 322 | --- bash-4.4.orig/sig.c 2016-02-11 20:02:45.000000000 +0000
|
---|
| 323 | +++ bash-4.4/sig.c 2017-04-13 23:33:07.609108202 +0000
|
---|
| 324 | @@ -585,7 +585,8 @@
|
---|
| 325 | #if defined (JOB_CONTROL)
|
---|
| 326 | if (sig == SIGHUP && (interactive || (subshell_environment & (SUBSHELL_COMSUB|SUBSHELL_PROCSUB))))
|
---|
| 327 | hangup_all_jobs ();
|
---|
| 328 | - end_job_control ();
|
---|
| 329 | + if ((subshell_environment & (SUBSHELL_COMSUB|SUBSHELL_PROCSUB)) == 0)
|
---|
| 330 | + end_job_control ();
|
---|
| 331 | #endif /* JOB_CONTROL */
|
---|
| 332 |
|
---|
| 333 | #if defined (PROCESS_SUBSTITUTION)
|
---|
| 334 | diff -Naur bash-4.4.orig/subst.c bash-4.4/subst.c
|
---|
| 335 | --- bash-4.4.orig/subst.c 2016-08-30 20:46:38.000000000 +0000
|
---|
| 336 | +++ bash-4.4/subst.c 2017-04-13 23:33:07.612108242 +0000
|
---|
| 337 | @@ -2825,11 +2825,15 @@
|
---|
| 338 |
|
---|
| 339 | /* Parse a single word from STRING, using SEPARATORS to separate fields.
|
---|
| 340 | ENDPTR is set to the first character after the word. This is used by
|
---|
| 341 | - the `read' builtin. This is never called with SEPARATORS != $IFS;
|
---|
| 342 | - it should be simplified.
|
---|
| 343 | + the `read' builtin.
|
---|
| 344 | +
|
---|
| 345 | + This is never called with SEPARATORS != $IFS, and takes advantage of that.
|
---|
| 346 |
|
---|
| 347 | XXX - this function is very similar to list_string; they should be
|
---|
| 348 | combined - XXX */
|
---|
| 349 | +
|
---|
| 350 | +#define islocalsep(c) (local_cmap[(unsigned char)(c)] != 0)
|
---|
| 351 | +
|
---|
| 352 | char *
|
---|
| 353 | get_word_from_string (stringp, separators, endptr)
|
---|
| 354 | char **stringp, *separators, **endptr;
|
---|
| 355 | @@ -2837,6 +2841,7 @@
|
---|
| 356 | register char *s;
|
---|
| 357 | char *current_word;
|
---|
| 358 | int sindex, sh_style_split, whitesep, xflags;
|
---|
| 359 | + unsigned char local_cmap[UCHAR_MAX+1]; /* really only need single-byte chars here */
|
---|
| 360 | size_t slen;
|
---|
| 361 |
|
---|
| 362 | if (!stringp || !*stringp || !**stringp)
|
---|
| 363 | @@ -2846,20 +2851,23 @@
|
---|
| 364 | separators[1] == '\t' &&
|
---|
| 365 | separators[2] == '\n' &&
|
---|
| 366 | separators[3] == '\0';
|
---|
| 367 | - for (xflags = 0, s = ifs_value; s && *s; s++)
|
---|
| 368 | + memset (local_cmap, '\0', sizeof (local_cmap));
|
---|
| 369 | + for (xflags = 0, s = separators; s && *s; s++)
|
---|
| 370 | {
|
---|
| 371 | if (*s == CTLESC) xflags |= SX_NOCTLESC;
|
---|
| 372 | if (*s == CTLNUL) xflags |= SX_NOESCCTLNUL;
|
---|
| 373 | + local_cmap[(unsigned char)*s] = 1; /* local charmap of separators */
|
---|
| 374 | }
|
---|
| 375 |
|
---|
| 376 | s = *stringp;
|
---|
| 377 | slen = 0;
|
---|
| 378 |
|
---|
| 379 | /* Remove sequences of whitespace at the beginning of STRING, as
|
---|
| 380 | - long as those characters appear in IFS. */
|
---|
| 381 | - if (sh_style_split || !separators || !*separators)
|
---|
| 382 | + long as those characters appear in SEPARATORS. This happens if
|
---|
| 383 | + SEPARATORS == $' \t\n' or if IFS is unset. */
|
---|
| 384 | + if (sh_style_split || separators == 0)
|
---|
| 385 | {
|
---|
| 386 | - for (; *s && spctabnl (*s) && isifs (*s); s++);
|
---|
| 387 | + for (; *s && spctabnl (*s) && islocalsep (*s); s++);
|
---|
| 388 |
|
---|
| 389 | /* If the string is nothing but whitespace, update it and return. */
|
---|
| 390 | if (!*s)
|
---|
| 391 | @@ -2878,9 +2886,9 @@
|
---|
| 392 |
|
---|
| 393 | This obeys the field splitting rules in Posix.2. */
|
---|
| 394 | sindex = 0;
|
---|
| 395 | - /* Don't need string length in ADVANCE_CHAR or string_extract_verbatim
|
---|
| 396 | - unless multibyte chars are possible. */
|
---|
| 397 | - slen = (MB_CUR_MAX > 1) ? STRLEN (s) : 1;
|
---|
| 398 | + /* Don't need string length in ADVANCE_CHAR unless multibyte chars are
|
---|
| 399 | + possible, but need it in string_extract_verbatim for bounds checking */
|
---|
| 400 | + slen = STRLEN (s);
|
---|
| 401 | current_word = string_extract_verbatim (s, slen, &sindex, separators, xflags);
|
---|
| 402 |
|
---|
| 403 | /* Set ENDPTR to the first character after the end of the word. */
|
---|
| 404 | @@ -2899,19 +2907,19 @@
|
---|
| 405 |
|
---|
| 406 | /* Now skip sequences of space, tab, or newline characters if they are
|
---|
| 407 | in the list of separators. */
|
---|
| 408 | - while (s[sindex] && spctabnl (s[sindex]) && isifs (s[sindex]))
|
---|
| 409 | + while (s[sindex] && spctabnl (s[sindex]) && islocalsep (s[sindex]))
|
---|
| 410 | sindex++;
|
---|
| 411 |
|
---|
| 412 | /* If the first separator was IFS whitespace and the current character is
|
---|
| 413 | a non-whitespace IFS character, it should be part of the current field
|
---|
| 414 | delimiter, not a separate delimiter that would result in an empty field.
|
---|
| 415 | Look at POSIX.2, 3.6.5, (3)(b). */
|
---|
| 416 | - if (s[sindex] && whitesep && isifs (s[sindex]) && !spctabnl (s[sindex]))
|
---|
| 417 | + if (s[sindex] && whitesep && islocalsep (s[sindex]) && !spctabnl (s[sindex]))
|
---|
| 418 | {
|
---|
| 419 | sindex++;
|
---|
| 420 | /* An IFS character that is not IFS white space, along with any adjacent
|
---|
| 421 | IFS white space, shall delimit a field. */
|
---|
| 422 | - while (s[sindex] && spctabnl (s[sindex]) && isifs (s[sindex]))
|
---|
| 423 | + while (s[sindex] && spctabnl (s[sindex]) && islocalsep(s[sindex]))
|
---|
| 424 | sindex++;
|
---|
| 425 | }
|
---|
| 426 |
|
---|
| 427 | @@ -5808,10 +5816,7 @@
|
---|
| 428 | {
|
---|
| 429 | #if defined (JOB_CONTROL)
|
---|
| 430 | if (last_procsub_child)
|
---|
| 431 | - {
|
---|
| 432 | - discard_pipeline (last_procsub_child);
|
---|
| 433 | - last_procsub_child = (PROCESS *)NULL;
|
---|
| 434 | - }
|
---|
| 435 | + discard_last_procsub_child ();
|
---|
| 436 | last_procsub_child = restore_pipeline (0);
|
---|
| 437 | #endif
|
---|
| 438 |
|
---|
| 439 | @@ -5931,6 +5936,7 @@
|
---|
| 440 | char *istring, buf[128], *bufp, *s;
|
---|
| 441 | int istring_index, istring_size, c, tflag, skip_ctlesc, skip_ctlnul;
|
---|
| 442 | ssize_t bufn;
|
---|
| 443 | + int nullbyte;
|
---|
| 444 |
|
---|
| 445 | istring = (char *)NULL;
|
---|
| 446 | istring_index = istring_size = bufn = tflag = 0;
|
---|
| 447 | @@ -5938,6 +5944,8 @@
|
---|
| 448 | for (skip_ctlesc = skip_ctlnul = 0, s = ifs_value; s && *s; s++)
|
---|
| 449 | skip_ctlesc |= *s == CTLESC, skip_ctlnul |= *s == CTLNUL;
|
---|
| 450 |
|
---|
| 451 | + nullbyte = 0;
|
---|
| 452 | +
|
---|
| 453 | /* Read the output of the command through the pipe. This may need to be
|
---|
| 454 | changed to understand multibyte characters in the future. */
|
---|
| 455 | while (1)
|
---|
| 456 | @@ -5956,7 +5964,11 @@
|
---|
| 457 | if (c == 0)
|
---|
| 458 | {
|
---|
| 459 | #if 1
|
---|
| 460 | - internal_warning ("%s", _("command substitution: ignored null byte in input"));
|
---|
| 461 | + if (nullbyte == 0)
|
---|
| 462 | + {
|
---|
| 463 | + internal_warning ("%s", _("command substitution: ignored null byte in input"));
|
---|
| 464 | + nullbyte = 1;
|
---|
| 465 | + }
|
---|
| 466 | #endif
|
---|
| 467 | continue;
|
---|
| 468 | }
|
---|
| 469 | @@ -9454,6 +9466,10 @@
|
---|
| 470 | tword->flags |= word->flags & (W_ASSIGNARG|W_ASSIGNRHS); /* affects $@ */
|
---|
| 471 | if (word->flags & W_COMPLETE)
|
---|
| 472 | tword->flags |= W_COMPLETE; /* for command substitutions */
|
---|
| 473 | + if (word->flags & W_NOCOMSUB)
|
---|
| 474 | + tword->flags |= W_NOCOMSUB;
|
---|
| 475 | + if (word->flags & W_NOPROCSUB)
|
---|
| 476 | + tword->flags |= W_NOPROCSUB;
|
---|
| 477 |
|
---|
| 478 | temp = (char *)NULL;
|
---|
| 479 |
|
---|