bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Bash-4.3 Official Patch 14


From: Chet Ramey
Subject: Bash-4.3 Official Patch 14
Date: Sat, 17 May 2014 16:15:39 -0400

                             BASH PATCH REPORT
                             =================

Bash-Release:   4.3
Patch-ID:       bash43-014

Bug-Reported-by:        Greg Wooledge <address@hidden>
Bug-Reference-ID:       <address@hidden>
Bug-Reference-URL:      
http://lists.gnu.org/archive/html/help-bash/2014-04/msg00004.html

Bug-Description:

Under certain circumstances, $@ is expanded incorrectly in contexts where
word splitting is not performed.

Patch (apply with `patch -p0'):
*** ../bash-4.3-patched/subst.c 2014-01-23 16:26:37.000000000 -0500
--- subst.c     2014-04-19 15:41:26.000000000 -0400
***************
*** 3249,3254 ****
--- 3249,3256 ----
      return ((char *)NULL);
  
+   expand_no_split_dollar_star = 1;
    w->flags |= W_NOSPLIT2;
    l = call_expand_word_internal (w, 0, 0, (int *)0, (int *)0);
+   expand_no_split_dollar_star = 0;
    if (l)
      {
***************
*** 7848,7851 ****
--- 7850,7857 ----
         according to POSIX.2, this expands to a list of the positional
         parameters no matter what IFS is set to. */
+       /* XXX - what to do when in a context where word splitting is not
+        performed? Even when IFS is not the default, posix seems to imply
+        that we behave like unquoted $* ?  Maybe we should use PF_NOSPLIT2
+        here. */
        temp = string_list_dollar_at (list, (pflags & PF_ASSIGNRHS) ? 
(quoted|Q_DOUBLE_QUOTES) : quoted);
  
***************
*** 8817,8820 ****
--- 8823,8827 ----
      {
        char *ifs_chars;
+       char *tstring;
  
        ifs_chars = (quoted_dollar_at || has_dollar_at) ? ifs_value : (char 
*)NULL;
***************
*** 8831,8834 ****
--- 8838,8865 ----
        if (split_on_spaces)
        list = list_string (istring, " ", 1);   /* XXX quoted == 1? */
+       /* If we have $@ (has_dollar_at != 0) and we are in a context where we
+        don't want to split the result (W_NOSPLIT2), and we are not quoted,
+        we have already separated the arguments with the first character of
+        $IFS.  In this case, we want to return a list with a single word
+        with the separator possibly replaced with a space (it's what other
+        shells seem to do).
+        quoted_dollar_at is internal to this function and is set if we are
+        passed an argument that is unquoted (quoted == 0) but we encounter a
+        double-quoted $@ while expanding it. */
+       else if (has_dollar_at && quoted_dollar_at == 0 && ifs_chars && quoted 
== 0 && (word->flags & W_NOSPLIT2))
+       {
+         /* Only split and rejoin if we have to */
+         if (*ifs_chars && *ifs_chars != ' ')
+           {
+             list = list_string (istring, *ifs_chars ? ifs_chars : " ", 1);
+             tstring = string_list (list);
+           }
+         else
+           tstring = istring;
+         tword = make_bare_word (tstring);
+         if (tstring != istring)
+           free (tstring);
+         goto set_word_flags;
+       }
        else if (has_dollar_at && ifs_chars)
        list = list_string (istring, *ifs_chars ? ifs_chars : " ", 1);
***************
*** 8836,8839 ****
--- 8867,8871 ----
        {
          tword = make_bare_word (istring);
+ set_word_flags:
          if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) || (quoted_state == 
WHOLLY_QUOTED))
            tword->flags |= W_QUOTED;
*** ../bash-4.3/patchlevel.h    2012-12-29 10:47:57.000000000 -0500
--- patchlevel.h        2014-03-20 20:01:28.000000000 -0400
***************
*** 26,30 ****
     looks for to find the patch level (for the sccs version string). */
  
! #define PATCHLEVEL 13
  
  #endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
     looks for to find the patch level (for the sccs version string). */
  
! #define PATCHLEVEL 14
  
  #endif /* _PATCHLEVEL_H_ */

-- 
``The lyf so short, the craft so long to lerne.'' - Chaucer
                 ``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, ITS, CWRU    address@hidden    http://cnswww.cns.cwru.edu/~chet/



reply via email to

[Prev in Thread] Current Thread [Next in Thread]