source: patches/bash-3.2-fixes-6.patch@ a063414

clfs-1.2 clfs-2.1 clfs-3.0.0-systemd clfs-3.0.0-sysvinit systemd sysvinit
Last change on this file since a063414 was 5cd07a2, checked in by Jim Gifford <clfs@…>, 17 years ago

Updated Bash 3.2 Patch to -6

  • Property mode set to 100644
File size: 49.2 KB
  • array.c

    Submitted By: Jim Gifford (jim at linuxfromscratch dot org)
    Date: 2007-09-04
    Initial Package Version: 3.2
    Origin: ftp://ftp.cwru.edu/pub/bash/bash-3.2-patches/
    Upstream Status: From Upstream
    Description: Contains patches 001-025 from upstream
    
    diff -Naur bash-3.2.orig/array.c bash-3.2/array.c
    old new  
    120120        return(a1);
    121121}
    122122
    123 #ifdef INCLUDE_UNUSED
    124123/*
    125124 * Make and return a new array composed of the elements in array A from
    126125 * S to E, inclusive.
     
    141140        for (p = s, i = 0; p != e; p = element_forw(p), i++) {
    142141                n = array_create_element (element_index(p), element_value(p));
    143142                ADD_BEFORE(a->head, n);
    144                 mi = element_index(ae);
     143                mi = element_index(n);
    145144        }
    146145        a->num_elements = i;
    147146        a->max_index = mi;
    148147        return a;
    149148}
    150 #endif
    151149
    152150/*
    153151 * Walk the array, calling FUNC once for each element, with the array
     
    300298        return array;
    301299}
    302300
     301ARRAY   *
     302array_quote_escapes(array)
     303ARRAY   *array;
     304{
     305        ARRAY_ELEMENT   *a;
     306        char    *t;
     307
     308        if (array == 0 || array_head(array) == 0 || array_empty(array))
     309                return (ARRAY *)NULL;
     310        for (a = element_forw(array->head); a != array->head; a = element_forw(a)) {
     311                t = quote_escapes (a->value);
     312                FREE(a->value);
     313                a->value = t;
     314        }
     315        return array;
     316}
     317
    303318/*
    304319 * Return a string whose elements are the members of array A beginning at
    305320 * index START and spanning NELEM members.  Null elements are counted.
     
    311326arrayind_t      start, nelem;
    312327int     starsub, quoted;
    313328{
     329        ARRAY           *a2;
    314330        ARRAY_ELEMENT   *h, *p;
    315331        arrayind_t      i;
    316         char            *ifs, sep[2];
     332        char            *ifs, sep[2], *t;
    317333
    318334        p = a ? array_head (a) : 0;
    319335        if (p == 0 || array_empty (a) || start > array_max_index(a))
     
    336352        for (i = 0, h = p; p != a->head && i < nelem; i++, p = element_forw(p))
    337353                ;
    338354
     355        a2 = array_slice(a, h, p);
     356
     357        if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))
     358                array_quote(a2);
     359        else
     360                array_quote_escapes(a2);
     361
    339362        if (starsub && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))) {
    340363                ifs = getifs();
    341364                sep[0] = ifs ? *ifs : '\0';
     
    343366                sep[0] = ' ';
    344367        sep[1] = '\0';
    345368
    346         return (array_to_string_internal (h, p, sep, quoted));
     369        t = array_to_string (a2, sep, 0);
     370        array_dispose(a2);
     371
     372        return t;
    347373}
    348374
    349375char *
     
    367393        }
    368394
    369395        if (mflags & MATCH_QUOTED)
    370                 array_quote (a2);
     396                array_quote(a2);
     397        else
     398                array_quote_escapes(a2);
    371399        if (mflags & MATCH_STARSUB) {
    372400                ifs = getifs();
    373401                sifs[0] = ifs ? *ifs : '\0';
  • array.h

    diff -Naur bash-3.2.orig/array.h bash-3.2/array.h
    old new  
    5555extern ARRAY_ELEMENT *array_unshift_element __P((ARRAY *));
    5656extern int      array_shift_element __P((ARRAY *, char *));
    5757extern ARRAY    *array_quote __P((ARRAY *));
     58extern ARRAY    *array_quote_escapes __P((ARRAY *));
    5859
    5960extern char     *array_subrange __P((ARRAY *, arrayind_t, arrayind_t, int, int));
    6061extern char     *array_patsub __P((ARRAY *, char *, char *, int));
  • arrayfunc.c

    diff -Naur bash-3.2.orig/arrayfunc.c bash-3.2/arrayfunc.c
    old new  
    618618  if (expok == 0)
    619619    {
    620620      last_command_exit_value = EXECUTION_FAILURE;
     621
     622      top_level_cleanup ();     
    621623      jump_to_top_level (DISCARD);
    622624    }
    623625  return val;
  • builtins/common.c

    diff -Naur bash-3.2.orig/builtins/common.c bash-3.2/builtins/common.c
    old new  
    1 /* Copyright (C) 1987-2005 Free Software Foundation, Inc.
     1/* Copyright (C) 1987-2007 Free Software Foundation, Inc.
    22
    33   This file is part of GNU Bash, the Bourne Again SHell.
    44
     
    131131  if (list)
    132132    {
    133133      builtin_error (_("too many arguments"));
     134      top_level_cleanup ();
    134135      jump_to_top_level (DISCARD);
    135136    }
    136137}
     
    395396          if (fatal)
    396397            throw_to_top_level ();
    397398          else
    398             jump_to_top_level (DISCARD);
     399            {
     400              top_level_cleanup ();
     401              jump_to_top_level (DISCARD);
     402            }
    399403        }
    400404      no_args (list->next);
    401405    }
     
    475479
    476480  if (the_current_working_directory == 0)
    477481    {
     482#if defined (GETCWD_BROKEN)
     483      the_current_working_directory = getcwd (0, PATH_MAX);
     484#else
    478485      the_current_working_directory = getcwd (0, 0);
     486#endif
    479487      if (the_current_working_directory == 0)
    480488        {
    481489          fprintf (stderr, _("%s: error retrieving current directory: %s: %s\n"),
  • builtins/printf.def

    diff -Naur bash-3.2.orig/builtins/printf.def bash-3.2/builtins/printf.def
    old new  
    11This file is printf.def, from which is created printf.c.
    22It implements the builtin "printf" in Bash.
    33
    4 Copyright (C) 1997-2005 Free Software Foundation, Inc.
     4Copyright (C) 1997-2007 Free Software Foundation, Inc.
    55
    66This file is part of GNU Bash, the Bourne Again SHell.
    77
     
    4949#  define INT_MIN               (-2147483647-1)
    5050#endif
    5151
     52#if defined (PREFER_STDARG)
     53#  include <stdarg.h>
     54#else
     55#  include <varargs.h>
     56#endif
     57
    5258#include <stdio.h>
    5359#include <chartypes.h>
    5460
     
    6470#include "bashgetopt.h"
    6571#include "common.h"
    6672
     73#if defined (PRI_MACROS_BROKEN)
     74#  undef PRIdMAX
     75#endif
     76
    6777#if !defined (PRIdMAX)
    6878#  if HAVE_LONG_LONG
    6979#    define PRIdMAX     "lld"
     
    151161#define SKIP1 "#'-+ 0"
    152162#define LENMODS "hjlLtz"
    153163
     164#ifndef HAVE_ASPRINTF
     165extern int asprintf __P((char **, const char *, ...)) __attribute__((__format__ (printf, 2, 3)));
     166#endif
     167
    154168static void printf_erange __P((char *));
    155169static int printstr __P((char *, char *, int, int, int));
    156170static int tescape __P((char *, char *, int *));
  • builtins/read.def

    diff -Naur bash-3.2.orig/builtins/read.def bash-3.2/builtins/read.def
    old new  
    127127     WORD_LIST *list;
    128128{
    129129  register char *varname;
    130   int size, i, nr, pass_next, saw_escape, eof, opt, retval, code;
    131   int input_is_tty, input_is_pipe, unbuffered_read;
     130  int size, i, nr, pass_next, saw_escape, eof, opt, retval, code, print_ps2;
     131  int input_is_tty, input_is_pipe, unbuffered_read, skip_ctlesc, skip_ctlnul;
    132132  int raw, edit, nchars, silent, have_timeout, fd;
    133133  unsigned int tmout;
    134134  intmax_t intval;
    135135  char c;
    136136  char *input_string, *orig_input_string, *ifs_chars, *prompt, *arrayname;
    137   char *e, *t, *t1;
     137  char *e, *t, *t1, *ps2;
    138138  struct stat tsb;
    139139  SHELL_VAR *var;
    140140#if defined (ARRAY_VARS)
     
    148148  USE_VAR(size);
    149149  USE_VAR(i);
    150150  USE_VAR(pass_next);
     151  USE_VAR(print_ps2);
    151152  USE_VAR(saw_escape);
    152153  USE_VAR(input_is_pipe);
    153154/*  USE_VAR(raw); */
     
    163164  USE_VAR(rlind);
    164165#endif
    165166  USE_VAR(list);
     167  USE_VAR(ps2);
    166168
    167169  i = 0;                /* Index into the string that we are reading. */
    168170  raw = edit = 0;       /* Not reading raw input by default. */
     
    386388  setmode (0, O_TEXT);
    387389#endif
    388390
    389   for (eof = retval = 0;;)
     391  ps2 = 0;
     392  for (print_ps2 = eof = retval = 0;;)
    390393    {
    391394#if defined (READLINE)
    392395      if (edit)
     
    412415        {
    413416#endif
    414417
     418      if (print_ps2)
     419        {
     420          if (ps2 == 0)
     421            ps2 = get_string_value ("PS2");
     422          fprintf (stderr, "%s", ps2 ? ps2 : "");
     423          fflush (stderr);
     424          print_ps2 = 0;
     425        }
     426
    415427      if (unbuffered_read)
    416428        retval = zread (fd, &c, 1);
    417429      else
     
    440452        {
    441453          pass_next = 0;
    442454          if (c == '\n')
    443             i--;                /* back up over the CTLESC */
     455            {
     456              i--;              /* back up over the CTLESC */
     457              if (interactive && input_is_tty && raw == 0)
     458                print_ps2 = 1;
     459            }
    444460          else
    445461            goto add_char;
    446462          continue;
  • config-bot.h

    diff -Naur bash-3.2.orig/config-bot.h bash-3.2/config-bot.h
    old new  
    11/* config-bot.h */
    22/* modify settings or make new ones based on what autoconf tells us. */
    33
    4 /* Copyright (C) 1989-2002 Free Software Foundation, Inc.
     4/* Copyright (C) 1989-2007 Free Software Foundation, Inc.
    55
    66   This file is part of GNU Bash, the Bourne Again SHell.
    77
     
    7070#  define TERMIOS_MISSING
    7171#endif
    7272
    73 /* If we have a getcwd(3), but it calls popen(), #undef HAVE_GETCWD so
    74    the replacement in getcwd.c will be built. */
    75 #if defined (HAVE_GETCWD) && defined (GETCWD_BROKEN)
     73/* If we have a getcwd(3), but one that does not dynamically allocate memory,
     74   #undef HAVE_GETCWD so the replacement in getcwd.c will be built.  We do
     75   not do this on Solaris, because their implementation of loopback mounts
     76   breaks the traditional file system assumptions that getcwd uses. */
     77#if defined (HAVE_GETCWD) && defined (GETCWD_BROKEN) && !defined (SOLARIS)
    7678#  undef HAVE_GETCWD
    7779#endif
    7880
  • config.h.in

    diff -Naur bash-3.2.orig/config.h.in bash-3.2/config.h.in
    old new  
    11/* config.h -- Configuration file for bash. */
    22
    3 /* Copyright (C) 1987-2006 Free Software Foundation, Inc.
     3/* Copyright (C) 1987-2007 Free Software Foundation, Inc.
    44
    55   This file is part of GNU Bash, the Bourne Again SHell.
    66
     
    413413
    414414#undef HAVE_DECL_STRTOLD
    415415
     416#undef PRI_MACROS_BROKEN
     417
    416418#undef STRTOLD_BROKEN
    417419
    418420/* Define if WCONTINUED is defined in system headers, but rejected by waitpid */
     
    10061008/* Define if you have the `dcgettext' function. */
    10071009#undef HAVE_DCGETTEXT
    10081010
     1011/* Define if you have the `localeconv' function. */
     1012#undef HAVE_LOCALECONV
     1013
    10091014/* Define if your system has a working `malloc' function. */
    10101015/* #undef HAVE_MALLOC */
    10111016
  • configure

    diff -Naur bash-3.2.orig/configure bash-3.2/configure
    old new  
    2731627316sco3.2v4*)      LOCAL_CFLAGS="-DMUST_UNBLOCK_CHLD -DPATH_MAX=1024" ;;
    2731727317sco3.2*)        LOCAL_CFLAGS=-DMUST_UNBLOCK_CHLD ;;
    2731827318sunos4*)        LOCAL_CFLAGS=-DSunOS4 ;;
    27319 solaris2.5*)    LOCAL_CFLAGS=-DSunOS5 ;;
     27319solaris2.5*)    LOCAL_CFLAGS="-DSunOS5 -DSOLARIS" ;;
     27320solaris2*)      LOCAL_CFLAGS=-DSOLARIS ;;
    2732027321lynxos*)        LOCAL_CFLAGS=-DRECYCLES_PIDS ;;
    2732127322linux*)         LOCAL_LDFLAGS=-rdynamic          # allow dynamic loading
    2732227323                case "`uname -r`" in
  • configure.in

    diff -Naur bash-3.2.orig/configure.in bash-3.2/configure.in
    old new  
    55dnl
    66dnl Process this file with autoconf to produce a configure script.
    77
    8 # Copyright (C) 1987-2006 Free Software Foundation, Inc.
     8# Copyright (C) 1987-2007 Free Software Foundation, Inc.
    99
    1010# This program is free software; you can redistribute it and/or modify
    1111# it under the terms of the GNU General Public License as published by
     
    991991sco3.2v4*)      LOCAL_CFLAGS="-DMUST_UNBLOCK_CHLD -DPATH_MAX=1024" ;;
    992992sco3.2*)        LOCAL_CFLAGS=-DMUST_UNBLOCK_CHLD ;;
    993993sunos4*)        LOCAL_CFLAGS=-DSunOS4 ;;
    994 solaris2.5*)    LOCAL_CFLAGS=-DSunOS5 ;;
     994solaris2.5*)    LOCAL_CFLAGS="-DSunOS5 -DSOLARIS" ;;
     995solaris2*)      LOCAL_CFLAGS=-DSOLARIS ;;
    995996lynxos*)        LOCAL_CFLAGS=-DRECYCLES_PIDS ;;
    996997linux*)         LOCAL_LDFLAGS=-rdynamic          # allow dynamic loading
    997998                case "`uname -r`" in
  • execute_cmd.c

    diff -Naur bash-3.2.orig/execute_cmd.c bash-3.2/execute_cmd.c
    old new  
    11/* execute_cmd.c -- Execute a COMMAND structure. */
    22
    3 /* Copyright (C) 1987-2005 Free Software Foundation, Inc.
     3/* Copyright (C) 1987-2007 Free Software Foundation, Inc.
    44
    55   This file is part of GNU Bash, the Bourne Again SHell.
    66
     
    25462546      arg1 = cond_expand_word (cond->left->op, 0);
    25472547      if (arg1 == 0)
    25482548        arg1 = nullstr;
    2549       arg2 = cond_expand_word (cond->right->op, patmatch||rmatch);
     2549      arg2 = cond_expand_word (cond->right->op, rmatch ? 2 : (patmatch ? 1 : 0));
    25502550      if (arg2 == 0)
    25512551        arg2 = nullstr;
    25522552
     
    30503050  if (command_line == 0)
    30513051    command_line = savestring (the_printed_command_except_trap);
    30523052
     3053#if defined (PROCESS_SUBSTITUTION)
     3054  if ((subshell_environment & SUBSHELL_COMSUB) && (simple_command->flags & CMD_NO_FORK) && fifos_pending() > 0)
     3055    simple_command->flags &= ~CMD_NO_FORK;
     3056#endif
     3057
    30533058  execute_disk_command (words, simple_command->redirects, command_line,
    30543059                        pipe_in, pipe_out, async, fds_to_close,
    30553060                        simple_command->flags);
  • bash-3.2

    diff -Naur bash-3.2.orig/expr.c bash-3.2/expr.c
    old new  
    929929      if (interactive_shell)
    930930        {
    931931          expr_unwind ();
     932          top_level_cleanup ();
    932933          jump_to_top_level (DISCARD);
    933934        }
    934935      else
  • findcmd.c

    diff -Naur bash-3.2.orig/findcmd.c bash-3.2/findcmd.c
    old new  
    308308  if (hashed_file && (posixly_correct || check_hashed_filenames))
    309309    {
    310310      st = file_status (hashed_file);
    311       if ((st ^ (FS_EXISTS | FS_EXECABLE)) != 0)
     311      if ((st & (FS_EXISTS|FS_EXECABLE)) != (FS_EXISTS|FS_EXECABLE))
    312312        {
    313313          phash_remove (pathname);
    314314          free (hashed_file);
  • bash-3.2

    diff -Naur bash-3.2.orig/jobs.c bash-3.2/jobs.c
    old new  
    783783  if (jobs[js.j_firstj] == 0)
    784784    {
    785785      old = js.j_firstj++;
     786      if (old >= js.j_jobslots)
     787        old = js.j_jobslots - 1;
    786788      while (js.j_firstj != old)
    787789        {
    788790          if (js.j_firstj >= js.j_jobslots)
    789791            js.j_firstj = 0;
    790           if (jobs[js.j_firstj])
     792          if (jobs[js.j_firstj] || js.j_firstj == old)  /* needed if old == 0 */
    791793            break;
    792794          js.j_firstj++;
    793795        }
     
    797799  if (jobs[js.j_lastj] == 0)
    798800    {
    799801      old = js.j_lastj--;
     802      if (old < 0)
     803        old = 0;
    800804      while (js.j_lastj != old)
    801805        {
    802806          if (js.j_lastj < 0)
    803807            js.j_lastj = js.j_jobslots - 1;
    804           if (jobs[js.j_lastj])
     808          if (jobs[js.j_lastj] || js.j_lastj == old)    /* needed if old == js.j_jobslots */
    805809            break;
    806810          js.j_lastj--;
    807811        }
     
    963967  reap_dead_jobs ();
    964968  realloc_jobs_list ();
    965969
    966   return (js.j_lastj);
     970#ifdef DEBUG
     971  itrace("compact_jobs_list: returning %d", (js.j_lastj || jobs[js.j_lastj]) ? js.j_lastj + 1 : 0);
     972#endif
     973
     974  return ((js.j_lastj || jobs[js.j_lastj]) ? js.j_lastj + 1 : 0);
    967975}
    968976
    969977/* Delete the job at INDEX from the job list.  Must be called
     
    984992  temp = jobs[job_index];
    985993  if (temp == 0)
    986994    return;
    987   if (job_index == js.j_current || job_index == js.j_previous)
    988     reset_current ();
    989995
    990996  if ((dflags & DEL_NOBGPID) == 0)
    991997    {
     
    10281034    js.j_firstj = js.j_lastj = 0;
    10291035  else if (jobs[js.j_firstj] == 0 || jobs[js.j_lastj] == 0)
    10301036    reset_job_indices ();
     1037
     1038  if (job_index == js.j_current || job_index == js.j_previous)
     1039    reset_current ();
    10311040}
    10321041
    10331042/* Must be called with SIGCHLD blocked. */
  • lib/readline/complete.c

    diff -Naur bash-3.2.orig/lib/readline/complete.c bash-3.2/lib/readline/complete.c
    old new  
    428428        return (1);
    429429      if (c == 'n' || c == 'N' || c == RUBOUT)
    430430        return (0);
    431       if (c == ABORT_CHAR)
     431      if (c == ABORT_CHAR || c < 0)
    432432        _rl_abort_internal ();
    433433      if (for_pager && (c == NEWLINE || c == RETURN))
    434434        return (2);
  • lib/readline/display.c

    diff -Naur bash-3.2.orig/lib/readline/display.c bash-3.2/lib/readline/display.c
    old new  
    561561      wrap_offset = prompt_invis_chars_first_line = 0;
    562562    }
    563563
     564#if defined (HANDLE_MULTIBYTE)
     565#define CHECK_INV_LBREAKS() \
     566      do { \
     567        if (newlines >= (inv_lbsize - 2)) \
     568          { \
     569            inv_lbsize *= 2; \
     570            inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \
     571            _rl_wrapped_line = (int *)xrealloc (_rl_wrapped_line, inv_lbsize * sizeof (int)); \
     572          } \
     573      } while (0)
     574#else
    564575#define CHECK_INV_LBREAKS() \
    565576      do { \
    566577        if (newlines >= (inv_lbsize - 2)) \
     
    569580            inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \
    570581          } \
    571582      } while (0)
     583#endif /* HANDLE_MULTIBYTE */
    572584
    573585#if defined (HANDLE_MULTIBYTE)   
    574586#define CHECK_LPOS() \
     
    15061518    {
    15071519      /* Non-zero if we're increasing the number of lines. */
    15081520      int gl = current_line >= _rl_vis_botlin && inv_botlin > _rl_vis_botlin;
     1521      /* If col_lendiff is > 0, implying that the new string takes up more
     1522         screen real estate than the old, but lendiff is < 0, meaning that it
     1523         takes fewer bytes, we need to just output the characters starting
     1524         from the first difference.  These will overwrite what is on the
     1525         display, so there's no reason to do a smart update.  This can really
     1526         only happen in a multibyte environment. */
     1527      if (lendiff < 0)
     1528        {
     1529          _rl_output_some_chars (nfd, temp);
     1530          _rl_last_c_pos += _rl_col_width (nfd, 0, temp);
     1531          /* If nfd begins before any invisible characters in the prompt,
     1532             adjust _rl_last_c_pos to account for wrap_offset and set
     1533             cpos_adjusted to let the caller know. */
     1534          if (current_line == 0 && wrap_offset && ((nfd - new) <= prompt_last_invisible))
     1535            {
     1536              _rl_last_c_pos -= wrap_offset;
     1537              cpos_adjusted = 1;
     1538            }
     1539          return;
     1540        }
    15091541      /* Sometimes it is cheaper to print the characters rather than
    15101542         use the terminal's capabilities.  If we're growing the number
    15111543         of lines, make sure we actually cause the new line to wrap
    15121544         around on auto-wrapping terminals. */
    1513       if (_rl_terminal_can_insert && ((2 * col_temp) >= col_lendiff || _rl_term_IC) && (!_rl_term_autowrap || !gl))
     1545      else if (_rl_terminal_can_insert && ((2 * col_temp) >= col_lendiff || _rl_term_IC) && (!_rl_term_autowrap || !gl))
    15141546        {
    15151547          /* If lendiff > prompt_visible_length and _rl_last_c_pos == 0 and
    15161548             _rl_horizontal_scroll_mode == 1, inserting the characters with
     
    15861618          temp = nls - nfd;
    15871619          if (temp > 0)
    15881620            {
     1621              /* If nfd begins at the prompt, or before the invisible
     1622                 characters in the prompt, we need to adjust _rl_last_c_pos
     1623                 in a multibyte locale to account for the wrap offset and
     1624                 set cpos_adjusted accordingly. */
    15891625              _rl_output_some_chars (nfd, temp);
    1590               _rl_last_c_pos += _rl_col_width (nfd, 0, temp);;
     1626              if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
     1627                {
     1628                  _rl_last_c_pos += _rl_col_width (nfd, 0, temp);
     1629                  if (current_line == 0 && wrap_offset &&  ((nfd - new) <= prompt_last_invisible))
     1630                    {
     1631                      _rl_last_c_pos -= wrap_offset;
     1632                      cpos_adjusted = 1;
     1633                    }
     1634                }
     1635              else
     1636                _rl_last_c_pos += temp;
    15911637            }
    15921638        }
    15931639      /* Otherwise, print over the existing material. */
     
    15951641        {
    15961642          if (temp > 0)
    15971643            {
     1644              /* If nfd begins at the prompt, or before the invisible
     1645                 characters in the prompt, we need to adjust _rl_last_c_pos
     1646                 in a multibyte locale to account for the wrap offset and
     1647                 set cpos_adjusted accordingly. */
    15981648              _rl_output_some_chars (nfd, temp);
    15991649              _rl_last_c_pos += col_temp;               /* XXX */
     1650              if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
     1651                {
     1652                  if (current_line == 0 && wrap_offset &&  ((nfd - new) <= prompt_last_invisible))
     1653                    {
     1654                      _rl_last_c_pos -= wrap_offset;
     1655                      cpos_adjusted = 1;
     1656                    }
     1657                }
    16001658            }
    16011659          lendiff = (oe - old) - (ne - new);
    16021660          if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
     
    17321790  if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
    17331791    {
    17341792      dpos = _rl_col_width (data, 0, new);
    1735       if (dpos > prompt_last_invisible)         /* XXX - don't use woff here */
     1793      /* Use NEW when comparing against the last invisible character in the
     1794         prompt string, since they're both buffer indices and DPOS is a
     1795         desired display position. */
     1796      if (new > prompt_last_invisible)          /* XXX - don't use woff here */
    17361797        {
    17371798          dpos -= woff;
    17381799          /* Since this will be assigned to _rl_last_c_pos at the end (more
     
    23802441
    23812442  if (end <= start)
    23822443    return 0;
     2444  if (MB_CUR_MAX == 1 || rl_byte_oriented)
     2445    return (end - start);
    23832446
    23842447  memset (&ps, 0, sizeof (mbstate_t));
    23852448
  • lib/readline/input.c

    diff -Naur bash-3.2.orig/lib/readline/input.c bash-3.2/lib/readline/input.c
    old new  
    133133    return (0);
    134134
    135135  *key = ibuffer[pop_index++];
    136 
     136#if 0
    137137  if (pop_index >= ibuffer_len)
     138#else
     139  if (pop_index > ibuffer_len)
     140#endif
    138141    pop_index = 0;
    139142
    140143  return (1);
     
    250253      while (chars_avail--)
    251254        {
    252255          k = (*rl_getc_function) (rl_instream);
    253           rl_stuff_char (k);
     256          if (rl_stuff_char (k) == 0)
     257            break;                      /* some problem; no more room */
    254258          if (k == NEWLINE || k == RETURN)
    255259            break;
    256260        }
     
    373377      RL_SETSTATE (RL_STATE_INPUTPENDING);
    374378    }
    375379  ibuffer[push_index++] = key;
     380#if 0
    376381  if (push_index >= ibuffer_len)
     382#else
     383  if (push_index > ibuffer_len)
     384#endif
    377385    push_index = 0;
    378386
    379387  return 1;
     
    513521     char *mbchar;
    514522     int size;
    515523{
    516   int mb_len = 0;
     524  int mb_len, c;
    517525  size_t mbchar_bytes_length;
    518526  wchar_t wc;
    519527  mbstate_t ps, ps_back;
    520528
    521529  memset(&ps, 0, sizeof (mbstate_t));
    522530  memset(&ps_back, 0, sizeof (mbstate_t));
    523  
     531
     532  mb_len = 0; 
    524533  while (mb_len < size)
    525534    {
    526535      RL_SETSTATE(RL_STATE_MOREINPUT);
    527       mbchar[mb_len++] = rl_read_key ();
     536      c = rl_read_key ();
    528537      RL_UNSETSTATE(RL_STATE_MOREINPUT);
    529538
     539      if (c < 0)
     540        break;
     541
     542      mbchar[mb_len++] = c;
     543
    530544      mbchar_bytes_length = mbrtowc (&wc, mbchar, mb_len, &ps);
    531545      if (mbchar_bytes_length == (size_t)(-1))
    532546        break;          /* invalid byte sequence for the current locale */
     
    564578
    565579  c = first;
    566580  memset (mb, 0, mlen);
    567   for (i = 0; i < mlen; i++)
     581  for (i = 0; c >= 0 && i < mlen; i++)
    568582    {
    569583      mb[i] = (char)c;
    570584      memset (&ps, 0, sizeof (mbstate_t));
  • lib/readline/isearch.c

    diff -Naur bash-3.2.orig/lib/readline/isearch.c bash-3.2/lib/readline/isearch.c
    old new  
    327327  rl_command_func_t *f;
    328328
    329329  f = (rl_command_func_t *)NULL;
    330  
    331  /* Translate the keys we do something with to opcodes. */
     330
     331  if (c < 0)
     332    {
     333      cxt->sflags |= SF_FAILED;
     334      cxt->history_pos = cxt->last_found_line;
     335      return -1;
     336    }
     337
     338  /* Translate the keys we do something with to opcodes. */
    332339  if (c >= 0 && _rl_keymap[c].type == ISFUNC)
    333340    {
    334341      f = _rl_keymap[c].function;
  • lib/readline/misc.c

    diff -Naur bash-3.2.orig/lib/readline/misc.c bash-3.2/lib/readline/misc.c
    old new  
    146146          rl_restore_prompt ();
    147147          rl_clear_message ();
    148148          RL_UNSETSTATE(RL_STATE_NUMERICARG);
     149          if (key < 0)
     150            return -1;
    149151          return (_rl_dispatch (key, _rl_keymap));
    150152        }
    151153    }
  • lib/readline/readline.c

    diff -Naur bash-3.2.orig/lib/readline/readline.c bash-3.2/lib/readline/readline.c
    old new  
    645645  if ((cxt->flags & KSEQ_DISPATCHED) == 0)
    646646    {
    647647      nkey = _rl_subseq_getchar (cxt->okey);
     648      if (nkey < 0)
     649        {
     650          _rl_abort_internal ();
     651          return -1;
     652        }
    648653      r = _rl_dispatch_subseq (nkey, cxt->dmap, cxt->subseq_arg);
    649654      cxt->flags |= KSEQ_DISPATCHED;
    650655    }
  • lib/readline/text.c

    diff -Naur bash-3.2.orig/lib/readline/text.c bash-3.2/lib/readline/text.c
    old new  
    857857  c = rl_read_key ();
    858858  RL_UNSETSTATE(RL_STATE_MOREINPUT);
    859859
     860  if (c < 0)
     861    return -1;
     862
    860863#if defined (HANDLE_SIGNALS)
    861864  if (RL_ISSTATE (RL_STATE_CALLBACK) == 0)
    862865    _rl_restore_tty_signals ();
     
    15201523
    15211524  mb_len = _rl_read_mbchar (mbchar, MB_LEN_MAX);
    15221525
     1526  if (mb_len <= 0)
     1527    return -1;
     1528
    15231529  if (count < 0)
    15241530    return (_rl_char_search_internal (-count, bdir, mbchar, mb_len));
    15251531  else
     
    15361542  c = rl_read_key ();
    15371543  RL_UNSETSTATE(RL_STATE_MOREINPUT);
    15381544
     1545  if (c < 0)
     1546    return -1;
     1547
    15391548  if (count < 0)
    15401549    return (_rl_char_search_internal (-count, bdir, c));
    15411550  else
  • lib/readline/vi_mode.c

    diff -Naur bash-3.2.orig/lib/readline/vi_mode.c bash-3.2/lib/readline/vi_mode.c
    old new  
    886886  RL_SETSTATE(RL_STATE_MOREINPUT);
    887887  c = rl_read_key ();
    888888  RL_UNSETSTATE(RL_STATE_MOREINPUT);
     889
     890  if (c < 0)
     891    {
     892      *nextkey = 0;
     893      return -1;
     894    }
     895
    889896  *nextkey = c;
    890897
    891898  if (!member (c, vi_motion))
     
    902909          RL_SETSTATE(RL_STATE_MOREINPUT);
    903910          c = rl_read_key ();   /* real command */
    904911          RL_UNSETSTATE(RL_STATE_MOREINPUT);
     912          if (c < 0)
     913            {
     914              *nextkey = 0;
     915              return -1;
     916            }
    905917          *nextkey = c;
    906918        }
    907919      else if (key == c && (key == 'd' || key == 'y' || key == 'c'))
     
    12241236_rl_vi_callback_char_search (data)
    12251237     _rl_callback_generic_arg *data;
    12261238{
     1239  int c;
    12271240#if defined (HANDLE_MULTIBYTE)
    1228   _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX);
     1241  c = _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX);
    12291242#else
    12301243  RL_SETSTATE(RL_STATE_MOREINPUT);
    1231   _rl_vi_last_search_char = rl_read_key ();
     1244  c = rl_read_key ();
    12321245  RL_UNSETSTATE(RL_STATE_MOREINPUT);
    12331246#endif
    12341247
     1248  if (c <= 0)
     1249    return -1;
     1250
     1251#if !defined (HANDLE_MULTIBYTE)
     1252  _rl_vi_last_search_char = c;
     1253#endif
     1254
    12351255  _rl_callback_func = 0;
    12361256  _rl_want_redisplay = 1;
    12371257
     
    12471267rl_vi_char_search (count, key)
    12481268     int count, key;
    12491269{
     1270  int c;
    12501271#if defined (HANDLE_MULTIBYTE)
    12511272  static char *target;
    12521273  static int tlen;
     
    12931314      else
    12941315        {
    12951316#if defined (HANDLE_MULTIBYTE)
    1296           _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX);
     1317          c = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX);
     1318          if (c <= 0)
     1319            return -1;
     1320          _rl_vi_last_search_mblen = c;
    12971321#else
    12981322          RL_SETSTATE(RL_STATE_MOREINPUT);
    1299           _rl_vi_last_search_char = rl_read_key ();
     1323          c = rl_read_key ();
    13001324          RL_UNSETSTATE(RL_STATE_MOREINPUT);
     1325          if (c < 0)
     1326            return -1;
     1327          _rl_vi_last_search_char = c;
    13011328#endif
    13021329        }
    13031330    }
     
    14671494  c = rl_read_key ();
    14681495  RL_UNSETSTATE(RL_STATE_MOREINPUT);
    14691496
     1497  if (c < 0)
     1498    return -1;
     1499
    14701500#if defined (HANDLE_MULTIBYTE)
    14711501  if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
    14721502    c = _rl_read_mbstring (c, mb, mlen);
     
    14851515
    14861516  _rl_vi_last_replacement = c = _rl_vi_callback_getchar (mb, MB_LEN_MAX);
    14871517
     1518  if (c < 0)
     1519    return -1;
     1520
    14881521  _rl_callback_func = 0;
    14891522  _rl_want_redisplay = 1;
    14901523
     
    15161549  else
    15171550    _rl_vi_last_replacement = c = _rl_vi_callback_getchar (mb, MB_LEN_MAX);
    15181551
     1552  if (c < 0)
     1553    return -1;
     1554
    15191555  return (_rl_vi_change_char (count, c, mb));
    15201556}
    15211557
     
    16501686  ch = rl_read_key ();
    16511687  RL_UNSETSTATE(RL_STATE_MOREINPUT);
    16521688
    1653   if (ch < 'a' || ch > 'z')
     1689  if (ch < 0 || ch < 'a' || ch > 'z')   /* make test against 0 explicit */
    16541690    {
    16551691      rl_ding ();
    16561692      return -1;
     
    17021738      rl_point = rl_mark;
    17031739      return 0;
    17041740    }
    1705   else if (ch < 'a' || ch > 'z')
     1741  else if (ch < 0 || ch < 'a' || ch > 'z')      /* make test against 0 explicit */
    17061742    {
    17071743      rl_ding ();
    17081744      return -1;
  • lib/sh/snprintf.c

    diff -Naur bash-3.2.orig/lib/sh/snprintf.c bash-3.2/lib/sh/snprintf.c
    old new  
    471471          10^x ~= r
    472472 * log_10(200) = 2;
    473473 * log_10(250) = 2;
     474 *
     475 * NOTE: do not call this with r == 0 -- an infinite loop results.
    474476 */
    475477static int
    476478log_10(r)
     
    576578    {
    577579      integral_part[0] = '0';
    578580      integral_part[1] = '\0';
    579       fraction_part[0] = '0';
    580       fraction_part[1] = '\0';
     581      /* The fractional part has to take the precision into account */
     582      for (ch = 0; ch < precision-1; ch++)
     583        fraction_part[ch] = '0';
     584      fraction_part[ch] = '0';
     585      fraction_part[ch+1] = '\0';
    581586      if (fract)
    582587        *fract = fraction_part;
    583588      return integral_part;
     
    663668    p->flags &= ~PF_ZEROPAD;
    664669
    665670  sd = d;       /* signed for ' ' padding in base 10 */
    666   flags = (*p->pf == 'u' || *p->pf == 'U') ? FL_UNSIGNED : 0;
     671  flags = 0;
     672  flags = (*p->pf == 'x' || *p->pf == 'X' || *p->pf == 'o' || *p->pf == 'u' || *p->pf == 'U') ? FL_UNSIGNED : 0;
    667673  if (*p->pf == 'X')
    668674    flags |= FL_HEXUPPER;
    669675
     
    733739    p->flags &= ~PF_ZEROPAD;
    734740
    735741  sd = d;       /* signed for ' ' padding in base 10 */
    736   flags = (*p->pf == 'u' || *p->pf == 'U') ? FL_UNSIGNED : 0;
     742  flags = (*p->pf == 'x' || *p->pf == 'X' || *p->pf == 'o' || *p->pf == 'u' || *p->pf == 'U') ? FL_UNSIGNED : 0;
    737743  if (*p->pf == 'X')
    738744    flags |= FL_HEXUPPER;
    739745
     
    805811      PUT_CHAR(*tmp, p);
    806812      tmp++;
    807813    }
     814
    808815  PAD_LEFT(p);
    809816}
    810817
     
    972979  if ((p->flags & PF_THOUSANDS) && grouping && (t = groupnum (tmp)))
    973980    tmp = t;
    974981
     982  if ((*p->pf == 'g' || *p->pf == 'G') && (p->flags & PF_ALTFORM) == 0)
     983    {
     984      /* smash the trailing zeros unless altform */
     985      for (i = strlen(tmp2) - 1; i >= 0 && tmp2[i] == '0'; i--)
     986        tmp2[i] = '\0';
     987      if (tmp2[0] == '\0')
     988        p->precision = 0;
     989    }
     990
    975991  /* calculate the padding. 1 for the dot */
    976992  p->width = p->width -
    977993            ((d > 0. && p->justify == RIGHT) ? 1:0) -
    978994            ((p->flags & PF_SPACE) ? 1:0) -
    979             strlen(tmp) - p->precision - 1;
     995            strlen(tmp) - p->precision -
     996            ((p->precision != 0 || (p->flags & PF_ALTFORM)) ? 1 : 0);   /* radix char */
    980997  PAD_RIGHT(p); 
    981998  PUT_PLUS(d, p, 0.);
    982999  PUT_SPACE(d, p, 0.);
     
    9911008  if (p->precision != 0 || (p->flags & PF_ALTFORM))
    9921009    PUT_CHAR(decpoint, p);  /* put the '.' */
    9931010
    994   if ((*p->pf == 'g' || *p->pf == 'G') && (p->flags & PF_ALTFORM) == 0)
    995     /* smash the trailing zeros unless altform */
    996     for (i = strlen(tmp2) - 1; i >= 0 && tmp2[i] == '0'; i--)
    997       tmp2[i] = '\0';
    998 
    9991011  for (; *tmp2; tmp2++)
    10001012    PUT_CHAR(*tmp2, p); /* the fraction */
    10011013 
     
    10111023  char *tmp, *tmp2;
    10121024  int j, i;
    10131025
    1014   if (chkinfnan(p, d, 1) || chkinfnan(p, d, 2))
     1026  if (d != 0 && (chkinfnan(p, d, 1) || chkinfnan(p, d, 2)))
    10151027    return;     /* already printed nan or inf */
    10161028
    10171029  GETLOCALEDATA(decpoint, thoussep, grouping);
    10181030  DEF_PREC(p);
    1019   j = log_10(d);
    1020   d = d / pow_10(j);  /* get the Mantissa */
    1021   d = ROUND(d, p);               
     1031  if (d == 0.)
     1032    j = 0;
     1033  else
     1034    {
     1035      j = log_10(d);
     1036      d = d / pow_10(j);  /* get the Mantissa */
     1037      d = ROUND(d, p);           
     1038    }
    10221039  tmp = dtoa(d, p->precision, &tmp2);
    10231040
    10241041  /* 1 for unit, 1 for the '.', 1 for 'e|E',
     
    10761093       PUT_CHAR(*tmp, p);
    10771094       tmp++;
    10781095     }
     1096
    10791097   PAD_LEFT(p);
    10801098}
    10811099#endif
     
    13581376                STAR_ARGS(data);
    13591377                DEF_PREC(data);
    13601378                d = GETDOUBLE(data);
    1361                 i = log_10(d);
     1379                i = (d != 0.) ? log_10(d) : -1;
    13621380                /*
    13631381                 * for '%g|%G' ANSI: use f if exponent
    13641382                 * is in the range or [-4,p] exclusively
  • parse.y

    diff -Naur bash-3.2.orig/parse.y bash-3.2/parse.y
    old new  
    10291029#define PST_CMDTOKEN    0x1000          /* command token OK - unused */
    10301030#define PST_COMPASSIGN  0x2000          /* parsing x=(...) compound assignment */
    10311031#define PST_ASSIGNOK    0x4000          /* assignment statement ok in this context */
     1032#define PST_REGEXP      0x8000          /* parsing an ERE/BRE as a single word */
    10321033
    10331034/* Initial size to allocate for tokens, and the
    10341035   amount to grow them by. */
     
    25912592      return (character);
    25922593    }
    25932594
     2595  if (parser_state & PST_REGEXP)
     2596    goto tokword;
     2597
    25942598  /* Shell meta-characters. */
    25952599  if MBTEST(shellmeta (character) && ((parser_state & PST_DBLPAREN) == 0))
    25962600    {
     
    26982702  if MBTEST(character == '-' && (last_read_token == LESS_AND || last_read_token == GREATER_AND))
    26992703    return (character);
    27002704
     2705tokword:
    27012706  /* Okay, if we got this far, we have to read a word.  Read one,
    27022707     and then check it against the known ones. */
    27032708  result = read_token_word (character);
     
    27352740/* itrace("parse_matched_pair: open = %c close = %c", open, close); */
    27362741  count = 1;
    27372742  pass_next_character = backq_backslash = was_dollar = in_comment = 0;
    2738   check_comment = (flags & P_COMMAND) && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0;
     2743  check_comment = (flags & P_COMMAND) && qc != '`' && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0;
    27392744
    27402745  /* RFLAGS is the set of flags we want to pass to recursive calls. */
    27412746  rflags = (qc == '"') ? P_DQUOTE : (flags & P_DQUOTE);
     
    32023207      if (tok == WORD && test_binop (yylval.word->word))
    32033208        op = yylval.word;
    32043209#if defined (COND_REGEXP)
    3205       else if (tok == WORD && STREQ (yylval.word->word,"=~"))
    3206         op = yylval.word;
     3210      else if (tok == WORD && STREQ (yylval.word->word, "=~"))
     3211        {
     3212          op = yylval.word;
     3213          parser_state |= PST_REGEXP;
     3214        }
    32073215#endif
    32083216      else if (tok == '<' || tok == '>')
    32093217        op = make_word_from_token (tok);  /* ( */
     
    32343242
    32353243      /* rhs */
    32363244      tok = read_token (READ);
     3245      parser_state &= ~PST_REGEXP;
    32373246      if (tok == WORD)
    32383247        {
    32393248          tright = make_cond_node (COND_TERM, yylval.word, (COND_COM *)NULL, (COND_COM *)NULL);
     
    33673376      if (pass_next_character)
    33683377        {
    33693378          pass_next_character = 0;
    3370           goto got_character;
     3379          goto got_escaped_character;
    33713380        }
    33723381
    33733382      cd = current_delimiter (dstack);
     
    34193428          goto next_character;
    34203429        }
    34213430
     3431#ifdef COND_REGEXP
     3432      /* When parsing a regexp as a single word inside a conditional command,
     3433         we need to special-case characters special to both the shell and
     3434         regular expressions.  Right now, that is only '(' and '|'. */ /*)*/
     3435      if MBTEST((parser_state & PST_REGEXP) && (character == '(' || character == '|'))          /*)*/
     3436        {
     3437          if (character == '|')
     3438            goto got_character;
     3439
     3440          push_delimiter (dstack, character);
     3441          ttok = parse_matched_pair (cd, '(', ')', &ttoklen, 0);
     3442          pop_delimiter (dstack);
     3443          if (ttok == &matched_pair_error)
     3444            return -1;          /* Bail immediately. */
     3445          RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2,
     3446                                  token_buffer_size, TOKEN_DEFAULT_GROW_SIZE);
     3447          token[token_index++] = character;
     3448          strcpy (token + token_index, ttok);
     3449          token_index += ttoklen;
     3450          FREE (ttok);
     3451          dollar_present = all_digit_token = 0;
     3452          goto next_character;
     3453        }
     3454#endif /* COND_REGEXP */
     3455
    34223456#ifdef EXTENDED_GLOB
    34233457      /* Parse a ksh-style extended pattern matching specification. */
    3424       if (extended_glob && PATTERN_CHAR (character))
     3458      if MBTEST(extended_glob && PATTERN_CHAR (character))
    34253459        {
    34263460          peek_char = shell_getc (1);
    34273461          if MBTEST(peek_char == '(')           /* ) */
     
    36163650
    36173651    got_character:
    36183652
    3619       all_digit_token &= DIGIT (character);
    3620       dollar_present |= character == '$';
    3621 
    36223653      if (character == CTLESC || character == CTLNUL)
    36233654        token[token_index++] = CTLESC;
    36243655
     3656    got_escaped_character:
     3657
     3658      all_digit_token &= DIGIT (character);
     3659      dollar_present |= character == '$';
     3660
    36253661      token[token_index++] = character;
    36263662
    36273663      RESIZE_MALLOCED_BUFFER (token, token_index, 1, token_buffer_size,
  • patchlevel.h

    diff -Naur bash-3.2.orig/patchlevel.h bash-3.2/patchlevel.h
    old new  
    2525   regexp `^#define[    ]*PATCHLEVEL', since that's what support/mkversion.sh
    2626   looks for to find the patch level (for the sccs version string). */
    2727
    28 #define PATCHLEVEL 0
     28#define PATCHLEVEL 25
    2929
    3030#endif /* _PATCHLEVEL_H_ */
  • pathexp.c

    diff -Naur bash-3.2.orig/pathexp.c bash-3.2/pathexp.c
    old new  
    11/* pathexp.c -- The shell interface to the globbing library. */
    22
    3 /* Copyright (C) 1995-2002 Free Software Foundation, Inc.
     3/* Copyright (C) 1995-2007 Free Software Foundation, Inc.
    44
    55   This file is part of GNU Bash, the Bourne Again SHell.
    66
     
    110110  return (0);
    111111}
    112112
     113/* Return 1 if C is a character that is `special' in a POSIX ERE and needs to
     114   be quoted to match itself. */
     115static inline int
     116ere_char (c)
     117     int c;
     118{
     119  switch (c)
     120    {
     121    case '.':
     122    case '[':
     123    case '\\':
     124    case '(':
     125    case ')':
     126    case '*':
     127    case '+':
     128    case '?':
     129    case '{':
     130    case '|':
     131    case '^':
     132    case '$':
     133      return 1;
     134    default:
     135      return 0;
     136    }
     137  return (0);
     138}
     139
    113140/* PATHNAME can contain characters prefixed by CTLESC; this indicates
    114141   that the character is to be quoted.  We quote it here in the style
    115142   that the glob library recognizes.  If flags includes QGLOB_CVTNULL,
     
    142169        {
    143170          if ((qflags & QGLOB_FILENAME) && pathname[i+1] == '/')
    144171            continue;
     172          if ((qflags & QGLOB_REGEXP) && ere_char (pathname[i+1]) == 0)
     173            continue;
    145174          temp[j++] = '\\';
    146175          i++;
    147176          if (pathname[i] == '\0')
  • pathexp.h

    diff -Naur bash-3.2.orig/pathexp.h bash-3.2/pathexp.h
    old new  
    11/* pathexp.h -- The shell interface to the globbing library. */
    22
    3 /* Copyright (C) 1987-2005 Free Software Foundation, Inc.
     3/* Copyright (C) 1987-2007 Free Software Foundation, Inc.
    44
    55   This file is part of GNU Bash, the Bourne Again SHell.
    66
     
    3232/* Flag values for quote_string_for_globbing */
    3333#define QGLOB_CVTNULL   0x01    /* convert QUOTED_NULL strings to '\0' */
    3434#define QGLOB_FILENAME  0x02    /* do correct quoting for matching filenames */
     35#define QGLOB_REGEXP    0x04    /* quote an ERE for regcomp/regexec */
    3536
    3637#if defined (EXTENDED_GLOB)
    3738/* Flags to OR with other flag args to strmatch() to enabled the extended
  • po/ru.po

    diff -Naur bash-3.2.orig/po/ru.po bash-3.2/po/ru.po
    old new  
    1212"Last-Translator: Evgeniy Dushistov <dushistov@mail.ru>\n"
    1313"Language-Team: Russian <ru@li.org>\n"
    1414"MIME-Version: 1.0\n"
    15 "Content-Type: text/plain; charset=UTF-8\n"
     15"Content-Type: text/plain; charset=KOI8-R\n"
    1616"Content-Transfer-Encoding: 8bit\n"
    1717"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
    1818
  • bash-3.2

    diff -Naur bash-3.2.orig/sig.c bash-3.2/sig.c
    old new  
    350350#undef XSIG
    351351#undef XHANDLER
    352352
     353/* Run some of the cleanups that should be performed when we run
     354   jump_to_top_level from a builtin command context.  XXX - might want to
     355   also call reset_parser here. */
     356void
     357top_level_cleanup ()
     358{
     359  /* Clean up string parser environment. */
     360  while (parse_and_execute_level)
     361    parse_and_execute_cleanup ();
     362
     363#if defined (PROCESS_SUBSTITUTION)
     364  unlink_fifo_list ();
     365#endif /* PROCESS_SUBSTITUTION */
     366
     367  run_unwind_protects ();
     368  loop_level = continuing = breaking = 0;
     369  return_catch_flag = 0;
     370}
     371
    353372/* What to do when we've been interrupted, and it is safe to handle it. */
    354373void
    355374throw_to_top_level ()
  • bash-3.2

    diff -Naur bash-3.2.orig/sig.h bash-3.2/sig.h
    old new  
    121121extern void initialize_signals __P((int));
    122122extern void initialize_terminating_signals __P((void));
    123123extern void reset_terminating_signals __P((void));
     124extern void top_level_cleanup __P((void));
    124125extern void throw_to_top_level __P((void));
    125126extern void jump_to_top_level __P((int)) __attribute__((__noreturn__));
    126127
  • subst.c

    diff -Naur bash-3.2.orig/subst.c bash-3.2/subst.c
    old new  
    44/* ``Have a little faith, there's magic in the night.  You ain't a
    55     beauty, but, hey, you're alright.'' */
    66
    7 /* Copyright (C) 1987-2006 Free Software Foundation, Inc.
     7/* Copyright (C) 1987-2007 Free Software Foundation, Inc.
    88
    99   This file is part of GNU Bash, the Bourne Again SHell.
    1010
     
    12781278    {
    12791279      if (no_longjmp_on_fatal_error == 0)
    12801280        {                       /* { */
    1281           report_error ("bad substitution: no closing `%s' in %s", "}", string);
     1281          report_error (_("bad substitution: no closing `%s' in %s"), "}", string);
    12821282          last_command_exit_value = EXECUTION_FAILURE;
    12831283          exp_jump_to_top_level (DISCARD);
    12841284        }
     
    18871887  sep[1] = '\0';
    18881888#endif
    18891889
     1890  /* XXX -- why call quote_list if ifs == 0?  we can get away without doing
     1891     it now that quote_escapes quotes spaces */
     1892#if 0
    18901893  tlist = ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || (ifs && *ifs == 0))
     1894#else
     1895  tlist = (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
     1896#endif
    18911897                ? quote_list (list)
    18921898                : list_quote_escapes (list);
    18931899
     
    26462652
    26472653/* This needs better error handling. */
    26482654/* Expand W for use as an argument to a unary or binary operator in a
    2649    [[...]] expression.  If SPECIAL is nonzero, this is the rhs argument
     2655   [[...]] expression.  If SPECIAL is 1, this is the rhs argument
    26502656   to the != or == operator, and should be treated as a pattern.  In
    2651    this case, we quote the string specially for the globbing code.  The
    2652    caller is responsible for removing the backslashes if the unquoted
    2653    words is needed later. */   
     2657   this case, we quote the string specially for the globbing code.  If
     2658   SPECIAL is 2, this is an rhs argument for the =~ operator, and should
     2659   be quoted appropriately for regcomp/regexec.  The caller is responsible
     2660   for removing the backslashes if the unquoted word is needed later. */   
    26542661char *
    26552662cond_expand_word (w, special)
    26562663     WORD_DESC *w;
     
    26582665{
    26592666  char *r, *p;
    26602667  WORD_LIST *l;
     2668  int qflags;
    26612669
    26622670  if (w->word == 0 || w->word[0] == '\0')
    26632671    return ((char *)NULL);
     
    26722680        }
    26732681      else
    26742682        {
     2683          qflags = QGLOB_CVTNULL;
     2684          if (special == 2)
     2685            qflags |= QGLOB_REGEXP;
    26752686          p = string_list (l);
    2676           r = quote_string_for_globbing (p, QGLOB_CVTNULL);
     2687          r = quote_string_for_globbing (p, qflags);
    26772688          free (p);
    26782689        }
    26792690      dispose_words (l);
     
    29162927
    29172928/* Quote escape characters in string s, but no other characters.  This is
    29182929   used to protect CTLESC and CTLNUL in variable values from the rest of
    2919    the word expansion process after the variable is expanded. */
     2930   the word expansion process after the variable is expanded.  If IFS is
     2931   null, we quote spaces as well, just in case we split on spaces later
     2932   (in the case of unquoted $@, we will eventually attempt to split the
     2933   entire word on spaces).  Corresponding code exists in dequote_escapes.
     2934   Even if we don't end up splitting on spaces, quoting spaces is not a
     2935   problem. */
    29202936char *
    29212937quote_escapes (string)
    29222938     char *string;
     
    29242940  register char *s, *t;
    29252941  size_t slen;
    29262942  char *result, *send;
     2943  int quote_spaces;
    29272944  DECLARE_MBSTATE;
    29282945
    29292946  slen = strlen (string);
    29302947  send = string + slen;
    29312948
     2949  quote_spaces = (ifs_value && *ifs_value == 0);
    29322950  t = result = (char *)xmalloc ((slen * 2) + 1);
    29332951  s = string;
    29342952
    29352953  while (*s)
    29362954    {
    2937       if (*s == CTLESC || *s == CTLNUL)
     2955      if (*s == CTLESC || *s == CTLNUL || (quote_spaces && *s == ' '))
    29382956        *t++ = CTLESC;
    29392957      COPY_CHAR_P (t, s, send);
    29402958    }
     
    29762994  register char *s, *t;
    29772995  size_t slen;
    29782996  char *result, *send;
     2997  int quote_spaces;
    29792998  DECLARE_MBSTATE;
    29802999
    29813000  if (string == 0)
     
    29903009  if (strchr (string, CTLESC) == 0)
    29913010    return (strcpy (result, s));
    29923011
     3012  quote_spaces = (ifs_value && *ifs_value == 0);
    29933013  while (*s)
    29943014    {
    2995       if (*s == CTLESC && (s[1] == CTLESC || s[1] == CTLNUL))
     3015      if (*s == CTLESC && (s[1] == CTLESC || s[1] == CTLNUL || (quote_spaces && s[1] == ' ')))
    29963016        {
    29973017          s++;
    29983018          if (*s == '\0')
     
    39543974  if (patspec == RP_LONG_LEFT || patspec == RP_LONG_RIGHT)
    39553975    patstr++;
    39563976
    3957   pattern = getpattern (patstr, quoted, 1);
     3977  /* Need to pass getpattern newly-allocated memory in case of expansion --
     3978     the expansion code will free the passed string on an error. */
     3979  temp1 = savestring (patstr);
     3980  pattern = getpattern (temp1, quoted, 1);
     3981  free (temp1);
    39583982
    39593983  temp1 = (char *)NULL;         /* shut up gcc */
    39603984  switch (vtype)
     
    41234147    nfifo = 0;
    41244148}
    41254149
     4150int
     4151fifos_pending ()
     4152{
     4153  return nfifo;
     4154}
     4155
    41264156static char *
    41274157make_named_pipe ()
    41284158{
     
    41724202  nfds++;
    41734203}
    41744204
     4205int
     4206fifos_pending ()
     4207{
     4208  return 0;     /* used for cleanup; not needed with /dev/fd */
     4209}
     4210
    41754211void
    41764212unlink_fifo_list ()
    41774213{
     
    44564492      /* Add the character to ISTRING, possibly after resizing it. */
    44574493      RESIZE_MALLOCED_BUFFER (istring, istring_index, 2, istring_size, DEFAULT_ARRAY_SIZE);
    44584494
    4459       if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || c == CTLESC || c == CTLNUL)
     4495      /* This is essentially quote_string inline */
     4496      if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) /* || c == CTLESC || c == CTLNUL */)
     4497        istring[istring_index++] = CTLESC;
     4498      /* Escape CTLESC and CTLNUL in the output to protect those characters
     4499         from the rest of the word expansions (word splitting and globbing.)
     4500         This is essentially quote_escapes inline. */
     4501      else if (c == CTLESC)
     4502        istring[istring_index++] = CTLESC;
     4503      else if (c == CTLNUL || (c == ' ' && (ifs_value && *ifs_value == 0)))
    44604504        istring[istring_index++] = CTLESC;
    44614505
    44624506      istring[istring_index++] = c;
     
    46654709
    46664710      last_command_exit_value = rc;
    46674711      rc = run_exit_trap ();
     4712#if defined (PROCESS_SUBSTITUTION)
     4713      unlink_fifo_list ();
     4714#endif
    46684715      exit (rc);
    46694716    }
    46704717  else
     
    55465593         so verify_substring_values just returns the numbers specified and we
    55475594         rely on array_subrange to understand how to deal with them). */
    55485595      tt = array_subrange (array_cell (v), e1, e2, starsub, quoted);
     5596#if 0
     5597      /* array_subrange now calls array_quote_escapes as appropriate, so the
     5598         caller no longer needs to. */
    55495599      if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) == 0)
    55505600        {
    55515601          temp = tt ? quote_escapes (tt) : (char *)NULL;
    55525602          FREE (tt);
    55535603        }
    55545604      else
     5605#endif
    55555606        temp = tt;
    55565607      break;
    55575608#endif
     
    57075758  vtype &= ~VT_STARSUB;
    57085759
    57095760  mflags = 0;
     5761  if (patsub && *patsub == '/')
     5762    {
     5763      mflags |= MATCH_GLOBREP;
     5764      patsub++;
     5765    }
    57105766
    57115767  /* Malloc this because expand_string_if_necessary or one of the expansion
    57125768     functions in its call chain may free it on a substitution error. */
     
    57415797    }
    57425798
    57435799  /* ksh93 doesn't allow the match specifier to be a part of the expanded
    5744      pattern.  This is an extension. */
     5800     pattern.  This is an extension.  Make sure we don't anchor the pattern
     5801     at the beginning or end of the string if we're doing global replacement,
     5802     though. */
    57455803  p = pat;
    5746   if (pat && pat[0] == '/')
    5747     {
    5748       mflags |= MATCH_GLOBREP|MATCH_ANY;
    5749       p++;
    5750     }
     5804  if (mflags & MATCH_GLOBREP)
     5805    mflags |= MATCH_ANY;
    57515806  else if (pat && pat[0] == '#')
    57525807    {
    57535808      mflags |= MATCH_BEG;
     
    57985853#if defined (ARRAY_VARS)
    57995854    case VT_ARRAYVAR:
    58005855      temp = array_patsub (array_cell (v), p, rep, mflags);
     5856#if 0
     5857      /* Don't need to do this anymore; array_patsub calls array_quote_escapes
     5858         as appropriate before adding the space separators. */
    58015859      if (temp && (mflags & MATCH_QUOTED) == 0)
    58025860        {
    58035861          tt = quote_escapes (temp);
    58045862          free (temp);
    58055863          temp = tt;
    58065864        }
     5865#endif
    58075866      break;
    58085867#endif
    58095868    }
     
    76077666  expand_no_split_dollar_star = 0;      /* XXX */
    76087667  expanding_redir = 0;
    76097668
     7669  top_level_cleanup ();                 /* from sig.c */
     7670
    76107671  jump_to_top_level (v);
    76117672}
    76127673
     
    78247885          else if (fail_glob_expansion != 0)
    78257886            {
    78267887              report_error (_("no match: %s"), tlist->word->word);
    7827               jump_to_top_level (DISCARD);
     7888              exp_jump_to_top_level (DISCARD);
    78287889            }
    78297890          else if (allow_null_glob_expansion == 0)
    78307891            {
  • subst.h

    diff -Naur bash-3.2.orig/subst.h bash-3.2/subst.h
    old new  
    222222extern char *command_substitute __P((char *, int));
    223223extern char *pat_subst __P((char *, char *, char *, int));
    224224
     225extern int fifos_pending __P((void));
    225226extern void unlink_fifo_list __P((void));
    226227
    227228extern WORD_LIST *list_string_with_quotes __P((char *));
  • tests/new-exp.right

    diff -Naur bash-3.2.orig/tests/new-exp.right bash-3.2/tests/new-exp.right
    old new  
    430430Case06---1---A B C::---
    431431Case07---3---A:B:C---
    432432Case08---3---A:B:C---
    433 ./new-exp.tests: line 506: /${$(($#-1))}: bad substitution
     433./new-exp.tests: line 506: ${$(($#-1))}: bad substitution
    434434argv[1] = <a>
    435435argv[2] = <b>
    436436argv[3] = <c>
  • variables.c

    diff -Naur bash-3.2.orig/variables.c bash-3.2/variables.c
    old new  
    18211821          oval = value_cell (var);
    18221822          lval = evalexp (oval, &expok);        /* ksh93 seems to do this */
    18231823          if (expok == 0)
    1824             jump_to_top_level (DISCARD);
     1824            {
     1825              top_level_cleanup ();
     1826              jump_to_top_level (DISCARD);
     1827            }
    18251828        }
    18261829      rval = evalexp (value, &expok);
    18271830      if (expok == 0)
    1828         jump_to_top_level (DISCARD);
     1831        {
     1832          top_level_cleanup ();
     1833          jump_to_top_level (DISCARD);
     1834        }
    18291835      if (flags & ASS_APPEND)
    18301836        rval += lval;
    18311837      retval = itos (rval);
Note: See TracBrowser for help on using the repository browser.