Siteshwar Vashisht 14d621
From bc007799f0e1362100375bb95d952d28de4c62fb Mon Sep 17 00:00:00 2001
Siteshwar Vashisht 14d621
From: Chet Ramey <chet.ramey@case.edu>
Siteshwar Vashisht 14d621
Date: Fri, 27 Jan 2017 11:25:44 -0500
Siteshwar Vashisht 14d621
Subject: [PATCH] Bash-4.4 patch 12
Siteshwar Vashisht 14d621
Siteshwar Vashisht 14d621
---
Siteshwar Vashisht 14d621
 patchlevel.h |  2 +-
Siteshwar Vashisht 14d621
 subst.c      | 32 ++++++++++++++++++++------------
Siteshwar Vashisht 14d621
 2 files changed, 21 insertions(+), 13 deletions(-)
Siteshwar Vashisht 14d621
Siteshwar Vashisht 14d621
diff --git a/patchlevel.h b/patchlevel.h
Siteshwar Vashisht 14d621
index 772676c..93dbe0d 100644
Siteshwar Vashisht 14d621
--- a/patchlevel.h
Siteshwar Vashisht 14d621
+++ b/patchlevel.h
Siteshwar Vashisht 14d621
@@ -25,6 +25,6 @@
Siteshwar Vashisht 14d621
    regexp `^#define[ 	]*PATCHLEVEL', since that's what support/mkversion.sh
Siteshwar Vashisht 14d621
    looks for to find the patch level (for the sccs version string). */
Siteshwar Vashisht 14d621
 
Siteshwar Vashisht 14d621
-#define PATCHLEVEL 11
Siteshwar Vashisht 14d621
+#define PATCHLEVEL 12
Siteshwar Vashisht 14d621
 
Siteshwar Vashisht 14d621
 #endif /* _PATCHLEVEL_H_ */
Siteshwar Vashisht 14d621
diff --git a/subst.c b/subst.c
Siteshwar Vashisht 14d621
index 027a13e..dbf0157 100644
Siteshwar Vashisht 14d621
--- a/subst.c
Siteshwar Vashisht 14d621
+++ b/subst.c
Siteshwar Vashisht 14d621
@@ -2825,11 +2825,15 @@ list_string (string, separators, quoted)
Siteshwar Vashisht 14d621
 
Siteshwar Vashisht 14d621
 /* Parse a single word from STRING, using SEPARATORS to separate fields.
Siteshwar Vashisht 14d621
    ENDPTR is set to the first character after the word.  This is used by
Siteshwar Vashisht 14d621
-   the `read' builtin.  This is never called with SEPARATORS != $IFS;
Siteshwar Vashisht 14d621
-   it should be simplified.
Siteshwar Vashisht 14d621
+   the `read' builtin.
Siteshwar Vashisht 14d621
+   
Siteshwar Vashisht 14d621
+   This is never called with SEPARATORS != $IFS, and takes advantage of that.
Siteshwar Vashisht 14d621
 
Siteshwar Vashisht 14d621
    XXX - this function is very similar to list_string; they should be
Siteshwar Vashisht 14d621
 	 combined - XXX */
Siteshwar Vashisht 14d621
+
Siteshwar Vashisht 14d621
+#define islocalsep(c)	(local_cmap[(unsigned char)(c)] != 0)
Siteshwar Vashisht 14d621
+
Siteshwar Vashisht 14d621
 char *
Siteshwar Vashisht 14d621
 get_word_from_string (stringp, separators, endptr)
Siteshwar Vashisht 14d621
      char **stringp, *separators, **endptr;
Siteshwar Vashisht 14d621
@@ -2837,6 +2841,7 @@ get_word_from_string (stringp, separators, endptr)
Siteshwar Vashisht 14d621
   register char *s;
Siteshwar Vashisht 14d621
   char *current_word;
Siteshwar Vashisht 14d621
   int sindex, sh_style_split, whitesep, xflags;
Siteshwar Vashisht 14d621
+  unsigned char local_cmap[UCHAR_MAX+1];	/* really only need single-byte chars here */
Siteshwar Vashisht 14d621
   size_t slen;
Siteshwar Vashisht 14d621
 
Siteshwar Vashisht 14d621
   if (!stringp || !*stringp || !**stringp)
Siteshwar Vashisht 14d621
@@ -2846,20 +2851,23 @@ get_word_from_string (stringp, separators, endptr)
Siteshwar Vashisht 14d621
 				 separators[1] == '\t' &&
Siteshwar Vashisht 14d621
 				 separators[2] == '\n' &&
Siteshwar Vashisht 14d621
 				 separators[3] == '\0';
Siteshwar Vashisht 14d621
-  for (xflags = 0, s = ifs_value; s && *s; s++)
Siteshwar Vashisht 14d621
+  memset (local_cmap, '\0', sizeof (local_cmap));
Siteshwar Vashisht 14d621
+  for (xflags = 0, s = separators; s && *s; s++)
Siteshwar Vashisht 14d621
     {
Siteshwar Vashisht 14d621
       if (*s == CTLESC) xflags |= SX_NOCTLESC;
Siteshwar Vashisht 14d621
       if (*s == CTLNUL) xflags |= SX_NOESCCTLNUL;
Siteshwar Vashisht 14d621
+      local_cmap[(unsigned char)*s] = 1;	/* local charmap of separators */
Siteshwar Vashisht 14d621
     }
Siteshwar Vashisht 14d621
 
Siteshwar Vashisht 14d621
   s = *stringp;
Siteshwar Vashisht 14d621
   slen = 0;
Siteshwar Vashisht 14d621
 
Siteshwar Vashisht 14d621
   /* Remove sequences of whitespace at the beginning of STRING, as
Siteshwar Vashisht 14d621
-     long as those characters appear in IFS. */
Siteshwar Vashisht 14d621
-  if (sh_style_split || !separators || !*separators)
Siteshwar Vashisht 14d621
+     long as those characters appear in SEPARATORS.  This happens if
Siteshwar Vashisht 14d621
+     SEPARATORS == $' \t\n' or if IFS is unset. */
Siteshwar Vashisht 14d621
+  if (sh_style_split || separators == 0)
Siteshwar Vashisht 14d621
     {
Siteshwar Vashisht 14d621
-      for (; *s && spctabnl (*s) && isifs (*s); s++);
Siteshwar Vashisht 14d621
+      for (; *s && spctabnl (*s) && islocalsep (*s); s++);
Siteshwar Vashisht 14d621
 
Siteshwar Vashisht 14d621
       /* If the string is nothing but whitespace, update it and return. */
Siteshwar Vashisht 14d621
       if (!*s)
Siteshwar Vashisht 14d621
@@ -2878,9 +2886,9 @@ get_word_from_string (stringp, separators, endptr)
Siteshwar Vashisht 14d621
 
Siteshwar Vashisht 14d621
      This obeys the field splitting rules in Posix.2. */
Siteshwar Vashisht 14d621
   sindex = 0;
Siteshwar Vashisht 14d621
-  /* Don't need string length in ADVANCE_CHAR or string_extract_verbatim
Siteshwar Vashisht 14d621
-     unless multibyte chars are possible. */
Siteshwar Vashisht 14d621
-  slen = (MB_CUR_MAX > 1) ? STRLEN (s) : 1;
Siteshwar Vashisht 14d621
+  /* Don't need string length in ADVANCE_CHAR unless multibyte chars are
Siteshwar Vashisht 14d621
+     possible, but need it in string_extract_verbatim for bounds checking */
Siteshwar Vashisht 14d621
+  slen = STRLEN (s);
Siteshwar Vashisht 14d621
   current_word = string_extract_verbatim (s, slen, &sindex, separators, xflags);
Siteshwar Vashisht 14d621
 
Siteshwar Vashisht 14d621
   /* Set ENDPTR to the first character after the end of the word. */
Siteshwar Vashisht 14d621
@@ -2899,19 +2907,19 @@ get_word_from_string (stringp, separators, endptr)
Siteshwar Vashisht 14d621
 
Siteshwar Vashisht 14d621
   /* Now skip sequences of space, tab, or newline characters if they are
Siteshwar Vashisht 14d621
      in the list of separators. */
Siteshwar Vashisht 14d621
-  while (s[sindex] && spctabnl (s[sindex]) && isifs (s[sindex]))
Siteshwar Vashisht 14d621
+  while (s[sindex] && spctabnl (s[sindex]) && islocalsep (s[sindex]))
Siteshwar Vashisht 14d621
     sindex++;
Siteshwar Vashisht 14d621
 
Siteshwar Vashisht 14d621
   /* If the first separator was IFS whitespace and the current character is
Siteshwar Vashisht 14d621
      a non-whitespace IFS character, it should be part of the current field
Siteshwar Vashisht 14d621
      delimiter, not a separate delimiter that would result in an empty field.
Siteshwar Vashisht 14d621
      Look at POSIX.2, 3.6.5, (3)(b). */
Siteshwar Vashisht 14d621
-  if (s[sindex] && whitesep && isifs (s[sindex]) && !spctabnl (s[sindex]))
Siteshwar Vashisht 14d621
+  if (s[sindex] && whitesep && islocalsep (s[sindex]) && !spctabnl (s[sindex]))
Siteshwar Vashisht 14d621
     {
Siteshwar Vashisht 14d621
       sindex++;
Siteshwar Vashisht 14d621
       /* An IFS character that is not IFS white space, along with any adjacent
Siteshwar Vashisht 14d621
 	 IFS white space, shall delimit a field. */
Siteshwar Vashisht 14d621
-      while (s[sindex] && spctabnl (s[sindex]) && isifs (s[sindex]))
Siteshwar Vashisht 14d621
+      while (s[sindex] && spctabnl (s[sindex]) && islocalsep(s[sindex]))
Siteshwar Vashisht 14d621
 	sindex++;
Siteshwar Vashisht 14d621
     }
Siteshwar Vashisht 14d621
 
Siteshwar Vashisht 14d621
-- 
Siteshwar Vashisht 14d621
2.9.3
Siteshwar Vashisht 14d621