include $(TOPDIR)/rules.mk
PKG_NAME:=python-lxml
-PKG_VERSION:=4.0.0
+PKG_VERSION:=4.1.0
PKG_RELEASE:=1
PKG_SOURCE:=lxml-$(PKG_VERSION).tgz
PKG_SOURCE_URL:=http://lxml.de/files/
-PKG_HASH:=f7bc9f702500e205b1560d620f14015fec76dcd6f9e889a946a2ddcc3c344fd0
+PKG_HASH:=be3aaeb5f468a49f523f16736ccff7d82af2b4b303292ba3d052b5b28f3fbe47
PKG_BUILD_DIR:=$(BUILD_DIR)/$(BUILD_VARIANT)-lxml-$(PKG_VERSION)
PKG_UNPACK=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
include $(TOPDIR)/rules.mk
PKG_NAME:=glib2
-PKG_VERSION:=2.53.7
+PKG_VERSION:=2.54.1
PKG_RELEASE:=1
PKG_SOURCE:=glib-$(PKG_VERSION).tar.xz
PKG_BUILD_DIR:=$(BUILD_DIR)/glib-$(PKG_VERSION)
-PKG_SOURCE_URL:=@GNOME/glib/2.53
-PKG_HASH:=028efbf6df4d88d7725314456524b923169f4d4f8503347194b2baf2222f3e33
+PKG_SOURCE_URL:=@GNOME/glib/2.54
+PKG_HASH:=50c01b1419324f10fbf9b9709ec2164b18586968bdce7540583bf32302cf47a3
PKG_BUILD_PARALLEL:=1
HOST_BUILD_PARALLEL:=1
include $(TOPDIR)/rules.mk
PKG_NAME:=libgphoto2
-PKG_VERSION:=2.5.14
-PKG_RELEASE:=2
+PKG_VERSION:=2.5.16
+PKG_RELEASE:=1
PORT_VERSION:=0.12.0
PKG_MAINTAINER:=Leonardo Medici <leonardo_medici@me.com>
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
PKG_SOURCE_URL:=@SF/gphoto
-PKG_HASH:=d3ce70686fb87d6791b9adcbb6e5693bfbe1cfef9661c23c75eb8a699ec4e274
+PKG_HASH:=e757416d1623e01a9d0d294b2e790162e434c0964f50d3b7ff1a3424b62a2906
PKG_LICENSE:=LGPL-2.1
PKG_LICENSE_FILES:=COPYING
-Index: libgphoto2-2.5.14/configure.ac
+Index: libgphoto2-2.5.16/configure.ac
===================================================================
---- libgphoto2-2.5.14.orig/configure.ac
-+++ libgphoto2-2.5.14/configure.ac
+--- libgphoto2-2.5.16.orig/configure.ac
++++ libgphoto2-2.5.16/configure.ac
@@ -209,7 +209,6 @@ ALL_LINGUAS="cs da de es eu fr hu it ja
GP_GETTEXT_HACK([${PACKAGE}-${LIBGPHOTO2_CURRENT_MIN}],[The gPhoto Team],[${MAIL_GPHOTO_TRANSLATION}])
AM_GNU_GETTEXT_VERSION([0.14.1])
AM_ICONV()
GP_GETTEXT_FLAGS()
-Index: libgphoto2-2.5.14/libgphoto2_port/configure.ac
+Index: libgphoto2-2.5.16/libgphoto2_port/configure.ac
===================================================================
---- libgphoto2-2.5.14.orig/libgphoto2_port/configure.ac
-+++ libgphoto2-2.5.14/libgphoto2_port/configure.ac
+--- libgphoto2-2.5.16.orig/libgphoto2_port/configure.ac
++++ libgphoto2-2.5.16/libgphoto2_port/configure.ac
@@ -124,7 +124,6 @@ GP_GETTEXT_HACK([${PACKAGE}-${LIBGPHOTO2
ALL_LINGUAS="cs da de es eu fi fr it ja nl pl pt_BR ru sk sr sv uk vi zh_CN zh_TW"
AM_GNU_GETTEXT_VERSION([0.14.1])
-Index: libgphoto2-2.5.14/Makefile.am
+Index: libgphoto2-2.5.16/Makefile.am
===================================================================
---- libgphoto2-2.5.14.orig/Makefile.am
-+++ libgphoto2-2.5.14/Makefile.am
+--- libgphoto2-2.5.16.orig/Makefile.am
++++ libgphoto2-2.5.16/Makefile.am
@@ -8,7 +8,7 @@ bin_SCRIPTS = gphoto2-config
EXTRA_DIST = HACKING MAINTAINERS TESTERS installcheck.mk
EXTRA_DIST += libgphoto2.pc.in
pkgconfig_DATA = libgphoto2.pc
-Index: libgphoto2-2.5.14/Makefile.in
+Index: libgphoto2-2.5.16/Makefile.in
===================================================================
---- libgphoto2-2.5.14.orig/Makefile.in
-+++ libgphoto2-2.5.14/Makefile.in
+--- libgphoto2-2.5.16.orig/Makefile.in
++++ libgphoto2-2.5.16/Makefile.in
@@ -482,7 +482,7 @@ EXTRA_DIST = HACKING MAINTAINERS TESTERS
INSTALL README.in README README.packaging
pkgconfig_DATA = libgphoto2.pc
noinst_DATA = libgphoto2-uninstalled.pc
doc_DATA = AUTHORS COPYING NEWS ABOUT-NLS ChangeLog README \
-Index: libgphoto2-2.5.14/configure.ac
+Index: libgphoto2-2.5.16/configure.ac
===================================================================
---- libgphoto2-2.5.14.orig/configure.ac
-+++ libgphoto2-2.5.14/configure.ac
+--- libgphoto2-2.5.16.orig/configure.ac
++++ libgphoto2-2.5.16/configure.ac
@@ -635,20 +635,11 @@ gphoto-m4/Makefile
libgphoto2/Makefile
libgphoto2.pc
],[
dnl This relies on this code being called for each of the above files
dnl with ac_file set to the filename.
-Index: libgphoto2-2.5.14/libgphoto2_port/Makefile.am
+Index: libgphoto2-2.5.16/libgphoto2_port/Makefile.am
===================================================================
---- libgphoto2-2.5.14.orig/libgphoto2_port/Makefile.am
-+++ libgphoto2-2.5.14/libgphoto2_port/Makefile.am
+--- libgphoto2-2.5.16.orig/libgphoto2_port/Makefile.am
++++ libgphoto2-2.5.16/libgphoto2_port/Makefile.am
@@ -25,7 +25,7 @@ udevscript_PROGRAMS =
bin_SCRIPTS = gphoto2-port-config
########################################################################
-Index: libgphoto2-2.5.14/libgphoto2_port/Makefile.in
+Index: libgphoto2-2.5.16/libgphoto2_port/Makefile.in
===================================================================
---- libgphoto2-2.5.14.orig/libgphoto2_port/Makefile.in
-+++ libgphoto2-2.5.14/libgphoto2_port/Makefile.in
+--- libgphoto2-2.5.16.orig/libgphoto2_port/Makefile.in
++++ libgphoto2-2.5.16/libgphoto2_port/Makefile.in
@@ -574,7 +574,7 @@ EXTRA_LTLIBRARIES = disk.la ptpip.la ser
bin_SCRIPTS = gphoto2-port-config
########################################################################
# All iolibs are defined as EXTRA_LTLIBRARIES. This requires that
-Index: libgphoto2-2.5.14/libgphoto2_port/configure.ac
+Index: libgphoto2-2.5.16/libgphoto2_port/configure.ac
===================================================================
---- libgphoto2-2.5.14.orig/libgphoto2_port/configure.ac
-+++ libgphoto2-2.5.14/libgphoto2_port/configure.ac
+--- libgphoto2-2.5.16.orig/libgphoto2_port/configure.ac
++++ libgphoto2-2.5.16/libgphoto2_port/configure.ac
@@ -512,13 +512,10 @@ AC_SUBST([AM_LDFLAGS])
# ---------------------------------------------------------------------------
AC_CONFIG_FILES([
include $(TOPDIR)/rules.mk
PKG_NAME:=gphoto2
-PKG_VERSION:=2.5.14
+PKG_VERSION:=2.5.15
PKG_RELEASE:=1
PKG_MAINTAINER:=Leonardo Medici <leonardo_medici@me.com>
-
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
PKG_SOURCE_URL:=@SF/gphoto
-PKG_HASH:=9302d02fb472d4936988382b7277ccdc4edaf7ede56c490278912ffd0627699c
+PKG_HASH:=ae571a227983dc9997876702a73af5431d41f287ea0f483cda897c57a6084a77
PKG_LICENSE:=GPL-2.0
PKG_LICENSE_FILES:=COPYING
-Index: gphoto2-2.5.14/Makefile.am
+Index: gphoto2-2.5.15/Makefile.am
===================================================================
---- gphoto2-2.5.14.orig/Makefile.am
-+++ gphoto2-2.5.14/Makefile.am
+--- gphoto2-2.5.15.orig/Makefile.am
++++ gphoto2-2.5.15/Makefile.am
@@ -1,4 +1,4 @@
-SUBDIRS = gphoto-m4 contrib doc gphoto2 packaging po tests
+SUBDIRS = gphoto-m4 contrib doc gphoto2 packaging tests
ACLOCAL_AMFLAGS = -I auto-m4 -I gphoto-m4
EXTRA_DIST = README.md
-Index: gphoto2-2.5.14/Makefile.in
+Index: gphoto2-2.5.15/Makefile.in
===================================================================
---- gphoto2-2.5.14.orig/Makefile.in
-+++ gphoto2-2.5.14/Makefile.in
-@@ -390,7 +390,7 @@ target_alias = @target_alias@
+--- gphoto2-2.5.15.orig/Makefile.in
++++ gphoto2-2.5.15/Makefile.in
+@@ -389,7 +389,7 @@ target_alias = @target_alias@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
ACLOCAL_AMFLAGS = -I auto-m4 -I gphoto-m4
EXTRA_DIST = README.md
all: config.h
-Index: gphoto2-2.5.14/configure.ac
+Index: gphoto2-2.5.15/configure.ac
===================================================================
---- gphoto2-2.5.14.orig/configure.ac
-+++ gphoto2-2.5.14/configure.ac
-@@ -59,10 +59,7 @@ dnl ------------------------------------
+--- gphoto2-2.5.15.orig/configure.ac
++++ gphoto2-2.5.15/configure.ac
+@@ -58,10 +58,7 @@ dnl ------------------------------------
GP_GETTEXT_HACK([],[Lutz Müller and others],[${MAIL_GPHOTO_TRANSLATION}])
ALL_LINGUAS="az cs da de en_GB es eu fi fr hu id is it ja nl pa pl pt_BR ro ru rw sk sr sv uk vi zh_CN zh_TW"
AM_GNU_GETTEXT_VERSION([0.14.1])
dnl We cannot use AC_DEFINE_UNQUOTED() for these definitions, as
dnl we require make to do insert the proper $(datadir) value
-@@ -408,7 +405,6 @@ AC_SUBST([AM_LDFLAGS])
+@@ -407,7 +404,6 @@ AC_SUBST([AM_LDFLAGS])
# Create output files
# ---------------------------------------------------------------------------
AC_CONFIG_FILES([
-Index: gphoto2-2.5.14/Makefile.am
+Index: gphoto2-2.5.15/Makefile.am
===================================================================
---- gphoto2-2.5.14.orig/Makefile.am
-+++ gphoto2-2.5.14/Makefile.am
+--- gphoto2-2.5.15.orig/Makefile.am
++++ gphoto2-2.5.15/Makefile.am
@@ -1,4 +1,4 @@
-SUBDIRS = gphoto-m4 contrib doc gphoto2 packaging tests
+SUBDIRS = gphoto-m4 contrib gphoto2 packaging
ACLOCAL_AMFLAGS = -I auto-m4 -I gphoto-m4
EXTRA_DIST = README.md
-Index: gphoto2-2.5.14/Makefile.in
+Index: gphoto2-2.5.15/Makefile.in
===================================================================
---- gphoto2-2.5.14.orig/Makefile.in
-+++ gphoto2-2.5.14/Makefile.in
-@@ -390,7 +390,7 @@ target_alias = @target_alias@
+--- gphoto2-2.5.15.orig/Makefile.in
++++ gphoto2-2.5.15/Makefile.in
+@@ -389,7 +389,7 @@ target_alias = @target_alias@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
ACLOCAL_AMFLAGS = -I auto-m4 -I gphoto-m4
EXTRA_DIST = README.md
all: config.h
-Index: gphoto2-2.5.14/configure.ac
+Index: gphoto2-2.5.15/configure.ac
===================================================================
---- gphoto2-2.5.14.orig/configure.ac
-+++ gphoto2-2.5.14/configure.ac
-@@ -408,16 +408,10 @@ AC_CONFIG_FILES([
+--- gphoto2-2.5.15.orig/configure.ac
++++ gphoto2-2.5.15/configure.ac
+@@ -407,16 +407,10 @@ AC_CONFIG_FILES([
Makefile
gphoto2/Makefile
gphoto-m4/Makefile
include $(TOPDIR)/rules.mk
PKG_NAME:=minidlna
-PKG_VERSION:=1.2.0
+PKG_VERSION:=1.2.1
PKG_RELEASE:=1
PKG_SOURCE_URL:=@SF/minidlna
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
-PKG_HASH:=8d34436580c4c44be25976d5e46bc5b71af69bf441c4492774eac001164c4433
+PKG_HASH:=67388ba23ab0c7033557a32084804f796aa2a796db7bb2b770fb76ac2a742eec
PKG_LICENSE:=GPL-2.0 BSD-3-Clause
PKG_LICENSE_FILES:=COPYING LICENCE.miniupnpd
--- /dev/null
+menu "Configuration"
+ depends on PACKAGE_apache
+
+config APACHE_HTTP2
+ bool
+ prompt "Enable HTTP2"
+ help
+ Enable HTTPS2 support.
+ default n
+
+endmenu
include $(TOPDIR)/rules.mk
PKG_NAME:=apache
-PKG_VERSION:=2.4.27
+PKG_VERSION:=2.4.28
PKG_RELEASE:=1
PKG_SOURCE_NAME:=httpd
PKG_MAINTAINER:=Thomas Heil <heil@terminal-consulting.de>
PKG_SOURCE:=$(PKG_SOURCE_NAME)-$(PKG_VERSION).tar.bz2
PKG_SOURCE_URL:=@APACHE/httpd/
-PKG_HASH:=71fcc128238a690515bd8174d5330a5309161ef314a326ae45c7c15ed139c13a
+PKG_HASH:=c1197a3a62a4ab5c584ab89b249af38cf28b4adee9c0106b62999fd29f920666
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_NAME)-$(PKG_VERSION)
PKG_INSTALL:=1
+PKG_CONFIG_DEPENDS := \
+ CONFIG_APACHE_HTTP2
+
+ADDITIONAL_MODULES:=
+ifeq ($(CONFIG_APACHE_HTTP2),y)
+ ADDITIONAL_MODULES += --enable-http2
+endif
+ifneq ($(CONFIG_APACHE_HTTP2),y)
+ ADDITIONAL_MODULES += --enable-http2=no
+endif
+
include $(INCLUDE_DIR)/package.mk
define Package/apache/Default
Server, it has grown to be the most popular web server on the Internet.
endef
+define Package/apache/config
+ source "$(SOURCE)/Config.in"
+endef
+
define Package/apache
$(call Package/apache/Default)
- DEPENDS:=+libapr +libaprutil +libpcre +libopenssl +unixodbc +zlib
+ DEPENDS:=+libapr +libaprutil +libpcre +libopenssl +unixodbc +zlib +APACHE_HTTP2:libnghttp2
endef
define Package/apache/description
TARGET_CFLAGS += $(FPIC)
TARGET_CPPFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
-TARGET_LDFLAGS += -lpthread
+TARGET_LDFLAGS += -lpthread
define Build/Configure
$(call Build/Configure/Default, \
--with-apr="$(STAGING_DIR)/usr/bin/apr-1-config" \
--with-apr-util="$(STAGING_DIR)/usr/bin/apu-1-config" \
--with-pcre="$(STAGING_DIR)/usr/bin/pcre-config" \
+ $(ADDITIONAL_MODULES) \
--enable-http \
--with-crypto \
--with-sqlit3="$(STAGING_DIR)/usr" \
PKG_NAME:=fwknop
PKG_VERSION:=2.6.9
-PKG_RELEASE:=3
+PKG_RELEASE:=4
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
PKG_SOURCE_URL:=http://www.cipherdyne.org/fwknop/download
config global
# option uci_enabled '1'
+config network
+# option network 'wan' # takes precedence over config.PCAP_INTF
+
config access
option SOURCE 'ANY'
option HMAC_KEY 'CHANGEME'
# Copyright (C) 2009-2014 fwknop developers and contributors. For a full
# list of contributors, see the file 'CREDITS'.
#
-. /lib/functions.sh
+
+USE_PROCD=1
START=95
FWKNOPD_BIN=/usr/sbin/fwknopd
-start()
+start_service()
{
- gen_confs
- if [ $UCI_ENABLED ]; then
- $FWKNOPD_BIN -c /var/etc/fwknopd.conf -a /var/etc/access.conf
- else
- $FWKNOPD_BIN
+ generate_configuration
+
+ procd_open_instance
+ procd_set_param command "$FWKNOPD_BIN" --foreground --syslog-enable
+ procd_set_param respawn
+
+ if [ $UCI_ENABLED -eq 1 ]; then
+ procd_append_param command -c /var/etc/fwknopd.conf
+ procd_append_param command -a /var/etc/access.conf
fi
-}
+ procd_append_param command -i "$DEPEND_IFNAME"
+ procd_set_param netdev "$DEPEND_IFNAME"
-stop()
-{
- $FWKNOPD_BIN -K
+ procd_close_instance
}
-restart()
+service_triggers()
{
- stop;
- sleep 1;
- start;
+ procd_add_reload_trigger "fwknopd"
}
-reload()
+get_bool()
{
- gen_confs
- $FWKNOPD_BIN -R
+ local _tmp="$1"
+ case "$_tmp" in
+ 1|on|true|yes|enabled) _tmp=1;;
+ 0|off|false|no|disabled) _tmp=0;;
+ *) _tmp="$2";;
+ esac
+ echo -n "$_tmp"
}
-gen_confs()
+generate_configuration()
{
[ -f /tmp/access.conf.tmp ] && rm /tmp/access.conf.tmp
- if [ -z "$( uci get fwknopd.@config[0].PCAP_INTF )" ]
- then
- . /lib/functions/network.sh
- network_get_physdev device wan
- uci set fwknopd.@config[0].PCAP_INTF="$device"
- uci commit
- fi
+
+ UCI_ENABLED=0
+ DEPEND_IFNAME=
+ local NETWORK=
+ local PCAP_INTF=
+ local USER_CONFIG_PATH=/etc/fwknop/fwknopd.conf
+ local DEFAULT_UCI_NETWORK=wan
+ local DEFAULT_FWKNOPD_IFNAME=eth0
+
config_cb() {
local type="$1"
local name="$2"
option_cb() {
local option="$1"
local value="$2"
- if [ "$option" = "uci_enabled" ] && [ "$value" -eq 1 ] ; then
+ if [ "$option" = "uci_enabled" ] && [ "$(get_bool "$value" 0)" -eq 1 ] ; then
> /var/etc/fwknopd.conf
> /var/etc/access.conf
chmod 600 /var/etc/fwknopd.conf
UCI_ENABLED=1
fi
}
+ elif [ "$type" = "network" ]; then
+ option_cb() {
+ local option="$1"
+ local value="$2"
+ if [ $UCI_ENABLED -eq 1 ] && [ $option = "network" ]; then
+ NETWORK="$value"
+ fi
+ }
elif [ "$type" = "config" ]; then
option_cb() {
local option="$1"
local value="$2"
- if [ $UCI_ENABLED ]; then
+ if [ $UCI_ENABLED -eq 1 ] && [ $option = "PCAP_INTF" ]; then
+ PCAP_INTF="$value"
+ echo "$option $value" >> /var/etc/fwknopd.conf #writing each option to fwknopd.conf
+ elif [ $UCI_ENABLED -eq 1 ]; then
echo "$option $value" >> /var/etc/fwknopd.conf #writing each option to fwknopd.conf
fi
}
option_cb() {
local option="$1"
local value="$2"
- if [ $UCI_ENABLED ] && [ $option = "SOURCE" ]; then
+ if [ $UCI_ENABLED -eq 1 ] && [ $option = "SOURCE" ]; then
echo "$option $value" >> /var/etc/access.conf #writing each option to access.conf
fi
- if [ $UCI_ENABLED ] && [ $option != "SOURCE" ]; then
+ if [ $UCI_ENABLED -eq 1 ] && [ $option != "SOURCE" ]; then
echo "$option $value" >> /tmp/access.conf.tmp #writing each option to access.conf
fi
}
+ else
+ option_cb() { return; }
+ if [ -z "$type" ]; then
+ # Finalize reading
+ if [ -f /tmp/access.conf.tmp ] ; then
+ cat /tmp/access.conf.tmp >> /var/etc/access.conf
+ rm /tmp/access.conf.tmp
+ fi
+ fi
fi
}
if [ -f /etc/config/fwknopd ]; then
config_load fwknopd
- if [ -f /tmp/access.conf.tmp ] ; then
- cat /tmp/access.conf.tmp >> /var/etc/access.conf
- rm /tmp/access.conf.tmp
- fi
fi
+ if [ $UCI_ENABLED -eq 0 ]; then
+ if [ -f $USER_CONFIG_PATH ] ; then
+ # Scan user configuration for PCAP_INTF settings
+ DEPEND_IFNAME="$( sed -ne '/^\s*PCAP_INTF\s\+/ { s/^\s*PCAP_INTF\s\+//; s/\s\+$//; p; q; }' /etc/fwknop/fwknopd.conf )"
+ if [ -n "$DEPEND_IFNAME" ]; then
+ logger -p daemon.debug -t "fwknopd[----]" "Found fwknopd.conf configuration, using PCAP_INTF interface $DEPEND_IFNAME"
+ else
+ logger -p daemon.info -t "fwknopd[----]" "No PCAP_INTF interface specified in fwknopd.conf, fwknopd's default $DEFAULT_FWKNOPD_IFNAME will be used"
+ DEPEND_IFNAME="$DEFAULT_FWKNOPD_IFNAME"
+ fi
+ else
+ logger -p daemon.error -t "fwknopd[----]" "No $USER_CONFIG_PATH found, not starting"
+ exit 1
+ fi
+ elif [ $UCI_ENABLED -eq 1 ]; then
+ if [ -n "$NETWORK" ] && [ -n "$PCAP_INTF" ]; then
+ logger -p daemon.warn -t "fwknopd[----]" "Specified both network and PCAP_INTF. Ignoring PCAP_INTF"
+ elif [ -z "$NETWORK" ] && [ -z "$PCAP_INTF" ]; then
+ # Fallback - compatibility with old script, which used wan interface by default
+ logger -p daemon.info -t "fwknopd[----]" "Neither network, nor PCAP_INTF interface specified, trying network $DEFAULT_UCI_NETWORK"
+ NETWORK="$DEFAULT_UCI_NETWORK"
+ fi
+
+ if [ -n "$NETWORK" ]; then
+ . /lib/functions/network.sh
+ network_get_physdev DEPEND_IFNAME "$NETWORK"
+ if [ -n "$DEPEND_IFNAME" ]; then
+ logger -p daemon.debug -t "fwknopd[----]" "Resolved network $NETWORK as interface $DEPEND_IFNAME"
+ else
+ logger -p daemon.warn -t "fwknopd[----]" "Cannot find interface for network $NETWORK, fwknopd's default $DEFAULT_FWKNOPD_IFNAME will be used"
+ DEPEND_IFNAME="$DEFAULT_FWKNOPD_IFNAME"
+ fi
+ elif [ -n "$PCAP_INTF" ]; then
+ DEPEND_IFNAME="$PCAP_INTF"
+ logger -p daemon.debug -t "fwknopd[----]" "Using configured PCAP_INTF interface $DEPEND_IFNAME"
+ fi
+ fi
}
include $(TOPDIR)/rules.mk
PKG_NAME:=haproxy
-PKG_VERSION:=1.7.8
-PKG_RELEASE:=18
+PKG_VERSION:=1.7.9
+PKG_RELEASE:=02
PKG_SOURCE:=haproxy-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=http://www.haproxy.org/download/1.7/src/
-PKG_HASH:=ec90153ccedd20ad4015d3eaf76b502ff1f61b431d54c22b8457b5784a9ae142
+PKG_HASH:=1072337e54fa188dc6e0cfe3ba4c2200b07082e321cbfe5a0882d85d54db068e
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
PKG_LICENSE:=GPL-2.0
URL:=http://haproxy.1wt.eu/
endef
-define Download/lua533
- FILE:=lua-5.3.3.tar.gz
+define Download/lua534
+ FILE:=lua-5.3.4.tar.gz
URL:=http://www.lua.org/ftp/
- HASH:=5113c06884f7de453ce57702abaac1d618307f33f6789fa870e87a59d772aca2
+ HASH:=f681aa518233bc407e23acf0f5887c884f17436f000d453b2491a9f11a52400c
endef
define Build/Prepare
$(call Build/Prepare/Default)
- tar -zxvf $(DL_DIR)/lua-5.3.3.tar.gz -C $(PKG_BUILD_DIR)
- ln -s $(PKG_BUILD_DIR)/lua-5.3.3 $(PKG_BUILD_DIR)/lua
+ifeq ($(ENABLE_LUA),y)
+ tar -zxvf $(DL_DIR)/lua-5.3.4.tar.gz -C $(PKG_BUILD_DIR)
+ ln -s $(PKG_BUILD_DIR)/lua-5.3.4 $(PKG_BUILD_DIR)/lua
+endif
endef
define Package/haproxy/Default/conffiles
This package is built without SSL support.
endef
+ENABLE_LUA:=y
+ifeq ($(CONFIG_mips),y)
+ ENABLE_LUA:=n
+endif
+
ifeq ($(CONFIG_avr32),y)
LINUX_TARGET:=linux26
else
ifeq ($(BUILD_VARIANT),ssl)
ADDON+=USE_OPENSSL=1
+ ADDON+=ADDLIB="-lcrypto -lm "
+else ifeq ($(CONFIG_mips),n)
ADDON+=USE_LUA=1
- ADDON+=LUA_LIB_NAME="lua533"
- ADDON+=LUA_INC="$(STAGING_DIR)/lua-5.3.3/include"
- ADDON+=LUA_LIB="$(STAGING_DIR)/lua-5.3.3/lib"
- ADDON+=ADDLIB="-lcrypto -lm "
+ ADDON+=LUA_LIB_NAME="lua534"
+ ADDON+=LUA_INC="$(STAGING_DIR)/lua-5.3.4/include"
+ ADDON+=LUA_LIB="$(STAGING_DIR)/lua-5.3.4/lib"
else
ADDON+=ADDLIB="-lm"
endif
-
-define Build/Compile
+ifeq ($(ENABLE_LUA),y)
+define Build/Compile/lua
$(MAKE) TARGET=$(LINUX_TARGET) -C $(PKG_BUILD_DIR)/lua \
- INSTALL_TOP="$(STAGING_DIR)/lua-5.3.3/" \
+ INSTALL_TOP="$(STAGING_DIR)/lua-5.3.4/" \
CC="$(TARGET_CC)" \
CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS)" \
LDFLAGS="$(TARGET_LDFLAGS) -lncurses -lreadline" \
LD="$(TARGET_LD)" \
linux install
- mv $(STAGING_DIR)/lua-5.3.3/lib/liblua.a $(STAGING_DIR)/lua-5.3.3/lib/liblua533.a
+ mv $(STAGING_DIR)/lua-5.3.4/lib/liblua.a $(STAGING_DIR)/lua-5.3.4/lib/liblua534.a
+endef
+endif
+define Build/Compile
+ $(call Build/Compile/lua)
$(MAKE) TARGET=$(LINUX_TARGET) -C $(PKG_BUILD_DIR) \
DESTDIR="$(PKG_INSTALL_DIR)" \
CC="$(TARGET_CC)" \
Package/haproxy-nossl/install = $(Package/haproxy/install)
-
define Package/halog
MENU:=1
$(call Package/haproxy)
$(INSTALL_BIN) $(PKG_BUILD_DIR)/contrib/halog/halog $(1)/usr/bin/
endef
-$(eval $(call Download,lua533))
+$(eval $(call Download,lua534))
$(eval $(call BuildPackage,haproxy))
$(eval $(call BuildPackage,halog))
$(eval $(call BuildPackage,haproxy-nossl))
-
--- /dev/null
+From 912e8f18ef274fdda0a522b2aa8255bddd00fb7b Mon Sep 17 00:00:00 2001
+From: Willy Tarreau <w@1wt.eu>
+Date: Wed, 30 Aug 2017 07:35:35 +0200
+Subject: [PATCH] BUG/MEDIUM: connection: remove useless flag CO_FL_DATA_RD_SH
+
+This flag is both confusing and wrong. It is supposed to report the
+fact that the data layer has received a shutdown, but in fact this is
+reported by CO_FL_SOCK_RD_SH which is set by the transport layer after
+this condition is detected. The only case where the flag above is set
+is in the stream interface where CF_SHUTR is also set on the receiving
+channel.
+
+In addition, it was checked in the health checks code (while never set)
+and was always test jointly with CO_FL_SOCK_RD_SH everywhere, except in
+conn_data_read0_pending() which incorrectly doesn't match the second
+time it's called and is fortunately protected by an extra check on
+(ic->flags & CF_SHUTR).
+
+This patch gets rid of the flag completely. Now conn_data_read0_pending()
+accurately reports the fact that the transport layer has detected the end
+of the stream, regardless of the fact that this state was already consumed,
+and the stream interface watches ic->flags&CF_SHUTR to know if the channel
+was already closed by the upper layer (which it already used to do).
+
+The now unused conn_data_read0() function was removed.
+(cherry picked from commit 54e917cfa1e7b0539550ae32c48c76da2f169041)
+
+[wt: this happens to fix a real bug which occasionally strikes when
+ using http-reuse in the rare case where a server shuts down after
+ providing its response but before the connection is put back into
+ the idle pool, and it gets immediately recycled for another request,
+ without first passing through the idle handler, and the already
+ reported shutdown is never reported to the second transaction,
+ causing a loop to last for as long as the server timeout]
+---
+ contrib/debug/flags.c | 1 -
+ include/proto/connection.h | 8 +-------
+ include/types/connection.h | 2 +-
+ src/checks.c | 4 ++--
+ src/stream_interface.c | 11 +++++------
+ 5 files changed, 9 insertions(+), 17 deletions(-)
+
+diff --git a/contrib/debug/flags.c b/contrib/debug/flags.c
+index bc71bde9..19327f34 100644
+--- a/contrib/debug/flags.c
++++ b/contrib/debug/flags.c
+@@ -117,7 +117,6 @@ void show_conn_flags(unsigned int f)
+ SHOW_FLAG(f, CO_FL_SOCK_WR_SH);
+ SHOW_FLAG(f, CO_FL_SOCK_RD_SH);
+ SHOW_FLAG(f, CO_FL_DATA_WR_SH);
+- SHOW_FLAG(f, CO_FL_DATA_RD_SH);
+ SHOW_FLAG(f, CO_FL_WAKE_DATA);
+ SHOW_FLAG(f, CO_FL_INIT_DATA);
+ SHOW_FLAG(f, CO_FL_ADDR_TO_SET);
+diff --git a/include/proto/connection.h b/include/proto/connection.h
+index fce60259..eb68322a 100644
+--- a/include/proto/connection.h
++++ b/include/proto/connection.h
+@@ -413,12 +413,6 @@ static inline void conn_sock_read0(struct connection *c)
+ fdtab[c->t.sock.fd].linger_risk = 0;
+ }
+
+-static inline void conn_data_read0(struct connection *c)
+-{
+- c->flags |= CO_FL_DATA_RD_SH;
+- __conn_data_stop_recv(c);
+-}
+-
+ static inline void conn_sock_shutw(struct connection *c)
+ {
+ c->flags |= CO_FL_SOCK_WR_SH;
+@@ -450,7 +444,7 @@ static inline void conn_data_shutw_hard(struct connection *c)
+ /* detect sock->data read0 transition */
+ static inline int conn_data_read0_pending(struct connection *c)
+ {
+- return (c->flags & (CO_FL_DATA_RD_SH | CO_FL_SOCK_RD_SH)) == CO_FL_SOCK_RD_SH;
++ return (c->flags & CO_FL_SOCK_RD_SH) != 0;
+ }
+
+ /* detect data->sock shutw transition */
+diff --git a/include/types/connection.h b/include/types/connection.h
+index 02eac932..90e8e073 100644
+--- a/include/types/connection.h
++++ b/include/types/connection.h
+@@ -90,7 +90,7 @@ enum {
+ CO_FL_WAKE_DATA = 0x00008000, /* wake-up data layer upon activity at the transport layer */
+
+ /* flags used to remember what shutdown have been performed/reported */
+- CO_FL_DATA_RD_SH = 0x00010000, /* DATA layer was notified about shutr/read0 */
++ /* unused : 0x00010000 */
+ CO_FL_DATA_WR_SH = 0x00020000, /* DATA layer asked for shutw */
+ CO_FL_SOCK_RD_SH = 0x00040000, /* SOCK layer was notified about shutr/read0 */
+ CO_FL_SOCK_WR_SH = 0x00080000, /* SOCK layer asked for shutw */
+diff --git a/src/checks.c b/src/checks.c
+index ca3881a5..6c5e3cbc 100644
+--- a/src/checks.c
++++ b/src/checks.c
+@@ -839,7 +839,7 @@ static void event_srv_chk_r(struct connection *conn)
+ done = 0;
+
+ conn->xprt->rcv_buf(conn, check->bi, check->bi->size);
+- if (conn->flags & (CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_DATA_RD_SH)) {
++ if (conn->flags & (CO_FL_ERROR | CO_FL_SOCK_RD_SH)) {
+ done = 1;
+ if ((conn->flags & CO_FL_ERROR) && !check->bi->i) {
+ /* Report network errors only if we got no other data. Otherwise
+@@ -2892,7 +2892,7 @@ static void tcpcheck_main(struct connection *conn)
+ goto out_end_tcpcheck;
+
+ if (conn->xprt->rcv_buf(conn, check->bi, check->bi->size) <= 0) {
+- if (conn->flags & (CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_DATA_RD_SH)) {
++ if (conn->flags & (CO_FL_ERROR | CO_FL_SOCK_RD_SH)) {
+ done = 1;
+ if ((conn->flags & CO_FL_ERROR) && !check->bi->i) {
+ /* Report network errors only if we got no other data. Otherwise
+diff --git a/src/stream_interface.c b/src/stream_interface.c
+index 836487bd..aba49c94 100644
+--- a/src/stream_interface.c
++++ b/src/stream_interface.c
+@@ -1060,14 +1060,14 @@ static void si_conn_recv_cb(struct connection *conn)
+ if (conn->flags & CO_FL_ERROR)
+ return;
+
+- /* stop here if we reached the end of data */
+- if (conn_data_read0_pending(conn))
+- goto out_shutdown_r;
+-
+ /* maybe we were called immediately after an asynchronous shutr */
+ if (ic->flags & CF_SHUTR)
+ return;
+
++ /* stop here if we reached the end of data */
++ if (conn_data_read0_pending(conn))
++ goto out_shutdown_r;
++
+ cur_read = 0;
+
+ if ((ic->flags & (CF_STREAMER | CF_STREAMER_FAST)) && !ic->buf->o &&
+@@ -1153,7 +1153,7 @@ static void si_conn_recv_cb(struct connection *conn)
+ * that if such an event is not handled above in splice, it will be handled here by
+ * recv().
+ */
+- while (!(conn->flags & (CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_DATA_RD_SH | CO_FL_WAIT_ROOM | CO_FL_HANDSHAKE))) {
++ while (!(conn->flags & (CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_WAIT_ROOM | CO_FL_HANDSHAKE)) && !(ic->flags & CF_SHUTR)) {
+ max = channel_recv_max(ic);
+
+ if (!max) {
+@@ -1267,7 +1267,6 @@ static void si_conn_recv_cb(struct connection *conn)
+ if (ic->flags & CF_AUTO_CLOSE)
+ channel_shutw_now(ic);
+ stream_sock_read0(si);
+- conn_data_read0(conn);
+ return;
+ }
+
+--
+2.13.5
+
+++ /dev/null
-From fa73e6b0d5f64eb8a6fd8a1706d7ec03293a943e Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20L=C3=A9caille?= <flecaille@haproxy.com>
-Date: Thu, 13 Jul 2017 09:07:09 +0200
-Subject: [PATCH 01/18] BUG/MINOR: peers: peer synchronization issue (with
- several peers sections).
-
-When several stick-tables were configured with several peers sections,
-only a part of them could be synchronized: the ones attached to the last
-parsed 'peers' section. This was due to the fact that, at least, the peer I/O handler
-refered to the wrong peer section list, in fact always the same: the last one parsed.
-
-The fact that the global peer section list was named "struct peers *peers"
-lead to this issue. This variable name is dangerous ;).
-
-So this patch renames global 'peers' variable to 'cfg_peers' to ensure that
-no such wrong references are still in use, then all the functions wich used
-old 'peers' variable have been modified to refer to the correct peer list.
-
-Must be backported to 1.6 and 1.7.
-(cherry picked from commit ed2b4a6b793d062000518e51ed71e014c649c313)
-
-Signed-off-by: Willy Tarreau <w@1wt.eu>
----
- include/types/peers.h | 2 +-
- src/cfgparse.c | 18 +++++++++---------
- src/haproxy.c | 10 +++++-----
- src/peers.c | 40 ++++++++++++++++++++--------------------
- src/proxy.c | 6 +++---
- 5 files changed, 38 insertions(+), 38 deletions(-)
-
-diff --git a/include/types/peers.h b/include/types/peers.h
-index 105dffb0..a77a0942 100644
---- a/include/types/peers.h
-+++ b/include/types/peers.h
-@@ -91,7 +91,7 @@ struct peers {
- };
-
-
--extern struct peers *peers;
-+extern struct peers *cfg_peers;
-
- #endif /* _TYPES_PEERS_H */
-
-diff --git a/src/cfgparse.c b/src/cfgparse.c
-index 8c0906bf..1b53006b 100644
---- a/src/cfgparse.c
-+++ b/src/cfgparse.c
-@@ -2124,7 +2124,7 @@ int cfg_parse_peers(const char *file, int linenum, char **args, int kwm)
- goto out;
- }
-
-- for (curpeers = peers; curpeers != NULL; curpeers = curpeers->next) {
-+ for (curpeers = cfg_peers; curpeers != NULL; curpeers = curpeers->next) {
- /*
- * If there are two proxies with the same name only following
- * combinations are allowed:
-@@ -2142,8 +2142,8 @@ int cfg_parse_peers(const char *file, int linenum, char **args, int kwm)
- goto out;
- }
-
-- curpeers->next = peers;
-- peers = curpeers;
-+ curpeers->next = cfg_peers;
-+ cfg_peers = curpeers;
- curpeers->conf.file = strdup(file);
- curpeers->conf.line = linenum;
- curpeers->last_change = now.tv_sec;
-@@ -2223,7 +2223,7 @@ int cfg_parse_peers(const char *file, int linenum, char **args, int kwm)
- if (strcmp(newpeer->id, localpeer) == 0) {
- /* Current is local peer, it define a frontend */
- newpeer->local = 1;
-- peers->local = newpeer;
-+ cfg_peers->local = newpeer;
-
- if (!curpeers->peers_fe) {
- if ((curpeers->peers_fe = calloc(1, sizeof(struct proxy))) == NULL) {
-@@ -8189,9 +8189,9 @@ int check_config_validity()
- }
-
- if (curproxy->table.peers.name) {
-- struct peers *curpeers = peers;
-+ struct peers *curpeers;
-
-- for (curpeers = peers; curpeers; curpeers = curpeers->next) {
-+ for (curpeers = cfg_peers; curpeers; curpeers = curpeers->next) {
- if (strcmp(curpeers->id, curproxy->table.peers.name) == 0) {
- free((void *)curproxy->table.peers.name);
- curproxy->table.peers.p = curpeers;
-@@ -9279,15 +9279,15 @@ out_uri_auth_compat:
- if (curproxy->table.peers.p)
- curproxy->table.peers.p->peers_fe->bind_proc |= curproxy->bind_proc;
-
-- if (peers) {
-- struct peers *curpeers = peers, **last;
-+ if (cfg_peers) {
-+ struct peers *curpeers = cfg_peers, **last;
- struct peer *p, *pb;
-
- /* Remove all peers sections which don't have a valid listener,
- * which are not used by any table, or which are bound to more
- * than one process.
- */
-- last = &peers;
-+ last = &cfg_peers;
- while (*last) {
- curpeers = *last;
-
-diff --git a/src/haproxy.c b/src/haproxy.c
-index 6d09aed4..25cea0cd 100644
---- a/src/haproxy.c
-+++ b/src/haproxy.c
-@@ -988,7 +988,7 @@ void init(int argc, char **argv)
- struct peers *pr;
- struct proxy *px;
-
-- for (pr = peers; pr; pr = pr->next)
-+ for (pr = cfg_peers; pr; pr = pr->next)
- if (pr->peers_fe)
- break;
-
-@@ -1217,11 +1217,11 @@ void init(int argc, char **argv)
- if (global.stats_fe)
- global.maxsock += global.stats_fe->maxconn;
-
-- if (peers) {
-+ if (cfg_peers) {
- /* peers also need to bypass global maxconn */
-- struct peers *p = peers;
-+ struct peers *p = cfg_peers;
-
-- for (p = peers; p; p = p->next)
-+ for (p = cfg_peers; p; p = p->next)
- if (p->peers_fe)
- global.maxsock += p->peers_fe->maxconn;
- }
-@@ -2067,7 +2067,7 @@ int main(int argc, char **argv)
- }
-
- /* we might have to unbind some peers sections from some processes */
-- for (curpeers = peers; curpeers; curpeers = curpeers->next) {
-+ for (curpeers = cfg_peers; curpeers; curpeers = curpeers->next) {
- if (!curpeers->peers_fe)
- continue;
-
-diff --git a/src/peers.c b/src/peers.c
-index 543c84c1..5b8a287a 100644
---- a/src/peers.c
-+++ b/src/peers.c
-@@ -171,7 +171,7 @@ enum {
- #define PEER_MINOR_VER 1
- #define PEER_DWNGRD_MINOR_VER 0
-
--struct peers *peers = NULL;
-+struct peers *cfg_peers = NULL;
- static void peer_session_forceshutdown(struct appctx *appctx);
-
- /* This function encode an uint64 to 'dynamic' length format.
-@@ -727,19 +727,19 @@ switchstate:
- /* if current peer is local */
- if (curpeer->local) {
- /* if current host need resyncfrom local and no process assined */
-- if ((peers->flags & PEERS_RESYNC_STATEMASK) == PEERS_RESYNC_FROMLOCAL &&
-- !(peers->flags & PEERS_F_RESYNC_ASSIGN)) {
-+ if ((curpeers->flags & PEERS_RESYNC_STATEMASK) == PEERS_RESYNC_FROMLOCAL &&
-+ !(curpeers->flags & PEERS_F_RESYNC_ASSIGN)) {
- /* assign local peer for a lesson, consider lesson already requested */
- curpeer->flags |= PEER_F_LEARN_ASSIGN;
-- peers->flags |= (PEERS_F_RESYNC_ASSIGN|PEERS_F_RESYNC_PROCESS);
-+ curpeers->flags |= (PEERS_F_RESYNC_ASSIGN|PEERS_F_RESYNC_PROCESS);
- }
-
- }
-- else if ((peers->flags & PEERS_RESYNC_STATEMASK) == PEERS_RESYNC_FROMREMOTE &&
-- !(peers->flags & PEERS_F_RESYNC_ASSIGN)) {
-+ else if ((curpeers->flags & PEERS_RESYNC_STATEMASK) == PEERS_RESYNC_FROMREMOTE &&
-+ !(curpeers->flags & PEERS_F_RESYNC_ASSIGN)) {
- /* assign peer for a lesson */
- curpeer->flags |= PEER_F_LEARN_ASSIGN;
-- peers->flags |= PEERS_F_RESYNC_ASSIGN;
-+ curpeers->flags |= PEERS_F_RESYNC_ASSIGN;
- }
-
-
-@@ -807,7 +807,7 @@ switchstate:
- curpeer->statuscode = atoi(trash.str);
-
- /* Awake main task */
-- task_wakeup(peers->sync_task, TASK_WOKEN_MSG);
-+ task_wakeup(curpeers->sync_task, TASK_WOKEN_MSG);
-
- /* If status code is success */
- if (curpeer->statuscode == PEER_SESS_SC_SUCCESSCODE) {
-@@ -830,14 +830,14 @@ switchstate:
- curpeer->flags |= PEER_F_TEACH_PROCESS;
-
- }
-- else if ((peers->flags & PEERS_RESYNC_STATEMASK) == PEERS_RESYNC_FROMREMOTE &&
-- !(peers->flags & PEERS_F_RESYNC_ASSIGN)) {
-+ else if ((curpeers->flags & PEERS_RESYNC_STATEMASK) == PEERS_RESYNC_FROMREMOTE &&
-+ !(curpeers->flags & PEERS_F_RESYNC_ASSIGN)) {
- /* If peer is remote and resync from remote is needed,
- and no peer currently assigned */
-
- /* assign peer for a lesson */
- curpeer->flags |= PEER_F_LEARN_ASSIGN;
-- peers->flags |= PEERS_F_RESYNC_ASSIGN;
-+ curpeers->flags |= PEERS_F_RESYNC_ASSIGN;
- }
-
- }
-@@ -950,8 +950,8 @@ switchstate:
-
- if (curpeer->flags & PEER_F_LEARN_ASSIGN) {
- curpeer->flags &= ~PEER_F_LEARN_ASSIGN;
-- peers->flags &= ~(PEERS_F_RESYNC_ASSIGN|PEERS_F_RESYNC_PROCESS);
-- peers->flags |= (PEERS_F_RESYNC_LOCAL|PEERS_F_RESYNC_REMOTE);
-+ curpeers->flags &= ~(PEERS_F_RESYNC_ASSIGN|PEERS_F_RESYNC_PROCESS);
-+ curpeers->flags |= (PEERS_F_RESYNC_LOCAL|PEERS_F_RESYNC_REMOTE);
- }
- curpeer->confirm++;
- }
-@@ -959,11 +959,11 @@ switchstate:
-
- if (curpeer->flags & PEER_F_LEARN_ASSIGN) {
- curpeer->flags &= ~PEER_F_LEARN_ASSIGN;
-- peers->flags &= ~(PEERS_F_RESYNC_ASSIGN|PEERS_F_RESYNC_PROCESS);
-+ curpeers->flags &= ~(PEERS_F_RESYNC_ASSIGN|PEERS_F_RESYNC_PROCESS);
-
- curpeer->flags |= PEER_F_LEARN_NOTUP2DATE;
-- peers->resync_timeout = tick_add(now_ms, MS_TO_TICKS(5000));
-- task_wakeup(peers->sync_task, TASK_WOKEN_MSG);
-+ curpeers->resync_timeout = tick_add(now_ms, MS_TO_TICKS(5000));
-+ task_wakeup(curpeers->sync_task, TASK_WOKEN_MSG);
- }
- curpeer->confirm++;
- }
-@@ -1334,8 +1334,8 @@ incomplete:
-
- /* Need to request a resync */
- if ((curpeer->flags & PEER_F_LEARN_ASSIGN) &&
-- (peers->flags & PEERS_F_RESYNC_ASSIGN) &&
-- !(peers->flags & PEERS_F_RESYNC_PROCESS)) {
-+ (curpeers->flags & PEERS_F_RESYNC_ASSIGN) &&
-+ !(curpeers->flags & PEERS_F_RESYNC_PROCESS)) {
- unsigned char msg[2];
-
- /* Current peer was elected to request a resync */
-@@ -1351,7 +1351,7 @@ incomplete:
- appctx->st0 = PEER_SESS_ST_END;
- goto switchstate;
- }
-- peers->flags |= PEERS_F_RESYNC_PROCESS;
-+ curpeers->flags |= PEERS_F_RESYNC_PROCESS;
- }
-
- /* Nothing to read, now we start to write */
-@@ -1624,7 +1624,7 @@ incomplete:
-
- /* Current peer was elected to request a resync */
- msg[0] = PEER_MSG_CLASS_CONTROL;
-- msg[1] = ((peers->flags & PEERS_RESYNC_STATEMASK) == PEERS_RESYNC_FINISHED) ? PEER_MSG_CTRL_RESYNCFINISHED : PEER_MSG_CTRL_RESYNCPARTIAL;
-+ msg[1] = ((curpeers->flags & PEERS_RESYNC_STATEMASK) == PEERS_RESYNC_FINISHED) ? PEER_MSG_CTRL_RESYNCFINISHED : PEER_MSG_CTRL_RESYNCPARTIAL;
- /* process final lesson message */
- repl = bi_putblk(si_ic(si), (char *)msg, sizeof(msg));
- if (repl <= 0) {
-diff --git a/src/proxy.c b/src/proxy.c
-index 78120d9b..bedc7ae0 100644
---- a/src/proxy.c
-+++ b/src/proxy.c
-@@ -1007,7 +1007,7 @@ void soft_stop(void)
- p = p->next;
- }
-
-- prs = peers;
-+ prs = cfg_peers;
- while (prs) {
- if (prs->peers_fe)
- stop_proxy(prs->peers_fe);
-@@ -1142,7 +1142,7 @@ void pause_proxies(void)
- p = p->next;
- }
-
-- prs = peers;
-+ prs = cfg_peers;
- while (prs) {
- if (prs->peers_fe)
- err |= !pause_proxy(prs->peers_fe);
-@@ -1176,7 +1176,7 @@ void resume_proxies(void)
- p = p->next;
- }
-
-- prs = peers;
-+ prs = cfg_peers;
- while (prs) {
- if (prs->peers_fe)
- err |= !resume_proxy(prs->peers_fe);
---
-2.13.0
-
+++ /dev/null
-From bcc483a9edfeb8ab69d1af83886d9e1323cffd06 Mon Sep 17 00:00:00 2001
-From: Thierry FOURNIER <thierry.fournier@ozon.io>
-Date: Wed, 12 Jul 2017 11:18:00 +0200
-Subject: [PATCH 02/18] BUG/MINOR: lua: In error case, the safe mode is not
- removed
-
-Just forgot of reset the safe mode. This have not consequences
-the safe mode just set a pointer on fucntion which is called only
-and initialises a longjmp.
-
-Out of lua execution, this longjmp is never executed and the
-function is never called.
-
-This patch should be backported in 1.6 and 1.7
-(cherry picked from commit 0a97620c080232a21ad7fce2c859a2edc9d7147e)
-
-Signed-off-by: Willy Tarreau <w@1wt.eu>
----
- src/hlua.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/src/hlua.c b/src/hlua.c
-index c862102d..4c1c2d21 100644
---- a/src/hlua.c
-+++ b/src/hlua.c
-@@ -854,6 +854,7 @@ int hlua_ctx_init(struct hlua *lua, struct task *task)
- lua->T = lua_newthread(gL.T);
- if (!lua->T) {
- lua->Tref = LUA_REFNIL;
-+ RESET_SAFE_LJMP(gL.T);
- return 0;
- }
- hlua_sethlua(lua);
---
-2.13.0
-
+++ /dev/null
-From 49d319a677432b69c6a69ef5331ae2ed592075c9 Mon Sep 17 00:00:00 2001
-From: Thierry FOURNIER <thierry.fournier@ozon.io>
-Date: Wed, 12 Jul 2017 13:41:33 +0200
-Subject: [PATCH 03/18] BUG/MINOR: lua: executes the function destroying the
- Lua session in safe mode
-
-When we destroy the Lua session, we manipulates Lua stack,
-so errors can raises. It will be better to catch these errors.
-
-This patch should be backported in 1.6 and 1.7
-(cherry picked from commit 75d0208009c3189b5d10793e08f27dd62a76c3ae)
-
-Signed-off-by: Willy Tarreau <w@1wt.eu>
----
- src/hlua.c | 17 +++++++++++++++--
- 1 file changed, 15 insertions(+), 2 deletions(-)
-
-diff --git a/src/hlua.c b/src/hlua.c
-index 4c1c2d21..2d312804 100644
---- a/src/hlua.c
-+++ b/src/hlua.c
-@@ -876,9 +876,15 @@ void hlua_ctx_destroy(struct hlua *lua)
- /* Purge all the pending signals. */
- hlua_com_purge(lua);
-
-+ if (!SET_SAFE_LJMP(lua->T))
-+ return;
- luaL_unref(lua->T, LUA_REGISTRYINDEX, lua->Mref);
-- luaL_unref(gL.T, LUA_REGISTRYINDEX, lua->Tref);
-+ RESET_SAFE_LJMP(lua->T);
-
-+ if (!SET_SAFE_LJMP(gL.T))
-+ return;
-+ luaL_unref(gL.T, LUA_REGISTRYINDEX, lua->Tref);
-+ RESET_SAFE_LJMP(gL.T);
- /* Forces a garbage collecting process. If the Lua program is finished
- * without error, we run the GC on the thread pointer. Its freed all
- * the unused memory.
-@@ -889,9 +895,16 @@ void hlua_ctx_destroy(struct hlua *lua)
- * the garbage collection.
- */
- if (lua->flags & HLUA_MUST_GC) {
-+ if (!SET_SAFE_LJMP(lua->T))
-+ return;
- lua_gc(lua->T, LUA_GCCOLLECT, 0);
-- if (lua_status(lua->T) != LUA_OK)
-+ RESET_SAFE_LJMP(lua->T);
-+ if (lua_status(lua->T) != LUA_OK) {
-+ if (!SET_SAFE_LJMP(gL.T))
-+ return;
- lua_gc(gL.T, LUA_GCCOLLECT, 0);
-+ RESET_SAFE_LJMP(gL.T);
-+ }
- }
-
- lua->T = NULL;
---
-2.13.0
-
+++ /dev/null
-From 2823f54f706f56304970313cb14a98a4ce20d5ab Mon Sep 17 00:00:00 2001
-From: Thierry FOURNIER <thierry.fournier@ozon.io>
-Date: Sun, 16 Jul 2017 20:48:54 +0200
-Subject: [PATCH 04/18] BUG/MAJOR: lua/socket: resources not detroyed when the
- socket is aborted
-
-In some cases, the socket is misused. The user can open socket and never
-close it, or open the socket and close it without sending data. This
-causes resources leak on all resources associated to the stream (buffer,
-spoe, ...)
-
-This is caused by the stream_shutdown function which is called outside
-of the stream execution process. Sometimes, the shtudown is required
-while the stream is not started, so the cleanup is ignored.
-
-This patch change the shutdown mode of the session. Now if the session is
-no longer used and the Lua want to destroy it, it just set a destroy flag
-and the session kill itself.
-
-This patch should be backported in 1.6 and 1.7
-
-(cherry picked from cmomit b13b20a19aacb039a33f886e38a181b00c9a6d41)
-
-Signed-off-by: Willy Tarreau <w@1wt.eu>
----
- include/types/applet.h | 1 +
- src/hlua.c | 16 ++++++++++++++--
- 2 files changed, 15 insertions(+), 2 deletions(-)
-
-diff --git a/include/types/applet.h b/include/types/applet.h
-index 46b2bc10..aee9167e 100644
---- a/include/types/applet.h
-+++ b/include/types/applet.h
-@@ -122,6 +122,7 @@ struct appctx {
- struct hlua_socket *socket;
- struct list wake_on_read;
- struct list wake_on_write;
-+ int die;
- } hlua;
- struct {
- struct hlua hlua;
-diff --git a/src/hlua.c b/src/hlua.c
-index 2d312804..eb003558 100644
---- a/src/hlua.c
-+++ b/src/hlua.c
-@@ -1544,6 +1544,15 @@ static void hlua_socket_handler(struct appctx *appctx)
- struct stream_interface *si = appctx->owner;
- struct connection *c = objt_conn(si_opposite(si)->end);
-
-+ if (appctx->ctx.hlua.die) {
-+ si_shutw(si);
-+ si_shutr(si);
-+ si_ic(si)->flags |= CF_READ_NULL;
-+ hlua_com_wake(&appctx->ctx.hlua.wake_on_read);
-+ hlua_com_wake(&appctx->ctx.hlua.wake_on_write);
-+ stream_shutdown(si_strm(si), SF_ERR_KILLED);
-+ }
-+
- /* If the connection object is not avalaible, close all the
- * streams and wakeup everithing waiting for.
- */
-@@ -1619,9 +1628,10 @@ __LJMP static int hlua_socket_gc(lua_State *L)
-
- /* Remove all reference between the Lua stack and the coroutine stream. */
- appctx = objt_appctx(socket->s->si[0].end);
-- stream_shutdown(socket->s, SF_ERR_KILLED);
- socket->s = NULL;
- appctx->ctx.hlua.socket = NULL;
-+ appctx->ctx.hlua.die = 1;
-+ appctx_wakeup(appctx);
-
- return 0;
- }
-@@ -1641,10 +1651,11 @@ __LJMP static int hlua_socket_close(lua_State *L)
- return 0;
-
- /* Close the stream and remove the associated stop task. */
-- stream_shutdown(socket->s, SF_ERR_KILLED);
- appctx = objt_appctx(socket->s->si[0].end);
- appctx->ctx.hlua.socket = NULL;
- socket->s = NULL;
-+ appctx->ctx.hlua.die = 1;
-+ appctx_wakeup(appctx);
-
- return 0;
- }
-@@ -2316,6 +2327,7 @@ __LJMP static int hlua_socket_new(lua_State *L)
-
- appctx->ctx.hlua.socket = socket;
- appctx->ctx.hlua.connected = 0;
-+ appctx->ctx.hlua.die = 0;
- LIST_INIT(&appctx->ctx.hlua.wake_on_write);
- LIST_INIT(&appctx->ctx.hlua.wake_on_read);
-
---
-2.13.0
-
+++ /dev/null
-From ea3b479be6cacb399a6541a00b1bdce17b0179d0 Mon Sep 17 00:00:00 2001
-From: Thierry FOURNIER <thierry.fournier@ozon.io>
-Date: Mon, 17 Jul 2017 00:44:40 +0200
-Subject: [PATCH 05/18] BUG/MEDIUM: lua: bad memory access
-
-We cannot perform garbage collection on unreferenced thread.
-This memory is now free and another Lua process can use it for
-other things.
-
-HAProxy is monothread, so this bug doesn't cause crash.
-
-This patch must be backported in 1.6 and 1.7
-(cherry picked from commit 7bd10d58d3aecf7cf1e5ee7df01193e07128a52d)
-
-Signed-off-by: Willy Tarreau <w@1wt.eu>
----
- src/hlua.c | 12 +++---------
- 1 file changed, 3 insertions(+), 9 deletions(-)
-
-diff --git a/src/hlua.c b/src/hlua.c
-index eb003558..a998860e 100644
---- a/src/hlua.c
-+++ b/src/hlua.c
-@@ -895,16 +895,10 @@ void hlua_ctx_destroy(struct hlua *lua)
- * the garbage collection.
- */
- if (lua->flags & HLUA_MUST_GC) {
-- if (!SET_SAFE_LJMP(lua->T))
-+ if (!SET_SAFE_LJMP(gL.T))
- return;
-- lua_gc(lua->T, LUA_GCCOLLECT, 0);
-- RESET_SAFE_LJMP(lua->T);
-- if (lua_status(lua->T) != LUA_OK) {
-- if (!SET_SAFE_LJMP(gL.T))
-- return;
-- lua_gc(gL.T, LUA_GCCOLLECT, 0);
-- RESET_SAFE_LJMP(gL.T);
-- }
-+ lua_gc(gL.T, LUA_GCCOLLECT, 0);
-+ RESET_SAFE_LJMP(gL.T);
- }
-
- lua->T = NULL;
---
-2.13.0
-
+++ /dev/null
-From 20850d19250eb530cab889bb9059a630b3f805a3 Mon Sep 17 00:00:00 2001
-From: Willy Tarreau <w@1wt.eu>
-Date: Tue, 18 Jul 2017 06:56:40 +0200
-Subject: [PATCH 06/18] DOC: update CONTRIBUTING regarding optional parts and
- message format
-
-Make it clear that optional components must not break when disabled,
-that openssl is the only officially supported library and its support
-must not be broken, and that bug fixes must always be detailed.
-(cherry picked from commit 9d84cd602f4adb3954209eb14c94eea9254d1b5b)
-
-Signed-off-by: Willy Tarreau <w@1wt.eu>
----
- CONTRIBUTING | 21 ++++++++++++++++++++-
- 1 file changed, 20 insertions(+), 1 deletion(-)
-
-diff --git a/CONTRIBUTING b/CONTRIBUTING
-index 74a099bc..b2c2b493 100644
---- a/CONTRIBUTING
-+++ b/CONTRIBUTING
-@@ -69,6 +69,16 @@ code :
- Since most of these restrictions are just a matter of coding style, it is
- normally not a problem to comply.
-
-+When modifying some optional subsystem (SSL, Lua, compression, device detection
-+engines), please make sure the code continues to build (and to work) when these
-+features are disabled. Similarly, when modifying the SSL stack, please always
-+ensure that supported OpenSSL versions continue to build and to work, especially
-+if you modify support for alternate libraries. Clean support for the legacy
-+OpenSSL libraries is mandatory, support for its derivatives is a bonus and may
-+occasionally break eventhough a great care is taken. In other words, if you
-+provide a patch for OpenSSL you don't need to test its derivatives, but if you
-+provide a patch for a derivative you also need to test with OpenSSL.
-+
- If your work is very confidential and you can't publicly discuss it, you can
- also mail willy@haproxy.org directly about it, but your mail may be waiting
- several days in the queue before you get a response, if you get a response at
-@@ -441,13 +451,22 @@ do not think about them anymore after a few patches.
- way the subject is built. Please see the section below for more information
- regarding this formatting.
-
-- As a rule of thumb, your patch must never be made only of a subject line,
-+ As a rule of thumb, your patch MUST NEVER be made only of a subject line,
- it *must* contain a description. Even one or two lines, or indicating
- whether a backport is desired or not. It turns out that single-line commits
- are so rare in the Git world that they require special manual (hence
- painful) handling when they are backported, and at least for this reason
- it's important to keep this in mind.
-
-+ Each patch fixing a bug MUST be tagged with "BUG", a severity level, an
-+ indication of the affected subsystem and a brief description of the nature
-+ of the issue in the subject line, and a detailed analysis in the message
-+ body. The explanation of the user-visible impact and the need for
-+ backporting to stable branches or not are MANDATORY. Bug fixes with no
-+ indication will simply be rejected as they are very likely to cause more
-+ harm when nobody is able to tell whether or not the patch needs to be
-+ backported or can be reverted in case of regression.
-+
- 12) Discuss on the mailing list
-
- When submitting changes, please always CC the mailing list address so that
---
-2.13.0
-
+++ /dev/null
-From 8d99949c4c51d95c14fb2b09d18e1cff058f0c17 Mon Sep 17 00:00:00 2001
-From: Willy Tarreau <w@1wt.eu>
-Date: Tue, 18 Jul 2017 06:58:16 +0200
-Subject: [PATCH 07/18] DOC: update the list of OpenSSL versions in the README
-
-1.1.0 is also supported nowadays. Also mention the best effort support
-for derivatives.
-(cherry picked from commit 7ab16868bc6e9d5ef879e1046effa035789835cc)
-
-Signed-off-by: Willy Tarreau <w@1wt.eu>
----
- README | 8 ++++++--
- 1 file changed, 6 insertions(+), 2 deletions(-)
-
-diff --git a/README b/README
-index 839d06ec..8ad70e66 100644
---- a/README
-+++ b/README
-@@ -113,8 +113,12 @@ build fails due to missing symbols such as deflateInit(), then try again with
- Your are strongly encouraged to always use an up-to-date version of OpenSSL, as
- found on https://www.openssl.org/ as vulnerabilities are occasionally found and
- you don't want them on your systems. HAProxy is known to build correctly on all
--currently supported branches (0.9.8, 1.0.0, 1.0.1 and 1.0.2 at the time of
--writing). Branch 1.0.2 is recommended for the richest features.
-+currently supported branches (0.9.8, 1.0.0, 1.0.1, 1.0.2 and 1.1.0 at the time
-+of writing). Branch 1.0.2 is currently recommended for the best combination of
-+features and stability. Asynchronous engines require OpenSSL 1.1.0 though. It's
-+worth mentionning that some OpenSSL derivatives are also reported to work but
-+may occasionally break. Patches to fix them are welcome but please read the
-+CONTRIBUTING file first.
-
- To link OpenSSL statically against haproxy, build OpenSSL with the no-shared
- keyword and install it to a local directory, so your system is not affected :
---
-2.13.0
-
+++ /dev/null
-From 3e21b8d25ad148ef4e6544f28a8b2305f9484a7b Mon Sep 17 00:00:00 2001
-From: Willy Tarreau <w@1wt.eu>
-Date: Wed, 19 Jul 2017 19:05:29 +0200
-Subject: [PATCH 08/18] MINOR: tools: add a portable timegm() alternative
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-timegm() is not provided everywhere and the documentation on how to
-replace it is bogus as it proposes an inefficient and non-thread safe
-alternative.
-
-Here we reimplement everything needed to compute the number of seconds
-since Epoch based on the broken down fields in struct tm. It is only
-guaranteed to return correct values for correct inputs. It was successfully
-tested with all possible 32-bit values of time_t converted to struct tm
-using gmtime() and back to time_t using the legacy timegm() and this
-function, and both functions always produced the same result.
-
-Thanks to Benoît Garnier for an instructive discussion and detailed
-explanations of the various time functions, leading to this solution.
-(cherry picked from commit cb1949b8b30b8db7e05546da2939eff2b5973321)
-
-Signed-off-by: Willy Tarreau <w@1wt.eu>
----
- include/common/standard.h | 21 ++++++++++++++++++
- src/standard.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 75 insertions(+)
-
-diff --git a/include/common/standard.h b/include/common/standard.h
-index 87f90a65..c19c368b 100644
---- a/include/common/standard.h
-+++ b/include/common/standard.h
-@@ -624,6 +624,27 @@ static inline void get_gmtime(const time_t now, struct tm *tm)
- gmtime_r(&now, tm);
- }
-
-+/* Counts a number of elapsed days since 01/01/0000 based solely on elapsed
-+ * years and assuming the regular rule for leap years applies. It's fake but
-+ * serves as a temporary origin. It's worth remembering that it's the first
-+ * year of each period that is leap and not the last one, so for instance year
-+ * 1 sees 366 days since year 0 was leap. For this reason we have to apply
-+ * modular arithmetics which is why we offset the year by 399 before
-+ * subtracting the excess at the end. No overflow here before ~11.7 million
-+ * years.
-+ */
-+static inline unsigned int days_since_zero(unsigned int y)
-+{
-+ return y * 365 + (y + 399) / 4 - (y + 399) / 100 + (y + 399) / 400
-+ - 399 / 4 + 399 / 100;
-+}
-+
-+/* Returns the number of seconds since 01/01/1970 0:0:0 GMT for GMT date <tm>.
-+ * It is meant as a portable replacement for timegm() for use with valid inputs.
-+ * Returns undefined results for invalid dates (eg: months out of range 0..11).
-+ */
-+extern time_t my_timegm(const struct tm *tm);
-+
- /* This function parses a time value optionally followed by a unit suffix among
- * "d", "h", "m", "s", "ms" or "us". It converts the value into the unit
- * expected by the caller. The computation does its best to avoid overflows.
-diff --git a/src/standard.c b/src/standard.c
-index 8df1da6c..e1d414f3 100644
---- a/src/standard.c
-+++ b/src/standard.c
-@@ -2841,6 +2841,60 @@ char *localdate2str_log(char *dst, time_t t, struct tm *tm, size_t size)
- return dst;
- }
-
-+/* Returns the number of seconds since 01/01/1970 0:0:0 GMT for GMT date <tm>.
-+ * It is meant as a portable replacement for timegm() for use with valid inputs.
-+ * Returns undefined results for invalid dates (eg: months out of range 0..11).
-+ */
-+time_t my_timegm(const struct tm *tm)
-+{
-+ /* Each month has 28, 29, 30 or 31 days, or 28+N. The date in the year
-+ * is thus (current month - 1)*28 + cumulated_N[month] to count the
-+ * sum of the extra N days for elapsed months. The sum of all these N
-+ * days doesn't exceed 30 for a complete year (366-12*28) so it fits
-+ * in a 5-bit word. This means that with 60 bits we can represent a
-+ * matrix of all these values at once, which is fast and efficient to
-+ * access. The extra February day for leap years is not counted here.
-+ *
-+ * Jan : none = 0 (0)
-+ * Feb : Jan = 3 (3)
-+ * Mar : Jan..Feb = 3 (3 + 0)
-+ * Apr : Jan..Mar = 6 (3 + 0 + 3)
-+ * May : Jan..Apr = 8 (3 + 0 + 3 + 2)
-+ * Jun : Jan..May = 11 (3 + 0 + 3 + 2 + 3)
-+ * Jul : Jan..Jun = 13 (3 + 0 + 3 + 2 + 3 + 2)
-+ * Aug : Jan..Jul = 16 (3 + 0 + 3 + 2 + 3 + 2 + 3)
-+ * Sep : Jan..Aug = 19 (3 + 0 + 3 + 2 + 3 + 2 + 3 + 3)
-+ * Oct : Jan..Sep = 21 (3 + 0 + 3 + 2 + 3 + 2 + 3 + 3 + 2)
-+ * Nov : Jan..Oct = 24 (3 + 0 + 3 + 2 + 3 + 2 + 3 + 3 + 2 + 3)
-+ * Dec : Jan..Nov = 26 (3 + 0 + 3 + 2 + 3 + 2 + 3 + 3 + 2 + 3 + 2)
-+ */
-+ uint64_t extra =
-+ ( 0ULL << 0*5) + ( 3ULL << 1*5) + ( 3ULL << 2*5) + /* Jan, Feb, Mar, */
-+ ( 6ULL << 3*5) + ( 8ULL << 4*5) + (11ULL << 5*5) + /* Apr, May, Jun, */
-+ (13ULL << 6*5) + (16ULL << 7*5) + (19ULL << 8*5) + /* Jul, Aug, Sep, */
-+ (21ULL << 9*5) + (24ULL << 10*5) + (26ULL << 11*5); /* Oct, Nov, Dec, */
-+
-+ unsigned int y = tm->tm_year + 1900;
-+ unsigned int m = tm->tm_mon;
-+ unsigned long days = 0;
-+
-+ /* days since 1/1/1970 for full years */
-+ days += days_since_zero(y) - days_since_zero(1970);
-+
-+ /* days for full months in the current year */
-+ days += 28 * m + ((extra >> (m * 5)) & 0x1f);
-+
-+ /* count + 1 after March for leap years. A leap year is a year multiple
-+ * of 4, unless it's multiple of 100 without being multiple of 400. 2000
-+ * is leap, 1900 isn't, 1904 is.
-+ */
-+ if ((m > 1) && !(y & 3) && ((y % 100) || !(y % 400)))
-+ days++;
-+
-+ days += tm->tm_mday - 1;
-+ return days * 86400ULL + tm->tm_hour * 3600 + tm->tm_min * 60 + tm->tm_sec;
-+}
-+
- /* This function check a char. It returns true and updates
- * <date> and <len> pointer to the new position if the
- * character is found.
---
-2.13.0
-
+++ /dev/null
-From df1655a6c0e4431317cc66c67693281092a952b0 Mon Sep 17 00:00:00 2001
-From: Willy Tarreau <w@1wt.eu>
-Date: Wed, 19 Jul 2017 19:08:48 +0200
-Subject: [PATCH 09/18] BUILD: lua: replace timegm() with my_timegm() to fix
- build on Solaris 10
-
-Akhnin Nikita reported that Lua doesn't build on Solaris 10 because
-the code uses timegm() to parse a date, which is not provided there.
-The recommended way to implement timegm() is broken in the man page,
-as it is based on a change of the TZ environment variable at run time
-before calling the function (which is obviously not thread safe, and
-terribly inefficient).
-
-Here instead we rely on the new my_timegm() function, it should be
-sufficient for all known use cases.
-(cherry picked from commit abd9bb20b76818c9f461a82b72b10818736ff8b3)
-
-Signed-off-by: Willy Tarreau <w@1wt.eu>
----
- src/hlua_fcn.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/hlua_fcn.c b/src/hlua_fcn.c
-index 58905d7d..fe899a4a 100644
---- a/src/hlua_fcn.c
-+++ b/src/hlua_fcn.c
-@@ -287,7 +287,7 @@ static int hlua_parse_date(lua_State *L, int (*fcn)(const char *, int, struct tm
- * the timezone from the broken-down time, it must be fixed
- * after the conversion.
- */
-- time = timegm(&tm);
-+ time = my_timegm(&tm);
- if (time == -1) {
- lua_pushnil(L);
- return 1;
---
-2.13.0
-
+++ /dev/null
-From e14ec1d816de60b648dd7cb6c55b665f5163156b Mon Sep 17 00:00:00 2001
-From: ben51degrees <ben@51degrees.com>
-Date: Wed, 19 Jul 2017 16:22:04 +0100
-Subject: [PATCH 10/18] DOC: Updated 51Degrees git URL to point to a stable
- version.
-
-The previously documented location doesn't work anymore and must not be
-used. Warning for backports, different branches are in use depending on
-the version (v3.2.10 for 1.7, v3.2.5 for 1.6).
-(cherry picked from commit ac752ff68cd3ac88a7a27ce17daa5c3f0c839694)
-
-Signed-off-by: Willy Tarreau <w@1wt.eu>
----
- doc/51Degrees-device-detection.txt | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/doc/51Degrees-device-detection.txt b/doc/51Degrees-device-detection.txt
-index 1ee912d9..71b2eb76 100644
---- a/doc/51Degrees-device-detection.txt
-+++ b/doc/51Degrees-device-detection.txt
-@@ -14,7 +14,7 @@ headers as configurable parameters.
- In order to enable 51Degrees download the 51Degrees source code from the
- official github repository :
-
-- git clone https://github.com/51Degrees/Device-Detection
-+ git clone https://git.51Degrees.com/Device-Detection.git -b v3.2.10
-
- then run 'make' with USE_51DEGREES and 51DEGREES_SRC set. Both 51DEGREES_INC
- and 51DEGREES_LIB may additionally be used to force specific different paths
---
-2.13.0
-
+++ /dev/null
-From 9304b76fb37a36f6249ec963093d74210bd237f6 Mon Sep 17 00:00:00 2001
-From: Christopher Faulet <cfaulet@haproxy.com>
-Date: Tue, 18 Jul 2017 10:35:55 +0200
-Subject: [PATCH 11/18] BUG/MINOR: http: Set the response error state in
- http_sync_res_state
-
-This is just typo. It may only report a wrong response message state in
-"show errors" on the CLI.
-
-This patch must be backported in 1.7.
-
-(cherry picked from commit a3992e06a6e74142d9784d18d8cb3527fadb64d6)
-Signed-off-by: William Lallemand <wlallemand@haproxy.org>
----
- src/proto_http.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/proto_http.c b/src/proto_http.c
-index 94c8d639..796955f5 100644
---- a/src/proto_http.c
-+++ b/src/proto_http.c
-@@ -5530,7 +5530,7 @@ int http_sync_res_state(struct stream *s)
- goto http_msg_closed;
- }
- else if (chn->flags & CF_SHUTW) {
-- txn->req.err_state = txn->req.msg_state;
-+ txn->rsp.err_state = txn->rsp.msg_state;
- txn->rsp.msg_state = HTTP_MSG_ERROR;
- s->be->be_counters.cli_aborts++;
- if (objt_server(s->target))
---
-2.13.0
-
+++ /dev/null
-From a49007a187ab7fddfcec58e1d9fc8a707e4531c9 Mon Sep 17 00:00:00 2001
-From: Christopher Faulet <cfaulet@haproxy.com>
-Date: Tue, 18 Jul 2017 11:18:46 +0200
-Subject: [PATCH 12/18] MINOR: http: Reorder/rewrite checks in
- http_resync_states
-
-The previous patch removed the forced symmetry of the TUNNEL mode during the
-state synchronization. Here, we take care to remove body analyzer only on the
-channel in TUNNEL mode. In fact, today, this change has no effect because both
-sides are switched in same time. But this way, with some changes, it will be
-possible to keep body analyzer on a side (to finish the states synchronization)
-with the other one in TUNNEL mode.
-
-WARNING: This patch will be used to fix a bug. The fix will be commited in a
-very next commit. So if the fix is backported, this one must be backported too.
-
-(cherry picked from commit f77bb539d4846ab278269b99a3165a5608ca0cf4)
-Signed-off-by: William Lallemand <wlallemand@haproxy.org>
----
- src/proto_http.c | 48 +++++++++++++++++++++++++++++-------------------
- 1 file changed, 29 insertions(+), 19 deletions(-)
-
-diff --git a/src/proto_http.c b/src/proto_http.c
-index 796955f5..aaf9f648 100644
---- a/src/proto_http.c
-+++ b/src/proto_http.c
-@@ -5577,34 +5577,27 @@ int http_resync_states(struct stream *s)
-
- /* OK, both state machines agree on a compatible state.
- * There are a few cases we're interested in :
-- * - HTTP_MSG_TUNNEL on either means we have to disable both analysers
- * - HTTP_MSG_CLOSED on both sides means we've reached the end in both
- * directions, so let's simply disable both analysers.
-- * - HTTP_MSG_CLOSED on the response only means we must abort the
-- * request.
-- * - HTTP_MSG_CLOSED on the request and HTTP_MSG_DONE on the response
-- * with server-close mode means we've completed one request and we
-- * must re-initialize the server connection.
-+ * - HTTP_MSG_CLOSED on the response only or HTTP_MSG_ERROR on either
-+ * means we must abort the request.
-+ * - HTTP_MSG_TUNNEL on either means we have to disable analyser on
-+ * corresponding channel.
-+ * - HTTP_MSG_DONE or HTTP_MSG_CLOSED on the request and HTTP_MSG_DONE
-+ * on the response with server-close mode means we've completed one
-+ * request and we must re-initialize the server connection.
- */
--
-- if (txn->req.msg_state == HTTP_MSG_TUNNEL ||
-- txn->rsp.msg_state == HTTP_MSG_TUNNEL ||
-- (txn->req.msg_state == HTTP_MSG_CLOSED &&
-- txn->rsp.msg_state == HTTP_MSG_CLOSED)) {
-+ if (txn->req.msg_state == HTTP_MSG_CLOSED &&
-+ txn->rsp.msg_state == HTTP_MSG_CLOSED) {
- s->req.analysers &= AN_REQ_FLT_END;
- channel_auto_close(&s->req);
- channel_auto_read(&s->req);
- s->res.analysers &= AN_RES_FLT_END;
- channel_auto_close(&s->res);
- channel_auto_read(&s->res);
-- if (txn->req.msg_state == HTTP_MSG_TUNNEL && HAS_REQ_DATA_FILTERS(s))
-- s->req.analysers |= AN_REQ_FLT_XFER_DATA;
-- if (txn->rsp.msg_state == HTTP_MSG_TUNNEL && HAS_RSP_DATA_FILTERS(s))
-- s->res.analysers |= AN_RES_FLT_XFER_DATA;
-- }
-- else if ((txn->req.msg_state >= HTTP_MSG_DONE &&
-- (txn->rsp.msg_state == HTTP_MSG_CLOSED || (s->res.flags & CF_SHUTW))) ||
-- txn->rsp.msg_state == HTTP_MSG_ERROR ||
-+ }
-+ else if (txn->rsp.msg_state == HTTP_MSG_CLOSED ||
-+ txn->rsp.msg_state == HTTP_MSG_ERROR ||
- txn->req.msg_state == HTTP_MSG_ERROR) {
- s->res.analysers &= AN_RES_FLT_END;
- channel_auto_close(&s->res);
-@@ -5615,6 +5608,23 @@ int http_resync_states(struct stream *s)
- channel_auto_read(&s->req);
- channel_truncate(&s->req);
- }
-+ else if (txn->req.msg_state == HTTP_MSG_TUNNEL ||
-+ txn->rsp.msg_state == HTTP_MSG_TUNNEL) {
-+ if (txn->req.msg_state == HTTP_MSG_TUNNEL) {
-+ s->req.analysers &= AN_REQ_FLT_END;
-+ if (HAS_REQ_DATA_FILTERS(s))
-+ s->req.analysers |= AN_REQ_FLT_XFER_DATA;
-+ }
-+ if (txn->rsp.msg_state == HTTP_MSG_TUNNEL) {
-+ s->res.analysers &= AN_RES_FLT_END;
-+ if (HAS_RSP_DATA_FILTERS(s))
-+ s->res.analysers |= AN_RES_FLT_XFER_DATA;
-+ }
-+ channel_auto_close(&s->req);
-+ channel_auto_read(&s->req);
-+ channel_auto_close(&s->res);
-+ channel_auto_read(&s->res);
-+ }
- else if ((txn->req.msg_state == HTTP_MSG_DONE ||
- txn->req.msg_state == HTTP_MSG_CLOSED) &&
- txn->rsp.msg_state == HTTP_MSG_DONE &&
---
-2.13.0
-
+++ /dev/null
-From 1430a0c0f62fcff4303706f5baf2b544e00fcda3 Mon Sep 17 00:00:00 2001
-From: Christopher Faulet <cfaulet@haproxy.com>
-Date: Tue, 18 Jul 2017 10:48:24 +0200
-Subject: [PATCH 13/18] MINOR: http: Switch requests/responses in TUNNEL mode
- only by checking txn flags
-
-Today, the only way to have a request or a response in HTTP_MSG_TUNNEL state is
-to have the flag TX_CON_WANT_TUN set on the transaction. So this is a symmetric
-state. Both the request and the response are switch in same time in this
-state. This can be done only by checking transaction flags instead of relying on
-the other side state. This is the purpose of this patch.
-
-This way, if for any reason we need to switch only one side in TUNNEL mode, it
-will be possible. And to prepare asymmetric cases, we check channel flags in
-DONE _AND_ TUNNEL states.
-
-WARNING: This patch will be used to fix a bug. The fix will be commited in a
-very next commit. So if the fix is backported, this one must be backported too.
-
-(cherry picked from commit 4be9803914ae7156109c915659aad216e4a3c6c1)
-Signed-off-by: William Lallemand <wlallemand@haproxy.org>
----
- src/proto_http.c | 65 +++++++++++++++++++-------------------------------------
- 1 file changed, 22 insertions(+), 43 deletions(-)
-
-diff --git a/src/proto_http.c b/src/proto_http.c
-index aaf9f648..00a92cdb 100644
---- a/src/proto_http.c
-+++ b/src/proto_http.c
-@@ -5294,7 +5294,7 @@ int http_sync_req_state(struct stream *s)
- unsigned int old_flags = chn->flags;
- unsigned int old_state = txn->req.msg_state;
-
-- if (unlikely(txn->req.msg_state < HTTP_MSG_BODY))
-+ if (unlikely(txn->req.msg_state < HTTP_MSG_DONE))
- return 0;
-
- if (txn->req.msg_state == HTTP_MSG_DONE) {
-@@ -5338,13 +5338,6 @@ int http_sync_req_state(struct stream *s)
- goto wait_other_side;
- }
-
-- if (txn->rsp.msg_state == HTTP_MSG_TUNNEL) {
-- /* if any side switches to tunnel mode, the other one does too */
-- channel_auto_read(chn);
-- txn->req.msg_state = HTTP_MSG_TUNNEL;
-- goto wait_other_side;
-- }
--
- /* When we get here, it means that both the request and the
- * response have finished receiving. Depending on the connection
- * mode, we'll have to wait for the last bytes to leave in either
-@@ -5377,20 +5370,7 @@ int http_sync_req_state(struct stream *s)
- }
- }
-
-- if (chn->flags & (CF_SHUTW|CF_SHUTW_NOW)) {
-- /* if we've just closed an output, let's switch */
-- s->si[1].flags |= SI_FL_NOLINGER; /* we want to close ASAP */
--
-- if (!channel_is_empty(chn)) {
-- txn->req.msg_state = HTTP_MSG_CLOSING;
-- goto http_msg_closing;
-- }
-- else {
-- txn->req.msg_state = HTTP_MSG_CLOSED;
-- goto http_msg_closed;
-- }
-- }
-- goto wait_other_side;
-+ goto check_channel_flags;
- }
-
- if (txn->req.msg_state == HTTP_MSG_CLOSING) {
-@@ -5419,6 +5399,16 @@ int http_sync_req_state(struct stream *s)
- goto wait_other_side;
- }
-
-+ check_channel_flags:
-+ /* Here, we are in HTTP_MSG_DONE or HTTP_MSG_TUNNEL */
-+ if (chn->flags & (CF_SHUTW|CF_SHUTW_NOW)) {
-+ /* if we've just closed an output, let's switch */
-+ s->si[1].flags |= SI_FL_NOLINGER; /* we want to close ASAP */
-+ txn->req.msg_state = HTTP_MSG_CLOSING;
-+ goto http_msg_closing;
-+ }
-+
-+
- wait_other_side:
- return txn->req.msg_state != old_state || chn->flags != old_flags;
- }
-@@ -5438,7 +5428,7 @@ int http_sync_res_state(struct stream *s)
- unsigned int old_flags = chn->flags;
- unsigned int old_state = txn->rsp.msg_state;
-
-- if (unlikely(txn->rsp.msg_state < HTTP_MSG_BODY))
-+ if (unlikely(txn->rsp.msg_state < HTTP_MSG_DONE))
- return 0;
-
- if (txn->rsp.msg_state == HTTP_MSG_DONE) {
-@@ -5461,14 +5451,6 @@ int http_sync_res_state(struct stream *s)
- goto wait_other_side;
- }
-
-- if (txn->req.msg_state == HTTP_MSG_TUNNEL) {
-- /* if any side switches to tunnel mode, the other one does too */
-- channel_auto_read(chn);
-- txn->rsp.msg_state = HTTP_MSG_TUNNEL;
-- chn->flags |= CF_NEVER_WAIT;
-- goto wait_other_side;
-- }
--
- /* When we get here, it means that both the request and the
- * response have finished receiving. Depending on the connection
- * mode, we'll have to wait for the last bytes to leave in either
-@@ -5506,18 +5488,7 @@ int http_sync_res_state(struct stream *s)
- txn->rsp.msg_state = HTTP_MSG_TUNNEL;
- }
-
-- if (chn->flags & (CF_SHUTW|CF_SHUTW_NOW)) {
-- /* if we've just closed an output, let's switch */
-- if (!channel_is_empty(chn)) {
-- txn->rsp.msg_state = HTTP_MSG_CLOSING;
-- goto http_msg_closing;
-- }
-- else {
-- txn->rsp.msg_state = HTTP_MSG_CLOSED;
-- goto http_msg_closed;
-- }
-- }
-- goto wait_other_side;
-+ goto check_channel_flags;
- }
-
- if (txn->rsp.msg_state == HTTP_MSG_CLOSING) {
-@@ -5548,6 +5519,14 @@ int http_sync_res_state(struct stream *s)
- goto wait_other_side;
- }
-
-+ check_channel_flags:
-+ /* Here, we are in HTTP_MSG_DONE or HTTP_MSG_TUNNEL */
-+ if (chn->flags & (CF_SHUTW|CF_SHUTW_NOW)) {
-+ /* if we've just closed an output, let's switch */
-+ txn->rsp.msg_state = HTTP_MSG_CLOSING;
-+ goto http_msg_closing;
-+ }
-+
- wait_other_side:
- /* We force the response to leave immediately if we're waiting for the
- * other side, since there is no pending shutdown to push it out.
---
-2.13.0
-
+++ /dev/null
-From f82344c1cf20afcf77e8c3df8f9d341d659da93b Mon Sep 17 00:00:00 2001
-From: Christopher Faulet <cfaulet@haproxy.com>
-Date: Tue, 18 Jul 2017 11:42:08 +0200
-Subject: [PATCH 14/18] BUG/MEDIUM: http: Switch HTTP responses in TUNNEL mode
- when body length is undefined
-
-When the body length of a HTTP response is undefined, the HTTP parser is blocked
-in the body parsing. Before HAProxy 1.7, in this case, because
-AN_RES_HTTP_XFER_BODY is never set, there is no visible effect. When the server
-closes its connection to terminate the response, HAProxy catches it as a normal
-closure. Since 1.7, we always set this analyzer to enter at least once in
-http_response_forward_body. But, in the present case, when the server connection
-is closed, http_response_forward_body is called one time too many. The response
-is correctly sent to the client, but an error is catched and logged with "SD--"
-flags.
-
-To reproduce the bug, you can use the configuration "tests/test-fsm.cfg". The
-tests 3 and 21 hit the bug.
-
-Idea to fix the bug is to switch the response in TUNNEL mode without switching
-the request. This is possible because of previous patches.
-
-First, we need to detect responses with undefined body length during states
-synchronization. Excluding tunnelled transactions, when the response length is
-undefined, TX_CON_WANT_CLO is always set on the transaction. So, when states are
-synchronized, if TX_CON_WANT_CLO is set, the response is switched in TUNNEL mode
-and the request remains unchanged.
-
-Then, in http_msg_forward_body, we add a specific check to switch the response
-in DONE mode if the body length is undefined and if there is no data filter.
-
-This patch depends on following previous commits:
-
- * MINOR: http: Switch requests/responses in TUNNEL mode only by checking txn flags
- * MINOR: http: Reorder/rewrite checks in http_resync_states
-
-This patch must be backported in 1.7 with 2 previous ones.
-
-(cherry picked from commit 1486b0ab6de744e14ae684af105951345534f9ec)
-Signed-off-by: William Lallemand <wlallemand@haproxy.org>
----
- src/proto_http.c | 37 +++++++++++++++++++++++++------------
- 1 file changed, 25 insertions(+), 12 deletions(-)
-
-diff --git a/src/proto_http.c b/src/proto_http.c
-index 00a92cdb..e776e4d5 100644
---- a/src/proto_http.c
-+++ b/src/proto_http.c
-@@ -5354,7 +5354,16 @@ int http_sync_req_state(struct stream *s)
- * let's enforce it now that we're not expecting any new
- * data to come. The caller knows the stream is complete
- * once both states are CLOSED.
-+ *
-+ * However, there is an exception if the response
-+ * length is undefined. In this case, we need to wait
-+ * the close from the server. The response will be
-+ * switched in TUNNEL mode until the end.
- */
-+ if (!(txn->rsp.flags & HTTP_MSGF_XFER_LEN) &&
-+ txn->rsp.msg_state != HTTP_MSG_CLOSED)
-+ goto check_channel_flags;
-+
- if (!(chn->flags & (CF_SHUTW|CF_SHUTW_NOW))) {
- channel_shutr_now(chn);
- channel_shutw_now(chn);
-@@ -5471,8 +5480,16 @@ int http_sync_res_state(struct stream *s)
- * let's enforce it now that we're not expecting any new
- * data to come. The caller knows the stream is complete
- * once both states are CLOSED.
-+ *
-+ * However, there is an exception if the response length
-+ * is undefined. In this case, we switch in TUNNEL mode.
- */
-- if (!(chn->flags & (CF_SHUTW|CF_SHUTW_NOW))) {
-+ if (!(txn->rsp.flags & HTTP_MSGF_XFER_LEN)) {
-+ channel_auto_read(chn);
-+ txn->rsp.msg_state = HTTP_MSG_TUNNEL;
-+ chn->flags |= CF_NEVER_WAIT;
-+ }
-+ else if (!(chn->flags & (CF_SHUTW|CF_SHUTW_NOW))) {
- channel_shutr_now(chn);
- channel_shutw_now(chn);
- }
-@@ -6952,14 +6969,6 @@ int http_response_forward_body(struct stream *s, struct channel *res, int an_bit
- if ((msg->flags & HTTP_MSGF_TE_CHNK) || (msg->flags & HTTP_MSGF_COMPRESSING))
- res->flags |= CF_EXPECT_MORE;
-
-- /* If there is neither content-length, nor transfer-encoding header
-- * _AND_ there is no data filtering, we can safely forward all data
-- * indefinitely. */
-- if (!(msg->flags & HTTP_MSGF_XFER_LEN) && !HAS_DATA_FILTERS(s, res)) {
-- buffer_flush(res->buf);
-- channel_forward_forever(res);
-- }
--
- /* the stream handler will take care of timeouts and errors */
- return 0;
-
-@@ -7036,9 +7045,13 @@ http_msg_forward_body(struct stream *s, struct http_msg *msg)
- goto missing_data_or_waiting;
- }
-
-- /* The server still sending data that should be filtered */
-- if (!(msg->flags & HTTP_MSGF_XFER_LEN) && !(chn->flags & CF_SHUTR))
-- goto missing_data_or_waiting;
-+ /* This check can only be true for a response. HTTP_MSGF_XFER_LEN is
-+ * always set for a request. */
-+ if (!(msg->flags & HTTP_MSGF_XFER_LEN)) {
-+ /* The server still sending data that should be filtered */
-+ if (!(chn->flags & CF_SHUTR) && HAS_DATA_FILTERS(s, chn))
-+ goto missing_data_or_waiting;
-+ }
-
- msg->msg_state = HTTP_MSG_ENDING;
-
---
-2.13.0
-
+++ /dev/null
-From af9b52e92be8ca6a07f9156dcb0b08dd2ad8db75 Mon Sep 17 00:00:00 2001
-From: Christopher Faulet <cfaulet@haproxy.com>
-Date: Thu, 20 Jul 2017 11:05:10 +0200
-Subject: [PATCH 15/18] BUG/MAJOR: http: Fix possible infinity loop in
- http_sync_(req|res)_state
-
-In commit "MINOR: http: Switch requests/responses in TUNNEL mode only by
-checking txn flags", it is possible to have an infinite loop on HTTP_MSG_CLOSING
-state.
-
-(cherry picked from commit 56d260916f61e48c8b2f1fd2f9431afac776d160)
-Signed-off-by: William Lallemand <wlallemand@haproxy.org>
----
- src/proto_http.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/src/proto_http.c b/src/proto_http.c
-index e776e4d5..4a030013 100644
---- a/src/proto_http.c
-+++ b/src/proto_http.c
-@@ -5394,8 +5394,8 @@ int http_sync_req_state(struct stream *s)
- else if (chn->flags & CF_SHUTW) {
- txn->req.err_state = txn->req.msg_state;
- txn->req.msg_state = HTTP_MSG_ERROR;
-- goto wait_other_side;
- }
-+ goto wait_other_side;
- }
-
- if (txn->req.msg_state == HTTP_MSG_CLOSED) {
-@@ -5523,8 +5523,8 @@ int http_sync_res_state(struct stream *s)
- s->be->be_counters.cli_aborts++;
- if (objt_server(s->target))
- objt_server(s->target)->counters.cli_aborts++;
-- goto wait_other_side;
- }
-+ goto wait_other_side;
- }
-
- if (txn->rsp.msg_state == HTTP_MSG_CLOSED) {
---
-2.13.0
-
+++ /dev/null
-From c00347899e9f0c3420f98c53eab1469644e28e06 Mon Sep 17 00:00:00 2001
-From: Nenad Merdanovic <nmerdan@haproxy.com>
-Date: Sun, 23 Jul 2017 22:04:58 -0400
-Subject: [PATCH 16/18] BUG/MINOR: lua: Fix Server.get_addr() port values
-
-The get_addr() method of the Lua Server class was using the
-'sockaddr_storage addr' member to get the port value. HAProxy does not
-store ports in this member as it uses a separate member, called
-'svc_port'.
-
-This fix should be backported to 1.7.
-
-(cherry picked from commit 3849473828f319829aff422d2fbbce0823e65d64)
-Signed-off-by: William Lallemand <wlallemand@haproxy.org>
----
- src/hlua_fcn.c | 6 ++----
- 1 file changed, 2 insertions(+), 4 deletions(-)
-
-diff --git a/src/hlua_fcn.c b/src/hlua_fcn.c
-index fe899a4a..0752220e 100644
---- a/src/hlua_fcn.c
-+++ b/src/hlua_fcn.c
-@@ -545,8 +545,7 @@ int hlua_server_get_addr(lua_State *L)
- addr, INET_ADDRSTRLEN);
- luaL_addstring(&b, addr);
- luaL_addstring(&b, ":");
-- snprintf(addr, INET_ADDRSTRLEN, "%d",
-- ntohs(((struct sockaddr_in *)&srv->addr)->sin_port));
-+ snprintf(addr, INET_ADDRSTRLEN, "%d", srv->svc_port);
- luaL_addstring(&b, addr);
- break;
- case AF_INET6:
-@@ -554,8 +553,7 @@ int hlua_server_get_addr(lua_State *L)
- addr, INET_ADDRSTRLEN);
- luaL_addstring(&b, addr);
- luaL_addstring(&b, ":");
-- snprintf(addr, INET_ADDRSTRLEN, "%d",
-- ntohs(((struct sockaddr_in6 *)&srv->addr)->sin6_port));
-+ snprintf(addr, INET_ADDRSTRLEN, "%d", srv->svc_port);
- luaL_addstring(&b, addr);
- break;
- case AF_UNIX:
---
-2.13.0
-
+++ /dev/null
-From e79fe9bc0ae363e91555f1ba64889e2ddf475b8e Mon Sep 17 00:00:00 2001
-From: Nenad Merdanovic <nmerdan@haproxy.com>
-Date: Sun, 23 Jul 2017 22:04:59 -0400
-Subject: [PATCH 17/18] BUG/MINOR: lua: Correctly use INET6_ADDRSTRLEN in
- Server.get_addr()
-
-The get_addr() method of the Lua Server class incorrectly used
-INET_ADDRSTRLEN for IPv6 addresses resulting in failing to convert
-longer IPv6 addresses to strings.
-
-This fix should be backported to 1.7.
-
-(cherry picked from commit a9f040453acc09e888c3f2dc983f15dcf3fa66e3)
-Signed-off-by: William Lallemand <wlallemand@haproxy.org>
----
- src/hlua_fcn.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/hlua_fcn.c b/src/hlua_fcn.c
-index 0752220e..f8b9b5ec 100644
---- a/src/hlua_fcn.c
-+++ b/src/hlua_fcn.c
-@@ -550,7 +550,7 @@ int hlua_server_get_addr(lua_State *L)
- break;
- case AF_INET6:
- inet_ntop(AF_INET6, &((struct sockaddr_in6 *)&srv->addr)->sin6_addr,
-- addr, INET_ADDRSTRLEN);
-+ addr, INET6_ADDRSTRLEN);
- luaL_addstring(&b, addr);
- luaL_addstring(&b, ":");
- snprintf(addr, INET_ADDRSTRLEN, "%d", srv->svc_port);
---
-2.13.0
-
+++ /dev/null
-From dd18f945c26fc30872a52c66b06b5a0a86b10060 Mon Sep 17 00:00:00 2001
-From: Willy Tarreau <w@1wt.eu>
-Date: Mon, 24 Jul 2017 17:35:27 +0200
-Subject: [PATCH 18/18] BUG/MINOR: lua: always detach the tcp/http tasks before
- freeing them
-
-In hlua_{http,tcp}_applet_release(), a call to task_free() is performed
-to release the task, but no task_delete() is made on these tasks. Till
-now it wasn't much of a problem because this was normally not done with
-the task in the run queue, and the task was never put into the wait queue
-since it doesn't have any timer. But with threading it will become an
-issue. And not having this already prevents another bug from being fixed.
-
-Thanks to Christopher for spotting this one. A backport to 1.7 and 1.6 is
-preferred for safety.
-
-(cherry picked from commit bd7fc95edbce821f1d7b745a7b75deef4d6b1e27)
-Signed-off-by: William Lallemand <wlallemand@haproxy.org>
----
- src/hlua.c | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/src/hlua.c b/src/hlua.c
-index a998860e..67b9458c 100644
---- a/src/hlua.c
-+++ b/src/hlua.c
-@@ -5948,6 +5948,7 @@ error:
-
- static void hlua_applet_tcp_release(struct appctx *ctx)
- {
-+ task_delete(ctx->ctx.hlua_apptcp.task);
- task_free(ctx->ctx.hlua_apptcp.task);
- ctx->ctx.hlua_apptcp.task = NULL;
- hlua_ctx_destroy(&ctx->ctx.hlua_apptcp.hlua);
-@@ -6226,6 +6227,7 @@ error:
-
- static void hlua_applet_http_release(struct appctx *ctx)
- {
-+ task_delete(ctx->ctx.hlua_apphttp.task);
- task_free(ctx->ctx.hlua_apphttp.task);
- ctx->ctx.hlua_apphttp.task = NULL;
- hlua_ctx_destroy(&ctx->ctx.hlua_apphttp.hlua);
---
-2.13.0
-
include $(TOPDIR)/rules.mk
PKG_NAME:=memcached
-PKG_VERSION:=1.5.1
+PKG_VERSION:=1.5.2
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=http://memcached.org/files
-PKG_HASH:=a87908936b51d1bd3ef10a2347eef5647f003b63407a5d8161fa7928b1cd6b5c
+PKG_HASH:=9ac93113bdb5d037e79c61277386564ac2e5e31d49e594f11e554e4c149b7245
PKG_MAINTAINER:=Thomas Heil <heil@terminal-consulting.de>
PKG_LICENSE:=GPLv3
PKG_MAINTAINER:=Steven Hessing <steven.hessing@gmail.com>
-PKG_SOURCE_VERSION:=0.5.2
+PKG_SOURCE_VERSION:=0.5.3
PKG_SOURCE_URL:=https://github.com/noddos/noddos/releases/download/v$(PKG_SOURCE_VERSION)/
PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.xz
-PKG_HASH:=63fe85fc4a588da2d71b7b7db68f1c80ba19520467a3800bdb43bc516a6cff72
+PKG_HASH:=a7f66d6eea17eb6bbd79470ae6f1d97d474c659b8b8259bf0027cae6b4cf8b04
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)-$(PKG_SOURCE_VERSION)
include $(TOPDIR)/rules.mk
PKG_NAME:=tcpreplay
-PKG_VERSION:=4.2.3
+PKG_VERSION:=4.2.5
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://github.com/appneta/tcpreplay/releases/download/v$(PKG_VERSION)
-PKG_HASH:=68d8d49dab5bf58b2e8d244eee1ee7f2379d967da19fe97dd9d59bcf40a22abc
+PKG_HASH:=941026be34e1db5101d3d22ebddd6fff76179a1ee81e273338f533ba4eca89d7
PKG_LICENSE:=GPL-3.0
PKG_LICENSE_FILES:=docs/LICENSE
include $(TOPDIR)/rules.mk
PKG_NAME:=pulseaudio
-PKG_VERSION:=11.0
-PKG_RELEASE:=2
+PKG_VERSION:=11.1
+PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
-PKG_SOURCE_URL:=http://freedesktop.org/software/pulseaudio/releases/
-PKG_HASH:=072305d4018fc5e75bb1b45ee6b938fa52fc9fd27493bf327415ef89ed14c969
+PKG_SOURCE_URL:=https://freedesktop.org/software/pulseaudio/releases/
+PKG_HASH:=f2521c525a77166189e3cb9169f75c2ee2b82fa3fcf9476024fbc2c3a6c9cd9e
PKG_LICENSE:=LGPL-2.1+
PKG_LICENSE_FILES:=GPL LICENSE
include $(TOPDIR)/rules.mk
PKG_NAME:=acpid
-PKG_VERSION:=2.0.27
+PKG_VERSION:=2.0.28
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
PKG_SOURCE_URL:=@SF/acpid2
-PKG_HASH:=820c223e53cc11d9d7229fb1ffc2c2205f1054082c80f83f5a4ec4df16d3a616
+PKG_HASH:=980c3a54b0d3f2fd49fd845a0584c5c2abeaab9e9ac09fcbb68686bbb57a7110
PKG_MAINTAINER:=Thomas Heil <heil@terminal-consulting.de>
PKG_LICENSE:=GPL-2.0
PKG_LICENSE_FILES:=COPYING
include $(TOPDIR)/rules.mk
-BASE_VERSION:=4.3
+BASE_VERSION:=4.4
PKG_NAME:=bash
-PKG_VERSION:=$(BASE_VERSION).42
+PKG_VERSION:=$(BASE_VERSION).12
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(BASE_VERSION).tar.gz
PKG_SOURCE_URL:=@GNU/bash
-PKG_HASH:=afc687a28e0e24dc21b988fa159ff9dbcf6b7caa92ade8645cc6d5605cd024d4
+PKG_HASH:=d86b3392c1202e8ff5a423b302e6284db7f8f435ea9f39b5b1b20fd3ac36dfcb
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BASE_VERSION)
PKG_LICENSE:=GPL-3.0+
---- a/execute_cmd.c
-+++ b/execute_cmd.c
-@@ -2369,7 +2369,11 @@ execute_pipeline (command, asynchronous,
+Index: bash-4.4/execute_cmd.c
+===================================================================
+--- bash-4.4.orig/execute_cmd.c
++++ bash-4.4/execute_cmd.c
+@@ -2459,7 +2459,11 @@ execute_pipeline (command, asynchronous,
/* If the `lastpipe' option is set with shopt, and job control is not
enabled, execute the last element of non-async pipelines in the
current shell environment. */
---- a/configure
-+++ b/configure
-@@ -5430,8 +5430,7 @@ if test $opt_readline = yes; then
+Index: bash-4.4/configure
+===================================================================
+--- bash-4.4.orig/configure
++++ bash-4.4/configure
+@@ -5420,8 +5420,7 @@ if test $opt_readline = yes; then
# static version specified as -llibname to override the
# dynamic version
case "${host_os}" in
esac
fi
else
---- a/configure.ac
-+++ b/configure.ac
-@@ -578,8 +578,7 @@ if test $opt_readline = yes; then
+Index: bash-4.4/configure.ac
+===================================================================
+--- bash-4.4.orig/configure.ac
++++ bash-4.4/configure.ac
+@@ -573,8 +573,7 @@ if test $opt_readline = yes; then
# static version specified as -llibname to override the
# dynamic version
case "${host_os}" in
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-001
-
-Bug-Reported-by: NBaH <nbah@sfr.fr>
-Bug-Reference-ID: <ler0b5$iu9$1@speranza.aioe.org>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-02/msg00092.html
-
-Bug-Description:
-
-A missing check for a valid option prevented `test -R' from working. There
-is another problem that causes bash to look up the wrong variable name when
-processing the argument to `test -R'.
-
-Patch (apply with `patch -p0'):
-
---- a/test.c
-+++ b/test.c
-@@ -646,8 +646,8 @@ unary_test (op, arg)
- return (v && invisible_p (v) == 0 && var_isset (v) ? TRUE : FALSE);
-
- case 'R':
-- v = find_variable (arg);
-- return (v && invisible_p (v) == 0 && var_isset (v) && nameref_p (v) ? TRUE : FALSE);
-+ v = find_variable_noref (arg);
-+ return ((v && invisible_p (v) == 0 && var_isset (v) && nameref_p (v)) ? TRUE : FALSE);
- }
-
- /* We can't actually get here, but this shuts up gcc. */
-@@ -723,6 +723,7 @@ test_unop (op)
- case 'o': case 'p': case 'r': case 's': case 't':
- case 'u': case 'v': case 'w': case 'x': case 'z':
- case 'G': case 'L': case 'O': case 'S': case 'N':
-+ case 'R':
- return (1);
- }
-
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 0
-+#define PATCHLEVEL 1
-
- #endif /* _PATCHLEVEL_H_ */
--- /dev/null
+Index: bash-4.4/lib/readline/history.c
+===================================================================
+--- bash-4.4.orig/lib/readline/history.c
++++ bash-4.4/lib/readline/history.c
+@@ -57,6 +57,8 @@ extern int errno;
+ /* How big to make the_history when we first allocate it. */
+ #define DEFAULT_HISTORY_INITIAL_SIZE 502
+
++#define MAX_HISTORY_INITIAL_SIZE 8192
++
+ /* The number of slots to increase the_history by. */
+ #define DEFAULT_HISTORY_GROW_SIZE 50
+
+@@ -307,7 +309,9 @@ add_history (string)
+ if (history_size == 0)
+ {
+ if (history_stifled && history_max_entries > 0)
+- history_size = history_max_entries + 2;
++ history_size = (history_max_entries > MAX_HISTORY_INITIAL_SIZE)
++ ? MAX_HISTORY_INITIAL_SIZE
++ : history_max_entries + 2;
+ else
+ history_size = DEFAULT_HISTORY_INITIAL_SIZE;
+ the_history = (HIST_ENTRY **)xmalloc (history_size * sizeof (HIST_ENTRY *));
+Index: bash-4.4/patchlevel.h
+===================================================================
+--- bash-4.4.orig/patchlevel.h
++++ bash-4.4/patchlevel.h
+@@ -25,6 +25,6 @@
+ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
+ looks for to find the patch level (for the sccs version string). */
+
+-#define PATCHLEVEL 0
++#define PATCHLEVEL 1
+
+ #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-002
-
-Bug-Reported-by: Moe Tunes <moetunes42@gmail.com>
-Bug-Reference-ID: <53103F49.3070100@gmail.com>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-02/msg00086.html
-
-Bug-Description:
-
-A change to save state while running the DEBUG trap caused pipelines to hang
-on systems which need process group synchronization while building pipelines.
-
-Patch (apply with `patch -p0'):
-
---- a/trap.c
-+++ b/trap.c
-@@ -920,7 +920,8 @@ _run_trap_internal (sig, tag)
- subst_assign_varlist = 0;
-
- #if defined (JOB_CONTROL)
-- save_pipeline (1); /* XXX only provides one save level */
-+ if (sig != DEBUG_TRAP) /* run_debug_trap does this */
-+ save_pipeline (1); /* XXX only provides one save level */
- #endif
-
- /* If we're in a function, make sure return longjmps come here, too. */
-@@ -940,7 +941,8 @@ _run_trap_internal (sig, tag)
- trap_exit_value = last_command_exit_value;
-
- #if defined (JOB_CONTROL)
-- restore_pipeline (1);
-+ if (sig != DEBUG_TRAP) /* run_debug_trap does this */
-+ restore_pipeline (1);
- #endif
-
- subst_assign_varlist = save_subst_varlist;
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 1
-+#define PATCHLEVEL 2
-
- #endif /* _PATCHLEVEL_H_ */
--- /dev/null
+Index: bash-4.4/patchlevel.h
+===================================================================
+--- bash-4.4.orig/patchlevel.h
++++ bash-4.4/patchlevel.h
+@@ -25,6 +25,6 @@
+ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
+ looks for to find the patch level (for the sccs version string). */
+
+-#define PATCHLEVEL 1
++#define PATCHLEVEL 2
+
+ #endif /* _PATCHLEVEL_H_ */
+Index: bash-4.4/subst.c
+===================================================================
+--- bash-4.4.orig/subst.c
++++ bash-4.4/subst.c
+@@ -5931,6 +5931,7 @@ read_comsub (fd, quoted, rflag)
+ char *istring, buf[128], *bufp, *s;
+ int istring_index, istring_size, c, tflag, skip_ctlesc, skip_ctlnul;
+ ssize_t bufn;
++ int nullbyte;
+
+ istring = (char *)NULL;
+ istring_index = istring_size = bufn = tflag = 0;
+@@ -5938,6 +5939,8 @@ read_comsub (fd, quoted, rflag)
+ for (skip_ctlesc = skip_ctlnul = 0, s = ifs_value; s && *s; s++)
+ skip_ctlesc |= *s == CTLESC, skip_ctlnul |= *s == CTLNUL;
+
++ nullbyte = 0;
++
+ /* Read the output of the command through the pipe. This may need to be
+ changed to understand multibyte characters in the future. */
+ while (1)
+@@ -5956,7 +5959,11 @@ read_comsub (fd, quoted, rflag)
+ if (c == 0)
+ {
+ #if 1
+- internal_warning ("%s", _("command substitution: ignored null byte in input"));
++ if (nullbyte == 0)
++ {
++ internal_warning ("%s", _("command substitution: ignored null byte in input"));
++ nullbyte = 1;
++ }
+ #endif
+ continue;
+ }
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-003
-
-Bug-Reported-by: Anatol Pomozov <anatol.pomozov@gmail.com>
-Bug-Reference-ID: <CAOMFOmXy3mT2So5GQ5F-smCVArQuAeBwZ2QKzgCtMeXJoDeYOQ@mail.gmail.com>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-readline/2014-03/msg00010.html
-
-Bug-Description:
-
-When in callback mode, some readline commands can cause readline to seg
-fault by passing invalid contexts to callback functions.
-
-Patch (apply with `patch -p0'):
-
---- a/lib/readline/readline.c
-+++ b/lib/readline/readline.c
-@@ -744,7 +744,8 @@ _rl_dispatch_callback (cxt)
- r = _rl_subseq_result (r, cxt->oldmap, cxt->okey, (cxt->flags & KSEQ_SUBSEQ));
-
- RL_CHECK_SIGNALS ();
-- if (r == 0) /* success! */
-+ /* We only treat values < 0 specially to simulate recursion. */
-+ if (r >= 0 || (r == -1 && (cxt->flags & KSEQ_SUBSEQ) == 0)) /* success! or failure! */
- {
- _rl_keyseq_chain_dispose ();
- RL_UNSETSTATE (RL_STATE_MULTIKEY);
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 2
-+#define PATCHLEVEL 3
-
- #endif /* _PATCHLEVEL_H_ */
--- /dev/null
+Index: bash-4.4/lib/glob/sm_loop.c
+===================================================================
+--- bash-4.4.orig/lib/glob/sm_loop.c
++++ bash-4.4/lib/glob/sm_loop.c
+@@ -330,6 +330,12 @@ PARSE_COLLSYM (p, vp)
+ for (pc = 0; p[pc]; pc++)
+ if (p[pc] == L('.') && p[pc+1] == L(']'))
+ break;
++ if (p[pc] == 0)
++ {
++ if (vp)
++ *vp = INVALID;
++ return (p + pc);
++ }
+ val = COLLSYM (p, pc);
+ if (vp)
+ *vp = val;
+@@ -483,6 +489,9 @@ BRACKMATCH (p, test, flags)
+ c = *p++;
+ c = FOLD (c);
+
++ if (c == L('\0'))
++ return ((test == L('[')) ? savep : (CHAR *)0);
++
+ if ((flags & FNM_PATHNAME) && c == L('/'))
+ /* [/] can never match when matching a pathname. */
+ return (CHAR *)0;
+Index: bash-4.4/patchlevel.h
+===================================================================
+--- bash-4.4.orig/patchlevel.h
++++ bash-4.4/patchlevel.h
+@@ -25,6 +25,6 @@
+ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
+ looks for to find the patch level (for the sccs version string). */
+
+-#define PATCHLEVEL 2
++#define PATCHLEVEL 3
+
+ #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-004
-
-Bug-Reported-by: Daan van Rossum <daan@flash.uchicago.edu>
-Bug-Reference-ID: <20140307072523.GA14250@flash.uchicago.edu>
-Bug-Reference-URL:
-
-Bug-Description:
-
-The `.' command in vi mode cannot undo multi-key commands beginning with
-`c', `d', and `y' (command plus motion specifier).
-
-Patch (apply with `patch -p0'):
-
---- a/lib/readline/readline.c
-+++ b/lib/readline/readline.c
-@@ -965,7 +965,7 @@ _rl_dispatch_subseq (key, map, got_subse
- #if defined (VI_MODE)
- if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap &&
- key != ANYOTHERKEY &&
-- rl_key_sequence_length == 1 && /* XXX */
-+ _rl_dispatching_keymap == vi_movement_keymap &&
- _rl_vi_textmod_command (key))
- _rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign);
- #endif
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 3
-+#define PATCHLEVEL 4
-
- #endif /* _PATCHLEVEL_H_ */
--- /dev/null
+Index: bash-4.4/jobs.c
+===================================================================
+--- bash-4.4.orig/jobs.c
++++ bash-4.4/jobs.c
+@@ -453,6 +453,21 @@ cleanup_the_pipeline ()
+ discard_pipeline (disposer);
+ }
+
++void
++discard_last_procsub_child ()
++{
++ PROCESS *disposer;
++ sigset_t set, oset;
++
++ BLOCK_CHILD (set, oset);
++ disposer = last_procsub_child;
++ last_procsub_child = (PROCESS *)NULL;
++ UNBLOCK_CHILD (oset);
++
++ if (disposer)
++ discard_pipeline (disposer);
++}
++
+ struct pipeline_saver *
+ alloc_pipeline_saver ()
+ {
+Index: bash-4.4/jobs.h
+===================================================================
+--- bash-4.4.orig/jobs.h
++++ bash-4.4/jobs.h
+@@ -190,6 +190,7 @@ extern JOB **jobs;
+ extern void making_children __P((void));
+ extern void stop_making_children __P((void));
+ extern void cleanup_the_pipeline __P((void));
++extern void discard_last_procsub_child __P((void));
+ extern void save_pipeline __P((int));
+ extern PROCESS *restore_pipeline __P((int));
+ extern void start_pipeline __P((void));
+Index: bash-4.4/patchlevel.h
+===================================================================
+--- bash-4.4.orig/patchlevel.h
++++ bash-4.4/patchlevel.h
+@@ -25,6 +25,6 @@
+ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
+ looks for to find the patch level (for the sccs version string). */
+
+-#define PATCHLEVEL 3
++#define PATCHLEVEL 4
+
+ #endif /* _PATCHLEVEL_H_ */
+Index: bash-4.4/subst.c
+===================================================================
+--- bash-4.4.orig/subst.c
++++ bash-4.4/subst.c
+@@ -5808,10 +5808,7 @@ process_substitute (string, open_for_rea
+ {
+ #if defined (JOB_CONTROL)
+ if (last_procsub_child)
+- {
+- discard_pipeline (last_procsub_child);
+- last_procsub_child = (PROCESS *)NULL;
+- }
++ discard_last_procsub_child ();
+ last_procsub_child = restore_pipeline (0);
+ #endif
+
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-005
-
-Bug-Reported-by: David Sines <dave.gma@googlemail.com>
-Bug-Reference-ID: <CAO3BAa_CK_Rgkhdfzs+NJ4KFYdB9qW3pvXQK0xLCi6GMmDU8bw@mail.gmail.com>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00037.html
-
-Bug-Description:
-
-When in Posix mode, bash did not correctly interpret the ANSI-C-style
-$'...' quoting mechanism when performing pattern substitution word
-expansions within double quotes.
-
-Patch (apply with `patch -p0'):
-
---- a/parse.y
-+++ b/parse.y
-@@ -3398,7 +3398,7 @@ parse_matched_pair (qc, open, close, len
- within a double-quoted ${...} construct "an even number of
- unescaped double-quotes or single-quotes, if any, shall occur." */
- /* This was changed in Austin Group Interp 221 */
-- if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'')
-+ if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && dolbrace_state != DOLBRACE_QUOTE2 && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'')
- continue;
-
- /* Could also check open == '`' if we want to parse grouping constructs
---- a/y.tab.c
-+++ b/y.tab.c
-@@ -5710,7 +5710,7 @@ parse_matched_pair (qc, open, close, len
- within a double-quoted ${...} construct "an even number of
- unescaped double-quotes or single-quotes, if any, shall occur." */
- /* This was changed in Austin Group Interp 221 */
-- if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'')
-+ if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && dolbrace_state != DOLBRACE_QUOTE2 && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'')
- continue;
-
- /* Could also check open == '`' if we want to parse grouping constructs
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 4
-+#define PATCHLEVEL 5
-
- #endif /* _PATCHLEVEL_H_ */
--- /dev/null
+Index: bash-4.4/builtins/evalstring.c
+===================================================================
+--- bash-4.4.orig/builtins/evalstring.c
++++ bash-4.4/builtins/evalstring.c
+@@ -104,12 +104,9 @@ should_suppress_fork (command)
+ running_trap == 0 &&
+ *bash_input.location.string == '\0' &&
+ command->type == cm_simple &&
+-#if 0
+ signal_is_trapped (EXIT_TRAP) == 0 &&
+ signal_is_trapped (ERROR_TRAP) == 0 &&
+-#else
+ any_signals_trapped () < 0 &&
+-#endif
+ command->redirects == 0 && command->value.Simple->redirects == 0 &&
+ ((command->flags & CMD_TIME_PIPELINE) == 0) &&
+ ((command->flags & CMD_INVERT_RETURN) == 0));
+Index: bash-4.4/patchlevel.h
+===================================================================
+--- bash-4.4.orig/patchlevel.h
++++ bash-4.4/patchlevel.h
+@@ -25,6 +25,6 @@
+ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
+ looks for to find the patch level (for the sccs version string). */
+
+-#define PATCHLEVEL 4
++#define PATCHLEVEL 5
+
+ #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-006
-
-Bug-Reported-by: Eduardo A . Bustamante Lopez <dualbus@gmail.com>
-Bug-Reference-ID: <20140228170013.GA16015@dualbus.me>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-02/msg00091.html
-
-Bug-Description:
-
-A shell that started with job control active but was not interactive left
-the terminal in the wrong process group when exiting, causing its parent
-shell to get a stop signal when it attempted to read from the terminal.
-
-Patch (apply with `patch -p0'):
-
---- a/jobs.c
-+++ b/jobs.c
-@@ -4374,7 +4374,7 @@ without_job_control ()
- void
- end_job_control ()
- {
-- if (interactive_shell) /* XXX - should it be interactive? */
-+ if (interactive_shell || job_control) /* XXX - should it be just job_control? */
- {
- terminate_stopped_jobs ();
-
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 5
-+#define PATCHLEVEL 6
-
- #endif /* _PATCHLEVEL_H_ */
--- /dev/null
+Index: bash-4.4/builtins/pushd.def
+===================================================================
+--- bash-4.4.orig/builtins/pushd.def
++++ bash-4.4/builtins/pushd.def
+@@ -365,7 +365,7 @@ popd_builtin (list)
+ break;
+ }
+
+- if (which > directory_list_offset || (directory_list_offset == 0 && which == 0))
++ if (which > directory_list_offset || (which < -directory_list_offset) || (directory_list_offset == 0 && which == 0))
+ {
+ pushd_error (directory_list_offset, which_word ? which_word : "");
+ return (EXECUTION_FAILURE);
+@@ -387,6 +387,11 @@ popd_builtin (list)
+ remove that directory from the list and shift the remainder
+ of the list into place. */
+ i = (direction == '+') ? directory_list_offset - which : which;
++ if (i < 0 || i > directory_list_offset)
++ {
++ pushd_error (directory_list_offset, which_word ? which_word : "");
++ return (EXECUTION_FAILURE);
++ }
+ free (pushd_directory_list[i]);
+ directory_list_offset--;
+
+Index: bash-4.4/patchlevel.h
+===================================================================
+--- bash-4.4.orig/patchlevel.h
++++ bash-4.4/patchlevel.h
+@@ -25,6 +25,6 @@
+ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
+ looks for to find the patch level (for the sccs version string). */
+
+-#define PATCHLEVEL 5
++#define PATCHLEVEL 6
+
+ #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-007
-
-Bug-Reported-by: geir.hauge@gmail.com
-Bug-Reference-ID: <20140318093650.B181C1C5B0B@gina.itea.ntnu.no>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00095.html
-
-Bug-Description:
-
-Using compound assignments for associative arrays like
-
-assoc=( [x]= [y]=bar )
-
-left the value corresponding to the key `x' NULL. This caused subsequent
-lookups to interpret it as unset.
-
-Patch (apply with `patch -p0'):
-
---- a/arrayfunc.c
-+++ b/arrayfunc.c
-@@ -597,6 +597,11 @@ assign_compound_array_list (var, nlist,
- if (assoc_p (var))
- {
- val = expand_assignment_string_to_string (val, 0);
-+ if (val == 0)
-+ {
-+ val = (char *)xmalloc (1);
-+ val[0] = '\0'; /* like do_assignment_internal */
-+ }
- free_val = 1;
- }
-
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 6
-+#define PATCHLEVEL 7
-
- #endif /* _PATCHLEVEL_H_ */
--- /dev/null
+Index: bash-4.4/bashline.c
+===================================================================
+--- bash-4.4.orig/bashline.c
++++ bash-4.4/bashline.c
+@@ -142,7 +142,7 @@ static int executable_completion __P((co
+ static rl_icppfunc_t *save_directory_hook __P((void));
+ static void restore_directory_hook __P((rl_icppfunc_t));
+
+-static int directory_exists __P((const char *));
++static int directory_exists __P((const char *, int));
+
+ static void cleanup_expansion_error __P((void));
+ static void maybe_make_readline_line __P((char *));
+@@ -3102,18 +3102,20 @@ restore_directory_hook (hookf)
+ rl_directory_rewrite_hook = hookf;
+ }
+
+-/* Check whether not the (dequoted) version of DIRNAME, with any trailing slash
+- removed, exists. */
++/* Check whether not DIRNAME, with any trailing slash removed, exists. If
++ SHOULD_DEQUOTE is non-zero, we dequote the directory name first. */
+ static int
+-directory_exists (dirname)
++directory_exists (dirname, should_dequote)
+ const char *dirname;
++ int should_dequote;
+ {
+ char *new_dirname;
+ int dirlen, r;
+ struct stat sb;
+
+- /* First, dequote the directory name */
+- new_dirname = bash_dequote_filename ((char *)dirname, rl_completion_quote_character);
++ /* We save the string and chop the trailing slash because stat/lstat behave
++ inconsistently if one is present. */
++ new_dirname = should_dequote ? bash_dequote_filename ((char *)dirname, rl_completion_quote_character) : savestring (dirname);
+ dirlen = STRLEN (new_dirname);
+ if (new_dirname[dirlen - 1] == '/')
+ new_dirname[dirlen - 1] = '\0';
+@@ -3145,7 +3147,7 @@ bash_filename_stat_hook (dirname)
+ else if (t = mbschr (local_dirname, '`')) /* XXX */
+ should_expand_dirname = '`';
+
+- if (should_expand_dirname && directory_exists (local_dirname))
++ if (should_expand_dirname && directory_exists (local_dirname, 0))
+ should_expand_dirname = 0;
+
+ if (should_expand_dirname)
+@@ -3155,7 +3157,7 @@ bash_filename_stat_hook (dirname)
+ have to worry about restoring this setting. */
+ global_nounset = unbound_vars_is_error;
+ unbound_vars_is_error = 0;
+- wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB|W_COMPLETE); /* does the right thing */
++ wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB|W_NOPROCSUB|W_COMPLETE); /* does the right thing */
+ unbound_vars_is_error = global_nounset;
+ if (wl)
+ {
+@@ -3244,13 +3246,13 @@ bash_directory_completion_hook (dirname)
+ should_expand_dirname = '`';
+ }
+
+- if (should_expand_dirname && directory_exists (local_dirname))
++ if (should_expand_dirname && directory_exists (local_dirname, 1))
+ should_expand_dirname = 0;
+
+ if (should_expand_dirname)
+ {
+ new_dirname = savestring (local_dirname);
+- wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB|W_COMPLETE); /* does the right thing */
++ wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB|W_NOPROCSUB|W_COMPLETE); /* does the right thing */
+ if (wl)
+ {
+ *dirname = string_list (wl);
+Index: bash-4.4/patchlevel.h
+===================================================================
+--- bash-4.4.orig/patchlevel.h
++++ bash-4.4/patchlevel.h
+@@ -25,6 +25,6 @@
+ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
+ looks for to find the patch level (for the sccs version string). */
+
+-#define PATCHLEVEL 6
++#define PATCHLEVEL 7
+
+ #endif /* _PATCHLEVEL_H_ */
+Index: bash-4.4/subst.c
+===================================================================
+--- bash-4.4.orig/subst.c
++++ bash-4.4/subst.c
+@@ -9458,6 +9458,10 @@ add_twochars:
+ tword->flags |= word->flags & (W_ASSIGNARG|W_ASSIGNRHS); /* affects $@ */
+ if (word->flags & W_COMPLETE)
+ tword->flags |= W_COMPLETE; /* for command substitutions */
++ if (word->flags & W_NOCOMSUB)
++ tword->flags |= W_NOCOMSUB;
++ if (word->flags & W_NOPROCSUB)
++ tword->flags |= W_NOPROCSUB;
+
+ temp = (char *)NULL;
+
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-008
-
-Bug-Reported-by: Stephane Chazelas <stephane.chazelas@gmail.com>
-Bug-Reference-ID: <20140318135901.GB22158@chaz.gmail.com>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00098.html
-
-Bug-Description:
-
-Some extended glob patterns incorrectly matched filenames with a leading
-dot, regardless of the setting of the `dotglob' option.
-
-Patch (apply with `patch -p0'):
-
---- a/lib/glob/gmisc.c
-+++ b/lib/glob/gmisc.c
-@@ -210,6 +210,7 @@ extglob_pattern_p (pat)
- case '+':
- case '!':
- case '@':
-+ case '?':
- return (pat[1] == LPAREN);
- default:
- return 0;
---- a/lib/glob/glob.c
-+++ b/lib/glob/glob.c
-@@ -179,42 +179,50 @@ extglob_skipname (pat, dname, flags)
- char *pat, *dname;
- int flags;
- {
-- char *pp, *pe, *t;
-- int n, r;
-+ char *pp, *pe, *t, *se;
-+ int n, r, negate;
-
-+ negate = *pat == '!';
- pp = pat + 2;
-- pe = pp + strlen (pp) - 1; /*(*/
-- if (*pe != ')')
-- return 0;
-- if ((t = strchr (pp, '|')) == 0) /* easy case first */
-+ se = pp + strlen (pp) - 1; /* end of string */
-+ pe = glob_patscan (pp, se, 0); /* end of extglob pattern (( */
-+ /* we should check for invalid extglob pattern here */
-+ /* if pe != se we have more of the pattern at the end of the extglob
-+ pattern. Check the easy case first ( */
-+ if (pe == se && *pe == ')' && (t = strchr (pp, '|')) == 0)
- {
- *pe = '\0';
-+#if defined (HANDLE_MULTIBYTE)
-+ r = mbskipname (pp, dname, flags);
-+#else
- r = skipname (pp, dname, flags); /*(*/
-+#endif
- *pe = ')';
- return r;
- }
-+
-+ /* check every subpattern */
- while (t = glob_patscan (pp, pe, '|'))
- {
- n = t[-1];
- t[-1] = '\0';
-+#if defined (HANDLE_MULTIBYTE)
-+ r = mbskipname (pp, dname, flags);
-+#else
- r = skipname (pp, dname, flags);
-+#endif
- t[-1] = n;
- if (r == 0) /* if any pattern says not skip, we don't skip */
- return r;
- pp = t;
- } /*(*/
-
-- if (pp == pe) /* glob_patscan might find end of pattern */
-+ /* glob_patscan might find end of pattern */
-+ if (pp == se)
- return r;
-
-- *pe = '\0';
--# if defined (HANDLE_MULTIBYTE)
-- r = mbskipname (pp, dname, flags); /*(*/
--# else
-- r = skipname (pp, dname, flags); /*(*/
--# endif
-- *pe = ')';
-- return r;
-+ /* but if it doesn't then we didn't match a leading dot */
-+ return 0;
- }
- #endif
-
-@@ -277,20 +285,23 @@ wextglob_skipname (pat, dname, flags)
- int flags;
- {
- #if EXTENDED_GLOB
-- wchar_t *pp, *pe, *t, n;
-- int r;
-+ wchar_t *pp, *pe, *t, n, *se;
-+ int r, negate;
-
-+ negate = *pat == L'!';
- pp = pat + 2;
-- pe = pp + wcslen (pp) - 1; /*(*/
-- if (*pe != L')')
-- return 0;
-- if ((t = wcschr (pp, L'|')) == 0)
-+ se = pp + wcslen (pp) - 1; /*(*/
-+ pe = glob_patscan_wc (pp, se, 0);
-+
-+ if (pe == se && *pe == ')' && (t = wcschr (pp, L'|')) == 0)
- {
- *pe = L'\0';
- r = wchkname (pp, dname); /*(*/
- *pe = L')';
- return r;
- }
-+
-+ /* check every subpattern */
- while (t = glob_patscan_wc (pp, pe, '|'))
- {
- n = t[-1];
-@@ -305,10 +316,8 @@ wextglob_skipname (pat, dname, flags)
- if (pp == pe) /* glob_patscan_wc might find end of pattern */
- return r;
-
-- *pe = L'\0';
-- r = wchkname (pp, dname); /*(*/
-- *pe = L')';
-- return r;
-+ /* but if it doesn't then we didn't match a leading dot */
-+ return 0;
- #else
- return (wchkname (pat, dname));
- #endif
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 7
-+#define PATCHLEVEL 8
-
- #endif /* _PATCHLEVEL_H_ */
--- /dev/null
+Index: bash-4.4/expr.c
+===================================================================
+--- bash-4.4.orig/expr.c
++++ bash-4.4/expr.c
+@@ -578,24 +578,23 @@ expcond ()
+ rval = cval = explor ();
+ if (curtok == QUES) /* found conditional expr */
+ {
+- readtok ();
+- if (curtok == 0 || curtok == COL)
+- evalerror (_("expression expected"));
+ if (cval == 0)
+ {
+ set_noeval = 1;
+ noeval++;
+ }
+
++ readtok ();
++ if (curtok == 0 || curtok == COL)
++ evalerror (_("expression expected"));
++
+ val1 = EXP_HIGHEST ();
+
+ if (set_noeval)
+ noeval--;
+ if (curtok != COL)
+ evalerror (_("`:' expected for conditional expression"));
+- readtok ();
+- if (curtok == 0)
+- evalerror (_("expression expected"));
++
+ set_noeval = 0;
+ if (cval)
+ {
+@@ -603,7 +602,11 @@ expcond ()
+ noeval++;
+ }
+
++ readtok ();
++ if (curtok == 0)
++ evalerror (_("expression expected"));
+ val2 = expcond ();
++
+ if (set_noeval)
+ noeval--;
+ rval = cval ? val1 : val2;
+Index: bash-4.4/patchlevel.h
+===================================================================
+--- bash-4.4.orig/patchlevel.h
++++ bash-4.4/patchlevel.h
+@@ -25,6 +25,6 @@
+ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
+ looks for to find the patch level (for the sccs version string). */
+
+-#define PATCHLEVEL 7
++#define PATCHLEVEL 8
+
+ #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-009
-
-Bug-Reported-by: Matthias Klose <doko@debian.org>
-Bug-Reference-ID: <53346FC8.6090005@debian.org>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00171.html
-
-Bug-Description:
-
-There is a problem with unsigned sign extension when attempting to reallocate
-the input line when it is fewer than 3 characters long and there has been a
-history expansion. The sign extension causes the shell to not reallocate the
-line, which results in a segmentation fault when it writes past the end.
-
-Patch (apply with `patch -p0'):
-
---- a/parse.y
-+++ b/parse.y
-@@ -2424,7 +2424,7 @@ shell_getc (remove_quoted_newline)
- not already end in an EOF character. */
- if (shell_input_line_terminator != EOF)
- {
-- if (shell_input_line_size < SIZE_MAX && shell_input_line_len > shell_input_line_size - 3)
-+ if (shell_input_line_size < SIZE_MAX-3 && (shell_input_line_len+3 > shell_input_line_size))
- shell_input_line = (char *)xrealloc (shell_input_line,
- 1 + (shell_input_line_size += 2));
-
---- a/y.tab.c
-+++ b/y.tab.c
-@@ -4736,7 +4736,7 @@ shell_getc (remove_quoted_newline)
- not already end in an EOF character. */
- if (shell_input_line_terminator != EOF)
- {
-- if (shell_input_line_size < SIZE_MAX && shell_input_line_len > shell_input_line_size - 3)
-+ if (shell_input_line_size < SIZE_MAX-3 && (shell_input_line_len+3 > shell_input_line_size))
- shell_input_line = (char *)xrealloc (shell_input_line,
- 1 + (shell_input_line_size += 2));
-
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 8
-+#define PATCHLEVEL 9
-
- #endif /* _PATCHLEVEL_H_ */
--- /dev/null
+Index: bash-4.4/lib/readline/history.c
+===================================================================
+--- bash-4.4.orig/lib/readline/history.c
++++ bash-4.4/lib/readline/history.c
+@@ -279,6 +279,7 @@ add_history (string)
+ const char *string;
+ {
+ HIST_ENTRY *temp;
++ int new_length;
+
+ if (history_stifled && (history_length == history_max_entries))
+ {
+@@ -295,13 +296,9 @@ add_history (string)
+
+ /* Copy the rest of the entries, moving down one slot. Copy includes
+ trailing NULL. */
+-#if 0
+- for (i = 0; i < history_length; i++)
+- the_history[i] = the_history[i + 1];
+-#else
+ memmove (the_history, the_history + 1, history_length * sizeof (HIST_ENTRY *));
+-#endif
+
++ new_length = history_length;
+ history_base++;
+ }
+ else
+@@ -315,7 +312,7 @@ add_history (string)
+ else
+ history_size = DEFAULT_HISTORY_INITIAL_SIZE;
+ the_history = (HIST_ENTRY **)xmalloc (history_size * sizeof (HIST_ENTRY *));
+- history_length = 1;
++ new_length = 1;
+ }
+ else
+ {
+@@ -325,14 +322,15 @@ add_history (string)
+ the_history = (HIST_ENTRY **)
+ xrealloc (the_history, history_size * sizeof (HIST_ENTRY *));
+ }
+- history_length++;
++ new_length = history_length + 1;
+ }
+ }
+
+ temp = alloc_history_entry ((char *)string, hist_inittime ());
+
+- the_history[history_length] = (HIST_ENTRY *)NULL;
+- the_history[history_length - 1] = temp;
++ the_history[new_length] = (HIST_ENTRY *)NULL;
++ the_history[new_length - 1] = temp;
++ history_length = new_length;
+ }
+
+ /* Change the time stamp of the most recent history entry to STRING. */
+Index: bash-4.4/patchlevel.h
+===================================================================
+--- bash-4.4.orig/patchlevel.h
++++ bash-4.4/patchlevel.h
+@@ -25,6 +25,6 @@
+ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
+ looks for to find the patch level (for the sccs version string). */
+
+-#define PATCHLEVEL 8
++#define PATCHLEVEL 9
+
+ #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-010
-
-Bug-Reported-by: Albert Shih <Albert.Shih@obspm.fr>
-Bug-Reference-ID: Wed, 5 Mar 2014 23:01:40 +0100
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00028.html
-
-Bug-Description:
-
-Patch (apply with `patch -p0'):
-
-This patch changes the behavior of programmable completion to compensate
-for two assumptions made by the bash-completion package. Bash-4.3 changed
-to dequote the argument to programmable completion only under certain
-circumstances, to make the behavior of compgen more consistent when run
-from the command line -- closer to the behavior when run by a shell function
-run as part of programmable completion. Bash-completion can pass quoted
-arguments to compgen when the original word to be completed was not quoted,
-expecting programmable completion to dequote the word before attempting
-completion.
-
-This patch fixes two cases:
-
-1. An empty string that bash-completion passes to compgen as a quoted null
- string ('').
-
-2. An unquoted word that bash-completion quotes using single quotes or
- backslashes before passing it to compgen.
-
-In these cases, since readline did not detect a quote character in the original
-word to be completed, bash-4.3
-
---- a/externs.h
-+++ b/externs.h
-@@ -324,6 +324,7 @@ extern char *sh_un_double_quote __P((cha
- extern char *sh_backslash_quote __P((char *, const char *, int));
- extern char *sh_backslash_quote_for_double_quotes __P((char *));
- extern int sh_contains_shell_metas __P((char *));
-+extern int sh_contains_quotes __P((char *));
-
- /* declarations for functions defined in lib/sh/spell.c */
- extern int spname __P((char *, char *));
---- a/lib/sh/shquote.c
-+++ b/lib/sh/shquote.c
-@@ -311,3 +311,17 @@ sh_contains_shell_metas (string)
-
- return (0);
- }
-+
-+int
-+sh_contains_quotes (string)
-+ char *string;
-+{
-+ char *s;
-+
-+ for (s = string; s && *s; s++)
-+ {
-+ if (*s == '\'' || *s == '"' || *s == '\\')
-+ return 1;
-+ }
-+ return 0;
-+}
---- a/pcomplete.c
-+++ b/pcomplete.c
-@@ -183,6 +183,7 @@ ITEMLIST it_variables = { LIST_DYNAMIC,
-
- COMPSPEC *pcomp_curcs;
- const char *pcomp_curcmd;
-+const char *pcomp_curtxt;
-
- #ifdef DEBUG
- /* Debugging code */
-@@ -753,6 +754,32 @@ pcomp_filename_completion_function (text
- quoted strings. */
- dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character);
- }
-+ /* Intended to solve a mismatched assumption by bash-completion. If
-+ the text to be completed is empty, but bash-completion turns it into
-+ a quoted string ('') assuming that this code will dequote it before
-+ calling readline, do the dequoting. */
-+ else if (iscompgen && iscompleting &&
-+ pcomp_curtxt && *pcomp_curtxt == 0 &&
-+ text && (*text == '\'' || *text == '"') && text[1] == text[0] && text[2] == 0 &&
-+ rl_filename_dequoting_function)
-+ dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character);
-+ /* Another mismatched assumption by bash-completion. If compgen is being
-+ run as part of bash-completion, and the argument to compgen is not
-+ the same as the word originally passed to the programmable completion
-+ code, dequote the argument if it has quote characters. It's an
-+ attempt to detect when bash-completion is quoting its filename
-+ argument before calling compgen. */
-+ /* We could check whether gen_shell_function_matches is in the call
-+ stack by checking whether the gen-shell-function-matches tag is in
-+ the unwind-protect stack, but there's no function to do that yet.
-+ We could simply check whether we're executing in a function by
-+ checking variable_context, and may end up doing that. */
-+ else if (iscompgen && iscompleting && rl_filename_dequoting_function &&
-+ pcomp_curtxt && text &&
-+ STREQ (pcomp_curtxt, text) == 0 &&
-+ variable_context &&
-+ sh_contains_quotes (text)) /* guess */
-+ dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character);
- else
- dfn = savestring (text);
- }
-@@ -1522,7 +1549,7 @@ gen_progcomp_completions (ocmd, cmd, wor
- COMPSPEC **lastcs;
- {
- COMPSPEC *cs, *oldcs;
-- const char *oldcmd;
-+ const char *oldcmd, *oldtxt;
- STRINGLIST *ret;
-
- cs = progcomp_search (ocmd);
-@@ -1545,14 +1572,17 @@ gen_progcomp_completions (ocmd, cmd, wor
-
- oldcs = pcomp_curcs;
- oldcmd = pcomp_curcmd;
-+ oldtxt = pcomp_curtxt;
-
- pcomp_curcs = cs;
- pcomp_curcmd = cmd;
-+ pcomp_curtxt = word;
-
- ret = gen_compspec_completions (cs, cmd, word, start, end, foundp);
-
- pcomp_curcs = oldcs;
- pcomp_curcmd = oldcmd;
-+ pcomp_curtxt = oldtxt;
-
- /* We need to conditionally handle setting *retryp here */
- if (retryp)
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 9
-+#define PATCHLEVEL 10
-
- #endif /* _PATCHLEVEL_H_ */
--- /dev/null
+Index: bash-4.4/builtins/read.def
+===================================================================
+--- bash-4.4.orig/builtins/read.def
++++ bash-4.4/builtins/read.def
+@@ -181,7 +181,8 @@ read_builtin (list)
+ WORD_LIST *list;
+ {
+ register char *varname;
+- int size, i, nr, pass_next, saw_escape, eof, opt, retval, code, print_ps2;
++ int size, nr, pass_next, saw_escape, eof, opt, retval, code, print_ps2;
++ volatile int i;
+ int input_is_tty, input_is_pipe, unbuffered_read, skip_ctlesc, skip_ctlnul;
+ int raw, edit, nchars, silent, have_timeout, ignore_delim, fd, lastsig, t_errno;
+ unsigned int tmsec, tmusec;
+Index: bash-4.4/patchlevel.h
+===================================================================
+--- bash-4.4.orig/patchlevel.h
++++ bash-4.4/patchlevel.h
+@@ -25,6 +25,6 @@
+ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
+ looks for to find the patch level (for the sccs version string). */
+
+-#define PATCHLEVEL 9
++#define PATCHLEVEL 10
+
+ #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-011
-
-Bug-Reported-by: Egmont Koblinger <egmont@gmail.com>
-Bug-Reference-ID: <CAGWcZk+bU5Jo1M+tutGvL-250UBE9DXjpeJVofYJSFcqFEVfMg@mail.gmail.com>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00153.html
-
-Bug-Description:
-
-The signal handling changes to bash and readline (to avoid running any code
-in a signal handler context) cause the cursor to be placed on the wrong
-line of a multi-line command after a ^C interrupts editing.
-
-Patch (apply with `patch -p0'):
-
---- a/lib/readline/display.c
-+++ b/lib/readline/display.c
-@@ -2677,7 +2677,8 @@ _rl_clean_up_for_exit ()
- {
- if (_rl_echoing_p)
- {
-- _rl_move_vert (_rl_vis_botlin);
-+ if (_rl_vis_botlin > 0) /* minor optimization plus bug fix */
-+ _rl_move_vert (_rl_vis_botlin);
- _rl_vis_botlin = 0;
- fflush (rl_outstream);
- rl_restart_output (1, 0);
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 10
-+#define PATCHLEVEL 11
-
- #endif /* _PATCHLEVEL_H_ */
--- /dev/null
+Index: bash-4.4/patchlevel.h
+===================================================================
+--- bash-4.4.orig/patchlevel.h
++++ bash-4.4/patchlevel.h
+@@ -25,6 +25,6 @@
+ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
+ looks for to find the patch level (for the sccs version string). */
+
+-#define PATCHLEVEL 10
++#define PATCHLEVEL 11
+
+ #endif /* _PATCHLEVEL_H_ */
+Index: bash-4.4/sig.c
+===================================================================
+--- bash-4.4.orig/sig.c
++++ bash-4.4/sig.c
+@@ -585,7 +585,8 @@ termsig_handler (sig)
+ #if defined (JOB_CONTROL)
+ if (sig == SIGHUP && (interactive || (subshell_environment & (SUBSHELL_COMSUB|SUBSHELL_PROCSUB))))
+ hangup_all_jobs ();
+- end_job_control ();
++ if ((subshell_environment & (SUBSHELL_COMSUB|SUBSHELL_PROCSUB)) == 0)
++ end_job_control ();
+ #endif /* JOB_CONTROL */
+
+ #if defined (PROCESS_SUBSTITUTION)
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-012
-
-Bug-Reported-by: Eduardo A. Bustamante López<dualbus@gmail.com>
-Bug-Reference-ID: <5346B54C.4070205@case.edu>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-04/msg00051.html
-
-Bug-Description:
-
-When a SIGCHLD trap runs a command containing a shell builtin while
-a script is running `wait' to wait for all running children to complete,
-the SIGCHLD trap will not be run once for each child that terminates.
-
-Patch (apply with `patch -p0'):
-
---- a/jobs.c
-+++ b/jobs.c
-@@ -3597,6 +3597,7 @@ run_sigchld_trap (nchild)
- unwind_protect_int (jobs_list_frozen);
- unwind_protect_pointer (the_pipeline);
- unwind_protect_pointer (subst_assign_varlist);
-+ unwind_protect_pointer (this_shell_builtin);
-
- /* We have to add the commands this way because they will be run
- in reverse order of adding. We don't want maybe_set_sigchld_trap ()
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 11
-+#define PATCHLEVEL 12
-
- #endif /* _PATCHLEVEL_H_ */
--- /dev/null
+Index: bash-4.4/patchlevel.h
+===================================================================
+--- bash-4.4.orig/patchlevel.h
++++ bash-4.4/patchlevel.h
+@@ -25,6 +25,6 @@
+ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
+ looks for to find the patch level (for the sccs version string). */
+
+-#define PATCHLEVEL 11
++#define PATCHLEVEL 12
+
+ #endif /* _PATCHLEVEL_H_ */
+Index: bash-4.4/subst.c
+===================================================================
+--- bash-4.4.orig/subst.c
++++ bash-4.4/subst.c
+@@ -2825,11 +2825,15 @@ list_string (string, separators, quoted)
+
+ /* Parse a single word from STRING, using SEPARATORS to separate fields.
+ ENDPTR is set to the first character after the word. This is used by
+- the `read' builtin. This is never called with SEPARATORS != $IFS;
+- it should be simplified.
++ the `read' builtin.
++
++ This is never called with SEPARATORS != $IFS, and takes advantage of that.
+
+ XXX - this function is very similar to list_string; they should be
+ combined - XXX */
++
++#define islocalsep(c) (local_cmap[(unsigned char)(c)] != 0)
++
+ char *
+ get_word_from_string (stringp, separators, endptr)
+ char **stringp, *separators, **endptr;
+@@ -2837,6 +2841,7 @@ get_word_from_string (stringp, separator
+ register char *s;
+ char *current_word;
+ int sindex, sh_style_split, whitesep, xflags;
++ unsigned char local_cmap[UCHAR_MAX+1]; /* really only need single-byte chars here */
+ size_t slen;
+
+ if (!stringp || !*stringp || !**stringp)
+@@ -2846,20 +2851,23 @@ get_word_from_string (stringp, separator
+ separators[1] == '\t' &&
+ separators[2] == '\n' &&
+ separators[3] == '\0';
+- for (xflags = 0, s = ifs_value; s && *s; s++)
++ memset (local_cmap, '\0', sizeof (local_cmap));
++ for (xflags = 0, s = separators; s && *s; s++)
+ {
+ if (*s == CTLESC) xflags |= SX_NOCTLESC;
+ if (*s == CTLNUL) xflags |= SX_NOESCCTLNUL;
++ local_cmap[(unsigned char)*s] = 1; /* local charmap of separators */
+ }
+
+ s = *stringp;
+ slen = 0;
+
+ /* Remove sequences of whitespace at the beginning of STRING, as
+- long as those characters appear in IFS. */
+- if (sh_style_split || !separators || !*separators)
++ long as those characters appear in SEPARATORS. This happens if
++ SEPARATORS == $' \t\n' or if IFS is unset. */
++ if (sh_style_split || separators == 0)
+ {
+- for (; *s && spctabnl (*s) && isifs (*s); s++);
++ for (; *s && spctabnl (*s) && islocalsep (*s); s++);
+
+ /* If the string is nothing but whitespace, update it and return. */
+ if (!*s)
+@@ -2878,9 +2886,9 @@ get_word_from_string (stringp, separator
+
+ This obeys the field splitting rules in Posix.2. */
+ sindex = 0;
+- /* Don't need string length in ADVANCE_CHAR or string_extract_verbatim
+- unless multibyte chars are possible. */
+- slen = (MB_CUR_MAX > 1) ? STRLEN (s) : 1;
++ /* Don't need string length in ADVANCE_CHAR unless multibyte chars are
++ possible, but need it in string_extract_verbatim for bounds checking */
++ slen = STRLEN (s);
+ current_word = string_extract_verbatim (s, slen, &sindex, separators, xflags);
+
+ /* Set ENDPTR to the first character after the end of the word. */
+@@ -2899,19 +2907,19 @@ get_word_from_string (stringp, separator
+
+ /* Now skip sequences of space, tab, or newline characters if they are
+ in the list of separators. */
+- while (s[sindex] && spctabnl (s[sindex]) && isifs (s[sindex]))
++ while (s[sindex] && spctabnl (s[sindex]) && islocalsep (s[sindex]))
+ sindex++;
+
+ /* If the first separator was IFS whitespace and the current character is
+ a non-whitespace IFS character, it should be part of the current field
+ delimiter, not a separate delimiter that would result in an empty field.
+ Look at POSIX.2, 3.6.5, (3)(b). */
+- if (s[sindex] && whitesep && isifs (s[sindex]) && !spctabnl (s[sindex]))
++ if (s[sindex] && whitesep && islocalsep (s[sindex]) && !spctabnl (s[sindex]))
+ {
+ sindex++;
+ /* An IFS character that is not IFS white space, along with any adjacent
+ IFS white space, shall delimit a field. */
+- while (s[sindex] && spctabnl (s[sindex]) && isifs (s[sindex]))
++ while (s[sindex] && spctabnl (s[sindex]) && islocalsep(s[sindex]))
+ sindex++;
+ }
+
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-013
-
-Bug-Reported-by: <Trond.Endrestol@ximalas.info>
-Bug-Reference-ID: <alpine.BSF.2.03.1404192114310.1973@enterprise.ximalas.info>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-04/msg00069.html
-
-Bug-Description:
-
-Using reverse-i-search when horizontal scrolling is enabled does not redisplay
-the entire line containing the successful search results.
-
-Patch (apply with `patch -p0'):
---- a/lib/readline/display.c
-+++ b/lib/readline/display.c
-@@ -1637,7 +1637,7 @@ update_line (old, new, current_line, oma
- /* If we are changing the number of invisible characters in a line, and
- the spot of first difference is before the end of the invisible chars,
- lendiff needs to be adjusted. */
-- if (current_line == 0 && !_rl_horizontal_scroll_mode &&
-+ if (current_line == 0 && /* !_rl_horizontal_scroll_mode && */
- current_invis_chars != visible_wrap_offset)
- {
- if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
-@@ -1825,8 +1825,13 @@ update_line (old, new, current_line, oma
- else
- _rl_last_c_pos += bytes_to_insert;
-
-+ /* XXX - we only want to do this if we are at the end of the line
-+ so we move there with _rl_move_cursor_relative */
- if (_rl_horizontal_scroll_mode && ((oe-old) > (ne-new)))
-- goto clear_rest_of_line;
-+ {
-+ _rl_move_cursor_relative (ne-new, new);
-+ goto clear_rest_of_line;
-+ }
- }
- }
- /* Otherwise, print over the existing material. */
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 12
-+#define PATCHLEVEL 13
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-014
-
-Bug-Reported-by: Greg Wooledge <wooledg@eeg.ccf.org>
-Bug-Reference-ID: <20140418202123.GB7660@eeg.ccf.org>
-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'):
---- a/subst.c
-+++ b/subst.c
-@@ -3248,8 +3248,10 @@ cond_expand_word (w, special)
- if (w->word == 0 || w->word[0] == '\0')
- 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)
- {
- if (special == 0) /* LHS */
-@@ -7847,6 +7849,10 @@ param_expand (string, sindex, quoted, ex
- We also want to make sure that splitting is done no matter what --
- 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);
-
- tflag |= W_DOLLARAT;
-@@ -8816,6 +8822,7 @@ finished_with_string:
- else
- {
- char *ifs_chars;
-+ char *tstring;
-
- ifs_chars = (quoted_dollar_at || has_dollar_at) ? ifs_value : (char *)NULL;
-
-@@ -8830,11 +8837,36 @@ finished_with_string:
- regardless of what else has happened to IFS since the expansion. */
- 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);
- else
- {
- tword = make_bare_word (istring);
-+set_word_flags:
- if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) || (quoted_state == WHOLLY_QUOTED))
- tword->flags |= W_QUOTED;
- if (word->flags & W_ASSIGNMENT)
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 13
-+#define PATCHLEVEL 14
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-015
-
-Bug-Reported-by: Clark Wang <dearvoid@gmail.com>
-Bug-Reference-ID: <CADv8-og2TOSoabXeNVXVGaXN3tEMHnYVq1rwOLe5meaRPSGRig@mail.gmail.com>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-04/msg00095.html
-
-Bug-Description:
-
-When completing directory names, the directory name is dequoted twice.
-This causes problems for directories with single and double quotes in
-their names.
-
-Patch (apply with `patch -p0'):
---- a/bashline.c
-+++ b/bashline.c
-@@ -4167,9 +4167,16 @@ bash_directory_completion_matches (text)
- int qc;
-
- qc = rl_dispatching ? rl_completion_quote_character : 0;
-- dfn = bash_dequote_filename ((char *)text, qc);
-+ /* If rl_completion_found_quote != 0, rl_completion_matches will call the
-+ filename dequoting function, causing the directory name to be dequoted
-+ twice. */
-+ if (rl_dispatching && rl_completion_found_quote == 0)
-+ dfn = bash_dequote_filename ((char *)text, qc);
-+ else
-+ dfn = (char *)text;
- m1 = rl_completion_matches (dfn, rl_filename_completion_function);
-- free (dfn);
-+ if (dfn != text)
-+ free (dfn);
-
- if (m1 == 0 || m1[0] == 0)
- return m1;
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 14
-+#define PATCHLEVEL 15
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-016
-
-Bug-Reported-by: Pierre Gaston <pierre.gaston@gmail.com>
-Bug-Reference-ID: <CAPSX3sTCD61k1VQLJ5r-LWzEt+e7Xc-fxXmwn2u8EA5gJJej8Q@mail.gmail.com>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-04/msg00100.html
-
-Bug-Description:
-
-An extended glob pattern containing a slash (`/') causes the globbing code
-to misinterpret it as a directory separator.
-
-Patch (apply with `patch -p0'):
---- a/lib/glob/glob.c
-+++ b/lib/glob/glob.c
-@@ -123,6 +123,8 @@ static char **glob_dir_to_array __P((cha
- extern char *glob_patscan __P((char *, char *, int));
- extern wchar_t *glob_patscan_wc __P((wchar_t *, wchar_t *, int));
-
-+extern char *glob_dirscan __P((char *, int));
-+
- /* Compile `glob_loop.c' for single-byte characters. */
- #define CHAR unsigned char
- #define INT int
-@@ -187,6 +189,9 @@ extglob_skipname (pat, dname, flags)
- se = pp + strlen (pp) - 1; /* end of string */
- pe = glob_patscan (pp, se, 0); /* end of extglob pattern (( */
- /* we should check for invalid extglob pattern here */
-+ if (pe == 0)
-+ return 0;
-+
- /* if pe != se we have more of the pattern at the end of the extglob
- pattern. Check the easy case first ( */
- if (pe == se && *pe == ')' && (t = strchr (pp, '|')) == 0)
-@@ -1015,7 +1020,7 @@ glob_filename (pathname, flags)
- {
- char **result;
- unsigned int result_size;
-- char *directory_name, *filename, *dname;
-+ char *directory_name, *filename, *dname, *fn;
- unsigned int directory_len;
- int free_dirname; /* flag */
- int dflags;
-@@ -1031,6 +1036,18 @@ glob_filename (pathname, flags)
-
- /* Find the filename. */
- filename = strrchr (pathname, '/');
-+#if defined (EXTENDED_GLOB)
-+ if (filename && extended_glob)
-+ {
-+ fn = glob_dirscan (pathname, '/');
-+#if DEBUG_MATCHING
-+ if (fn != filename)
-+ fprintf (stderr, "glob_filename: glob_dirscan: fn (%s) != filename (%s)\n", fn ? fn : "(null)", filename);
-+#endif
-+ filename = fn;
-+ }
-+#endif
-+
- if (filename == NULL)
- {
- filename = pathname;
---- a/lib/glob/gmisc.c
-+++ b/lib/glob/gmisc.c
-@@ -42,6 +42,8 @@
- #define WLPAREN L'('
- #define WRPAREN L')'
-
-+extern char *glob_patscan __P((char *, char *, int));
-+
- /* Return 1 of the first character of WSTRING could match the first
- character of pattern WPAT. Wide character version. */
- int
-@@ -375,3 +377,34 @@ bad_bracket:
-
- return matlen;
- }
-+
-+/* Skip characters in PAT and return the final occurrence of DIRSEP. This
-+ is only called when extended_glob is set, so we have to skip over extglob
-+ patterns x(...) */
-+char *
-+glob_dirscan (pat, dirsep)
-+ char *pat;
-+ int dirsep;
-+{
-+ char *p, *d, *pe, *se;
-+
-+ d = pe = se = 0;
-+ for (p = pat; p && *p; p++)
-+ {
-+ if (extglob_pattern_p (p))
-+ {
-+ if (se == 0)
-+ se = p + strlen (p) - 1;
-+ pe = glob_patscan (p + 2, se, 0);
-+ if (pe == 0)
-+ continue;
-+ else if (*pe == 0)
-+ break;
-+ p = pe - 1; /* will do increment above */
-+ continue;
-+ }
-+ if (*p == dirsep)
-+ d = p;
-+ }
-+ return d;
-+}
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 15
-+#define PATCHLEVEL 16
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-017
-
-Bug-Reported-by: Dan Douglas <ormaaj@gmail.com>
-Bug-Reference-ID: <7781746.RhfoTROLxF@smorgbox>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-05/msg00026.html
-
-Bug-Description:
-
-The code that creates local variables should not clear the `invisible'
-attribute when returning an existing local variable. Let the code that
-actually assigns a value clear it.
-
-Patch (apply with `patch -p0'):
---- a/variables.c
-+++ b/variables.c
-@@ -2197,10 +2197,7 @@ make_local_variable (name)
- /* local foo; local foo; is a no-op. */
- old_var = find_variable (name);
- if (old_var && local_p (old_var) && old_var->context == variable_context)
-- {
-- VUNSETATTR (old_var, att_invisible); /* XXX */
-- return (old_var);
-- }
-+ return (old_var);
-
- was_tmpvar = old_var && tempvar_p (old_var);
- /* If we're making a local variable in a shell function, the temporary env
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 16
-+#define PATCHLEVEL 17
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-018
-
-Bug-Reported-by: Geir Hauge <geir.hauge@gmail.com>
-Bug-Reference-ID: <CAO-BiTLOvfPXDypg61jcBausADrxUKJejakV2WTWP26cW0=rgA@mail.gmail.com>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-05/msg00040.html
-
-Bug-Description:
-
-When assigning an array variable using the compound assignment syntax,
-but using `declare' with the rhs of the compound assignment quoted, the
-shell did not mark the variable as visible after successfully performing
-the assignment.
-
-Patch (apply with `patch -p0'):
---- a/arrayfunc.c
-+++ b/arrayfunc.c
-@@ -179,6 +179,7 @@ bind_array_var_internal (entry, ind, key
- array_insert (array_cell (entry), ind, newval);
- FREE (newval);
-
-+ VUNSETATTR (entry, att_invisible); /* no longer invisible */
- return (entry);
- }
-
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 17
-+#define PATCHLEVEL 18
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-019
-
-Bug-Reported-by: John Lenton
-Bug-Reference-ID:
-Bug-Reference-URL: https://bugs.launchpad.net/ubuntu/+source/bash/+bug/1317476
-
-Bug-Description:
-
-The -t timeout option to `read' does not work when the -e option is used.
-
-Patch (apply with `patch -p0'):
-
---- a/lib/readline/input.c
-+++ b/lib/readline/input.c
-@@ -534,8 +534,16 @@ rl_getc (stream)
- return (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF);
- else if (_rl_caught_signal == SIGHUP || _rl_caught_signal == SIGTERM)
- return (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF);
-+ /* keyboard-generated signals of interest */
- else if (_rl_caught_signal == SIGINT || _rl_caught_signal == SIGQUIT)
- RL_CHECK_SIGNALS ();
-+ /* non-keyboard-generated signals of interest */
-+ else if (_rl_caught_signal == SIGALRM
-+#if defined (SIGVTALRM)
-+ || _rl_caught_signal == SIGVTALRM
-+#endif
-+ )
-+ RL_CHECK_SIGNALS ();
-
- if (rl_signal_event_hook)
- (*rl_signal_event_hook) ();
---- a/builtins/read.def
-+++ b/builtins/read.def
-@@ -442,7 +442,10 @@ read_builtin (list)
- add_unwind_protect (reset_alarm, (char *)NULL);
- #if defined (READLINE)
- if (edit)
-- add_unwind_protect (reset_attempted_completion_function, (char *)NULL);
-+ {
-+ add_unwind_protect (reset_attempted_completion_function, (char *)NULL);
-+ add_unwind_protect (bashline_reset_event_hook, (char *)NULL);
-+ }
- #endif
- falarm (tmsec, tmusec);
- }
-@@ -1021,6 +1024,7 @@ edit_line (p, itext)
-
- old_attempted_completion_function = rl_attempted_completion_function;
- rl_attempted_completion_function = (rl_completion_func_t *)NULL;
-+ bashline_set_event_hook ();
- if (itext)
- {
- old_startup_hook = rl_startup_hook;
-@@ -1032,6 +1036,7 @@ edit_line (p, itext)
-
- rl_attempted_completion_function = old_attempted_completion_function;
- old_attempted_completion_function = (rl_completion_func_t *)NULL;
-+ bashline_reset_event_hook ();
-
- if (ret == 0)
- return ret;
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 18
-+#define PATCHLEVEL 19
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-020
-
-Bug-Reported-by: Jared Yanovich <slovichon@gmail.com>
-Bug-Reference-ID: <20140417073654.GB26875@nightderanger.psc.edu>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-04/msg00065.html
-
-Bug-Description:
-
-When PS2 contains a command substitution, here-documents entered in an
-interactive shell can sometimes cause a segmentation fault.
-
-Patch (apply with `patch -p0'):
-
---- a/shell.h
-+++ b/shell.h
-@@ -168,7 +168,8 @@ typedef struct _sh_parser_state_t {
- /* flags state affecting the parser */
- int expand_aliases;
- int echo_input_at_read;
--
-+ int need_here_doc;
-+
- } sh_parser_state_t;
-
- typedef struct _sh_input_line_state_t {
---- a/parse.y
-+++ b/parse.y
-@@ -2642,7 +2642,7 @@ gather_here_documents ()
- int r;
-
- r = 0;
-- while (need_here_doc)
-+ while (need_here_doc > 0)
- {
- parser_state |= PST_HEREDOC;
- make_here_document (redir_stack[r++], line_number);
-@@ -6075,6 +6075,7 @@ save_parser_state (ps)
-
- ps->expand_aliases = expand_aliases;
- ps->echo_input_at_read = echo_input_at_read;
-+ ps->need_here_doc = need_here_doc;
-
- ps->token = token;
- ps->token_buffer_size = token_buffer_size;
-@@ -6123,6 +6124,7 @@ restore_parser_state (ps)
-
- expand_aliases = ps->expand_aliases;
- echo_input_at_read = ps->echo_input_at_read;
-+ need_here_doc = ps->need_here_doc;
-
- FREE (token);
- token = ps->token;
---- a/y.tab.c
-+++ b/y.tab.c
-@@ -4954,7 +4954,7 @@ gather_here_documents ()
- int r;
-
- r = 0;
-- while (need_here_doc)
-+ while (need_here_doc > 0)
- {
- parser_state |= PST_HEREDOC;
- make_here_document (redir_stack[r++], line_number);
-@@ -8387,6 +8387,7 @@ save_parser_state (ps)
-
- ps->expand_aliases = expand_aliases;
- ps->echo_input_at_read = echo_input_at_read;
-+ ps->need_here_doc = need_here_doc;
-
- ps->token = token;
- ps->token_buffer_size = token_buffer_size;
-@@ -8435,6 +8436,7 @@ restore_parser_state (ps)
-
- expand_aliases = ps->expand_aliases;
- echo_input_at_read = ps->echo_input_at_read;
-+ need_here_doc = ps->need_here_doc;
-
- FREE (token);
- token = ps->token;
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 19
-+#define PATCHLEVEL 20
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-021
-
-Bug-Reported-by: Jared Yanovich <slovichon@gmail.com>
-Bug-Reference-ID: <20140625225019.GJ17044@nightderanger.psc.edu>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-06/msg00070.html
-
-Bug-Description:
-
-When the readline `revert-all-at-newline' option is set, pressing newline
-when the current line is one retrieved from history results in a double free
-and a segmentation fault.
-
-Patch (apply with `patch -p0'):
-
---- a/lib/readline/misc.c
-+++ b/lib/readline/misc.c
-@@ -461,6 +461,7 @@ _rl_revert_all_lines ()
- saved_undo_list = 0;
- /* Set up rl_line_buffer and other variables from history entry */
- rl_replace_from_history (entry, 0); /* entry->line is now current */
-+ entry->data = 0; /* entry->data is now current undo list */
- /* Undo all changes to this history entry */
- while (rl_undo_list)
- rl_do_undo ();
-@@ -468,7 +469,6 @@ _rl_revert_all_lines ()
- the timestamp. */
- FREE (entry->line);
- entry->line = savestring (rl_line_buffer);
-- entry->data = 0;
- }
- entry = previous_history ();
- }
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 20
-+#define PATCHLEVEL 21
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-022
-
-Bug-Reported-by: scorp.dev.null@gmail.com
-Bug-Reference-ID: <E1WxXw8-0007iE-Bi@pcm14>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-06/msg00061.html
-
-Bug-Description:
-
-Using nested pipelines within loops with the `lastpipe' option set can result
-in a segmentation fault.
-
-Patch (apply with `patch -p0'):
-
---- a/execute_cmd.c
-+++ b/execute_cmd.c
-@@ -2413,7 +2413,16 @@ execute_pipeline (command, asynchronous,
- #endif
- lstdin = wait_for (lastpid);
- #if defined (JOB_CONTROL)
-- exec_result = job_exit_status (lastpipe_jid);
-+ /* If wait_for removes the job from the jobs table, use result of last
-+ command as pipeline's exit status as usual. The jobs list can get
-+ frozen and unfrozen at inconvenient times if there are multiple pipelines
-+ running simultaneously. */
-+ if (INVALID_JOB (lastpipe_jid) == 0)
-+ exec_result = job_exit_status (lastpipe_jid);
-+ else if (pipefail_opt)
-+ exec_result = exec_result | lstdin; /* XXX */
-+ /* otherwise we use exec_result */
-+
- #endif
- unfreeze_jobs_list ();
- }
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 21
-+#define PATCHLEVEL 22
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-023
-
-Bug-Reported-by: Tim Friske <me@timfriske.com>
-Bug-Reference-ID: <CAM1RzOcOR9zzC2i+aeES6LtbHNHoOV+0pZEYPrqxv_QAii-RXA@mail.gmail.com>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-06/msg00056.html
-
-Bug-Description:
-
-Bash does not correctly parse process substitution constructs that contain
-unbalanced parentheses as part of the contained command.
-
-Patch (apply with `patch -p0'):
-
---- a/subst.h
-+++ b/subst.h
-@@ -82,7 +82,7 @@ extern char *extract_arithmetic_subst __
- /* Extract the <( or >( construct in STRING, and return a new string.
- Start extracting at (SINDEX) as if we had just seen "<(".
- Make (SINDEX) get the position just after the matching ")". */
--extern char *extract_process_subst __P((char *, char *, int *));
-+extern char *extract_process_subst __P((char *, char *, int *, int));
- #endif /* PROCESS_SUBSTITUTION */
-
- /* Extract the name of the variable to bind to from the assignment string. */
---- a/subst.c
-+++ b/subst.c
-@@ -1192,12 +1192,18 @@ extract_arithmetic_subst (string, sindex
- Start extracting at (SINDEX) as if we had just seen "<(".
- Make (SINDEX) get the position of the matching ")". */ /*))*/
- char *
--extract_process_subst (string, starter, sindex)
-+extract_process_subst (string, starter, sindex, xflags)
- char *string;
- char *starter;
- int *sindex;
-+ int xflags;
- {
-+#if 0
- return (extract_delimited_string (string, sindex, starter, "(", ")", SX_COMMAND));
-+#else
-+ xflags |= (no_longjmp_on_fatal_error ? SX_NOLONGJMP : 0);
-+ return (xparse_dolparen (string, string+*sindex, sindex, xflags));
-+#endif
- }
- #endif /* PROCESS_SUBSTITUTION */
-
-@@ -1785,7 +1791,7 @@ skip_to_delim (string, start, delims, fl
- si = i + 2;
- if (string[si] == '\0')
- CQ_RETURN(si);
-- temp = extract_process_subst (string, (c == '<') ? "<(" : ">(", &si);
-+ temp = extract_process_subst (string, (c == '<') ? "<(" : ">(", &si, 0);
- free (temp); /* no SX_ALLOC here */
- i = si;
- if (string[i] == '\0')
-@@ -8249,7 +8255,7 @@ add_string:
- else
- t_index = sindex + 1; /* skip past both '<' and LPAREN */
-
-- temp1 = extract_process_subst (string, (c == '<') ? "<(" : ">(", &t_index); /*))*/
-+ temp1 = extract_process_subst (string, (c == '<') ? "<(" : ">(", &t_index, 0); /*))*/
- sindex = t_index;
-
- /* If the process substitution specification is `<()', we want to
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 22
-+#define PATCHLEVEL 23
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-024
-
-Bug-Reported-by: Corentin Peuvrel <cpeuvrel@pom-monitoring.com>
-Bug-Reference-ID: <53CE9E5D.6050203@pom-monitoring.com>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-07/msg00021.html
-
-Bug-Description:
-
-Indirect variable references do not work correctly if the reference
-variable expands to an array reference using a subscript other than 0
-(e.g., foo='bar[1]' ; echo ${!foo}).
-
-Patch (apply with `patch -p0'):
-
---- a/subst.c
-+++ b/subst.c
-@@ -7374,7 +7374,13 @@ parameter_brace_expand (string, indexp,
- }
-
- if (want_indir)
-- tdesc = parameter_brace_expand_indir (name + 1, var_is_special, quoted, quoted_dollar_atp, contains_dollar_at);
-+ {
-+ tdesc = parameter_brace_expand_indir (name + 1, var_is_special, quoted, quoted_dollar_atp, contains_dollar_at);
-+ /* Turn off the W_ARRAYIND flag because there is no way for this function
-+ to return the index we're supposed to be using. */
-+ if (tdesc && tdesc->flags)
-+ tdesc->flags &= ~W_ARRAYIND;
-+ }
- else
- tdesc = parameter_brace_expand_word (name, var_is_special, quoted, PF_IGNUNBOUND|(pflags&(PF_NOSPLIT2|PF_ASSIGNRHS)), &ind);
-
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 23
-+#define PATCHLEVEL 24
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-025
-
-Bug-Reported-by: Stephane Chazelas <stephane.chazelas@gmail.com>
-Bug-Reference-ID:
-Bug-Reference-URL:
-
-Bug-Description:
-
-Under certain circumstances, bash will execute user code while processing the
-environment for exported function definitions.
-
-Patch (apply with `patch -p0'):
-
---- a/builtins/common.h
-+++ b/builtins/common.h
-@@ -33,6 +33,8 @@
- #define SEVAL_RESETLINE 0x010
- #define SEVAL_PARSEONLY 0x020
- #define SEVAL_NOLONGJMP 0x040
-+#define SEVAL_FUNCDEF 0x080 /* only allow function definitions */
-+#define SEVAL_ONECMD 0x100 /* only allow a single command */
-
- /* Flags for describe_command, shared between type.def and command.def */
- #define CDESC_ALL 0x001 /* type -a */
---- a/builtins/evalstring.c
-+++ b/builtins/evalstring.c
-@@ -308,6 +308,14 @@ parse_and_execute (string, from_file, fl
- {
- struct fd_bitmap *bitmap;
-
-+ if ((flags & SEVAL_FUNCDEF) && command->type != cm_function_def)
-+ {
-+ internal_warning ("%s: ignoring function definition attempt", from_file);
-+ should_jump_to_top_level = 0;
-+ last_result = last_command_exit_value = EX_BADUSAGE;
-+ break;
-+ }
-+
- bitmap = new_fd_bitmap (FD_BITMAP_SIZE);
- begin_unwind_frame ("pe_dispose");
- add_unwind_protect (dispose_fd_bitmap, bitmap);
-@@ -368,6 +376,9 @@ parse_and_execute (string, from_file, fl
- dispose_command (command);
- dispose_fd_bitmap (bitmap);
- discard_unwind_frame ("pe_dispose");
-+
-+ if (flags & SEVAL_ONECMD)
-+ break;
- }
- }
- else
---- a/variables.c
-+++ b/variables.c
-@@ -358,13 +358,11 @@ initialize_shell_variables (env, privmod
- temp_string[char_index] = ' ';
- strcpy (temp_string + char_index + 1, string);
-
-- if (posixly_correct == 0 || legal_identifier (name))
-- parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST);
--
-- /* Ancient backwards compatibility. Old versions of bash exported
-- functions like name()=() {...} */
-- if (name[char_index - 1] == ')' && name[char_index - 2] == '(')
-- name[char_index - 2] = '\0';
-+ /* Don't import function names that are invalid identifiers from the
-+ environment, though we still allow them to be defined as shell
-+ variables. */
-+ if (legal_identifier (name))
-+ parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_FUNCDEF|SEVAL_ONECMD);
-
- if (temp_var = find_function (name))
- {
-@@ -381,10 +379,6 @@ initialize_shell_variables (env, privmod
- last_command_exit_value = 1;
- report_error (_("error importing function definition for `%s'"), name);
- }
--
-- /* ( */
-- if (name[char_index - 1] == ')' && name[char_index - 2] == '\0')
-- name[char_index - 2] = '('; /* ) */
- }
- #if defined (ARRAY_VARS)
- # if ARRAY_EXPORT
---- a/subst.c
-+++ b/subst.c
-@@ -8047,7 +8047,9 @@ comsub:
-
- goto return0;
- }
-- else if (var = find_variable_last_nameref (temp1))
-+ else if (var && (invisible_p (var) || var_isset (var) == 0))
-+ temp = (char *)NULL;
-+ else if ((var = find_variable_last_nameref (temp1)) && var_isset (var) && invisible_p (var) == 0)
- {
- temp = nameref_cell (var);
- #if defined (ARRAY_VARS)
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 24
-+#define PATCHLEVEL 25
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-026
-
-Bug-Reported-by: Tavis Ormandy <taviso@cmpxchg8b.com>
-Bug-Reference-ID:
-Bug-Reference-URL: http://twitter.com/taviso/statuses/514887394294652929
-
-Bug-Description:
-
-Under certain circumstances, bash can incorrectly save a lookahead character and
-return it on a subsequent call, even when reading a new line.
-
-Patch (apply with `patch -p0'):
-
---- a/parse.y
-+++ b/parse.y
-@@ -2953,6 +2953,8 @@ reset_parser ()
- FREE (word_desc_to_read);
- word_desc_to_read = (WORD_DESC *)NULL;
-
-+ eol_ungetc_lookahead = 0;
-+
- current_token = '\n'; /* XXX */
- last_read_token = '\n';
- token_to_read = '\n';
---- a/y.tab.c
-+++ b/y.tab.c
-@@ -5265,6 +5265,8 @@ reset_parser ()
- FREE (word_desc_to_read);
- word_desc_to_read = (WORD_DESC *)NULL;
-
-+ eol_ungetc_lookahead = 0;
-+
- current_token = '\n'; /* XXX */
- last_read_token = '\n';
- token_to_read = '\n';
-@@ -8539,4 +8541,3 @@ set_line_mbstate ()
- }
- }
- #endif /* HANDLE_MULTIBYTE */
--
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 25
-+#define PATCHLEVEL 26
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-027
-
-Bug-Reported-by: Florian Weimer <fweimer@redhat.com>
-Bug-Reference-ID:
-Bug-Reference-URL:
-
-Bug-Description:
-
-This patch changes the encoding bash uses for exported functions to avoid
-clashes with shell variables and to avoid depending only on an environment
-variable's contents to determine whether or not to interpret it as a shell
-function.
-
-Patch (apply with `patch -p0'):
-
---- a/variables.c
-+++ b/variables.c
-@@ -83,6 +83,11 @@
-
- #define ifsname(s) ((s)[0] == 'I' && (s)[1] == 'F' && (s)[2] == 'S' && (s)[3] == '\0')
-
-+#define BASHFUNC_PREFIX "BASH_FUNC_"
-+#define BASHFUNC_PREFLEN 10 /* == strlen(BASHFUNC_PREFIX */
-+#define BASHFUNC_SUFFIX "%%"
-+#define BASHFUNC_SUFFLEN 2 /* == strlen(BASHFUNC_SUFFIX) */
-+
- extern char **environ;
-
- /* Variables used here and defined in other files. */
-@@ -279,7 +284,7 @@ static void push_temp_var __P((PTR_T));
- static void propagate_temp_var __P((PTR_T));
- static void dispose_temporary_env __P((sh_free_func_t *));
-
--static inline char *mk_env_string __P((const char *, const char *));
-+static inline char *mk_env_string __P((const char *, const char *, int));
- static char **make_env_array_from_var_list __P((SHELL_VAR **));
- static char **make_var_export_array __P((VAR_CONTEXT *));
- static char **make_func_export_array __P((void));
-@@ -349,22 +354,33 @@ initialize_shell_variables (env, privmod
-
- /* If exported function, define it now. Don't import functions from
- the environment in privileged mode. */
-- if (privmode == 0 && read_but_dont_execute == 0 && STREQN ("() {", string, 4))
-+ if (privmode == 0 && read_but_dont_execute == 0 &&
-+ STREQN (BASHFUNC_PREFIX, name, BASHFUNC_PREFLEN) &&
-+ STREQ (BASHFUNC_SUFFIX, name + char_index - BASHFUNC_SUFFLEN) &&
-+ STREQN ("() {", string, 4))
- {
-+ size_t namelen;
-+ char *tname; /* desired imported function name */
-+
-+ namelen = char_index - BASHFUNC_PREFLEN - BASHFUNC_SUFFLEN;
-+
-+ tname = name + BASHFUNC_PREFLEN; /* start of func name */
-+ tname[namelen] = '\0'; /* now tname == func name */
-+
- string_length = strlen (string);
-- temp_string = (char *)xmalloc (3 + string_length + char_index);
-+ temp_string = (char *)xmalloc (namelen + string_length + 2);
-
-- strcpy (temp_string, name);
-- temp_string[char_index] = ' ';
-- strcpy (temp_string + char_index + 1, string);
-+ memcpy (temp_string, tname, namelen);
-+ temp_string[namelen] = ' ';
-+ memcpy (temp_string + namelen + 1, string, string_length + 1);
-
- /* Don't import function names that are invalid identifiers from the
- environment, though we still allow them to be defined as shell
- variables. */
-- if (legal_identifier (name))
-- parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_FUNCDEF|SEVAL_ONECMD);
-+ if (absolute_program (tname) == 0 && (posixly_correct == 0 || legal_identifier (tname)))
-+ parse_and_execute (temp_string, tname, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_FUNCDEF|SEVAL_ONECMD);
-
-- if (temp_var = find_function (name))
-+ if (temp_var = find_function (tname))
- {
- VSETATTR (temp_var, (att_exported|att_imported));
- array_needs_making = 1;
-@@ -377,8 +393,11 @@ initialize_shell_variables (env, privmod
- array_needs_making = 1;
- }
- last_command_exit_value = 1;
-- report_error (_("error importing function definition for `%s'"), name);
-+ report_error (_("error importing function definition for `%s'"), tname);
- }
-+
-+ /* Restore original suffix */
-+ tname[namelen] = BASHFUNC_SUFFIX[0];
- }
- #if defined (ARRAY_VARS)
- # if ARRAY_EXPORT
-@@ -2954,7 +2973,7 @@ assign_in_env (word, flags)
- var->context = variable_context; /* XXX */
-
- INVALIDATE_EXPORTSTR (var);
-- var->exportstr = mk_env_string (name, value);
-+ var->exportstr = mk_env_string (name, value, 0);
-
- array_needs_making = 1;
-
-@@ -3852,21 +3871,42 @@ merge_temporary_env ()
- /* **************************************************************** */
-
- static inline char *
--mk_env_string (name, value)
-+mk_env_string (name, value, isfunc)
- const char *name, *value;
-+ int isfunc;
- {
-- int name_len, value_len;
-- char *p;
-+ size_t name_len, value_len;
-+ char *p, *q;
-
- name_len = strlen (name);
- value_len = STRLEN (value);
-- p = (char *)xmalloc (2 + name_len + value_len);
-- strcpy (p, name);
-- p[name_len] = '=';
-+
-+ /* If we are exporting a shell function, construct the encoded function
-+ name. */
-+ if (isfunc && value)
-+ {
-+ p = (char *)xmalloc (BASHFUNC_PREFLEN + name_len + BASHFUNC_SUFFLEN + value_len + 2);
-+ q = p;
-+ memcpy (q, BASHFUNC_PREFIX, BASHFUNC_PREFLEN);
-+ q += BASHFUNC_PREFLEN;
-+ memcpy (q, name, name_len);
-+ q += name_len;
-+ memcpy (q, BASHFUNC_SUFFIX, BASHFUNC_SUFFLEN);
-+ q += BASHFUNC_SUFFLEN;
-+ }
-+ else
-+ {
-+ p = (char *)xmalloc (2 + name_len + value_len);
-+ memcpy (p, name, name_len);
-+ q = p + name_len;
-+ }
-+
-+ q[0] = '=';
- if (value && *value)
-- strcpy (p + name_len + 1, value);
-+ memcpy (q + 1, value, value_len + 1);
- else
-- p[name_len + 1] = '\0';
-+ q[1] = '\0';
-+
- return (p);
- }
-
-@@ -3952,7 +3992,7 @@ make_env_array_from_var_list (vars)
- /* Gee, I'd like to get away with not using savestring() if we're
- using the cached exportstr... */
- list[list_index] = USE_EXPORTSTR ? savestring (value)
-- : mk_env_string (var->name, value);
-+ : mk_env_string (var->name, value, function_p (var));
-
- if (USE_EXPORTSTR == 0)
- SAVE_EXPORTSTR (var, list[list_index]);
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 26
-+#define PATCHLEVEL 27
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-028
-
-Bug-Reported-by: Florian Weimer <fweimer@redhat.com>
-Bug-Reference-ID:
-Bug-Reference-URL:
-
-Bug-Description:
-
-There are two local buffer overflows in parse.y that can cause the shell
-to dump core when given many here-documents attached to a single command
-or many nested loops.
-
-Patch (apply with `patch -p0'):
-
---- a/parse.y
-+++ b/parse.y
-@@ -168,6 +168,9 @@ static char *read_a_line __P((int));
-
- static int reserved_word_acceptable __P((int));
- static int yylex __P((void));
-+
-+static void push_heredoc __P((REDIRECT *));
-+static char *mk_alexpansion __P((char *));
- static int alias_expand_token __P((char *));
- static int time_command_acceptable __P((void));
- static int special_case_tokens __P((char *));
-@@ -265,7 +268,9 @@ int parser_state;
-
- /* Variables to manage the task of reading here documents, because we need to
- defer the reading until after a complete command has been collected. */
--static REDIRECT *redir_stack[10];
-+#define HEREDOC_MAX 16
-+
-+static REDIRECT *redir_stack[HEREDOC_MAX];
- int need_here_doc;
-
- /* Where shell input comes from. History expansion is performed on each
-@@ -307,7 +312,7 @@ static int global_extglob;
- or `for WORD' begins. This is a nested command maximum, since the array
- index is decremented after a case, select, or for command is parsed. */
- #define MAX_CASE_NEST 128
--static int word_lineno[MAX_CASE_NEST];
-+static int word_lineno[MAX_CASE_NEST+1];
- static int word_top = -1;
-
- /* If non-zero, it is the token that we want read_token to return
-@@ -520,42 +525,42 @@ redirection: '>' WORD
- source.dest = 0;
- redir.filename = $2;
- $$ = make_redirection (source, r_reading_until, redir, 0);
-- redir_stack[need_here_doc++] = $$;
-+ push_heredoc ($$);
- }
- | NUMBER LESS_LESS WORD
- {
- source.dest = $1;
- redir.filename = $3;
- $$ = make_redirection (source, r_reading_until, redir, 0);
-- redir_stack[need_here_doc++] = $$;
-+ push_heredoc ($$);
- }
- | REDIR_WORD LESS_LESS WORD
- {
- source.filename = $1;
- redir.filename = $3;
- $$ = make_redirection (source, r_reading_until, redir, REDIR_VARASSIGN);
-- redir_stack[need_here_doc++] = $$;
-+ push_heredoc ($$);
- }
- | LESS_LESS_MINUS WORD
- {
- source.dest = 0;
- redir.filename = $2;
- $$ = make_redirection (source, r_deblank_reading_until, redir, 0);
-- redir_stack[need_here_doc++] = $$;
-+ push_heredoc ($$);
- }
- | NUMBER LESS_LESS_MINUS WORD
- {
- source.dest = $1;
- redir.filename = $3;
- $$ = make_redirection (source, r_deblank_reading_until, redir, 0);
-- redir_stack[need_here_doc++] = $$;
-+ push_heredoc ($$);
- }
- | REDIR_WORD LESS_LESS_MINUS WORD
- {
- source.filename = $1;
- redir.filename = $3;
- $$ = make_redirection (source, r_deblank_reading_until, redir, REDIR_VARASSIGN);
-- redir_stack[need_here_doc++] = $$;
-+ push_heredoc ($$);
- }
- | LESS_LESS_LESS WORD
- {
-@@ -2636,6 +2641,21 @@ yylex ()
- which allow ESAC to be the next one read. */
- static int esacs_needed_count;
-
-+static void
-+push_heredoc (r)
-+ REDIRECT *r;
-+{
-+ if (need_here_doc >= HEREDOC_MAX)
-+ {
-+ last_command_exit_value = EX_BADUSAGE;
-+ need_here_doc = 0;
-+ report_syntax_error (_("maximum here-document count exceeded"));
-+ reset_parser ();
-+ exit_shell (last_command_exit_value);
-+ }
-+ redir_stack[need_here_doc++] = r;
-+}
-+
- void
- gather_here_documents ()
- {
---- a/y.tab.c
-+++ b/y.tab.c
-@@ -168,7 +168,7 @@
-
-
- /* Copy the first part of user declarations. */
--#line 21 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 21 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-
- #include "config.h"
-
-@@ -319,6 +319,9 @@ static char *read_a_line __P((int));
-
- static int reserved_word_acceptable __P((int));
- static int yylex __P((void));
-+
-+static void push_heredoc __P((REDIRECT *));
-+static char *mk_alexpansion __P((char *));
- static int alias_expand_token __P((char *));
- static int time_command_acceptable __P((void));
- static int special_case_tokens __P((char *));
-@@ -416,7 +419,9 @@ int parser_state;
-
- /* Variables to manage the task of reading here documents, because we need to
- defer the reading until after a complete command has been collected. */
--static REDIRECT *redir_stack[10];
-+#define HEREDOC_MAX 16
-+
-+static REDIRECT *redir_stack[HEREDOC_MAX];
- int need_here_doc;
-
- /* Where shell input comes from. History expansion is performed on each
-@@ -458,7 +463,7 @@ static int global_extglob;
- or `for WORD' begins. This is a nested command maximum, since the array
- index is decremented after a case, select, or for command is parsed. */
- #define MAX_CASE_NEST 128
--static int word_lineno[MAX_CASE_NEST];
-+static int word_lineno[MAX_CASE_NEST+1];
- static int word_top = -1;
-
- /* If non-zero, it is the token that we want read_token to return
-@@ -492,7 +497,7 @@ static REDIRECTEE redir;
-
- #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
- typedef union YYSTYPE
--#line 324 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 329 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- WORD_DESC *word; /* the word that we read. */
- int number; /* the number that we read. */
-@@ -503,7 +508,7 @@ typedef union YYSTYPE
- PATTERN_LIST *pattern;
- }
- /* Line 193 of yacc.c. */
--#line 507 "y.tab.c"
-+#line 512 "y.tab.c"
- YYSTYPE;
- # define yystype YYSTYPE /* obsolescent; will be withdrawn */
- # define YYSTYPE_IS_DECLARED 1
-@@ -516,7 +521,7 @@ typedef union YYSTYPE
-
-
- /* Line 216 of yacc.c. */
--#line 520 "y.tab.c"
-+#line 525 "y.tab.c"
-
- #ifdef short
- # undef short
-@@ -886,23 +891,23 @@ static const yytype_int8 yyrhs[] =
- /* YYRLINE[YYN] -- source line where rule number YYN was defined. */
- static const yytype_uint16 yyrline[] =
- {
-- 0, 377, 377, 388, 397, 412, 422, 424, 428, 434,
-- 440, 446, 452, 458, 464, 470, 476, 482, 488, 494,
-- 500, 506, 512, 518, 525, 532, 539, 546, 553, 560,
-- 566, 572, 578, 584, 590, 596, 602, 608, 614, 620,
-- 626, 632, 638, 644, 650, 656, 662, 668, 674, 680,
-- 686, 692, 700, 702, 704, 708, 712, 723, 725, 729,
-- 731, 733, 749, 751, 755, 757, 759, 761, 763, 765,
-- 767, 769, 771, 773, 775, 779, 784, 789, 794, 799,
-- 804, 809, 814, 821, 826, 831, 836, 843, 848, 853,
-- 858, 863, 868, 875, 880, 885, 892, 895, 898, 902,
-- 904, 935, 942, 947, 964, 969, 986, 993, 995, 997,
-- 1002, 1006, 1010, 1014, 1016, 1018, 1022, 1023, 1027, 1029,
-- 1031, 1033, 1037, 1039, 1041, 1043, 1045, 1047, 1051, 1053,
-- 1062, 1070, 1071, 1077, 1078, 1085, 1089, 1091, 1093, 1100,
-- 1102, 1104, 1108, 1109, 1112, 1114, 1116, 1120, 1121, 1130,
-- 1143, 1159, 1174, 1176, 1178, 1185, 1188, 1192, 1194, 1200,
-- 1206, 1223, 1243, 1245, 1268, 1272, 1274, 1276
-+ 0, 382, 382, 393, 402, 417, 427, 429, 433, 439,
-+ 445, 451, 457, 463, 469, 475, 481, 487, 493, 499,
-+ 505, 511, 517, 523, 530, 537, 544, 551, 558, 565,
-+ 571, 577, 583, 589, 595, 601, 607, 613, 619, 625,
-+ 631, 637, 643, 649, 655, 661, 667, 673, 679, 685,
-+ 691, 697, 705, 707, 709, 713, 717, 728, 730, 734,
-+ 736, 738, 754, 756, 760, 762, 764, 766, 768, 770,
-+ 772, 774, 776, 778, 780, 784, 789, 794, 799, 804,
-+ 809, 814, 819, 826, 831, 836, 841, 848, 853, 858,
-+ 863, 868, 873, 880, 885, 890, 897, 900, 903, 907,
-+ 909, 940, 947, 952, 969, 974, 991, 998, 1000, 1002,
-+ 1007, 1011, 1015, 1019, 1021, 1023, 1027, 1028, 1032, 1034,
-+ 1036, 1038, 1042, 1044, 1046, 1048, 1050, 1052, 1056, 1058,
-+ 1067, 1075, 1076, 1082, 1083, 1090, 1094, 1096, 1098, 1105,
-+ 1107, 1109, 1113, 1114, 1117, 1119, 1121, 1125, 1126, 1135,
-+ 1148, 1164, 1179, 1181, 1183, 1190, 1193, 1197, 1199, 1205,
-+ 1211, 1228, 1248, 1250, 1273, 1277, 1279, 1281
- };
- #endif
-
-@@ -2093,7 +2098,7 @@ yyreduce:
- switch (yyn)
- {
- case 2:
--#line 378 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 383 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- /* Case of regular command. Discard the error
- safety net,and return the command just parsed. */
-@@ -2107,7 +2112,7 @@ yyreduce:
- break;
-
- case 3:
--#line 389 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 394 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- /* Case of regular command, but not a very
- interesting one. Return a NULL command. */
-@@ -2119,7 +2124,7 @@ yyreduce:
- break;
-
- case 4:
--#line 398 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 403 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- /* Error during parsing. Return NULL command. */
- global_command = (COMMAND *)NULL;
-@@ -2137,7 +2142,7 @@ yyreduce:
- break;
-
- case 5:
--#line 413 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 418 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- /* Case of EOF seen by itself. Do ignoreeof or
- not. */
-@@ -2148,17 +2153,17 @@ yyreduce:
- break;
-
- case 6:
--#line 423 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 428 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.word_list) = make_word_list ((yyvsp[(1) - (1)].word), (WORD_LIST *)NULL); }
- break;
-
- case 7:
--#line 425 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 430 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.word_list) = make_word_list ((yyvsp[(2) - (2)].word), (yyvsp[(1) - (2)].word_list)); }
- break;
-
- case 8:
--#line 429 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 434 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = 1;
- redir.filename = (yyvsp[(2) - (2)].word);
-@@ -2167,7 +2172,7 @@ yyreduce:
- break;
-
- case 9:
--#line 435 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 440 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = 0;
- redir.filename = (yyvsp[(2) - (2)].word);
-@@ -2176,7 +2181,7 @@ yyreduce:
- break;
-
- case 10:
--#line 441 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 446 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2185,7 +2190,7 @@ yyreduce:
- break;
-
- case 11:
--#line 447 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 452 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2194,7 +2199,7 @@ yyreduce:
- break;
-
- case 12:
--#line 453 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 458 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2203,7 +2208,7 @@ yyreduce:
- break;
-
- case 13:
--#line 459 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 464 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2212,7 +2217,7 @@ yyreduce:
- break;
-
- case 14:
--#line 465 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 470 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = 1;
- redir.filename = (yyvsp[(2) - (2)].word);
-@@ -2221,7 +2226,7 @@ yyreduce:
- break;
-
- case 15:
--#line 471 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 476 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2230,7 +2235,7 @@ yyreduce:
- break;
-
- case 16:
--#line 477 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 482 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2239,7 +2244,7 @@ yyreduce:
- break;
-
- case 17:
--#line 483 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 488 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = 1;
- redir.filename = (yyvsp[(2) - (2)].word);
-@@ -2248,7 +2253,7 @@ yyreduce:
- break;
-
- case 18:
--#line 489 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 494 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2257,7 +2262,7 @@ yyreduce:
- break;
-
- case 19:
--#line 495 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 500 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2266,7 +2271,7 @@ yyreduce:
- break;
-
- case 20:
--#line 501 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 506 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = 0;
- redir.filename = (yyvsp[(2) - (2)].word);
-@@ -2275,7 +2280,7 @@ yyreduce:
- break;
-
- case 21:
--#line 507 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 512 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2284,7 +2289,7 @@ yyreduce:
- break;
-
- case 22:
--#line 513 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 518 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2293,67 +2298,67 @@ yyreduce:
- break;
-
- case 23:
--#line 519 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 524 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = 0;
- redir.filename = (yyvsp[(2) - (2)].word);
- (yyval.redirect) = make_redirection (source, r_reading_until, redir, 0);
-- redir_stack[need_here_doc++] = (yyval.redirect);
-+ push_heredoc ((yyval.redirect));
- }
- break;
-
- case 24:
--#line 526 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 531 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.filename = (yyvsp[(3) - (3)].word);
- (yyval.redirect) = make_redirection (source, r_reading_until, redir, 0);
-- redir_stack[need_here_doc++] = (yyval.redirect);
-+ push_heredoc ((yyval.redirect));
- }
- break;
-
- case 25:
--#line 533 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 538 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.filename = (yyvsp[(3) - (3)].word);
- (yyval.redirect) = make_redirection (source, r_reading_until, redir, REDIR_VARASSIGN);
-- redir_stack[need_here_doc++] = (yyval.redirect);
-+ push_heredoc ((yyval.redirect));
- }
- break;
-
- case 26:
--#line 540 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 545 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = 0;
- redir.filename = (yyvsp[(2) - (2)].word);
- (yyval.redirect) = make_redirection (source, r_deblank_reading_until, redir, 0);
-- redir_stack[need_here_doc++] = (yyval.redirect);
-+ push_heredoc ((yyval.redirect));
- }
- break;
-
- case 27:
--#line 547 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 552 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.filename = (yyvsp[(3) - (3)].word);
- (yyval.redirect) = make_redirection (source, r_deblank_reading_until, redir, 0);
-- redir_stack[need_here_doc++] = (yyval.redirect);
-+ push_heredoc ((yyval.redirect));
- }
- break;
-
- case 28:
--#line 554 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 559 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.filename = (yyvsp[(3) - (3)].word);
- (yyval.redirect) = make_redirection (source, r_deblank_reading_until, redir, REDIR_VARASSIGN);
-- redir_stack[need_here_doc++] = (yyval.redirect);
-+ push_heredoc ((yyval.redirect));
- }
- break;
-
- case 29:
--#line 561 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 566 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = 0;
- redir.filename = (yyvsp[(2) - (2)].word);
-@@ -2362,7 +2367,7 @@ yyreduce:
- break;
-
- case 30:
--#line 567 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 572 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2371,7 +2376,7 @@ yyreduce:
- break;
-
- case 31:
--#line 573 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 578 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2380,7 +2385,7 @@ yyreduce:
- break;
-
- case 32:
--#line 579 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 584 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = 0;
- redir.dest = (yyvsp[(2) - (2)].number);
-@@ -2389,7 +2394,7 @@ yyreduce:
- break;
-
- case 33:
--#line 585 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 590 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.dest = (yyvsp[(3) - (3)].number);
-@@ -2398,7 +2403,7 @@ yyreduce:
- break;
-
- case 34:
--#line 591 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 596 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.dest = (yyvsp[(3) - (3)].number);
-@@ -2407,7 +2412,7 @@ yyreduce:
- break;
-
- case 35:
--#line 597 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 602 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = 1;
- redir.dest = (yyvsp[(2) - (2)].number);
-@@ -2416,7 +2421,7 @@ yyreduce:
- break;
-
- case 36:
--#line 603 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 608 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.dest = (yyvsp[(3) - (3)].number);
-@@ -2425,7 +2430,7 @@ yyreduce:
- break;
-
- case 37:
--#line 609 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 614 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.dest = (yyvsp[(3) - (3)].number);
-@@ -2434,7 +2439,7 @@ yyreduce:
- break;
-
- case 38:
--#line 615 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 620 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = 0;
- redir.filename = (yyvsp[(2) - (2)].word);
-@@ -2443,7 +2448,7 @@ yyreduce:
- break;
-
- case 39:
--#line 621 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 626 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2452,7 +2457,7 @@ yyreduce:
- break;
-
- case 40:
--#line 627 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 632 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2461,7 +2466,7 @@ yyreduce:
- break;
-
- case 41:
--#line 633 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 638 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = 1;
- redir.filename = (yyvsp[(2) - (2)].word);
-@@ -2470,7 +2475,7 @@ yyreduce:
- break;
-
- case 42:
--#line 639 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 644 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2479,7 +2484,7 @@ yyreduce:
- break;
-
- case 43:
--#line 645 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 650 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2488,7 +2493,7 @@ yyreduce:
- break;
-
- case 44:
--#line 651 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 656 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = 1;
- redir.dest = 0;
-@@ -2497,7 +2502,7 @@ yyreduce:
- break;
-
- case 45:
--#line 657 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 662 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.dest = 0;
-@@ -2506,7 +2511,7 @@ yyreduce:
- break;
-
- case 46:
--#line 663 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 668 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.dest = 0;
-@@ -2515,7 +2520,7 @@ yyreduce:
- break;
-
- case 47:
--#line 669 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 674 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = 0;
- redir.dest = 0;
-@@ -2524,7 +2529,7 @@ yyreduce:
- break;
-
- case 48:
--#line 675 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 680 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.dest = 0;
-@@ -2533,7 +2538,7 @@ yyreduce:
- break;
-
- case 49:
--#line 681 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 686 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.dest = 0;
-@@ -2542,7 +2547,7 @@ yyreduce:
- break;
-
- case 50:
--#line 687 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 692 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = 1;
- redir.filename = (yyvsp[(2) - (2)].word);
-@@ -2551,7 +2556,7 @@ yyreduce:
- break;
-
- case 51:
--#line 693 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 698 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- source.dest = 1;
- redir.filename = (yyvsp[(2) - (2)].word);
-@@ -2560,29 +2565,29 @@ yyreduce:
- break;
-
- case 52:
--#line 701 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 706 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.element).word = (yyvsp[(1) - (1)].word); (yyval.element).redirect = 0; }
- break;
-
- case 53:
--#line 703 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 708 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.element).word = (yyvsp[(1) - (1)].word); (yyval.element).redirect = 0; }
- break;
-
- case 54:
--#line 705 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 710 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.element).redirect = (yyvsp[(1) - (1)].redirect); (yyval.element).word = 0; }
- break;
-
- case 55:
--#line 709 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 714 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.redirect) = (yyvsp[(1) - (1)].redirect);
- }
- break;
-
- case 56:
--#line 713 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 718 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- register REDIRECT *t;
-
-@@ -2594,27 +2599,27 @@ yyreduce:
- break;
-
- case 57:
--#line 724 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 729 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = make_simple_command ((yyvsp[(1) - (1)].element), (COMMAND *)NULL); }
- break;
-
- case 58:
--#line 726 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 731 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = make_simple_command ((yyvsp[(2) - (2)].element), (yyvsp[(1) - (2)].command)); }
- break;
-
- case 59:
--#line 730 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 735 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = clean_simple_command ((yyvsp[(1) - (1)].command)); }
- break;
-
- case 60:
--#line 732 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 737 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 61:
--#line 734 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 739 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- COMMAND *tc;
-
-@@ -2633,72 +2638,72 @@ yyreduce:
- break;
-
- case 62:
--#line 750 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 755 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 63:
--#line 752 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 757 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 64:
--#line 756 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 761 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 65:
--#line 758 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 763 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 66:
--#line 760 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 765 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = make_while_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command)); }
- break;
-
- case 67:
--#line 762 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 767 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = make_until_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command)); }
- break;
-
- case 68:
--#line 764 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 769 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 69:
--#line 766 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 771 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 70:
--#line 768 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 773 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 71:
--#line 770 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 775 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 72:
--#line 772 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 777 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 73:
--#line 774 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 779 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 74:
--#line 776 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 781 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 75:
--#line 780 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 785 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = make_for_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2706,7 +2711,7 @@ yyreduce:
- break;
-
- case 76:
--#line 785 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 790 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = make_for_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2714,7 +2719,7 @@ yyreduce:
- break;
-
- case 77:
--#line 790 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 795 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = make_for_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2722,7 +2727,7 @@ yyreduce:
- break;
-
- case 78:
--#line 795 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 800 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = make_for_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2730,7 +2735,7 @@ yyreduce:
- break;
-
- case 79:
--#line 800 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 805 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = make_for_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2738,7 +2743,7 @@ yyreduce:
- break;
-
- case 80:
--#line 805 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 810 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = make_for_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2746,7 +2751,7 @@ yyreduce:
- break;
-
- case 81:
--#line 810 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 815 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = make_for_command ((yyvsp[(2) - (9)].word), (WORD_LIST *)NULL, (yyvsp[(8) - (9)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2754,7 +2759,7 @@ yyreduce:
- break;
-
- case 82:
--#line 815 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 820 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = make_for_command ((yyvsp[(2) - (9)].word), (WORD_LIST *)NULL, (yyvsp[(8) - (9)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2762,7 +2767,7 @@ yyreduce:
- break;
-
- case 83:
--#line 822 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 827 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = make_arith_for_command ((yyvsp[(2) - (7)].word_list), (yyvsp[(6) - (7)].command), arith_for_lineno);
- if (word_top > 0) word_top--;
-@@ -2770,7 +2775,7 @@ yyreduce:
- break;
-
- case 84:
--#line 827 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 832 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = make_arith_for_command ((yyvsp[(2) - (7)].word_list), (yyvsp[(6) - (7)].command), arith_for_lineno);
- if (word_top > 0) word_top--;
-@@ -2778,7 +2783,7 @@ yyreduce:
- break;
-
- case 85:
--#line 832 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 837 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = make_arith_for_command ((yyvsp[(2) - (5)].word_list), (yyvsp[(4) - (5)].command), arith_for_lineno);
- if (word_top > 0) word_top--;
-@@ -2786,7 +2791,7 @@ yyreduce:
- break;
-
- case 86:
--#line 837 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 842 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = make_arith_for_command ((yyvsp[(2) - (5)].word_list), (yyvsp[(4) - (5)].command), arith_for_lineno);
- if (word_top > 0) word_top--;
-@@ -2794,7 +2799,7 @@ yyreduce:
- break;
-
- case 87:
--#line 844 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 849 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = make_select_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2802,7 +2807,7 @@ yyreduce:
- break;
-
- case 88:
--#line 849 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 854 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = make_select_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2810,7 +2815,7 @@ yyreduce:
- break;
-
- case 89:
--#line 854 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 859 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = make_select_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2818,7 +2823,7 @@ yyreduce:
- break;
-
- case 90:
--#line 859 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 864 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = make_select_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2826,7 +2831,7 @@ yyreduce:
- break;
-
- case 91:
--#line 864 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 869 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = make_select_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2834,7 +2839,7 @@ yyreduce:
- break;
-
- case 92:
--#line 869 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 874 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = make_select_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2842,7 +2847,7 @@ yyreduce:
- break;
-
- case 93:
--#line 876 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 881 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = make_case_command ((yyvsp[(2) - (6)].word), (PATTERN_LIST *)NULL, word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2850,7 +2855,7 @@ yyreduce:
- break;
-
- case 94:
--#line 881 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 886 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = make_case_command ((yyvsp[(2) - (7)].word), (yyvsp[(5) - (7)].pattern), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2858,7 +2863,7 @@ yyreduce:
- break;
-
- case 95:
--#line 886 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 891 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = make_case_command ((yyvsp[(2) - (6)].word), (yyvsp[(5) - (6)].pattern), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2866,27 +2871,27 @@ yyreduce:
- break;
-
- case 96:
--#line 893 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 898 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = make_function_def ((yyvsp[(1) - (5)].word), (yyvsp[(5) - (5)].command), function_dstart, function_bstart); }
- break;
-
- case 97:
--#line 896 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 901 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = make_function_def ((yyvsp[(2) - (6)].word), (yyvsp[(6) - (6)].command), function_dstart, function_bstart); }
- break;
-
- case 98:
--#line 899 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 904 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = make_function_def ((yyvsp[(2) - (4)].word), (yyvsp[(4) - (4)].command), function_dstart, function_bstart); }
- break;
-
- case 99:
--#line 903 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 908 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 100:
--#line 905 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 910 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- COMMAND *tc;
-
-@@ -2918,7 +2923,7 @@ yyreduce:
- break;
-
- case 101:
--#line 936 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 941 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = make_subshell_command ((yyvsp[(2) - (3)].command));
- (yyval.command)->flags |= CMD_WANT_SUBSHELL;
-@@ -2926,7 +2931,7 @@ yyreduce:
- break;
-
- case 102:
--#line 943 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 948 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = make_coproc_command ("COPROC", (yyvsp[(2) - (2)].command));
- (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
-@@ -2934,7 +2939,7 @@ yyreduce:
- break;
-
- case 103:
--#line 948 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 953 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- COMMAND *tc;
-
-@@ -2954,7 +2959,7 @@ yyreduce:
- break;
-
- case 104:
--#line 965 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 970 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = make_coproc_command ((yyvsp[(2) - (3)].word)->word, (yyvsp[(3) - (3)].command));
- (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
-@@ -2962,7 +2967,7 @@ yyreduce:
- break;
-
- case 105:
--#line 970 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 975 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- COMMAND *tc;
-
-@@ -2982,7 +2987,7 @@ yyreduce:
- break;
-
- case 106:
--#line 987 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 992 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = make_coproc_command ("COPROC", clean_simple_command ((yyvsp[(2) - (2)].command)));
- (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
-@@ -2990,117 +2995,117 @@ yyreduce:
- break;
-
- case 107:
--#line 994 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 999 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = make_if_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command), (COMMAND *)NULL); }
- break;
-
- case 108:
--#line 996 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1001 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = make_if_command ((yyvsp[(2) - (7)].command), (yyvsp[(4) - (7)].command), (yyvsp[(6) - (7)].command)); }
- break;
-
- case 109:
--#line 998 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1003 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = make_if_command ((yyvsp[(2) - (6)].command), (yyvsp[(4) - (6)].command), (yyvsp[(5) - (6)].command)); }
- break;
-
- case 110:
--#line 1003 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1008 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = make_group_command ((yyvsp[(2) - (3)].command)); }
- break;
-
- case 111:
--#line 1007 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1012 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = make_arith_command ((yyvsp[(1) - (1)].word_list)); }
- break;
-
- case 112:
--#line 1011 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1016 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = (yyvsp[(2) - (3)].command); }
- break;
-
- case 113:
--#line 1015 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1020 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = make_if_command ((yyvsp[(2) - (4)].command), (yyvsp[(4) - (4)].command), (COMMAND *)NULL); }
- break;
-
- case 114:
--#line 1017 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1022 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = make_if_command ((yyvsp[(2) - (6)].command), (yyvsp[(4) - (6)].command), (yyvsp[(6) - (6)].command)); }
- break;
-
- case 115:
--#line 1019 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1024 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = make_if_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command), (yyvsp[(5) - (5)].command)); }
- break;
-
- case 117:
--#line 1024 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1029 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyvsp[(2) - (2)].pattern)->next = (yyvsp[(1) - (2)].pattern); (yyval.pattern) = (yyvsp[(2) - (2)].pattern); }
- break;
-
- case 118:
--#line 1028 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1033 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.pattern) = make_pattern_list ((yyvsp[(2) - (4)].word_list), (yyvsp[(4) - (4)].command)); }
- break;
-
- case 119:
--#line 1030 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1035 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.pattern) = make_pattern_list ((yyvsp[(2) - (4)].word_list), (COMMAND *)NULL); }
- break;
-
- case 120:
--#line 1032 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1037 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.pattern) = make_pattern_list ((yyvsp[(3) - (5)].word_list), (yyvsp[(5) - (5)].command)); }
- break;
-
- case 121:
--#line 1034 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1039 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.pattern) = make_pattern_list ((yyvsp[(3) - (5)].word_list), (COMMAND *)NULL); }
- break;
-
- case 122:
--#line 1038 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1043 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.pattern) = (yyvsp[(1) - (2)].pattern); }
- break;
-
- case 123:
--#line 1040 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1045 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); }
- break;
-
- case 124:
--#line 1042 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1047 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyvsp[(1) - (2)].pattern)->flags |= CASEPAT_FALLTHROUGH; (yyval.pattern) = (yyvsp[(1) - (2)].pattern); }
- break;
-
- case 125:
--#line 1044 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1049 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyvsp[(2) - (3)].pattern)->flags |= CASEPAT_FALLTHROUGH; (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); }
- break;
-
- case 126:
--#line 1046 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1051 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyvsp[(1) - (2)].pattern)->flags |= CASEPAT_TESTNEXT; (yyval.pattern) = (yyvsp[(1) - (2)].pattern); }
- break;
-
- case 127:
--#line 1048 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1053 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyvsp[(2) - (3)].pattern)->flags |= CASEPAT_TESTNEXT; (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); }
- break;
-
- case 128:
--#line 1052 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1057 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.word_list) = make_word_list ((yyvsp[(1) - (1)].word), (WORD_LIST *)NULL); }
- break;
-
- case 129:
--#line 1054 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1059 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.word_list) = make_word_list ((yyvsp[(3) - (3)].word), (yyvsp[(1) - (3)].word_list)); }
- break;
-
- case 130:
--#line 1063 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1068 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = (yyvsp[(2) - (2)].command);
- if (need_here_doc)
-@@ -3109,14 +3114,14 @@ yyreduce:
- break;
-
- case 132:
--#line 1072 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1077 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = (yyvsp[(2) - (2)].command);
- }
- break;
-
- case 134:
--#line 1079 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1084 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- if ((yyvsp[(1) - (3)].command)->type == cm_connection)
- (yyval.command) = connect_async_list ((yyvsp[(1) - (3)].command), (COMMAND *)NULL, '&');
-@@ -3126,17 +3131,17 @@ yyreduce:
- break;
-
- case 136:
--#line 1090 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1095 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), AND_AND); }
- break;
-
- case 137:
--#line 1092 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1097 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), OR_OR); }
- break;
-
- case 138:
--#line 1094 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1099 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- if ((yyvsp[(1) - (4)].command)->type == cm_connection)
- (yyval.command) = connect_async_list ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), '&');
-@@ -3146,37 +3151,37 @@ yyreduce:
- break;
-
- case 139:
--#line 1101 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1106 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), ';'); }
- break;
-
- case 140:
--#line 1103 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1108 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), ';'); }
- break;
-
- case 141:
--#line 1105 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1110 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 144:
--#line 1113 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1118 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.number) = '\n'; }
- break;
-
- case 145:
--#line 1115 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1120 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.number) = ';'; }
- break;
-
- case 146:
--#line 1117 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1122 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.number) = yacc_EOF; }
- break;
-
- case 149:
--#line 1131 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1136 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = (yyvsp[(1) - (1)].command);
- if (need_here_doc)
-@@ -3192,7 +3197,7 @@ yyreduce:
- break;
-
- case 150:
--#line 1144 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1149 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- if ((yyvsp[(1) - (2)].command)->type == cm_connection)
- (yyval.command) = connect_async_list ((yyvsp[(1) - (2)].command), (COMMAND *)NULL, '&');
-@@ -3211,7 +3216,7 @@ yyreduce:
- break;
-
- case 151:
--#line 1160 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1165 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- (yyval.command) = (yyvsp[(1) - (2)].command);
- if (need_here_doc)
-@@ -3227,17 +3232,17 @@ yyreduce:
- break;
-
- case 152:
--#line 1175 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1180 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), AND_AND); }
- break;
-
- case 153:
--#line 1177 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1182 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), OR_OR); }
- break;
-
- case 154:
--#line 1179 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1184 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- if ((yyvsp[(1) - (3)].command)->type == cm_connection)
- (yyval.command) = connect_async_list ((yyvsp[(1) - (3)].command), (yyvsp[(3) - (3)].command), '&');
-@@ -3247,22 +3252,22 @@ yyreduce:
- break;
-
- case 155:
--#line 1186 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1191 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = command_connect ((yyvsp[(1) - (3)].command), (yyvsp[(3) - (3)].command), ';'); }
- break;
-
- case 156:
--#line 1189 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1194 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 157:
--#line 1193 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1198 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 158:
--#line 1195 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1200 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- if ((yyvsp[(2) - (2)].command))
- (yyvsp[(2) - (2)].command)->flags ^= CMD_INVERT_RETURN; /* toggle */
-@@ -3271,7 +3276,7 @@ yyreduce:
- break;
-
- case 159:
--#line 1201 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1206 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- if ((yyvsp[(2) - (2)].command))
- (yyvsp[(2) - (2)].command)->flags |= (yyvsp[(1) - (2)].number);
-@@ -3280,7 +3285,7 @@ yyreduce:
- break;
-
- case 160:
--#line 1207 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1212 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- ELEMENT x;
-
-@@ -3300,7 +3305,7 @@ yyreduce:
- break;
-
- case 161:
--#line 1224 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1229 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- ELEMENT x;
-
-@@ -3321,12 +3326,12 @@ yyreduce:
- break;
-
- case 162:
--#line 1244 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1249 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), '|'); }
- break;
-
- case 163:
--#line 1246 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1251 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- {
- /* Make cmd1 |& cmd2 equivalent to cmd1 2>&1 | cmd2 */
- COMMAND *tc;
-@@ -3352,28 +3357,28 @@ yyreduce:
- break;
-
- case 164:
--#line 1269 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1274 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 165:
--#line 1273 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1278 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.number) = CMD_TIME_PIPELINE; }
- break;
-
- case 166:
--#line 1275 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1280 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.number) = CMD_TIME_PIPELINE|CMD_TIME_POSIX; }
- break;
-
- case 167:
--#line 1277 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1282 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
- { (yyval.number) = CMD_TIME_PIPELINE|CMD_TIME_POSIX; }
- break;
-
-
- /* Line 1267 of yacc.c. */
--#line 3377 "y.tab.c"
-+#line 3382 "y.tab.c"
- default: break;
- }
- YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
-@@ -3587,7 +3592,7 @@ yyreturn:
- }
-
-
--#line 1279 "/usr/homes/chet/src/bash/src/parse.y"
-+#line 1284 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-
-
- /* Initial size to allocate for tokens, and the
-@@ -4948,6 +4953,21 @@ yylex ()
- which allow ESAC to be the next one read. */
- static int esacs_needed_count;
-
-+static void
-+push_heredoc (r)
-+ REDIRECT *r;
-+{
-+ if (need_here_doc >= HEREDOC_MAX)
-+ {
-+ last_command_exit_value = EX_BADUSAGE;
-+ need_here_doc = 0;
-+ report_syntax_error (_("maximum here-document count exceeded"));
-+ reset_parser ();
-+ exit_shell (last_command_exit_value);
-+ }
-+ redir_stack[need_here_doc++] = r;
-+}
-+
- void
- gather_here_documents ()
- {
-@@ -8541,3 +8561,4 @@ set_line_mbstate ()
- }
- }
- #endif /* HANDLE_MULTIBYTE */
-+
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 27
-+#define PATCHLEVEL 28
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-029
-
-Bug-Reported-by: Michal Zalewski <lcamtuf@coredump.cx>
-Bug-Reference-ID:
-Bug-Reference-URL:
-
-Bug-Description:
-
-When bash is parsing a function definition that contains a here-document
-delimited by end-of-file (or end-of-string), it leaves the closing delimiter
-uninitialized. This can result in an invalid memory access when the parsed
-function is later copied.
-
-Patch (apply with `patch -p0'):
-
---- a/make_cmd.c
-+++ b/make_cmd.c
-@@ -692,6 +692,7 @@ make_redirection (source, instruction, d
- /* First do the common cases. */
- temp->redirector = source;
- temp->redirectee = dest_and_filename;
-+ temp->here_doc_eof = 0;
- temp->instruction = instruction;
- temp->flags = 0;
- temp->rflags = flags;
---- a/copy_cmd.c
-+++ b/copy_cmd.c
-@@ -126,7 +126,7 @@ copy_redirect (redirect)
- {
- case r_reading_until:
- case r_deblank_reading_until:
-- new_redirect->here_doc_eof = savestring (redirect->here_doc_eof);
-+ new_redirect->here_doc_eof = redirect->here_doc_eof ? savestring (redirect->here_doc_eof) : 0;
- /*FALLTHROUGH*/
- case r_reading_string:
- case r_appending_to:
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 28
-+#define PATCHLEVEL 29
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-030
-
-Bug-Reported-by: Michal Zalewski <lcamtuf@coredump.cx>
-Bug-Reference-ID:
-Bug-Reference-URL:
-
-Bug-Description:
-
-A combination of nested command substitutions and function importing from
-the environment can cause bash to execute code appearing in the environment
-variable value following the function definition.
-
-Patch (apply with `patch -p0'):
-
---- a/builtins/evalstring.c
-+++ b/builtins/evalstring.c
-@@ -308,12 +308,25 @@ parse_and_execute (string, from_file, fl
- {
- struct fd_bitmap *bitmap;
-
-- if ((flags & SEVAL_FUNCDEF) && command->type != cm_function_def)
-+ if (flags & SEVAL_FUNCDEF)
- {
-- internal_warning ("%s: ignoring function definition attempt", from_file);
-- should_jump_to_top_level = 0;
-- last_result = last_command_exit_value = EX_BADUSAGE;
-- break;
-+ char *x;
-+
-+ /* If the command parses to something other than a straight
-+ function definition, or if we have not consumed the entire
-+ string, or if the parser has transformed the function
-+ name (as parsing will if it begins or ends with shell
-+ whitespace, for example), reject the attempt */
-+ if (command->type != cm_function_def ||
-+ ((x = parser_remaining_input ()) && *x) ||
-+ (STREQ (from_file, command->value.Function_def->name->word) == 0))
-+ {
-+ internal_warning (_("%s: ignoring function definition attempt"), from_file);
-+ should_jump_to_top_level = 0;
-+ last_result = last_command_exit_value = EX_BADUSAGE;
-+ reset_parser ();
-+ break;
-+ }
- }
-
- bitmap = new_fd_bitmap (FD_BITMAP_SIZE);
-@@ -378,7 +391,10 @@ parse_and_execute (string, from_file, fl
- discard_unwind_frame ("pe_dispose");
-
- if (flags & SEVAL_ONECMD)
-- break;
-+ {
-+ reset_parser ();
-+ break;
-+ }
- }
- }
- else
---- a/parse.y
-+++ b/parse.y
-@@ -2538,6 +2538,16 @@ shell_ungetc (c)
- eol_ungetc_lookahead = c;
- }
-
-+char *
-+parser_remaining_input ()
-+{
-+ if (shell_input_line == 0)
-+ return 0;
-+ if (shell_input_line_index < 0 || shell_input_line_index >= shell_input_line_len)
-+ return '\0'; /* XXX */
-+ return (shell_input_line + shell_input_line_index);
-+}
-+
- #ifdef INCLUDE_UNUSED
- /* Back the input pointer up by one, effectively `ungetting' a character. */
- static void
-@@ -4027,8 +4037,8 @@ xparse_dolparen (base, string, indp, fla
- reset_parser ();
- /* reset_parser clears shell_input_line and associated variables */
- restore_input_line_state (&ls);
-- if (interactive)
-- token_to_read = 0;
-+
-+ token_to_read = 0;
-
- /* Need to find how many characters parse_and_execute consumed, update
- *indp, if flags != 0, copy the portion of the string parsed into RET
---- a/shell.h
-+++ b/shell.h
-@@ -180,6 +180,8 @@ typedef struct _sh_input_line_state_t {
- } sh_input_line_state_t;
-
- /* Let's try declaring these here. */
-+extern char *parser_remaining_input __P((void));
-+
- extern sh_parser_state_t *save_parser_state __P((sh_parser_state_t *));
- extern void restore_parser_state __P((sh_parser_state_t *));
-
---- a/y.tab.c
-+++ b/y.tab.c
-@@ -168,7 +168,7 @@
-
-
- /* Copy the first part of user declarations. */
--#line 21 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 21 "/usr/src/local/bash/bash-4.3-patched/parse.y"
-
- #include "config.h"
-
-@@ -497,7 +497,7 @@ static REDIRECTEE redir;
-
- #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
- typedef union YYSTYPE
--#line 329 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 329 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- WORD_DESC *word; /* the word that we read. */
- int number; /* the number that we read. */
-@@ -2098,7 +2098,7 @@ yyreduce:
- switch (yyn)
- {
- case 2:
--#line 383 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 383 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- /* Case of regular command. Discard the error
- safety net,and return the command just parsed. */
-@@ -2112,7 +2112,7 @@ yyreduce:
- break;
-
- case 3:
--#line 394 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 394 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- /* Case of regular command, but not a very
- interesting one. Return a NULL command. */
-@@ -2124,7 +2124,7 @@ yyreduce:
- break;
-
- case 4:
--#line 403 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 403 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- /* Error during parsing. Return NULL command. */
- global_command = (COMMAND *)NULL;
-@@ -2142,7 +2142,7 @@ yyreduce:
- break;
-
- case 5:
--#line 418 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 418 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- /* Case of EOF seen by itself. Do ignoreeof or
- not. */
-@@ -2153,17 +2153,17 @@ yyreduce:
- break;
-
- case 6:
--#line 428 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 428 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.word_list) = make_word_list ((yyvsp[(1) - (1)].word), (WORD_LIST *)NULL); }
- break;
-
- case 7:
--#line 430 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 430 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.word_list) = make_word_list ((yyvsp[(2) - (2)].word), (yyvsp[(1) - (2)].word_list)); }
- break;
-
- case 8:
--#line 434 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 434 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = 1;
- redir.filename = (yyvsp[(2) - (2)].word);
-@@ -2172,7 +2172,7 @@ yyreduce:
- break;
-
- case 9:
--#line 440 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 440 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = 0;
- redir.filename = (yyvsp[(2) - (2)].word);
-@@ -2181,7 +2181,7 @@ yyreduce:
- break;
-
- case 10:
--#line 446 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 446 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2190,7 +2190,7 @@ yyreduce:
- break;
-
- case 11:
--#line 452 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 452 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2199,7 +2199,7 @@ yyreduce:
- break;
-
- case 12:
--#line 458 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 458 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2208,7 +2208,7 @@ yyreduce:
- break;
-
- case 13:
--#line 464 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 464 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2217,7 +2217,7 @@ yyreduce:
- break;
-
- case 14:
--#line 470 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 470 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = 1;
- redir.filename = (yyvsp[(2) - (2)].word);
-@@ -2226,7 +2226,7 @@ yyreduce:
- break;
-
- case 15:
--#line 476 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 476 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2235,7 +2235,7 @@ yyreduce:
- break;
-
- case 16:
--#line 482 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 482 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2244,7 +2244,7 @@ yyreduce:
- break;
-
- case 17:
--#line 488 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 488 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = 1;
- redir.filename = (yyvsp[(2) - (2)].word);
-@@ -2253,7 +2253,7 @@ yyreduce:
- break;
-
- case 18:
--#line 494 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 494 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2262,7 +2262,7 @@ yyreduce:
- break;
-
- case 19:
--#line 500 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 500 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2271,7 +2271,7 @@ yyreduce:
- break;
-
- case 20:
--#line 506 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 506 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = 0;
- redir.filename = (yyvsp[(2) - (2)].word);
-@@ -2280,7 +2280,7 @@ yyreduce:
- break;
-
- case 21:
--#line 512 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 512 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2289,7 +2289,7 @@ yyreduce:
- break;
-
- case 22:
--#line 518 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 518 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2298,7 +2298,7 @@ yyreduce:
- break;
-
- case 23:
--#line 524 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 524 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = 0;
- redir.filename = (yyvsp[(2) - (2)].word);
-@@ -2308,7 +2308,7 @@ yyreduce:
- break;
-
- case 24:
--#line 531 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 531 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2318,7 +2318,7 @@ yyreduce:
- break;
-
- case 25:
--#line 538 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 538 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2328,7 +2328,7 @@ yyreduce:
- break;
-
- case 26:
--#line 545 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 545 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = 0;
- redir.filename = (yyvsp[(2) - (2)].word);
-@@ -2338,7 +2338,7 @@ yyreduce:
- break;
-
- case 27:
--#line 552 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 552 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2348,7 +2348,7 @@ yyreduce:
- break;
-
- case 28:
--#line 559 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 559 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2358,7 +2358,7 @@ yyreduce:
- break;
-
- case 29:
--#line 566 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 566 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = 0;
- redir.filename = (yyvsp[(2) - (2)].word);
-@@ -2367,7 +2367,7 @@ yyreduce:
- break;
-
- case 30:
--#line 572 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 572 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2376,7 +2376,7 @@ yyreduce:
- break;
-
- case 31:
--#line 578 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 578 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2385,7 +2385,7 @@ yyreduce:
- break;
-
- case 32:
--#line 584 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 584 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = 0;
- redir.dest = (yyvsp[(2) - (2)].number);
-@@ -2394,7 +2394,7 @@ yyreduce:
- break;
-
- case 33:
--#line 590 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 590 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.dest = (yyvsp[(3) - (3)].number);
-@@ -2403,7 +2403,7 @@ yyreduce:
- break;
-
- case 34:
--#line 596 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 596 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.dest = (yyvsp[(3) - (3)].number);
-@@ -2412,7 +2412,7 @@ yyreduce:
- break;
-
- case 35:
--#line 602 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 602 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = 1;
- redir.dest = (yyvsp[(2) - (2)].number);
-@@ -2421,7 +2421,7 @@ yyreduce:
- break;
-
- case 36:
--#line 608 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 608 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.dest = (yyvsp[(3) - (3)].number);
-@@ -2430,7 +2430,7 @@ yyreduce:
- break;
-
- case 37:
--#line 614 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 614 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.dest = (yyvsp[(3) - (3)].number);
-@@ -2439,7 +2439,7 @@ yyreduce:
- break;
-
- case 38:
--#line 620 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 620 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = 0;
- redir.filename = (yyvsp[(2) - (2)].word);
-@@ -2448,7 +2448,7 @@ yyreduce:
- break;
-
- case 39:
--#line 626 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 626 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2457,7 +2457,7 @@ yyreduce:
- break;
-
- case 40:
--#line 632 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 632 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2466,7 +2466,7 @@ yyreduce:
- break;
-
- case 41:
--#line 638 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 638 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = 1;
- redir.filename = (yyvsp[(2) - (2)].word);
-@@ -2475,7 +2475,7 @@ yyreduce:
- break;
-
- case 42:
--#line 644 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 644 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2484,7 +2484,7 @@ yyreduce:
- break;
-
- case 43:
--#line 650 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 650 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.filename = (yyvsp[(3) - (3)].word);
-@@ -2493,7 +2493,7 @@ yyreduce:
- break;
-
- case 44:
--#line 656 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 656 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = 1;
- redir.dest = 0;
-@@ -2502,7 +2502,7 @@ yyreduce:
- break;
-
- case 45:
--#line 662 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 662 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.dest = 0;
-@@ -2511,7 +2511,7 @@ yyreduce:
- break;
-
- case 46:
--#line 668 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 668 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.dest = 0;
-@@ -2520,7 +2520,7 @@ yyreduce:
- break;
-
- case 47:
--#line 674 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 674 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = 0;
- redir.dest = 0;
-@@ -2529,7 +2529,7 @@ yyreduce:
- break;
-
- case 48:
--#line 680 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 680 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = (yyvsp[(1) - (3)].number);
- redir.dest = 0;
-@@ -2538,7 +2538,7 @@ yyreduce:
- break;
-
- case 49:
--#line 686 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 686 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.filename = (yyvsp[(1) - (3)].word);
- redir.dest = 0;
-@@ -2547,7 +2547,7 @@ yyreduce:
- break;
-
- case 50:
--#line 692 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 692 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = 1;
- redir.filename = (yyvsp[(2) - (2)].word);
-@@ -2556,7 +2556,7 @@ yyreduce:
- break;
-
- case 51:
--#line 698 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 698 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- source.dest = 1;
- redir.filename = (yyvsp[(2) - (2)].word);
-@@ -2565,29 +2565,29 @@ yyreduce:
- break;
-
- case 52:
--#line 706 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 706 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.element).word = (yyvsp[(1) - (1)].word); (yyval.element).redirect = 0; }
- break;
-
- case 53:
--#line 708 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 708 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.element).word = (yyvsp[(1) - (1)].word); (yyval.element).redirect = 0; }
- break;
-
- case 54:
--#line 710 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 710 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.element).redirect = (yyvsp[(1) - (1)].redirect); (yyval.element).word = 0; }
- break;
-
- case 55:
--#line 714 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 714 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.redirect) = (yyvsp[(1) - (1)].redirect);
- }
- break;
-
- case 56:
--#line 718 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 718 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- register REDIRECT *t;
-
-@@ -2599,27 +2599,27 @@ yyreduce:
- break;
-
- case 57:
--#line 729 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 729 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = make_simple_command ((yyvsp[(1) - (1)].element), (COMMAND *)NULL); }
- break;
-
- case 58:
--#line 731 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 731 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = make_simple_command ((yyvsp[(2) - (2)].element), (yyvsp[(1) - (2)].command)); }
- break;
-
- case 59:
--#line 735 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 735 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = clean_simple_command ((yyvsp[(1) - (1)].command)); }
- break;
-
- case 60:
--#line 737 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 737 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 61:
--#line 739 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 739 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- COMMAND *tc;
-
-@@ -2638,72 +2638,72 @@ yyreduce:
- break;
-
- case 62:
--#line 755 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 755 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 63:
--#line 757 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 757 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 64:
--#line 761 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 761 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 65:
--#line 763 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 763 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 66:
--#line 765 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 765 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = make_while_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command)); }
- break;
-
- case 67:
--#line 767 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 767 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = make_until_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command)); }
- break;
-
- case 68:
--#line 769 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 769 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 69:
--#line 771 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 771 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 70:
--#line 773 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 773 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 71:
--#line 775 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 775 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 72:
--#line 777 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 777 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 73:
--#line 779 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 779 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 74:
--#line 781 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 781 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 75:
--#line 785 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 785 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = make_for_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2711,7 +2711,7 @@ yyreduce:
- break;
-
- case 76:
--#line 790 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 790 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = make_for_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2719,7 +2719,7 @@ yyreduce:
- break;
-
- case 77:
--#line 795 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 795 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = make_for_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2727,7 +2727,7 @@ yyreduce:
- break;
-
- case 78:
--#line 800 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 800 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = make_for_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2735,7 +2735,7 @@ yyreduce:
- break;
-
- case 79:
--#line 805 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 805 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = make_for_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2743,7 +2743,7 @@ yyreduce:
- break;
-
- case 80:
--#line 810 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 810 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = make_for_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2751,7 +2751,7 @@ yyreduce:
- break;
-
- case 81:
--#line 815 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 815 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = make_for_command ((yyvsp[(2) - (9)].word), (WORD_LIST *)NULL, (yyvsp[(8) - (9)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2759,7 +2759,7 @@ yyreduce:
- break;
-
- case 82:
--#line 820 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 820 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = make_for_command ((yyvsp[(2) - (9)].word), (WORD_LIST *)NULL, (yyvsp[(8) - (9)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2767,7 +2767,7 @@ yyreduce:
- break;
-
- case 83:
--#line 827 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 827 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = make_arith_for_command ((yyvsp[(2) - (7)].word_list), (yyvsp[(6) - (7)].command), arith_for_lineno);
- if (word_top > 0) word_top--;
-@@ -2775,7 +2775,7 @@ yyreduce:
- break;
-
- case 84:
--#line 832 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 832 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = make_arith_for_command ((yyvsp[(2) - (7)].word_list), (yyvsp[(6) - (7)].command), arith_for_lineno);
- if (word_top > 0) word_top--;
-@@ -2783,7 +2783,7 @@ yyreduce:
- break;
-
- case 85:
--#line 837 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 837 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = make_arith_for_command ((yyvsp[(2) - (5)].word_list), (yyvsp[(4) - (5)].command), arith_for_lineno);
- if (word_top > 0) word_top--;
-@@ -2791,7 +2791,7 @@ yyreduce:
- break;
-
- case 86:
--#line 842 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 842 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = make_arith_for_command ((yyvsp[(2) - (5)].word_list), (yyvsp[(4) - (5)].command), arith_for_lineno);
- if (word_top > 0) word_top--;
-@@ -2799,7 +2799,7 @@ yyreduce:
- break;
-
- case 87:
--#line 849 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 849 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = make_select_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2807,7 +2807,7 @@ yyreduce:
- break;
-
- case 88:
--#line 854 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 854 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = make_select_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2815,7 +2815,7 @@ yyreduce:
- break;
-
- case 89:
--#line 859 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 859 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = make_select_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2823,7 +2823,7 @@ yyreduce:
- break;
-
- case 90:
--#line 864 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 864 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = make_select_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2831,7 +2831,7 @@ yyreduce:
- break;
-
- case 91:
--#line 869 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 869 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = make_select_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2839,7 +2839,7 @@ yyreduce:
- break;
-
- case 92:
--#line 874 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 874 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = make_select_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2847,7 +2847,7 @@ yyreduce:
- break;
-
- case 93:
--#line 881 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 881 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = make_case_command ((yyvsp[(2) - (6)].word), (PATTERN_LIST *)NULL, word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2855,7 +2855,7 @@ yyreduce:
- break;
-
- case 94:
--#line 886 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 886 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = make_case_command ((yyvsp[(2) - (7)].word), (yyvsp[(5) - (7)].pattern), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2863,7 +2863,7 @@ yyreduce:
- break;
-
- case 95:
--#line 891 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 891 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = make_case_command ((yyvsp[(2) - (6)].word), (yyvsp[(5) - (6)].pattern), word_lineno[word_top]);
- if (word_top > 0) word_top--;
-@@ -2871,27 +2871,27 @@ yyreduce:
- break;
-
- case 96:
--#line 898 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 898 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = make_function_def ((yyvsp[(1) - (5)].word), (yyvsp[(5) - (5)].command), function_dstart, function_bstart); }
- break;
-
- case 97:
--#line 901 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 901 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = make_function_def ((yyvsp[(2) - (6)].word), (yyvsp[(6) - (6)].command), function_dstart, function_bstart); }
- break;
-
- case 98:
--#line 904 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 904 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = make_function_def ((yyvsp[(2) - (4)].word), (yyvsp[(4) - (4)].command), function_dstart, function_bstart); }
- break;
-
- case 99:
--#line 908 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 908 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 100:
--#line 910 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 910 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- COMMAND *tc;
-
-@@ -2923,7 +2923,7 @@ yyreduce:
- break;
-
- case 101:
--#line 941 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 941 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = make_subshell_command ((yyvsp[(2) - (3)].command));
- (yyval.command)->flags |= CMD_WANT_SUBSHELL;
-@@ -2931,7 +2931,7 @@ yyreduce:
- break;
-
- case 102:
--#line 948 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 948 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = make_coproc_command ("COPROC", (yyvsp[(2) - (2)].command));
- (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
-@@ -2939,7 +2939,7 @@ yyreduce:
- break;
-
- case 103:
--#line 953 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 953 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- COMMAND *tc;
-
-@@ -2959,7 +2959,7 @@ yyreduce:
- break;
-
- case 104:
--#line 970 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 970 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = make_coproc_command ((yyvsp[(2) - (3)].word)->word, (yyvsp[(3) - (3)].command));
- (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
-@@ -2967,7 +2967,7 @@ yyreduce:
- break;
-
- case 105:
--#line 975 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 975 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- COMMAND *tc;
-
-@@ -2987,7 +2987,7 @@ yyreduce:
- break;
-
- case 106:
--#line 992 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 992 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = make_coproc_command ("COPROC", clean_simple_command ((yyvsp[(2) - (2)].command)));
- (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
-@@ -2995,117 +2995,117 @@ yyreduce:
- break;
-
- case 107:
--#line 999 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 999 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = make_if_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command), (COMMAND *)NULL); }
- break;
-
- case 108:
--#line 1001 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1001 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = make_if_command ((yyvsp[(2) - (7)].command), (yyvsp[(4) - (7)].command), (yyvsp[(6) - (7)].command)); }
- break;
-
- case 109:
--#line 1003 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1003 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = make_if_command ((yyvsp[(2) - (6)].command), (yyvsp[(4) - (6)].command), (yyvsp[(5) - (6)].command)); }
- break;
-
- case 110:
--#line 1008 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1008 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = make_group_command ((yyvsp[(2) - (3)].command)); }
- break;
-
- case 111:
--#line 1012 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1012 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = make_arith_command ((yyvsp[(1) - (1)].word_list)); }
- break;
-
- case 112:
--#line 1016 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1016 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = (yyvsp[(2) - (3)].command); }
- break;
-
- case 113:
--#line 1020 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1020 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = make_if_command ((yyvsp[(2) - (4)].command), (yyvsp[(4) - (4)].command), (COMMAND *)NULL); }
- break;
-
- case 114:
--#line 1022 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1022 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = make_if_command ((yyvsp[(2) - (6)].command), (yyvsp[(4) - (6)].command), (yyvsp[(6) - (6)].command)); }
- break;
-
- case 115:
--#line 1024 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1024 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = make_if_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command), (yyvsp[(5) - (5)].command)); }
- break;
-
- case 117:
--#line 1029 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1029 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyvsp[(2) - (2)].pattern)->next = (yyvsp[(1) - (2)].pattern); (yyval.pattern) = (yyvsp[(2) - (2)].pattern); }
- break;
-
- case 118:
--#line 1033 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1033 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.pattern) = make_pattern_list ((yyvsp[(2) - (4)].word_list), (yyvsp[(4) - (4)].command)); }
- break;
-
- case 119:
--#line 1035 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1035 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.pattern) = make_pattern_list ((yyvsp[(2) - (4)].word_list), (COMMAND *)NULL); }
- break;
-
- case 120:
--#line 1037 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1037 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.pattern) = make_pattern_list ((yyvsp[(3) - (5)].word_list), (yyvsp[(5) - (5)].command)); }
- break;
-
- case 121:
--#line 1039 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1039 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.pattern) = make_pattern_list ((yyvsp[(3) - (5)].word_list), (COMMAND *)NULL); }
- break;
-
- case 122:
--#line 1043 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1043 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.pattern) = (yyvsp[(1) - (2)].pattern); }
- break;
-
- case 123:
--#line 1045 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1045 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); }
- break;
-
- case 124:
--#line 1047 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1047 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyvsp[(1) - (2)].pattern)->flags |= CASEPAT_FALLTHROUGH; (yyval.pattern) = (yyvsp[(1) - (2)].pattern); }
- break;
-
- case 125:
--#line 1049 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1049 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyvsp[(2) - (3)].pattern)->flags |= CASEPAT_FALLTHROUGH; (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); }
- break;
-
- case 126:
--#line 1051 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1051 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyvsp[(1) - (2)].pattern)->flags |= CASEPAT_TESTNEXT; (yyval.pattern) = (yyvsp[(1) - (2)].pattern); }
- break;
-
- case 127:
--#line 1053 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1053 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyvsp[(2) - (3)].pattern)->flags |= CASEPAT_TESTNEXT; (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); }
- break;
-
- case 128:
--#line 1057 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1057 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.word_list) = make_word_list ((yyvsp[(1) - (1)].word), (WORD_LIST *)NULL); }
- break;
-
- case 129:
--#line 1059 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1059 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.word_list) = make_word_list ((yyvsp[(3) - (3)].word), (yyvsp[(1) - (3)].word_list)); }
- break;
-
- case 130:
--#line 1068 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1068 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = (yyvsp[(2) - (2)].command);
- if (need_here_doc)
-@@ -3114,14 +3114,14 @@ yyreduce:
- break;
-
- case 132:
--#line 1077 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1077 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = (yyvsp[(2) - (2)].command);
- }
- break;
-
- case 134:
--#line 1084 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1084 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- if ((yyvsp[(1) - (3)].command)->type == cm_connection)
- (yyval.command) = connect_async_list ((yyvsp[(1) - (3)].command), (COMMAND *)NULL, '&');
-@@ -3131,17 +3131,17 @@ yyreduce:
- break;
-
- case 136:
--#line 1095 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1095 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), AND_AND); }
- break;
-
- case 137:
--#line 1097 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1097 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), OR_OR); }
- break;
-
- case 138:
--#line 1099 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1099 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- if ((yyvsp[(1) - (4)].command)->type == cm_connection)
- (yyval.command) = connect_async_list ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), '&');
-@@ -3151,37 +3151,37 @@ yyreduce:
- break;
-
- case 139:
--#line 1106 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1106 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), ';'); }
- break;
-
- case 140:
--#line 1108 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1108 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), ';'); }
- break;
-
- case 141:
--#line 1110 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1110 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 144:
--#line 1118 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1118 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.number) = '\n'; }
- break;
-
- case 145:
--#line 1120 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1120 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.number) = ';'; }
- break;
-
- case 146:
--#line 1122 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1122 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.number) = yacc_EOF; }
- break;
-
- case 149:
--#line 1136 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1136 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = (yyvsp[(1) - (1)].command);
- if (need_here_doc)
-@@ -3197,7 +3197,7 @@ yyreduce:
- break;
-
- case 150:
--#line 1149 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1149 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- if ((yyvsp[(1) - (2)].command)->type == cm_connection)
- (yyval.command) = connect_async_list ((yyvsp[(1) - (2)].command), (COMMAND *)NULL, '&');
-@@ -3216,7 +3216,7 @@ yyreduce:
- break;
-
- case 151:
--#line 1165 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1165 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- (yyval.command) = (yyvsp[(1) - (2)].command);
- if (need_here_doc)
-@@ -3232,17 +3232,17 @@ yyreduce:
- break;
-
- case 152:
--#line 1180 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1180 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), AND_AND); }
- break;
-
- case 153:
--#line 1182 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1182 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), OR_OR); }
- break;
-
- case 154:
--#line 1184 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1184 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- if ((yyvsp[(1) - (3)].command)->type == cm_connection)
- (yyval.command) = connect_async_list ((yyvsp[(1) - (3)].command), (yyvsp[(3) - (3)].command), '&');
-@@ -3252,22 +3252,22 @@ yyreduce:
- break;
-
- case 155:
--#line 1191 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1191 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = command_connect ((yyvsp[(1) - (3)].command), (yyvsp[(3) - (3)].command), ';'); }
- break;
-
- case 156:
--#line 1194 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1194 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 157:
--#line 1198 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1198 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 158:
--#line 1200 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1200 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- if ((yyvsp[(2) - (2)].command))
- (yyvsp[(2) - (2)].command)->flags ^= CMD_INVERT_RETURN; /* toggle */
-@@ -3276,7 +3276,7 @@ yyreduce:
- break;
-
- case 159:
--#line 1206 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1206 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- if ((yyvsp[(2) - (2)].command))
- (yyvsp[(2) - (2)].command)->flags |= (yyvsp[(1) - (2)].number);
-@@ -3285,7 +3285,7 @@ yyreduce:
- break;
-
- case 160:
--#line 1212 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1212 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- ELEMENT x;
-
-@@ -3305,7 +3305,7 @@ yyreduce:
- break;
-
- case 161:
--#line 1229 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1229 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- ELEMENT x;
-
-@@ -3326,12 +3326,12 @@ yyreduce:
- break;
-
- case 162:
--#line 1249 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1249 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), '|'); }
- break;
-
- case 163:
--#line 1251 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1251 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- {
- /* Make cmd1 |& cmd2 equivalent to cmd1 2>&1 | cmd2 */
- COMMAND *tc;
-@@ -3357,22 +3357,22 @@ yyreduce:
- break;
-
- case 164:
--#line 1274 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1274 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.command) = (yyvsp[(1) - (1)].command); }
- break;
-
- case 165:
--#line 1278 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1278 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.number) = CMD_TIME_PIPELINE; }
- break;
-
- case 166:
--#line 1280 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1280 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.number) = CMD_TIME_PIPELINE|CMD_TIME_POSIX; }
- break;
-
- case 167:
--#line 1282 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1282 "/usr/src/local/bash/bash-4.3-patched/parse.y"
- { (yyval.number) = CMD_TIME_PIPELINE|CMD_TIME_POSIX; }
- break;
-
-@@ -3592,7 +3592,7 @@ yyreturn:
- }
-
-
--#line 1284 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
-+#line 1284 "/usr/src/local/bash/bash-4.3-patched/parse.y"
-
-
- /* Initial size to allocate for tokens, and the
-@@ -4850,6 +4850,16 @@ shell_ungetc (c)
- eol_ungetc_lookahead = c;
- }
-
-+char *
-+parser_remaining_input ()
-+{
-+ if (shell_input_line == 0)
-+ return 0;
-+ if (shell_input_line_index < 0 || shell_input_line_index >= shell_input_line_len)
-+ return '\0'; /* XXX */
-+ return (shell_input_line + shell_input_line_index);
-+}
-+
- #ifdef INCLUDE_UNUSED
- /* Back the input pointer up by one, effectively `ungetting' a character. */
- static void
-@@ -6339,8 +6349,8 @@ xparse_dolparen (base, string, indp, fla
- reset_parser ();
- /* reset_parser clears shell_input_line and associated variables */
- restore_input_line_state (&ls);
-- if (interactive)
-- token_to_read = 0;
-+
-+ token_to_read = 0;
-
- /* Need to find how many characters parse_and_execute consumed, update
- *indp, if flags != 0, copy the portion of the string parsed into RET
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 29
-+#define PATCHLEVEL 30
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-031
-
-Bug-Reported-by: lolilolicon <lolilolicon@gmail.com>
-Bug-Reference-ID: <CAMtVo_Nz=32Oq=zWTb6=+8gUNXOo2rRvud1W4oPnA-cgVk_ZqQ@mail.gmail.com>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-08/msg00139.html
-
-Bug-Description:
-
-The new nameref assignment functionality introduced in bash-4.3 did not perform
-enough validation on the variable value and would create variables with
-invalid names.
-
-Patch (apply with `patch -p0'):
-
---- a/subst.h
-+++ b/subst.h
-@@ -47,6 +47,7 @@
- #define ASS_MKASSOC 0x0004
- #define ASS_MKGLOBAL 0x0008 /* force global assignment */
- #define ASS_NAMEREF 0x0010 /* assigning to nameref variable */
-+#define ASS_FROMREF 0x0020 /* assigning from value of nameref variable */
-
- /* Flags for the string extraction functions. */
- #define SX_NOALLOC 0x0001 /* just skip; don't return substring */
---- a/variables.c
-+++ b/variables.c
-@@ -2516,10 +2516,27 @@ bind_variable_internal (name, value, tab
- HASH_TABLE *table;
- int hflags, aflags;
- {
-- char *newval;
-+ char *newname, *newval;
- SHELL_VAR *entry;
-+#if defined (ARRAY_VARS)
-+ arrayind_t ind;
-+ char *subp;
-+ int sublen;
-+#endif
-
-+ newname = 0;
-+#if defined (ARRAY_VARS)
-+ if ((aflags & ASS_FROMREF) && (hflags & HASH_NOSRCH) == 0 && valid_array_reference (name))
-+ {
-+ newname = array_variable_name (name, &subp, &sublen);
-+ if (newname == 0)
-+ return (SHELL_VAR *)NULL; /* XXX */
-+ entry = hash_lookup (newname, table);
-+ }
-+ else
-+#endif
- entry = (hflags & HASH_NOSRCH) ? (SHELL_VAR *)NULL : hash_lookup (name, table);
-+
- /* Follow the nameref chain here if this is the global variables table */
- if (entry && nameref_p (entry) && (invisible_p (entry) == 0) && table == global_variables->table)
- {
-@@ -2550,6 +2567,16 @@ bind_variable_internal (name, value, tab
- var_setvalue (entry, make_variable_value (entry, value, 0));
- }
- }
-+#if defined (ARRAY_VARS)
-+ else if (entry == 0 && newname)
-+ {
-+ entry = make_new_array_variable (newname); /* indexed array by default */
-+ if (entry == 0)
-+ return entry;
-+ ind = array_expand_index (name, subp, sublen);
-+ bind_array_element (entry, ind, value, aflags);
-+ }
-+#endif
- else if (entry == 0)
- {
- entry = make_new_variable (name, table);
-@@ -2670,7 +2697,8 @@ bind_variable (name, value, flags)
- normal. */
- if (nameref_cell (nv) == 0)
- return (bind_variable_internal (nv->name, value, nvc->table, 0, flags));
-- return (bind_variable_internal (nameref_cell (nv), value, nvc->table, 0, flags));
-+ /* XXX - bug here with ref=array[index] */
-+ return (bind_variable_internal (nameref_cell (nv), value, nvc->table, 0, flags|ASS_FROMREF));
- }
- else
- v = nv;
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 30
-+#define PATCHLEVEL 31
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-032
-
-Bug-Reported-by: crispusfairbairn@gmail.com
-Bug-Reference-ID: <b5e499f7-3b98-408d-9f94-c0387580e73a@googlegroups.com>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-09/msg00013.html
-
-Bug-Description:
-
-When bash is running in Posix mode, it allows signals -- including SIGCHLD --
-to interrupt the `wait' builtin, as Posix requires. However, the interrupt
-causes bash to not run a SIGCHLD trap for all exited children. This patch
-fixes the issue and restores the documented behavior in Posix mode.
-
-Patch (apply with `patch -p0'):
-
---- a/jobs.c
-+++ b/jobs.c
-@@ -3339,7 +3339,9 @@ itrace("waitchld: waitpid returns %d blo
- if (posixly_correct && this_shell_builtin && this_shell_builtin == wait_builtin)
- {
- interrupt_immediately = 0;
-- trap_handler (SIGCHLD); /* set pending_traps[SIGCHLD] */
-+ /* This was trap_handler (SIGCHLD) but that can lose traps if
-+ children_exited > 1 */
-+ queue_sigchld_trap (children_exited);
- wait_signal_received = SIGCHLD;
- /* If we're in a signal handler, let CHECK_WAIT_INTR pick it up;
- run_pending_traps will call run_sigchld_trap later */
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 31
-+#define PATCHLEVEL 32
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-033
-
-Bug-Reported-by: mickael9@gmail.com, Jan Rome <jan.rome@gmail.com>
-Bug-Reference-ID: <20140907224046.382ED3610CC@mickael-laptop.localdomain>,
- <540D661D.50908@gmail.com>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-09/msg00029.html
- http://lists.gnu.org/archive/html/bug-bash/2014-09/msg00030.html
-
-Bug-Description:
-
-Bash does not clean up the terminal state in all cases where bash or
-readline modifies it and bash is subsequently terminated by a fatal signal.
-This happens when the `read' builtin modifies the terminal settings, both
-when readline is active and when it is not. It occurs most often when a script
-installs a trap that exits on a signal without re-sending the signal to itself.
-
-Patch (apply with `patch -p0'):
-
---- a/shell.c
-+++ b/shell.c
-@@ -73,6 +73,7 @@
- #endif
-
- #if defined (READLINE)
-+# include <readline/readline.h>
- # include "bashline.h"
- #endif
-
-@@ -909,6 +910,14 @@ exit_shell (s)
- fflush (stdout); /* XXX */
- fflush (stderr);
-
-+ /* Clean up the terminal if we are in a state where it's been modified. */
-+#if defined (READLINE)
-+ if (RL_ISSTATE (RL_STATE_TERMPREPPED) && rl_deprep_term_function)
-+ (*rl_deprep_term_function) ();
-+#endif
-+ if (read_tty_modified ())
-+ read_tty_cleanup ();
-+
- /* Do trap[0] if defined. Allow it to override the exit status
- passed to us. */
- if (signal_is_trapped (0))
---- a/builtins/read.def
-+++ b/builtins/read.def
-@@ -140,10 +140,12 @@ static void reset_alarm __P((void));
- procenv_t alrmbuf;
- int sigalrm_seen;
-
--static int reading;
-+static int reading, tty_modified;
- static SigHandler *old_alrm;
- static unsigned char delim;
-
-+static struct ttsave termsave;
-+
- /* In all cases, SIGALRM just sets a flag that we check periodically. This
- avoids problems with the semi-tricky stuff we do with the xfree of
- input_string at the top of the unwind-protect list (see below). */
-@@ -188,7 +190,6 @@ read_builtin (list)
- struct stat tsb;
- SHELL_VAR *var;
- TTYSTRUCT ttattrs, ttset;
-- struct ttsave termsave;
- #if defined (ARRAY_VARS)
- WORD_LIST *alist;
- #endif
-@@ -221,7 +222,7 @@ read_builtin (list)
- USE_VAR(ps2);
- USE_VAR(lastsig);
-
-- sigalrm_seen = reading = 0;
-+ sigalrm_seen = reading = tty_modified = 0;
-
- i = 0; /* Index into the string that we are reading. */
- raw = edit = 0; /* Not reading raw input by default. */
-@@ -438,6 +439,8 @@ read_builtin (list)
- retval = 128+SIGALRM;
- goto assign_vars;
- }
-+ if (interactive_shell == 0)
-+ initialize_terminating_signals ();
- old_alrm = set_signal_handler (SIGALRM, sigalrm);
- add_unwind_protect (reset_alarm, (char *)NULL);
- #if defined (READLINE)
-@@ -482,7 +485,10 @@ read_builtin (list)
- i = silent ? ttfd_cbreak (fd, &ttset) : ttfd_onechar (fd, &ttset);
- if (i < 0)
- sh_ttyerror (1);
-+ tty_modified = 1;
- add_unwind_protect ((Function *)ttyrestore, (char *)&termsave);
-+ if (interactive_shell == 0)
-+ initialize_terminating_signals ();
- }
- }
- else if (silent) /* turn off echo but leave term in canonical mode */
-@@ -497,7 +503,10 @@ read_builtin (list)
- if (i < 0)
- sh_ttyerror (1);
-
-+ tty_modified = 1;
- add_unwind_protect ((Function *)ttyrestore, (char *)&termsave);
-+ if (interactive_shell == 0)
-+ initialize_terminating_signals ();
- }
-
- /* This *must* be the top unwind-protect on the stack, so the manipulation
-@@ -588,6 +597,8 @@ read_builtin (list)
- }
- else
- lastsig = 0;
-+ if (terminating_signal && tty_modified)
-+ ttyrestore (&termsave); /* fix terminal before exiting */
- CHECK_TERMSIG;
- eof = 1;
- break;
-@@ -978,6 +989,20 @@ ttyrestore (ttp)
- struct ttsave *ttp;
- {
- ttsetattr (ttp->fd, ttp->attrs);
-+ tty_modified = 0;
-+}
-+
-+void
-+read_tty_cleanup ()
-+{
-+ if (tty_modified)
-+ ttyrestore (&termsave);
-+}
-+
-+int
-+read_tty_modified ()
-+{
-+ return (tty_modified);
- }
-
- #if defined (READLINE)
---- a/builtins/common.h
-+++ b/builtins/common.h
-@@ -122,6 +122,10 @@ extern void bash_logout __P((void));
- /* Functions from getopts.def */
- extern void getopts_reset __P((int));
-
-+/* Functions from read.def */
-+extern void read_tty_cleanup __P((void));
-+extern int read_tty_modified __P((void));
-+
- /* Functions from set.def */
- extern int minus_o_option_value __P((char *));
- extern void list_minus_o_opts __P((int, int));
---- a/bashline.c
-+++ b/bashline.c
-@@ -202,6 +202,7 @@ extern int current_command_line_count, s
- extern int last_command_exit_value;
- extern int array_needs_making;
- extern int posixly_correct, no_symbolic_links;
-+extern int sigalrm_seen;
- extern char *current_prompt_string, *ps1_prompt;
- extern STRING_INT_ALIST word_token_alist[];
- extern sh_builtin_func_t *last_shell_builtin, *this_shell_builtin;
-@@ -4208,8 +4209,9 @@ bash_event_hook ()
- {
- /* If we're going to longjmp to top_level, make sure we clean up readline.
- check_signals will call QUIT, which will eventually longjmp to top_level,
-- calling run_interrupt_trap along the way. */
-- if (interrupt_state)
-+ calling run_interrupt_trap along the way. The check for sigalrm_seen is
-+ to clean up the read builtin's state. */
-+ if (terminating_signal || interrupt_state || sigalrm_seen)
- rl_cleanup_after_signal ();
- bashline_reset_event_hook ();
- check_signals_and_traps (); /* XXX */
---- a/sig.c
-+++ b/sig.c
-@@ -532,8 +532,10 @@ termsig_sighandler (sig)
- #if defined (READLINE)
- /* Set the event hook so readline will call it after the signal handlers
- finish executing, so if this interrupted character input we can get
-- quick response. */
-- if (interactive_shell && interactive && no_line_editing == 0)
-+ quick response. If readline is active or has modified the terminal we
-+ need to set this no matter what the signal is, though the check for
-+ RL_STATE_TERMPREPPED is possibly redundant. */
-+ if (RL_ISSTATE (RL_STATE_SIGHANDLER) || RL_ISSTATE (RL_STATE_TERMPREPPED))
- bashline_set_event_hook ();
- #endif
-
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 32
-+#define PATCHLEVEL 33
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-034
-
-Bug-Reported-by: Dreamcat4 <dreamcat4@gmail.com>
-Bug-Reference-ID: <CAN39uTpAEs2GFu4ebC_SfSVMRTh-DJ9YanrY4BZZ3OO+CCHjng@mail.gmail.com>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2015-05/msg00001.html
-
-Bug-Description:
-
-If neither the -f nor -v options is supplied to unset, and a name argument is
-found to be a function and unset, subsequent name arguments are not treated as
-variables before attempting to unset a function by that name.
-
-Patch (apply with `patch -p0'):
-
---- a/builtins/set.def
-+++ b/builtins/set.def
-@@ -751,9 +751,11 @@ unset_builtin (list)
- WORD_LIST *list;
- {
- int unset_function, unset_variable, unset_array, opt, nameref, any_failed;
-+ int global_unset_func, global_unset_var;
- char *name;
-
- unset_function = unset_variable = unset_array = nameref = any_failed = 0;
-+ global_unset_func = global_unset_var = 0;
-
- reset_internal_getopt ();
- while ((opt = internal_getopt (list, "fnv")) != -1)
-@@ -761,10 +763,10 @@ unset_builtin (list)
- switch (opt)
- {
- case 'f':
-- unset_function = 1;
-+ global_unset_func = 1;
- break;
- case 'v':
-- unset_variable = 1;
-+ global_unset_var = 1;
- break;
- case 'n':
- nameref = 1;
-@@ -777,7 +779,7 @@ unset_builtin (list)
-
- list = loptend;
-
-- if (unset_function && unset_variable)
-+ if (global_unset_func && global_unset_var)
- {
- builtin_error (_("cannot simultaneously unset a function and a variable"));
- return (EXECUTION_FAILURE);
-@@ -795,6 +797,9 @@ unset_builtin (list)
-
- name = list->word->word;
-
-+ unset_function = global_unset_func;
-+ unset_variable = global_unset_var;
-+
- #if defined (ARRAY_VARS)
- unset_array = 0;
- if (!unset_function && valid_array_reference (name))
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 33
-+#define PATCHLEVEL 34
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-035
-
-Bug-Reported-by: <romerox.adrian@gmail.com>
-Bug-Reference-ID: <CABV5r3zhPXmSKUe9uedeGc5YFBM2njJ1iVmY2h5neWdQpDBQug@mail.gmail.com>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-08/msg00045.html
-
-Bug-Description:
-
-A locale with a long name can trigger a buffer overflow and core dump. This
-applies on systems that do not have locale_charset in libc, are not using
-GNU libiconv, and are not using the libintl that ships with bash in lib/intl.
-
-Patch (apply with `patch -p0'):
-
---- a/lib/sh/unicode.c
-+++ b/lib/sh/unicode.c
-@@ -78,13 +78,15 @@ stub_charset ()
- s = strrchr (locale, '.');
- if (s)
- {
-- strcpy (charsetbuf, s+1);
-+ strncpy (charsetbuf, s+1, sizeof (charsetbuf) - 1);
-+ charsetbuf[sizeof (charsetbuf) - 1] = '\0';
- t = strchr (charsetbuf, '@');
- if (t)
- *t = 0;
- return charsetbuf;
- }
-- strcpy (charsetbuf, locale);
-+ strncpy (charsetbuf, locale, sizeof (charsetbuf) - 1);
-+ charsetbuf[sizeof (charsetbuf) - 1] = '\0';
- return charsetbuf;
- }
- #endif
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 34
-+#define PATCHLEVEL 35
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-036
-
-Bug-Reported-by: emanuelczirai@cryptolab.net
-Bug-Reference-ID: <f962e4f556da5ebfadaf7afe9c78a8cb@cryptolab.net>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2015-02/msg00071.html
-
-Bug-Description:
-
-When evaluating and setting integer variables, and the assignment fails to
-create a variable (for example, when performing an operation on an array
-variable with an invalid subscript), bash attempts to dereference a null
-pointer, causing a segmentation violation.
-
-Patch (apply with `patch -p0'):
-
---- a/variables.c
-+++ b/variables.c
-@@ -2833,10 +2833,12 @@ bind_int_variable (lhs, rhs)
- #endif
- v = bind_variable (lhs, rhs, 0);
-
-- if (v && isint)
-- VSETATTR (v, att_integer);
--
-- VUNSETATTR (v, att_invisible);
-+ if (v)
-+ {
-+ if (isint)
-+ VSETATTR (v, att_integer);
-+ VUNSETATTR (v, att_invisible);
-+ }
-
- return (v);
- }
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 35
-+#define PATCHLEVEL 36
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-037
-
-Bug-Reported-by: Greg Wooledge <wooledg@eeg.ccf.org>
-Bug-Reference-ID: <20150204144240.GN13956@eeg.ccf.org>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2015-02/msg00007.html
-
-Bug-Description:
-
-If an associative array uses `@' or `*' as a subscript, `declare -p' produces
-output that cannot be reused as input.
-
-Patch (apply with `patch -p0'):
-
---- a/assoc.c
-+++ b/assoc.c
-@@ -436,6 +436,8 @@ assoc_to_assign (hash, quoted)
- #if 1
- if (sh_contains_shell_metas (tlist->key))
- istr = sh_double_quote (tlist->key);
-+ else if (ALL_ELEMENT_SUB (tlist->key[0]) && tlist->key[1] == '\0')
-+ istr = sh_double_quote (tlist->key);
- else
- istr = tlist->key;
- #else
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 36
-+#define PATCHLEVEL 37
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-038
-
-Bug-Reported-by: worley@alum.mit.edu (Dale R. Worley)
-Bug-Reference-ID: <201406100051.s5A0pCeB014978@hobgoblin.ariadne.com>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-06/msg00028.html
-
-Bug-Description:
-
-There are a number of instances where `time' is not recognized as a reserved
-word when the shell grammar says it should be.
-
-Patch (apply with `patch -p0'):
-
---- a/parse.y
-+++ b/parse.y
-@@ -2818,11 +2818,16 @@ time_command_acceptable ()
- case AND_AND:
- case OR_OR:
- case '&':
-+ case WHILE:
- case DO:
-+ case UNTIL:
-+ case IF:
- case THEN:
-+ case ELIF:
- case ELSE:
- case '{': /* } */
-- case '(': /* ) */
-+ case '(': /* )( */
-+ case ')': /* only valid in case statement */
- case BANG: /* ! time pipeline */
- case TIME: /* time time pipeline */
- case TIMEOPT: /* time -p time pipeline */
---- a/y.tab.c
-+++ b/y.tab.c
-@@ -5130,11 +5130,16 @@ time_command_acceptable ()
- case AND_AND:
- case OR_OR:
- case '&':
-+ case WHILE:
- case DO:
-+ case UNTIL:
-+ case IF:
- case THEN:
-+ case ELIF:
- case ELSE:
- case '{': /* } */
-- case '(': /* ) */
-+ case '(': /* )( */
-+ case ')': /* only valid in case statement */
- case BANG: /* ! time pipeline */
- case TIME: /* time time pipeline */
- case TIMEOPT: /* time -p time pipeline */
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 37
-+#define PATCHLEVEL 38
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-039
-
-Bug-Reported-by: SN <poczta-sn@gazeta.pl>
-Bug-Reference-ID: <54E2554C.205@gazeta.pl>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2015-02/msg00060.html
-
-Bug-Description:
-
-Using the output of `declare -p' when run in a function can result in variables
-that are invisible to `declare -p'. This problem occurs when an assignment
-builtin such as `declare' receives a quoted compound array assignment as one of
-its arguments.
-
-Patch (apply with `patch -p0'):
-
---- a/arrayfunc.c
-+++ b/arrayfunc.c
-@@ -404,6 +404,9 @@ assign_array_var_from_word_list (var, li
- (*var->assign_func) (var, l->word->word, i, 0);
- else
- array_insert (a, i, l->word->word);
-+
-+ VUNSETATTR (var, att_invisible); /* no longer invisible */
-+
- return var;
- }
-
-@@ -634,6 +637,10 @@ assign_array_var_from_string (var, value
-
- if (nlist)
- dispose_words (nlist);
-+
-+ if (var)
-+ VUNSETATTR (var, att_invisible); /* no longer invisible */
-+
- return (var);
- }
-
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 38
-+#define PATCHLEVEL 39
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-040
-
-Bug-Reported-by: Jean Delvare <jdelvare@suse.de>
-Bug-Reference-ID: <20150609180231.5f463695@endymion.delvare>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2015-06/msg00033.html
-
-Bug-Description:
-
-There is a memory leak that occurs when bash expands an array reference on
-the rhs of an assignment statement.
-
-Patch (apply with `patch -p0'):
-
---- a/subst.c
-+++ b/subst.c
-@@ -5782,7 +5782,7 @@ expand_arrayref:
- /* XXX - does this leak if name[@] or name[*]? */
- if (pflags & PF_ASSIGNRHS)
- {
-- temp = array_variable_name (name, &tt, (int *)0);
-+ var = array_variable_part (name, &tt, (int *)0);
- if (ALL_ELEMENT_SUB (tt[0]) && tt[1] == ']')
- temp = array_value (name, quoted|Q_DOUBLE_QUOTES, 0, &atype, &ind);
- else
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 39
-+#define PATCHLEVEL 40
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-041
-
-Bug-Reported-by: Hanno Böck <hanno@hboeck.de>
-Bug-Reference-ID: <20150623131106.6f111da9@pc1>, <20150707004640.0e61d2f9@pc1>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2015-06/msg00089.html,
- http://lists.gnu.org/archive/html/bug-bash/2015-07/msg00018.html
-
-Bug-Description:
-
-There are several out-of-bounds read errors that occur when completing command
-lines where assignment statements appear before the command name. The first
-two appear only when programmable completion is enabled; the last one only
-happens when listing possible completions.
-
-Patch (apply with `patch -p0'):
-
---- a/bashline.c
-+++ b/bashline.c
-@@ -1468,10 +1468,23 @@ attempt_shell_completion (text, start, e
-
- os = start;
- n = 0;
-+ was_assignment = 0;
- s = find_cmd_start (os);
- e = find_cmd_end (end);
- do
- {
-+ /* Don't read past the end of rl_line_buffer */
-+ if (s > rl_end)
-+ {
-+ s1 = s = e1;
-+ break;
-+ }
-+ /* Or past point if point is within an assignment statement */
-+ else if (was_assignment && s > rl_point)
-+ {
-+ s1 = s = e1;
-+ break;
-+ }
- /* Skip over assignment statements preceding a command name. If we
- don't find a command name at all, we can perform command name
- completion. If we find a partial command name, we should perform
---- a/lib/readline/complete.c
-+++ b/lib/readline/complete.c
-@@ -689,6 +689,8 @@ printable_part (pathname)
-
- if (temp == 0 || *temp == '\0')
- return (pathname);
-+ else if (temp[1] == 0 && temp == pathname)
-+ return (pathname);
- /* If the basename is NULL, we might have a pathname like '/usr/src/'.
- Look for a previous slash and, if one is found, return the portion
- following that slash. If there's no previous slash, just return the
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 40
-+#define PATCHLEVEL 41
-
- #endif /* _PATCHLEVEL_H_ */
+++ /dev/null
- BASH PATCH REPORT
- =================
-
-Bash-Release: 4.3
-Patch-ID: bash43-042
-
-Bug-Reported-by: Nathan Neulinger <nneul@neulinger.org>
-Bug-Reference-ID: <558EFDF2.7060402@neulinger.org>
-Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2015-06/msg00096.html
-
-Bug-Description:
-
-There is a problem when parsing command substitutions containing `case'
-commands within pipelines that causes the parser to not correctly identify
-the end of the command substitution.
-
-Patch (apply with `patch -p0'):
-
---- a/parse.y
-+++ b/parse.y
-@@ -3708,6 +3708,8 @@ eof_error:
- /*itrace("parse_comsub:%d: lex_inword -> 1 ch = `%c' (%d)", line_number, ch, __LINE__);*/
- tflags |= LEX_INWORD;
- lex_wlen = 0;
-+ if (tflags & LEX_RESWDOK)
-+ lex_rwlen = 0;
- }
- }
-
---- a/y.tab.c
-+++ b/y.tab.c
-@@ -6020,6 +6020,8 @@ eof_error:
- /*itrace("parse_comsub:%d: lex_inword -> 1 ch = `%c' (%d)", line_number, ch, __LINE__);*/
- tflags |= LEX_INWORD;
- lex_wlen = 0;
-+ if (tflags & LEX_RESWDOK)
-+ lex_rwlen = 0;
- }
- }
-
---- a/patchlevel.h
-+++ b/patchlevel.h
-@@ -25,6 +25,6 @@
- regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
- looks for to find the patch level (for the sccs version string). */
-
--#define PATCHLEVEL 41
-+#define PATCHLEVEL 42
-
- #endif /* _PATCHLEVEL_H_ */