From 8ff4f2f51a6cf07fc33742ce3bee81328896e49b Mon Sep 17 00:00:00 2001 From: Patrick J Volkerding Date: Fri, 25 May 2018 23:29:36 +0000 Subject: Fri May 25 23:29:36 UTC 2018 patches/packages/glibc-zoneinfo-2018e-noarch-2_slack14.1.txz: Rebuilt. Handle removal of US/Pacific-New timezone. If we see that the machine is using this, it will be automatically switched to US/Pacific. --- patches/source/glibc/doinst.sh-glibc | 197 ++ patches/source/glibc/doinst.sh-glibc-solibs | 137 + patches/source/glibc/doinst.sh-glibc-zoneinfo | 17 + .../glibc/glibc-2.10-dns-no-gethostbyname4.diff | 26 + patches/source/glibc/glibc-2.17_CVE-2012-4412.diff | 116 + patches/source/glibc/glibc-2.17_CVE-2012-4424.diff | 400 +++ patches/source/glibc/glibc-2.17_CVE-2013-2207.diff | 241 ++ patches/source/glibc/glibc-2.17_CVE-2013-4237.diff | 286 ++ patches/source/glibc/glibc-2.17_CVE-2013-4332.diff | 64 + patches/source/glibc/glibc-2.17_CVE-2013-4458.diff | 52 + patches/source/glibc/glibc-2.17_CVE-2013-4788.diff | 460 +++ patches/source/glibc/glibc-2.17_CVE-2014-0475.diff | 404 +++ patches/source/glibc/glibc-2.17_CVE-2014-4043.diff | 142 + patches/source/glibc/glibc-2.17_CVE-2014-5119.diff | 206 ++ patches/source/glibc/glibc-2.17_CVE-2014-6040.diff | 153 + patches/source/glibc/glibc-2.17_CVE-2015-7547.diff | 571 +++ .../glibc/glibc-2.17_gcc48-unsafe-optim.diff | 49 + patches/source/glibc/glibc-2.17_hardening.diff | 33 + .../source/glibc/glibc-2.17_strcoll-change.diff | 802 +++++ patches/source/glibc/glibc-cvs-checkout.sh | 3 + patches/source/glibc/glibc.CVE-2013-0242.diff | 189 + patches/source/glibc/glibc.CVE-2013-1914.diff | 53 + patches/source/glibc/glibc.CVE-2013-2207.diff | 241 ++ patches/source/glibc/glibc.CVE-2013-4332.diff | 64 + .../source/glibc/glibc.CVE-2015-0235.glibc217.diff | 217 ++ patches/source/glibc/glibc.SlackBuild | 536 +++ .../glibc.disable.broken.optimized.memcpy.diff | 30 + patches/source/glibc/glibc.getcwd.max.macro.diff | 10 + ...-4a531bb0b3b582cb693de9f76d2d97d970f9a5d5.patch | 1212 +++++++ ...ba58405325d78cefeae5cdf699-CVE-2010-3847b.patch | 27 + .../glibc.ldd.trace.through.dynamic.linker.diff | 49 + patches/source/glibc/glibc.locale.no-archive.diff | 10 + patches/source/glibc/glibc.make-3.82.diff | 28 + patches/source/glibc/glibc.nis-netgroups.diff | 12 + .../glibc/glibc.revert.to.fix.build.breakages.diff | 13 + patches/source/glibc/glibc.ru_RU.CP1251.diff | 10 + patches/source/glibc/is_IS.diff | 19 + patches/source/glibc/profile.d/glibc.csh.new | 9 + patches/source/glibc/profile.d/glibc.sh.new | 8 + patches/source/glibc/slack-desc.glibc | 19 + patches/source/glibc/slack-desc.glibc-debug | 19 + patches/source/glibc/slack-desc.glibc-i18n | 19 + patches/source/glibc/slack-desc.glibc-profile | 19 + patches/source/glibc/slack-desc.glibc-solibs | 19 + .../glibc/slack-desc.glibc-solibs-linuxthreads | 18 + patches/source/glibc/slack-desc.glibc-zoneinfo | 19 + .../source/glibc/slack-desc.glibc-zoneinfo.olson | 19 + .../timezone-scripts/output-updated-timeconfig.sh | 53 + patches/source/glibc/timezone-scripts/parts/00 | 131 + patches/source/glibc/timezone-scripts/parts/01 | 1658 +++++++++ patches/source/glibc/timezone-scripts/parts/02 | 28 + patches/source/glibc/timezone-scripts/parts/03 | 1658 +++++++++ patches/source/glibc/timezone-scripts/parts/04 | 32 + patches/source/glibc/timezone-scripts/parts/README | 2 + .../source/glibc/timezone-scripts/setup.timeconfig | 3 + patches/source/glibc/timezone-scripts/timeconfig | 3695 ++++++++++++++++++++ 56 files changed, 14507 insertions(+) create mode 100644 patches/source/glibc/doinst.sh-glibc create mode 100644 patches/source/glibc/doinst.sh-glibc-solibs create mode 100644 patches/source/glibc/doinst.sh-glibc-zoneinfo create mode 100644 patches/source/glibc/glibc-2.10-dns-no-gethostbyname4.diff create mode 100644 patches/source/glibc/glibc-2.17_CVE-2012-4412.diff create mode 100644 patches/source/glibc/glibc-2.17_CVE-2012-4424.diff create mode 100644 patches/source/glibc/glibc-2.17_CVE-2013-2207.diff create mode 100644 patches/source/glibc/glibc-2.17_CVE-2013-4237.diff create mode 100644 patches/source/glibc/glibc-2.17_CVE-2013-4332.diff create mode 100644 patches/source/glibc/glibc-2.17_CVE-2013-4458.diff create mode 100644 patches/source/glibc/glibc-2.17_CVE-2013-4788.diff create mode 100644 patches/source/glibc/glibc-2.17_CVE-2014-0475.diff create mode 100644 patches/source/glibc/glibc-2.17_CVE-2014-4043.diff create mode 100644 patches/source/glibc/glibc-2.17_CVE-2014-5119.diff create mode 100644 patches/source/glibc/glibc-2.17_CVE-2014-6040.diff create mode 100644 patches/source/glibc/glibc-2.17_CVE-2015-7547.diff create mode 100644 patches/source/glibc/glibc-2.17_gcc48-unsafe-optim.diff create mode 100644 patches/source/glibc/glibc-2.17_hardening.diff create mode 100644 patches/source/glibc/glibc-2.17_strcoll-change.diff create mode 100755 patches/source/glibc/glibc-cvs-checkout.sh create mode 100644 patches/source/glibc/glibc.CVE-2013-0242.diff create mode 100644 patches/source/glibc/glibc.CVE-2013-1914.diff create mode 100644 patches/source/glibc/glibc.CVE-2013-2207.diff create mode 100644 patches/source/glibc/glibc.CVE-2013-4332.diff create mode 100644 patches/source/glibc/glibc.CVE-2015-0235.glibc217.diff create mode 100755 patches/source/glibc/glibc.SlackBuild create mode 100644 patches/source/glibc/glibc.disable.broken.optimized.memcpy.diff create mode 100644 patches/source/glibc/glibc.getcwd.max.macro.diff create mode 100644 patches/source/glibc/glibc.git-4a531bb0b3b582cb693de9f76d2d97d970f9a5d5.patch create mode 100644 patches/source/glibc/glibc.git-96611391ad8823ba58405325d78cefeae5cdf699-CVE-2010-3847b.patch create mode 100644 patches/source/glibc/glibc.ldd.trace.through.dynamic.linker.diff create mode 100644 patches/source/glibc/glibc.locale.no-archive.diff create mode 100644 patches/source/glibc/glibc.make-3.82.diff create mode 100644 patches/source/glibc/glibc.nis-netgroups.diff create mode 100644 patches/source/glibc/glibc.revert.to.fix.build.breakages.diff create mode 100644 patches/source/glibc/glibc.ru_RU.CP1251.diff create mode 100644 patches/source/glibc/is_IS.diff create mode 100755 patches/source/glibc/profile.d/glibc.csh.new create mode 100755 patches/source/glibc/profile.d/glibc.sh.new create mode 100644 patches/source/glibc/slack-desc.glibc create mode 100644 patches/source/glibc/slack-desc.glibc-debug create mode 100644 patches/source/glibc/slack-desc.glibc-i18n create mode 100644 patches/source/glibc/slack-desc.glibc-profile create mode 100644 patches/source/glibc/slack-desc.glibc-solibs create mode 100644 patches/source/glibc/slack-desc.glibc-solibs-linuxthreads create mode 100644 patches/source/glibc/slack-desc.glibc-zoneinfo create mode 100644 patches/source/glibc/slack-desc.glibc-zoneinfo.olson create mode 100644 patches/source/glibc/timezone-scripts/output-updated-timeconfig.sh create mode 100644 patches/source/glibc/timezone-scripts/parts/00 create mode 100644 patches/source/glibc/timezone-scripts/parts/01 create mode 100644 patches/source/glibc/timezone-scripts/parts/02 create mode 100644 patches/source/glibc/timezone-scripts/parts/03 create mode 100644 patches/source/glibc/timezone-scripts/parts/04 create mode 100644 patches/source/glibc/timezone-scripts/parts/README create mode 100644 patches/source/glibc/timezone-scripts/setup.timeconfig create mode 100644 patches/source/glibc/timezone-scripts/timeconfig (limited to 'patches/source/glibc') diff --git a/patches/source/glibc/doinst.sh-glibc b/patches/source/glibc/doinst.sh-glibc new file mode 100644 index 000000000..5904dc751 --- /dev/null +++ b/patches/source/glibc/doinst.sh-glibc @@ -0,0 +1,197 @@ +#!/bin/sh +# Copyright (C) 2002, 2005 Slackware Linux, Inc. +# Copyright 2005, 2006, 2007, 2011, 2012 Patrick J. Volkerding, Sebeka, Minnesota, USA +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# Swap glibc on the fly. +# +# If we're on a running system we have to handle this _very_ carefully. :-) +# The tricks involved here get trickier every time... + +# OK, now we have to be sure of a few things. First, you do have a 2.6 +# kernel running, right? + +if [ -r /proc/ksyms ]; then + echo "FATAL: you need to be running a 2.6.x kernel in order to upgrade" + echo "to this version of glibc." + echo + sleep 999 + exit 1 +fi + +# Next, stop using the /lib/ntpl libraries. These are now obsolete and +# will break the installation if present: +if [ -d lib/tls ]; then + mkdir -p lib/obsolete + mv lib/tls lib/obsolete +fi +if [ -x sbin/ldconfig ]; then + sbin/ldconfig -r . +fi + +# Install NPTL glibc libraries: +if [ -x /sbin/ldconfig -a -d lib/incoming ]; then # swap on the fly + # First create copies of the incoming libraries: + ( cd lib/incoming + for file in * ; do + if [ ! -r ../${file}.incoming ]; then + cp -a $file ../${file}.incoming + fi + done + ) + # Then switch to them all at once: + /sbin/ldconfig -l lib/*.incoming 2> /dev/null + # Finally, rename them and clean up: + ( cd lib + for file in *.incoming ; do + rm -f `basename $file .incoming` + cp -a $file `basename $file .incoming` + /sbin/ldconfig -l `basename $file .incoming` + rm -f $file + done + ) +else # no ldconfig? Good, it's safe to just jam it on home (and make links below): + ( cd lib/incoming + for file in * ; do + cp -a $file .. + done + ) +fi +# Now, get rid of the temporary directory: +rm -rf lib/incoming +# Done installing NPTL glibc libraries. + +# Timezone stuff: +if [ -L etc/localtime -a ! -r etc/localtime-copied-from ]; then + mv etc/localtime etc/localtime-copied-from + chroot . /bin/cp etc/localtime-copied-from etc/localtime +fi +# Add the default timezone in /etc, if none exists: +if [ ! -r etc/localtime ]; then + ( cd etc ; rm -rf localtime localtime-copied-from ) + ( cd etc ; ln -sf /usr/share/zoneinfo/Factory localtime-copied-from ) + chroot . /bin/cp etc/localtime-copied-from etc/localtime +fi +# Add the default link in /usr/share/zoneinfo, if none exists: +if [ ! -L usr/share/zoneinfo/localtime ]; then + ( cd usr/share/zoneinfo ; rm -rf localtime ) + ( cd usr/share/zoneinfo ; ln -sf /etc/localtime localtime ) +fi +( cd usr/share/zoneinfo ; rm -rf timeconfig ) +( cd usr/share/zoneinfo ; ln -sf /usr/sbin/timeconfig timeconfig ) + +# Handle config files: +config() { + NEW="$1" + OLD="$(dirname $NEW)/$(basename $NEW .new)" + # If there's no config file by that name, mv it over: + if [ ! -r $OLD ]; then + mv $NEW $OLD + elif [ "$(cat $OLD | md5sum)" = "$(cat $NEW | md5sum)" ]; then # toss the redundant copy + rm $NEW + fi + # Otherwise, we leave the .new copy for the admin to consider... +} +config etc/nscd.conf.new +config etc/profile.d/glibc.csh.new +config etc/profile.d/glibc.sh.new +# Clearly you already decided this issue. :-) +rm -f etc/profile.d/glibc.csh.new +rm -f etc/profile.d/glibc.sh.new + +# In case there's no ldconfig, make the links manually: +if [ ! -x /sbin/ldconfig ]; then +( cd lib ; rm -rf libnss_nis.so.2 ) +( cd lib ; ln -sf libnss_nis-2.17.so libnss_nis.so.2 ) +( cd lib ; rm -rf libm.so.6 ) +( cd lib ; ln -sf libm-2.17.so libm.so.6 ) +( cd lib ; rm -rf libnss_files.so.2 ) +( cd lib ; ln -sf libnss_files-2.17.so libnss_files.so.2 ) +( cd lib ; rm -rf libresolv.so.2 ) +( cd lib ; ln -sf libresolv-2.17.so libresolv.so.2 ) +( cd lib ; rm -rf libnsl.so.1 ) +( cd lib ; ln -sf libnsl-2.17.so libnsl.so.1 ) +( cd lib ; rm -rf libutil.so.1 ) +( cd lib ; ln -sf libutil-2.17.so libutil.so.1 ) +( cd lib ; rm -rf libnss_compat.so.2 ) +( cd lib ; ln -sf libnss_compat-2.17.so libnss_compat.so.2 ) +( cd lib ; rm -rf libthread_db.so.1 ) +( cd lib ; ln -sf libthread_db-1.0.so libthread_db.so.1 ) +( cd lib ; rm -rf libnss_hesiod.so.2 ) +( cd lib ; ln -sf libnss_hesiod-2.17.so libnss_hesiod.so.2 ) +( cd lib ; rm -rf libanl.so.1 ) +( cd lib ; ln -sf libanl-2.17.so libanl.so.1 ) +( cd lib ; rm -rf libcrypt.so.1 ) +( cd lib ; ln -sf libcrypt-2.17.so libcrypt.so.1 ) +( cd lib ; rm -rf libBrokenLocale.so.1 ) +( cd lib ; ln -sf libBrokenLocale-2.17.so libBrokenLocale.so.1 ) +( cd lib ; rm -rf ld-linux.so.2 ) +( cd lib ; ln -sf ld-2.17.so ld-linux.so.2 ) +( cd lib ; rm -rf libdl.so.2 ) +( cd lib ; ln -sf libdl-2.17.so libdl.so.2 ) +( cd lib ; rm -rf libnss_dns.so.2 ) +( cd lib ; ln -sf libnss_dns-2.17.so libnss_dns.so.2 ) +( cd lib ; rm -rf libpthread.so.0 ) +( cd lib ; ln -sf libpthread-2.17.so libpthread.so.0 ) +( cd lib ; rm -rf libnss_nisplus.so.2 ) +( cd lib ; ln -sf libnss_nisplus-2.17.so libnss_nisplus.so.2 ) +( cd lib ; rm -rf libc.so.6 ) +( cd lib ; ln -sf libc-2.17.so libc.so.6 ) +( cd lib ; rm -rf librt.so.1 ) +( cd lib ; ln -sf librt-2.17.so librt.so.1 ) +fi + +# More links: +( cd usr/lib ; rm -rf libnss_nisplus.so ) +( cd usr/lib ; ln -sf ../../lib/libnss_nisplus.so.2 libnss_nisplus.so ) +# This is now a linker script: +#( cd usr/lib ; rm -rf libpthread.so ) +#( cd usr/lib ; ln -sf ../../lib/libpthread.so.0 libpthread.so ) +( cd usr/lib ; rm -rf libresolv.so ) +( cd usr/lib ; ln -sf ../../lib/libresolv.so.2 libresolv.so ) +( cd usr/lib ; rm -rf libnsl.so ) +( cd usr/lib ; ln -sf ../../lib/libnsl.so.1 libnsl.so ) +( cd usr/lib ; rm -rf libnss_hesiod.so ) +( cd usr/lib ; ln -sf ../../lib/libnss_hesiod.so.2 libnss_hesiod.so ) +( cd usr/lib ; rm -rf libnss_files.so ) +( cd usr/lib ; ln -sf ../../lib/libnss_files.so.2 libnss_files.so ) +( cd usr/lib ; rm -rf libm.so ) +( cd usr/lib ; ln -sf ../../lib/libm.so.6 libm.so ) +( cd usr/lib ; rm -rf libutil.so ) +( cd usr/lib ; ln -sf ../../lib/libutil.so.1 libutil.so ) +( cd usr/lib ; rm -rf libnss_compat.so ) +( cd usr/lib ; ln -sf ../../lib/libnss_compat.so.2 libnss_compat.so ) +( cd usr/lib ; rm -rf libthread_db.so ) +( cd usr/lib ; ln -sf ../../lib/libthread_db.so.1 libthread_db.so ) +( cd usr/lib ; rm -rf libcrypt.so ) +( cd usr/lib ; ln -sf ../../lib/libcrypt.so.1 libcrypt.so ) +( cd usr/lib ; rm -rf libBrokenLocale.so ) +( cd usr/lib ; ln -sf ../../lib/libBrokenLocale.so.1 libBrokenLocale.so ) +( cd usr/lib ; rm -rf libdl.so ) +( cd usr/lib ; ln -sf ../../lib/libdl.so.2 libdl.so ) +( cd usr/lib ; rm -rf libnss_dns.so ) +( cd usr/lib ; ln -sf ../../lib/libnss_dns.so.2 libnss_dns.so ) +( cd usr/lib ; rm -rf librt.so ) +( cd usr/lib ; ln -sf ../../lib/librt.so.1 librt.so ) +( cd usr/lib ; rm -rf libanl.so ) +( cd usr/lib ; ln -sf ../../lib/libanl.so.1 libanl.so ) +( cd usr/lib ; rm -rf libnss_nis.so ) +( cd usr/lib ; ln -sf ../../lib/libnss_nis.so.2 libnss_nis.so ) +( cd usr/share/zoneinfo ; rm -rf localtime ) +( cd usr/share/zoneinfo ; ln -sf /etc/localtime localtime ) +( cd bin ; rm -rf sln ) +( cd bin ; ln -sf /sbin/sln sln ) + +# Reload to prevent init from holding a stale handle to glibc on shutdown: +if [ -x /sbin/telinit ]; then + /sbin/telinit u +fi diff --git a/patches/source/glibc/doinst.sh-glibc-solibs b/patches/source/glibc/doinst.sh-glibc-solibs new file mode 100644 index 000000000..f721926cf --- /dev/null +++ b/patches/source/glibc/doinst.sh-glibc-solibs @@ -0,0 +1,137 @@ +#!/bin/sh +# Copyright (C) 2002, 2005 Slackware Linux, Inc. +# Copyright 2005, 2006, 2011, 2012 Patrick J. Volkerding, Sebeka, Minnesota, USA +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# Swap glibc on the fly. +# +# If we're on a running system we have to handle this _very_ carefully. :-) +# The tricks involved here get trickier every time... + +# OK, now we have to be sure of a few things. First, you do have a 2.6 +# kernel running, right? + +if [ -r /proc/ksyms ]; then + echo "FATAL: you need to be running a 2.6.x kernel in order to upgrade" + echo "to this version of glibc." + echo + sleep 999 + exit 1 +fi + +# Next, stop using the /lib/ntpl libraries. These are now obsolete and +# will break the installation if present: +if [ -d lib/tls ]; then + mkdir -p lib/obsolete + mv lib/tls lib/obsolete +fi +if [ -x sbin/ldconfig ]; then + sbin/ldconfig -r . +fi + +# Install NPTL glibc libraries: +if [ -x /sbin/ldconfig -a -d lib/incoming ]; then # swap on the fly + # First create copies of the incoming libraries: + ( cd lib/incoming + for file in * ; do + if [ ! -r ../${file}.incoming ]; then + cp -a $file ../${file}.incoming + fi + done + ) + # Then switch to them all at once: + /sbin/ldconfig -l lib/*.incoming 2> /dev/null + # Finally, rename them and clean up: + ( cd lib + for file in *.incoming ; do + rm -f `basename $file .incoming` + cp -a $file `basename $file .incoming` + /sbin/ldconfig -l `basename $file .incoming` + rm -f $file + done + ) +else # no ldconfig? Good, it's safe to just jam it on home (and make links below): + ( cd lib/incoming + for file in * ; do + cp -a $file .. + done + ) +fi +# Now, get rid of the temporary directory: +rm -rf lib/incoming +# Done installing NPTL glibc libraries. + +# Handle config files: +config() { + NEW="$1" + OLD="$(dirname $NEW)/$(basename $NEW .new)" + # If there's no config file by that name, mv it over: + if [ ! -r $OLD ]; then + mv $NEW $OLD + elif [ "$(cat $OLD | md5sum)" = "$(cat $NEW | md5sum)" ]; then # toss the redundant copy + rm $NEW + fi + # Otherwise, we leave the .new copy for the admin to consider... +} +config etc/profile.d/glibc.csh.new +config etc/profile.d/glibc.sh.new +# Clearly you already decided this issue. :-) +rm -f etc/profile.d/glibc.csh.new +rm -f etc/profile.d/glibc.sh.new + +# In case there's no ldconfig, make the links manually: +if [ ! -x /sbin/ldconfig ]; then +( cd lib ; rm -rf libnss_nis.so.2 ) +( cd lib ; ln -sf libnss_nis-2.17.so libnss_nis.so.2 ) +( cd lib ; rm -rf libm.so.6 ) +( cd lib ; ln -sf libm-2.17.so libm.so.6 ) +( cd lib ; rm -rf libnss_files.so.2 ) +( cd lib ; ln -sf libnss_files-2.17.so libnss_files.so.2 ) +( cd lib ; rm -rf libresolv.so.2 ) +( cd lib ; ln -sf libresolv-2.17.so libresolv.so.2 ) +( cd lib ; rm -rf libnsl.so.1 ) +( cd lib ; ln -sf libnsl-2.17.so libnsl.so.1 ) +( cd lib ; rm -rf libutil.so.1 ) +( cd lib ; ln -sf libutil-2.17.so libutil.so.1 ) +( cd lib ; rm -rf libnss_compat.so.2 ) +( cd lib ; ln -sf libnss_compat-2.17.so libnss_compat.so.2 ) +( cd lib ; rm -rf libthread_db.so.1 ) +( cd lib ; ln -sf libthread_db-1.0.so libthread_db.so.1 ) +( cd lib ; rm -rf libnss_hesiod.so.2 ) +( cd lib ; ln -sf libnss_hesiod-2.17.so libnss_hesiod.so.2 ) +( cd lib ; rm -rf libanl.so.1 ) +( cd lib ; ln -sf libanl-2.17.so libanl.so.1 ) +( cd lib ; rm -rf libcrypt.so.1 ) +( cd lib ; ln -sf libcrypt-2.17.so libcrypt.so.1 ) +( cd lib ; rm -rf libBrokenLocale.so.1 ) +( cd lib ; ln -sf libBrokenLocale-2.17.so libBrokenLocale.so.1 ) +( cd lib ; rm -rf ld-linux.so.2 ) +( cd lib ; ln -sf ld-2.17.so ld-linux.so.2 ) +( cd lib ; rm -rf libdl.so.2 ) +( cd lib ; ln -sf libdl-2.17.so libdl.so.2 ) +( cd lib ; rm -rf libnss_dns.so.2 ) +( cd lib ; ln -sf libnss_dns-2.17.so libnss_dns.so.2 ) +( cd lib ; rm -rf libpthread.so.0 ) +( cd lib ; ln -sf libpthread-2.17.so libpthread.so.0 ) +( cd lib ; rm -rf libnss_nisplus.so.2 ) +( cd lib ; ln -sf libnss_nisplus-2.17.so libnss_nisplus.so.2 ) +( cd lib ; rm -rf libc.so.6 ) +( cd lib ; ln -sf libc-2.17.so libc.so.6 ) +( cd lib ; rm -rf librt.so.1 ) +( cd lib ; ln -sf librt-2.17.so librt.so.1 ) +fi + +# Reload to prevent init from holding a stale handle to glibc on shutdown: +if [ -x /sbin/telinit ]; then + /sbin/telinit u +fi + diff --git a/patches/source/glibc/doinst.sh-glibc-zoneinfo b/patches/source/glibc/doinst.sh-glibc-zoneinfo new file mode 100644 index 000000000..04bfe8eff --- /dev/null +++ b/patches/source/glibc/doinst.sh-glibc-zoneinfo @@ -0,0 +1,17 @@ +# Prep the library links: +ldconfig -r . +# Fix existing old style /etc/localtime symlink: +if [ -L etc/localtime -a ! -r etc/localtime-copied-from ]; then + mv etc/localtime etc/localtime-copied-from +fi +# Add the default timezone in /etc, if none exists: +if [ ! -r etc/localtime ]; then + ( cd etc ; rm -rf localtime localtime-copied-from ) + ( cd etc ; ln -sf /usr/share/zoneinfo/Factory localtime-copied-from ) +fi +# Make sure /etc/localtime is updated: +chroot . /bin/cp etc/localtime-copied-from etc/localtime +# Add the default link in /usr/share/zoneinfo: +( cd usr/share/zoneinfo ; rm -rf timeconfig ) +( cd usr/share/zoneinfo ; ln -sf /usr/sbin/timeconfig timeconfig ) +### Make the rest of the symbolic links in the zoneinfo database: diff --git a/patches/source/glibc/glibc-2.10-dns-no-gethostbyname4.diff b/patches/source/glibc/glibc-2.10-dns-no-gethostbyname4.diff new file mode 100644 index 000000000..3fa365afa --- /dev/null +++ b/patches/source/glibc/glibc-2.10-dns-no-gethostbyname4.diff @@ -0,0 +1,26 @@ +The gethostbyname4() lookup method is problematic since it fires out both +the A and AAAA DNS queries in parallel and over the same socket. This +should work in theory, but it turns out that many cheap DSL modems and +similar devices have buggy DNS servers - if the AAAA query arrives too +quickly after the A query, the server will generate only a single reply +with the A query id but returning an error for the AAAA query; we get +stuck waiting for the second reply. + +For gethostbyname4() users affected, disabling IPv6 in the system might +work around the issue, unfortunately it only helps with applications +using AI_ADDRCONFIG (e.g. Firefox); some (notably e.g. Pidgin) neglect +to do that. + +Real fix should be using separate ports for the A and AAAA queries. + +--- resolv/Versions 2008-08-02 10:26:09.000000000 +0200 ++++ resolv/Versions 2008-12-08 12:51:53.000000000 +0100 +@@ -102,7 +102,7 @@ libnss_dns { + _nss_dns_gethostbyname_r; _nss_dns_getnetbyaddr_r; + _nss_dns_getnetbyname_r; _nss_dns_getcanonname_r; + _nss_dns_gethostbyaddr2_r; +- _nss_dns_gethostbyname4_r; ++# _nss_dns_gethostbyname4_r; + } + } + diff --git a/patches/source/glibc/glibc-2.17_CVE-2012-4412.diff b/patches/source/glibc/glibc-2.17_CVE-2012-4412.diff new file mode 100644 index 000000000..107302c78 --- /dev/null +++ b/patches/source/glibc/glibc-2.17_CVE-2012-4412.diff @@ -0,0 +1,116 @@ +From 40790558474490d9d1aee5502cccb92e1c45e196 Mon Sep 17 00:00:00 2001 +From: mancha +Date: Wed, 23 Oct 2013 +Subject: CVE-2012-4412 + +strcoll is implemented using a cache for indices and weights of +collation sequences in the strings so that subsequent passes do not +have to search through collation data again. For very large string +inputs, the cache size computation could overflow. In such a case, +use the fallback function that does not cache indices and weights of +collation sequences. + +--- +This patch was adapted for glibc 2.17 based on: +https://sourceware.org/git/?p=glibc.git;a=commit;h=303e567a8062 +--- + + Makefile | 2 + + strcoll_l.c | 10 +++++++- + tst-strcoll-overflow.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 72 insertions(+), 1 deletion(-) + +--- a/string/Makefile ++++ b/string/Makefile +@@ -61,6 +61,8 @@ tests := tester inl-tester noinl-tester testcopy test-ffs \ + tests-ifunc := $(strop-tests:%=test-%-ifunc) + tests += $(tests-ifunc) + ++xtests = tst-strcoll-overflow ++ + include ../Rules + + tester-ENV = LANGUAGE=C +--- a/string/strcoll_l.c ++++ b/string/strcoll_l.c +@@ -524,7 +524,15 @@ STRCOLL (const STRING_TYPE *s1, const STRING_TYPE *s2, __locale_t l) + memset (&seq1, 0, sizeof (seq1)); + seq2 = seq1; + +- if (! __libc_use_alloca ((s1len + s2len) * (sizeof (int32_t) + 1))) ++ size_t size_max = SIZE_MAX / (sizeof (int32_t) + 1); ++ ++ if (MIN (s1len, s2len) > size_max ++ || MAX (s1len, s2len) > size_max - MIN (s1len, s2len)) ++ { ++ /* If the strings are long enough to cause overflow in the size request, ++ then skip the allocation and proceed with the non-cached routines. */ ++ } ++ else if (! __libc_use_alloca ((s1len + s2len) * (sizeof (int32_t) + 1))) + { + seq1.idxarr = (int32_t *) malloc ((s1len + s2len) * (sizeof (int32_t) + 1)); + +--- /dev/null ++++ b/string/tst-strcoll-overflow.c +@@ -0,0 +1,61 @@ ++/* Copyright (C) 2013 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++/* Verify that strcoll does not crash for large strings for which it cannot ++ cache weight lookup results. The size is large enough to cause integer ++ overflows on 32-bit as well as buffer overflows on 64-bit. The test should ++ work reasonably reliably when overcommit is disabled, but it obviously ++ depends on how much memory the system has. There's a limitation to this ++ test in that it does not run to completion. Actually collating such a ++ large string can take days and we can't have xcheck running that long. For ++ that reason, we run the test for about 5 minutes and then assume that ++ everything is fine if there are no crashes. */ ++#define SIZE 0x40000000ul ++ ++int ++do_test (void) ++{ ++ if (setlocale (LC_COLLATE, "en_GB.UTF-8") == NULL) ++ { ++ puts ("setlocale failed, cannot test for overflow"); ++ return 0; ++ } ++ ++ char *p = malloc (SIZE); ++ ++ if (p == NULL) ++ { ++ puts ("could not allocate memory"); ++ return 1; ++ } ++ ++ memset (p, 'x', SIZE - 1); ++ p[SIZE - 1] = 0; ++ printf ("%d\n", strcoll (p, p)); ++ return 0; ++} ++ ++#define TIMEOUT 300 ++#define EXPECTED_SIGNAL SIGALRM ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" diff --git a/patches/source/glibc/glibc-2.17_CVE-2012-4424.diff b/patches/source/glibc/glibc-2.17_CVE-2012-4424.diff new file mode 100644 index 000000000..681fe312b --- /dev/null +++ b/patches/source/glibc/glibc-2.17_CVE-2012-4424.diff @@ -0,0 +1,400 @@ +From b538eb33a3ac26cbd7b4a4fbf87cbcf75e37b01e Mon Sep 17 00:00:00 2001 +From: mancha +Date: Wed, 23 Oct 2013 +Subject: CVE-2012-4424 + +strcoll currently falls back to alloca if malloc fails, resulting in a +possible stack overflow. This patch implements sequence traversal and +comparison without caching indices and rules. + +--- +This patch was adapted for glibc 2.17 based on: +https://sourceware.org/git/?p=glibc.git;a=commit;h=91998e449e0c +https://sourceware.org/git/?p=glibc.git;a=commit;h=141f3a77fe4f +--- + + misc/sys/cdefs.h | 2 + string/strcoll_l.c | 265 ++++++++++++++++++++++++++++++++++++++++++++++------- + 2 files changed, 236 insertions(+), 31 deletions(-) + +--- a/misc/sys/cdefs.h ++++ b/misc/sys/cdefs.h +@@ -378,8 +378,10 @@ + + #if __GNUC__ >= 3 + # define __glibc_unlikely(cond) __builtin_expect((cond), 0) ++# define __glibc_likely(cond) __builtin_expect((cond), 1) + #else + # define __glibc_unlikely(cond) (cond) ++# define __glibc_likely(cond) (cond) + #endif + + #include +--- a/string/strcoll_l.c ++++ b/string/strcoll_l.c +@@ -45,7 +45,7 @@ + typedef struct + { + int len; /* Length of the current sequence. */ +- int val; /* Position of the sequence relative to the ++ size_t val; /* Position of the sequence relative to the + previous non-ignored sequence. */ + size_t idxnow; /* Current index in sequences. */ + size_t idxmax; /* Maximum index in sequences. */ +@@ -55,6 +55,12 @@ typedef struct + const USTRING_TYPE *us; /* The string. */ + int32_t *idxarr; /* Array to cache weight indices. */ + unsigned char *rulearr; /* Array to cache rules. */ ++ unsigned char rule; /* Saved rule for the first sequence. */ ++ int32_t idx; /* Index to weight of the current sequence. */ ++ int32_t save_idx; /* Save looked up index of a forward ++ sequence after the last backward ++ sequence. */ ++ const USTRING_TYPE *back_us; /* Beginning of the backward sequence. */ + } coll_seq; + + /* Get next sequence. The weight indices are cached, so we don't need to +@@ -64,7 +70,7 @@ get_next_seq_cached (coll_seq *seq, int nrules, int pass, + const unsigned char *rulesets, + const USTRING_TYPE *weights) + { +- int val = seq->val = 0; ++ size_t val = seq->val = 0; + int len = seq->len; + size_t backw_stop = seq->backw_stop; + size_t backw = seq->backw; +@@ -146,7 +152,7 @@ get_next_seq (coll_seq *seq, int nrules, const unsigned char *rulesets, + const USTRING_TYPE *extra, const int32_t *indirect) + { + #include WEIGHT_H +- int val = seq->val = 0; ++ size_t val = seq->val = 0; + int len = seq->len; + size_t backw_stop = seq->backw_stop; + size_t backw = seq->backw; +@@ -162,7 +168,7 @@ get_next_seq (coll_seq *seq, int nrules, const unsigned char *rulesets, + ++val; + if (backw_stop != ~0ul) + { +- /* The is something pushed. */ ++ /* There is something pushed. */ + if (backw == backw_stop) + { + /* The last pushed character was handled. Continue +@@ -227,15 +233,199 @@ get_next_seq (coll_seq *seq, int nrules, const unsigned char *rulesets, + seq->us = us; + } + +-/* Compare two sequences. */ ++/* Get next sequence. Traverse the string as required. This function does not ++ set or use any index or rule cache. */ ++static void ++get_next_seq_nocache (coll_seq *seq, int nrules, const unsigned char *rulesets, ++ const USTRING_TYPE *weights, const int32_t *table, ++ const USTRING_TYPE *extra, const int32_t *indirect, ++ int pass) ++{ ++#include WEIGHT_H ++ size_t val = seq->val = 0; ++ int len = seq->len; ++ size_t backw_stop = seq->backw_stop; ++ size_t backw = seq->backw; ++ size_t idxcnt = seq->idxcnt; ++ size_t idxmax = seq->idxmax; ++ int32_t idx = seq->idx; ++ const USTRING_TYPE *us = seq->us; ++ ++ while (len == 0) ++ { ++ ++val; ++ if (backw_stop != ~0ul) ++ { ++ /* There is something pushed. */ ++ if (backw == backw_stop) ++ { ++ /* The last pushed character was handled. Continue ++ with forward characters. */ ++ if (idxcnt < idxmax) ++ { ++ idx = seq->save_idx; ++ backw_stop = ~0ul; ++ } ++ else ++ { ++ /* Nothing anymore. The backward sequence ended with ++ the last sequence in the string. Note that len is ++ still zero. */ ++ idx = 0; ++ break; ++ } ++ } ++ else ++ { ++ /* XXX Traverse BACKW sequences from the beginning of ++ BACKW_STOP to get the next sequence. Is ther a quicker way ++ to do this? */ ++ size_t i = backw_stop; ++ us = seq->back_us; ++ while (i < backw) ++ { ++ int32_t tmp = findidx (&us, -1); ++ idx = tmp & 0xffffff; ++ i++; ++ } ++ --backw; ++ us = seq->us; ++ } ++ } ++ else ++ { ++ backw_stop = idxmax; ++ int32_t prev_idx = idx; ++ ++ while (*us != L('\0')) ++ { ++ int32_t tmp = findidx (&us, -1); ++ unsigned char rule = tmp >> 24; ++ prev_idx = idx; ++ idx = tmp & 0xffffff; ++ idxcnt = idxmax++; ++ ++ /* Save the rule for the first sequence. */ ++ if (__glibc_unlikely (idxcnt == 0)) ++ seq->rule = rule; ++ ++ if ((rulesets[rule * nrules + pass] ++ & sort_backward) == 0) ++ /* No more backward characters to push. */ ++ break; ++ ++idxcnt; ++ } ++ ++ if (backw_stop >= idxcnt) ++ { ++ /* No sequence at all or just one. */ ++ if (idxcnt == idxmax || backw_stop > idxcnt) ++ /* Note that len is still zero. */ ++ break; ++ ++ backw_stop = ~0ul; ++ } ++ else ++ { ++ /* We pushed backward sequences. If the stream ended with the ++ backward sequence, then we process the last sequence we ++ found. Otherwise we process the sequence before the last ++ one since the last one was a forward sequence. */ ++ seq->back_us = seq->us; ++ seq->us = us; ++ backw = idxcnt; ++ if (idxmax > idxcnt) ++ { ++ backw--; ++ seq->save_idx = idx; ++ idx = prev_idx; ++ } ++ if (backw > backw_stop) ++ backw--; ++ } ++ } ++ ++ len = weights[idx++]; ++ /* Skip over indices of previous levels. */ ++ for (int i = 0; i < pass; i++) ++ { ++ idx += len; ++ len = weights[idx]; ++ idx++; ++ } ++ } ++ ++ /* Update the structure. */ ++ seq->val = val; ++ seq->len = len; ++ seq->backw_stop = backw_stop; ++ seq->backw = backw; ++ seq->idxcnt = idxcnt; ++ seq->idxmax = idxmax; ++ seq->us = us; ++ seq->idx = idx; ++} ++ ++/* Compare two sequences. This version does not use the index and rules ++ cache. */ ++static int ++do_compare_nocache (coll_seq *seq1, coll_seq *seq2, int position, ++ const USTRING_TYPE *weights) ++{ ++ int seq1len = seq1->len; ++ int seq2len = seq2->len; ++ size_t val1 = seq1->val; ++ size_t val2 = seq2->val; ++ int idx1 = seq1->idx; ++ int idx2 = seq2->idx; ++ int result = 0; ++ ++ /* Test for position if necessary. */ ++ if (position && val1 != val2) ++ { ++ result = val1 > val2 ? 1 : -1; ++ goto out; ++ } ++ ++ /* Compare the two sequences. */ ++ do ++ { ++ if (weights[idx1] != weights[idx2]) ++ { ++ /* The sequences differ. */ ++ result = weights[idx1] - weights[idx2]; ++ goto out; ++ } ++ ++ /* Increment the offsets. */ ++ ++idx1; ++ ++idx2; ++ ++ --seq1len; ++ --seq2len; ++ } ++ while (seq1len > 0 && seq2len > 0); ++ ++ if (position && seq1len != seq2len) ++ result = seq1len - seq2len; ++ ++out: ++ seq1->len = seq1len; ++ seq2->len = seq2len; ++ seq1->idx = idx1; ++ seq2->idx = idx2; ++ return result; ++} ++ ++/* Compare two sequences using the index cache. */ + static int + do_compare (coll_seq *seq1, coll_seq *seq2, int position, + const USTRING_TYPE *weights) + { + int seq1len = seq1->len; + int seq2len = seq2->len; +- int val1 = seq1->val; +- int val2 = seq2->val; ++ size_t val1 = seq1->val; ++ size_t val2 = seq2->val; + int32_t *idx1arr = seq1->idxarr; + int32_t *idx2arr = seq2->idxarr; + int idx1now = seq1->idxnow; +@@ -245,7 +435,7 @@ do_compare (coll_seq *seq1, coll_seq *seq2, int position, + /* Test for position if necessary. */ + if (position && val1 != val2) + { +- result = val1 - val2; ++ result = val1 > val2 ? 1 : -1; + goto out; + } + +@@ -334,57 +524,62 @@ STRCOLL (const STRING_TYPE *s1, const STRING_TYPE *s2, __locale_t l) + memset (&seq1, 0, sizeof (seq1)); + seq2 = seq1; + +- /* We need the elements of the strings as unsigned values since they +- are used as indices. */ +- seq1.us = (const USTRING_TYPE *) s1; +- seq2.us = (const USTRING_TYPE *) s2; +- + if (! __libc_use_alloca ((s1len + s2len) * (sizeof (int32_t) + 1))) + { + seq1.idxarr = (int32_t *) malloc ((s1len + s2len) * (sizeof (int32_t) + 1)); +- seq2.idxarr = &seq1.idxarr[s1len]; +- seq1.rulearr = (unsigned char *) &seq2.idxarr[s2len]; +- seq2.rulearr = &seq1.rulearr[s1len]; +- +- if (seq1.idxarr == NULL) +- /* No memory. Well, go with the stack then. +- +- XXX Once this implementation is stable we will handle this +- differently. Instead of precomputing the indices we will +- do this in time. This means, though, that this happens for +- every pass again. */ +- goto try_stack; +- use_malloc = true; ++ ++ /* If we failed to allocate memory, we leave everything as NULL so that ++ we use the nocache version of traversal and comparison functions. */ ++ if (seq1.idxarr != NULL) ++ { ++ seq2.idxarr = &seq1.idxarr[s1len]; ++ seq1.rulearr = (unsigned char *) &seq2.idxarr[s2len]; ++ seq2.rulearr = &seq1.rulearr[s1len]; ++ use_malloc = true; ++ } + } + else + { +- try_stack: + seq1.idxarr = (int32_t *) alloca (s1len * sizeof (int32_t)); + seq2.idxarr = (int32_t *) alloca (s2len * sizeof (int32_t)); + seq1.rulearr = (unsigned char *) alloca (s1len); + seq2.rulearr = (unsigned char *) alloca (s2len); + } + +- seq1.rulearr[0] = 0; ++ int rule = 0; + + /* Cache values in the first pass and if needed, use them in subsequent + passes. */ + for (int pass = 0; pass < nrules; ++pass) + { + seq1.idxcnt = 0; ++ seq1.idx = 0; ++ seq2.idx = 0; + seq1.backw_stop = ~0ul; + seq1.backw = ~0ul; + seq2.idxcnt = 0; + seq2.backw_stop = ~0ul; + seq2.backw = ~0ul; + ++ /* We need the elements of the strings as unsigned values since they ++ are used as indices. */ ++ seq1.us = (const USTRING_TYPE *) s1; ++ seq2.us = (const USTRING_TYPE *) s2; ++ + /* We assume that if a rule has defined `position' in one section + this is true for all of them. */ +- int position = rulesets[seq1.rulearr[0] * nrules + pass] & sort_position; ++ int position = rulesets[rule * nrules + pass] & sort_position; + + while (1) + { +- if (pass == 0) ++ if (__glibc_unlikely (seq1.idxarr == NULL)) ++ { ++ get_next_seq_nocache (&seq1, nrules, rulesets, weights, table, ++ extra, indirect, pass); ++ get_next_seq_nocache (&seq2, nrules, rulesets, weights, table, ++ extra, indirect, pass); ++ } ++ else if (pass == 0) + { + get_next_seq (&seq1, nrules, rulesets, weights, table, extra, + indirect); +@@ -411,10 +606,18 @@ STRCOLL (const STRING_TYPE *s1, const STRING_TYPE *s2, __locale_t l) + goto free_and_return; + } + +- result = do_compare (&seq1, &seq2, position, weights); ++ if (__glibc_unlikely (seq1.idxarr == NULL)) ++ result = do_compare_nocache (&seq1, &seq2, position, weights); ++ else ++ result = do_compare (&seq1, &seq2, position, weights); + if (result != 0) + goto free_and_return; + } ++ ++ if (__glibc_likely (seq1.rulearr != NULL)) ++ rule = seq1.rulearr[0]; ++ else ++ rule = seq1.rule; + } + + /* Free the memory if needed. */ diff --git a/patches/source/glibc/glibc-2.17_CVE-2013-2207.diff b/patches/source/glibc/glibc-2.17_CVE-2013-2207.diff new file mode 100644 index 000000000..c43ccf5cd --- /dev/null +++ b/patches/source/glibc/glibc-2.17_CVE-2013-2207.diff @@ -0,0 +1,241 @@ +From 5d96012d9978efe4bad88a38e2efcbeada9f7585 Mon Sep 17 00:00:00 2001 +From: mancha +Date: Thu, 22 Aug 2013 +Subject: CVE-2013-2207, BZ #15755: Disable pt_chown. + +Using the setuid installed pt_chown and a weak check on whether a file +descriptor is a tty, an attacker could fake a pty check using FUSE and +trick pt_chown to grant ownership of a pty descriptor that the current +user does not own. It cannot access /dev/pts/ptmx however. + +Pre-conditions for the attack: + + * Attacker with local user account + * Kernel with FUSE support + * "user_allow_other" in /etc/fuse.conf + * Victim with allocated slave in /dev/pts + +In most modern distributions pt_chown is not needed because devpts +is enabled by default. The fix for this CVE is to disable building +and using pt_chown by default. We still provide a configure option +to enable the use of pt_chown but distributions do so at their own +risk. + +--- +This patch was adapted for glibc 2.17 point release from: +http://sourceware.org/git/?p=glibc.git;a=commit;h=e4608715e6e1 +--- + + INSTALL | 12 ++++++++++++ + config.h.in | 3 +++ + config.make.in | 1 + + configure | 15 +++++++++++++++ + configure.in | 10 ++++++++++ + login/Makefile | 8 +++++++- + manual/install.texi | 14 ++++++++++++++ + sysdeps/unix/grantpt.c | 8 +++++--- + sysdeps/unix/sysv/linux/grantpt.c | 5 +++-- + 9 files changed, 70 insertions(+), 6 deletions(-) +--- + +--- a/INSTALL ++++ b/INSTALL +@@ -128,6 +128,18 @@ will be used, and CFLAGS sets optimizati + this can be prevented though there generally is no reason since it + creates compatibility problems. + ++`--enable-pt_chown' ++ The file `pt_chown' is a helper binary for `grantpt' (*note ++ Pseudo-Terminals: Allocation.) that is installed setuid root to ++ fix up pseudo-terminal ownership. It is not built by default ++ because systems using the Linux kernel are commonly built with the ++ `devpts' filesystem enabled and mounted at `/dev/pts', which ++ manages pseudo-terminal ownership automatically. By using ++ `--enable-pt_chown', you may build `pt_chown' and install it ++ setuid and owned by `root'. The use of `pt_chown' introduces ++ additional security risks to the system and you should enable it ++ only if you understand and accept those risks. ++ + `--build=BUILD-SYSTEM' + `--host=HOST-SYSTEM' + These options are for cross-compiling. If you specify both +--- a/config.h.in ++++ b/config.h.in +@@ -232,4 +232,7 @@ + /* The ARM hard-float ABI is being used. */ + #undef HAVE_ARM_PCS_VFP + ++/* The pt_chown binary is being built and used by grantpt. */ ++#undef HAVE_PT_CHOWN ++ + #endif +--- a/config.make.in ++++ b/config.make.in +@@ -101,6 +101,7 @@ force-install = @force_install@ + link-obsolete-rpc = @link_obsolete_rpc@ + build-nscd = @build_nscd@ + use-nscd = @use_nscd@ ++build-pt-chown = @build_pt_chown@ + + # Build tools. + CC = @CC@ +--- a/configure ++++ b/configure +@@ -653,6 +653,7 @@ multi_arch + base_machine + add_on_subdirs + add_ons ++build_pt_chown + build_nscd + link_obsolete_rpc + libc_cv_nss_crypt +@@ -759,6 +760,7 @@ enable_obsolete_rpc + enable_systemtap + enable_build_nscd + enable_nscd ++enable_pt_chown + with_cpu + ' + ac_precious_vars='build_alias +@@ -1419,6 +1421,7 @@ Optional Features: + --enable-systemtap enable systemtap static probe points [default=no] + --disable-build-nscd disable building and installing the nscd daemon + --disable-nscd library functions will not contact the nscd daemon ++ --enable-pt_chown Enable building and installing pt_chown + + Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] +@@ -3933,6 +3936,18 @@ else + use_nscd=yes + fi + ++# Check whether --enable-pt_chown was given. ++if test "${enable_pt_chown+set}" = set; then : ++ enableval=$enable_pt_chown; build_pt_chown=$enableval ++else ++ build_pt_chown=no ++fi ++ ++ ++if test $build_pt_chown = yes; then ++ $as_echo "#define HAVE_PT_CHOWN 1" >>confdefs.h ++ ++fi + + # The way shlib-versions is used to generate soversions.mk uses a + # fairly simplistic model for name recognition that can't distinguish +--- a/configure.in ++++ b/configure.in +@@ -315,6 +315,16 @@ AC_ARG_ENABLE([nscd], + [use_nscd=$enableval], + [use_nscd=yes]) + ++AC_ARG_ENABLE([pt_chown], ++ [AS_HELP_STRING([--enable-pt_chown], ++ [Enable building and installing pt_chown])], ++ [build_pt_chown=$enableval], ++ [build_pt_chown=no]) ++AC_SUBST(build_pt_chown) ++if test $build_pt_chown = yes; then ++ AC_DEFINE(HAVE_PT_CHOWN) ++fi ++ + # The way shlib-versions is used to generate soversions.mk uses a + # fairly simplistic model for name recognition that can't distinguish + # i486-pc-linux-gnu fully from i486-pc-gnu. So we mutate a $host_os +--- a/login/Makefile ++++ b/login/Makefile +@@ -29,9 +29,15 @@ routines := getutent getutent_r getutid + + CFLAGS-grantpt.c = -DLIBEXECDIR='"$(libexecdir)"' + +-others = utmpdump pt_chown ++others = utmpdump ++ ++include ../Makeconfig ++ ++ifeq (yes,$(build-pt-chown)) ++others += pt_chown + others-pie = pt_chown + install-others-programs = $(inst_libexecdir)/pt_chown ++endif + + subdir-dirs = programs + vpath %.c programs +--- a/manual/install.texi ++++ b/manual/install.texi +@@ -155,6 +155,20 @@ if the used tools support it. By using + prevented though there generally is no reason since it creates + compatibility problems. + ++@pindex pt_chown ++@findex grantpt ++@item --enable-pt_chown ++The file @file{pt_chown} is a helper binary for @code{grantpt} ++(@pxref{Allocation, Pseudo-Terminals}) that is installed setuid root to ++fix up pseudo-terminal ownership. It is not built by default because ++systems using the Linux kernel are commonly built with the @code{devpts} ++filesystem enabled and mounted at @file{/dev/pts}, which manages ++pseudo-terminal ownership automatically. By using ++@samp{--enable-pt_chown}, you may build @file{pt_chown} and install it ++setuid and owned by @code{root}. The use of @file{pt_chown} introduces ++additional security risks to the system and you should enable it only if ++you understand and accept those risks. ++ + @item --build=@var{build-system} + @itemx --host=@var{host-system} + These options are for cross-compiling. If you specify both options and +--- a/sysdeps/unix/grantpt.c ++++ b/sysdeps/unix/grantpt.c +@@ -173,9 +173,10 @@ grantpt (int fd) + retval = 0; + goto cleanup; + +- /* We have to use the helper program. */ ++ /* We have to use the helper program if it is available.. */ + helper:; + ++#ifdef HAVE_PT_CHOWN + pid_t pid = __fork (); + if (pid == -1) + goto cleanup; +@@ -190,9 +191,9 @@ grantpt (int fd) + if (__dup2 (fd, PTY_FILENO) < 0) + _exit (FAIL_EBADF); + +-#ifdef CLOSE_ALL_FDS ++# ifdef CLOSE_ALL_FDS + CLOSE_ALL_FDS (); +-#endif ++# endif + + execle (_PATH_PT_CHOWN, basename (_PATH_PT_CHOWN), NULL, NULL); + _exit (FAIL_EXEC); +@@ -231,6 +232,7 @@ grantpt (int fd) + assert(! "getpt: internal error: invalid exit code from pt_chown"); + } + } ++#endif + + cleanup: + if (buf != _buf) +--- a/sysdeps/unix/sysv/linux/grantpt.c ++++ b/sysdeps/unix/sysv/linux/grantpt.c +@@ -11,7 +11,7 @@ + + #include "pty-private.h" + +- ++#if HAVE_PT_CHOWN + /* Close all file descriptors except the one specified. */ + static void + close_all_fds (void) +@@ -38,6 +38,7 @@ close_all_fds (void) + __dup2 (STDOUT_FILENO, STDERR_FILENO); + } + } +-#define CLOSE_ALL_FDS() close_all_fds() ++# define CLOSE_ALL_FDS() close_all_fds() ++#endif + + #include diff --git a/patches/source/glibc/glibc-2.17_CVE-2013-4237.diff b/patches/source/glibc/glibc-2.17_CVE-2013-4237.diff new file mode 100644 index 000000000..4ac35f991 --- /dev/null +++ b/patches/source/glibc/glibc-2.17_CVE-2013-4237.diff @@ -0,0 +1,286 @@ +From 7fdc7f99b0b6ca222200ab5d99c500447c6b1cfc Mon Sep 17 00:00:00 2001 +From: mancha +Date: Wed, 23 Oct 2013 +Subject: CVE-2013-4237 + +The readdir_r function could write more than NAME_MAX bytes +to the d_name member of struct dirent, or omit the terminating NUL +character. + +--- +This patch was adapted for glibc 2.17 based on: +https://sourceware.org/git/?p=glibc.git;a=commit;h=91ce40854d0b +--- + + manual/conf.texi | 9 ++ + manual/filesys.texi | 73 +++++++++++++++++------- + sysdeps/posix/dirstream.h | 2 + sysdeps/posix/opendir.c | 1 + sysdeps/posix/readdir_r.c | 42 +++++++++---- + sysdeps/posix/rewinddir.c | 1 + sysdeps/unix/sysv/linux/i386/readdir64_r.c | 1 + sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c | 1 + 8 files changed, 96 insertions(+), 34 deletions(-) + +--- a/manual/conf.texi ++++ b/manual/conf.texi +@@ -1149,6 +1149,9 @@ typed ahead as input. @xref{I/O Queues}. + @deftypevr Macro int NAME_MAX + The uniform system limit (if any) for the length of a file name component, not + including the terminating null character. ++ ++@strong{Portability Note:} On some systems, @theglibc{} defines ++@code{NAME_MAX}, but does not actually enforce this limit. + @end deftypevr + + @comment limits.h +@@ -1157,6 +1160,9 @@ including the terminating null character. + The uniform system limit (if any) for the length of an entire file name (that + is, the argument given to system calls such as @code{open}), including the + terminating null character. ++ ++@strong{Portability Note:} @Theglibc{} does not enforce this limit ++even if @code{PATH_MAX} is defined. + @end deftypevr + + @cindex limits, pipe buffer size +@@ -1476,6 +1482,9 @@ Inquire about the value of @code{POSIX_REC_MIN_XFER_SIZE}. + Inquire about the value of @code{POSIX_REC_XFER_ALIGN}. + @end table + ++@strong{Portability Note:} On some systems, @theglibc{} does not ++enforce @code{_PC_NAME_MAX} or @code{_PC_PATH_MAX} limits. ++ + @node Utility Limits + @section Utility Program Capacity Limits + +--- a/manual/filesys.texi ++++ b/manual/filesys.texi +@@ -444,9 +444,9 @@ symbols are declared in the header file @file{dirent.h}. + @comment POSIX.1 + @deftypefun {struct dirent *} readdir (DIR *@var{dirstream}) + This function reads the next entry from the directory. It normally +-returns a pointer to a structure containing information about the file. +-This structure is statically allocated and can be rewritten by a +-subsequent call. ++returns a pointer to a structure containing information about the ++file. This structure is associated with the @var{dirstream} handle ++and can be rewritten by a subsequent call. + + @strong{Portability Note:} On some systems @code{readdir} may not + return entries for @file{.} and @file{..}, even though these are always +@@ -461,19 +461,61 @@ conditions are defined for this function: + The @var{dirstream} argument is not valid. + @end table + +-@code{readdir} is not thread safe. Multiple threads using +-@code{readdir} on the same @var{dirstream} may overwrite the return +-value. Use @code{readdir_r} when this is critical. ++To distinguish between an end-of-directory condition or an error, you ++must set @code{errno} to zero before calling @code{readdir}. To avoid ++entering an infinite loop, you should stop reading from the directory ++after the first error. ++ ++In POSIX.1-2008, @code{readdir} is not thread-safe. In @theglibc{} ++implementation, it is safe to call @code{readdir} concurrently on ++different @var{dirstream}s, but multiple threads accessing the same ++@var{dirstream} result in undefined behavior. @code{readdir_r} is a ++fully thread-safe alternative, but suffers from poor portability (see ++below). It is recommended that you use @code{readdir}, with external ++locking if multiple threads access the same @var{dirstream}. + @end deftypefun + + @comment dirent.h + @comment GNU + @deftypefun int readdir_r (DIR *@var{dirstream}, struct dirent *@var{entry}, struct dirent **@var{result}) +-This function is the reentrant version of @code{readdir}. Like +-@code{readdir} it returns the next entry from the directory. But to +-prevent conflicts between simultaneously running threads the result is +-not stored in statically allocated memory. Instead the argument +-@var{entry} points to a place to store the result. ++This function is a version of @code{readdir} which performs internal ++locking. Like @code{readdir} it returns the next entry from the ++directory. To prevent conflicts between simultaneously running ++threads the result is stored inside the @var{entry} object. ++ ++@strong{Portability Note:} It is recommended to use @code{readdir} ++instead of @code{readdir_r} for the following reasons: ++ ++@itemize @bullet ++@item ++On systems which do not define @code{NAME_MAX}, it may not be possible ++to use @code{readdir_r} safely because the caller does not specify the ++length of the buffer for the directory entry. ++ ++@item ++On some systems, @code{readdir_r} cannot read directory entries with ++very long names. If such a name is encountered, @theglibc{} ++implementation of @code{readdir_r} returns with an error code of ++@code{ENAMETOOLONG} after the final directory entry has been read. On ++other systems, @code{readdir_r} may return successfully, but the ++@code{d_name} member may not be NUL-terminated or may be truncated. ++ ++@item ++POSIX-1.2008 does not guarantee that @code{readdir} is thread-safe, ++even when access to the same @var{dirstream} is serialized. But in ++current implementations (including @theglibc{}), it is safe to call ++@code{readdir} concurrently on different @var{dirstream}s, so there is ++no need to use @code{readdir_r} in most multi-threaded programs. In ++the rare case that multiple threads need to read from the same ++@var{dirstream}, it is still better to use @code{readdir} and external ++synchronization. ++ ++@item ++It is expected that future versions of POSIX will obsolete ++@code{readdir_r} and mandate the level of thread safety for ++@code{readdir} which is provided by @theglibc{} and other ++implementations today. ++@end itemize + + Normally @code{readdir_r} returns zero and sets @code{*@var{result}} + to @var{entry}. If there are no more entries in the directory or an +@@ -481,15 +523,6 @@ error is detected, @code{readdir_r} sets @code{*@var{result}} to a + null pointer and returns a nonzero error code, also stored in + @code{errno}, as described for @code{readdir}. + +-@strong{Portability Note:} On some systems @code{readdir_r} may not +-return a NUL terminated string for the file name, even when there is no +-@code{d_reclen} field in @code{struct dirent} and the file +-name is the maximum allowed size. Modern systems all have the +-@code{d_reclen} field, and on old systems multi-threading is not +-critical. In any case there is no such problem with the @code{readdir} +-function, so that even on systems without the @code{d_reclen} member one +-could use multiple threads by using external locking. +- + It is also important to look at the definition of the @code{struct + dirent} type. Simply passing a pointer to an object of this type for + the second parameter of @code{readdir_r} might not be enough. Some +--- a/sysdeps/posix/dirstream.h ++++ b/sysdeps/posix/dirstream.h +@@ -39,6 +39,8 @@ struct __dirstream + + off_t filepos; /* Position of next entry to read. */ + ++ int errcode; /* Delayed error code. */ ++ + /* Directory block. */ + char data[0] __attribute__ ((aligned (__alignof__ (void*)))); + }; +--- a/sysdeps/posix/opendir.c ++++ b/sysdeps/posix/opendir.c +@@ -230,6 +230,7 @@ __alloc_dir (int fd, bool close_fd, int flags, const struct stat64 *statp) + dirp->size = 0; + dirp->offset = 0; + dirp->filepos = 0; ++ dirp->errcode = 0; + + return dirp; + } +--- a/sysdeps/posix/readdir_r.c ++++ b/sysdeps/posix/readdir_r.c +@@ -41,6 +41,7 @@ __READDIR_R (DIR *dirp, DIRENT_TYPE *entry, DIRENT_TYPE **result) + DIRENT_TYPE *dp; + size_t reclen; + const int saved_errno = errno; ++ int ret; + + __libc_lock_lock (dirp->lock); + +@@ -71,10 +72,10 @@ __READDIR_R (DIR *dirp, DIRENT_TYPE *entry, DIRENT_TYPE **result) + bytes = 0; + __set_errno (saved_errno); + } ++ if (bytes < 0) ++ dirp->errcode = errno; + + dp = NULL; +- /* Reclen != 0 signals that an error occurred. */ +- reclen = bytes != 0; + break; + } + dirp->size = (size_t) bytes; +@@ -107,29 +108,46 @@ __READDIR_R (DIR *dirp, DIRENT_TYPE *entry, DIRENT_TYPE **result) + dirp->filepos += reclen; + #endif + +- /* Skip deleted files. */ ++#ifdef NAME_MAX ++ if (reclen > offsetof (DIRENT_TYPE, d_name) + NAME_MAX + 1) ++ { ++ /* The record is very long. It could still fit into the ++ caller-supplied buffer if we can skip padding at the ++ end. */ ++ size_t namelen = _D_EXACT_NAMLEN (dp); ++ if (namelen <= NAME_MAX) ++ reclen = offsetof (DIRENT_TYPE, d_name) + namelen + 1; ++ else ++ { ++ /* The name is too long. Ignore this file. */ ++ dirp->errcode = ENAMETOOLONG; ++ dp->d_ino = 0; ++ continue; ++ } ++ } ++#endif ++ ++ /* Skip deleted and ignored files. */ + } + while (dp->d_ino == 0); + + if (dp != NULL) + { +-#ifdef GETDENTS_64BIT_ALIGNED +- /* The d_reclen value might include padding which is not part of +- the DIRENT_TYPE data structure. */ +- reclen = MIN (reclen, +- offsetof (DIRENT_TYPE, d_name) + sizeof (dp->d_name)); +-#endif + *result = memcpy (entry, dp, reclen); +-#ifdef GETDENTS_64BIT_ALIGNED ++#ifdef _DIRENT_HAVE_D_RECLEN + entry->d_reclen = reclen; + #endif ++ ret = 0; + } + else +- *result = NULL; ++ { ++ *result = NULL; ++ ret = dirp->errcode; ++ } + + __libc_lock_unlock (dirp->lock); + +- return dp != NULL ? 0 : reclen ? errno : 0; ++ return ret; + } + + #ifdef __READDIR_R_ALIAS +--- a/sysdeps/posix/rewinddir.c ++++ b/sysdeps/posix/rewinddir.c +@@ -33,6 +33,7 @@ rewinddir (dirp) + dirp->filepos = 0; + dirp->offset = 0; + dirp->size = 0; ++ dirp->errcode = 0; + #ifndef NOT_IN_libc + __libc_lock_unlock (dirp->lock); + #endif +--- a/sysdeps/unix/sysv/linux/i386/readdir64_r.c ++++ b/sysdeps/unix/sysv/linux/i386/readdir64_r.c +@@ -18,7 +18,6 @@ + #define __READDIR_R __readdir64_r + #define __GETDENTS __getdents64 + #define DIRENT_TYPE struct dirent64 +-#define GETDENTS_64BIT_ALIGNED 1 + + #include + +--- a/sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c ++++ b/sysdeps/unix/sysv/linux/wordsize-64/readdir_r.c +@@ -1,5 +1,4 @@ + #define readdir64_r __no_readdir64_r_decl +-#define GETDENTS_64BIT_ALIGNED 1 + #include + #undef readdir64_r + weak_alias (__readdir_r, readdir64_r) diff --git a/patches/source/glibc/glibc-2.17_CVE-2013-4332.diff b/patches/source/glibc/glibc-2.17_CVE-2013-4332.diff new file mode 100644 index 000000000..9f7f5886c --- /dev/null +++ b/patches/source/glibc/glibc-2.17_CVE-2013-4332.diff @@ -0,0 +1,64 @@ +From 0d6085cb1b4330b835ad08a3ec8f80b30f0cadb4 Mon Sep 17 00:00:00 2001 +From: mancha +Date: Wed, 11 Sep 2013 +Subject: CVE-2013-4332 + +malloc: Check for integer overflow in pvalloc, valloc, and memalign. + +A large bytes parameter to pvalloc, valloc, or memalign could cause +an integer overflow and corrupt allocator internals. Check the +overflow does not occur before continuing with the allocation. + +Note: This is a backport to glibc 2.17 of the following three commits: + * https://sourceware.org/git/?p=glibc.git;a=commit;h=1159a193696a + * https://sourceware.org/git/?p=glibc.git;a=commit;h=55e17aadc1ef + * https://sourceware.org/git/?p=glibc.git;a=commit;h=b73ed247781d +--- + +malloc.c | 21 +++++++++++++++++++++ + 1 file changed, 21 insertions(+) + +--- a/malloc/malloc.c ++++ b/malloc/malloc.c +@@ -3020,6 +3020,13 @@ __libc_memalign(size_t alignment, size_t + /* Otherwise, ensure that it is at least a minimum chunk size */ + if (alignment < MINSIZE) alignment = MINSIZE; + ++ /* Check for overflow. */ ++ if (bytes > SIZE_MAX - alignment - MINSIZE) ++ { ++ __set_errno (ENOMEM); ++ return 0; ++ } ++ + arena_get(ar_ptr, bytes + alignment + MINSIZE); + if(!ar_ptr) + return 0; +@@ -3051,6 +3058,13 @@ __libc_valloc(size_t bytes) + + size_t pagesz = GLRO(dl_pagesize); + ++ /* Check for overflow. */ ++ if (bytes > SIZE_MAX - pagesz - MINSIZE) ++ { ++ __set_errno (ENOMEM); ++ return 0; ++ } ++ + __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t, + const __malloc_ptr_t)) = + force_reg (__memalign_hook); +@@ -3088,6 +3102,13 @@ __libc_pvalloc(size_t bytes) + size_t page_mask = GLRO(dl_pagesize) - 1; + size_t rounded_bytes = (bytes + page_mask) & ~(page_mask); + ++ /* Check for overflow. */ ++ if (bytes > SIZE_MAX - 2*pagesz - MINSIZE) ++ { ++ __set_errno (ENOMEM); ++ return 0; ++ } ++ + __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t, + const __malloc_ptr_t)) = + force_reg (__memalign_hook); diff --git a/patches/source/glibc/glibc-2.17_CVE-2013-4458.diff b/patches/source/glibc/glibc-2.17_CVE-2013-4458.diff new file mode 100644 index 000000000..7ed5789f2 --- /dev/null +++ b/patches/source/glibc/glibc-2.17_CVE-2013-4458.diff @@ -0,0 +1,52 @@ +From f17988489a32f6c1308474bd7b408299646e0777 Mon Sep 17 00:00:00 2001 +From: mancha +Date: Fri, 25 Oct 2013 +Subject: CVE-2013-4458 + +Stack overflow in getaddrinfo (AF_INET6 case) with many +results has been fixed. Different from CVE-2013-1914. + +--- +This patch was adapted for glibc 2.17 based on: +https://sourceware.org/git/?p=glibc.git;a=commit;h=7cbcdb369958 +--- + + getaddrinfo.c | 20 ++++++++++++++++++-- + 1 file changed, 18 insertions(+), 2 deletions(-) + +--- a/sysdeps/posix/getaddrinfo.c ++++ b/sysdeps/posix/getaddrinfo.c +@@ -196,7 +196,22 @@ gaih_inet_serv (const char *servicename, const struct gaih_typeproto *tp, + &rc, &herrno, NULL, &localcanon)); \ + if (rc != ERANGE || herrno != NETDB_INTERNAL) \ + break; \ +- tmpbuf = extend_alloca (tmpbuf, tmpbuflen, 2 * tmpbuflen); \ ++ if (!malloc_tmpbuf && __libc_use_alloca (alloca_used + 2 * tmpbuflen)) \ ++ tmpbuf = extend_alloca_account (tmpbuf, tmpbuflen, 2 * tmpbuflen, \ ++ alloca_used); \ ++ else \ ++ { \ ++ char *newp = realloc (malloc_tmpbuf ? tmpbuf : NULL, \ ++ 2 * tmpbuflen); \ ++ if (newp == NULL) \ ++ { \ ++ result = -EAI_MEMORY; \ ++ goto free_and_return; \ ++ } \ ++ tmpbuf = newp; \ ++ malloc_tmpbuf = true; \ ++ tmpbuflen = 2 * tmpbuflen; \ ++ } \ + } \ + if (status == NSS_STATUS_SUCCESS && rc == 0) \ + h = &th; \ +@@ -208,7 +223,8 @@ gaih_inet_serv (const char *servicename, const struct gaih_typeproto *tp, + { \ + __set_h_errno (herrno); \ + _res.options |= old_res_options & RES_USE_INET6; \ +- return -EAI_SYSTEM; \ ++ result = -EAI_SYSTEM; \ ++ goto free_and_return; \ + } \ + if (herrno == TRY_AGAIN) \ + no_data = EAI_AGAIN; \ diff --git a/patches/source/glibc/glibc-2.17_CVE-2013-4788.diff b/patches/source/glibc/glibc-2.17_CVE-2013-4788.diff new file mode 100644 index 000000000..4bb20e396 --- /dev/null +++ b/patches/source/glibc/glibc-2.17_CVE-2013-4788.diff @@ -0,0 +1,460 @@ +From 866b96a005c53195ca649049b7e6ebef63ee3fe6 Mon Sep 17 00:00:00 2001 +From: mancha +Date: Wed, 23 Oct 2013 +Subject: CVE-2013-4788 + +The pointer guard used for pointer mangling was not initialized for +static applications resulting in the security feature being disabled. +The pointer guard is now correctly initialized to a random value for +static applications. Existing static applications need to be +recompiled to take advantage of the fix. + +The test tst-ptrguard1-static and tst-ptrguard1 add regression +coverage to ensure the pointer guards are sufficiently random +and initialized to a default value. + +--- +This patch was adapted for glibc 2.17 based on: +https://sourceware.org/git/?p=glibc.git;a=commit;h=c61b4d41c964 +--- + + csu/libc-start.c | 16 ++ + elf/Makefile | 9 - + elf/tst-ptrguard1-static.c | 1 + elf/tst-ptrguard1.c | 202 ++++++++++++++++++++++++++ + ports/sysdeps/ia64/stackguard-macros.h | 3 + ports/sysdeps/tile/stackguard-macros.h | 6 + sysdeps/generic/stackguard-macros.h | 3 + sysdeps/i386/stackguard-macros.h | 8 + + sysdeps/powerpc/powerpc32/stackguard-macros.h | 10 + + sysdeps/powerpc/powerpc64/stackguard-macros.h | 10 + + sysdeps/s390/s390-32/stackguard-macros.h | 11 + + sysdeps/s390/s390-64/stackguard-macros.h | 14 + + sysdeps/sparc/sparc32/stackguard-macros.h | 3 + sysdeps/sparc/sparc64/stackguard-macros.h | 3 + sysdeps/x86_64/stackguard-macros.h | 5 + 15 files changed, 302 insertions(+), 2 deletions(-) + +--- a/csu/libc-start.c ++++ b/csu/libc-start.c +@@ -38,6 +38,12 @@ extern void __pthread_initialize_minimal (void); + in thread local area. */ + uintptr_t __stack_chk_guard attribute_relro; + # endif ++# ifndef THREAD_SET_POINTER_GUARD ++/* Only exported for architectures that don't store the pointer guard ++ value in thread local area. */ ++uintptr_t __pointer_chk_guard_local ++ attribute_relro attribute_hidden __attribute__ ((nocommon)); ++# endif + #endif + + #ifdef HAVE_PTR_NTHREADS +@@ -184,6 +190,16 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL), + # else + __stack_chk_guard = stack_chk_guard; + # endif ++ ++ /* Set up the pointer guard value. */ ++ uintptr_t pointer_chk_guard = _dl_setup_pointer_guard (_dl_random, ++ stack_chk_guard); ++# ifdef THREAD_SET_POINTER_GUARD ++ THREAD_SET_POINTER_GUARD (pointer_chk_guard); ++# else ++ __pointer_chk_guard_local = pointer_chk_guard; ++# endif ++ + #endif + + /* Register the destructor of the dynamic linker if there is any. */ +--- a/elf/Makefile ++++ b/elf/Makefile +@@ -121,7 +121,8 @@ endif + tests = tst-tls1 tst-tls2 tst-tls9 tst-leaks1 \ + tst-array1 tst-array2 tst-array3 tst-array4 tst-array5 + tests-static = tst-tls1-static tst-tls2-static tst-stackguard1-static \ +- tst-leaks1-static tst-array1-static tst-array5-static ++ tst-leaks1-static tst-array1-static tst-array5-static \ ++ tst-ptrguard1-static + ifeq (yes,$(build-shared)) + tests-static += tst-tls9-static + tst-tls9-static-ENV = \ +@@ -145,7 +146,8 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \ + tst-audit1 tst-audit2 tst-audit8 \ + tst-stackguard1 tst-addr1 tst-thrlock \ + tst-unique1 tst-unique2 tst-unique3 tst-unique4 \ +- tst-initorder tst-initorder2 tst-relsort1 ++ tst-initorder tst-initorder2 tst-relsort1 \ ++ tst-ptrguard1 + # reldep9 + test-srcs = tst-pathopt + selinux-enabled := $(shell cat /selinux/enforce 2> /dev/null) +@@ -1045,6 +1047,9 @@ LDFLAGS-order2mod2.so = $(no-as-needed) + tst-stackguard1-ARGS = --command "$(host-built-program-cmd) --child" + tst-stackguard1-static-ARGS = --command "$(objpfx)tst-stackguard1-static --child" + ++tst-ptrguard1-ARGS = --command "$(host-built-program-cmd) --child" ++tst-ptrguard1-static-ARGS = --command "$(objpfx)tst-ptrguard1-static --child" ++ + $(objpfx)tst-leaks1: $(libdl) + $(objpfx)tst-leaks1-mem: $(objpfx)tst-leaks1.out + $(common-objpfx)malloc/mtrace $(objpfx)tst-leaks1.mtrace > $@ +--- /dev/null ++++ b/elf/tst-ptrguard1-static.c +@@ -0,0 +1 @@ ++#include "tst-ptrguard1.c" +--- /dev/null ++++ b/elf/tst-ptrguard1.c +@@ -0,0 +1,202 @@ ++/* Copyright (C) 2013 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#ifndef POINTER_CHK_GUARD ++extern uintptr_t __pointer_chk_guard; ++# define POINTER_CHK_GUARD __pointer_chk_guard ++#endif ++ ++static const char *command; ++static bool child; ++static uintptr_t ptr_chk_guard_copy; ++static bool ptr_chk_guard_copy_set; ++static int fds[2]; ++ ++static void __attribute__ ((constructor)) ++con (void) ++{ ++ ptr_chk_guard_copy = POINTER_CHK_GUARD; ++ ptr_chk_guard_copy_set = true; ++} ++ ++static int ++uintptr_t_cmp (const void *a, const void *b) ++{ ++ if (*(uintptr_t *) a < *(uintptr_t *) b) ++ return 1; ++ if (*(uintptr_t *) a > *(uintptr_t *) b) ++ return -1; ++ return 0; ++} ++ ++static int ++do_test (void) ++{ ++ if (!ptr_chk_guard_copy_set) ++ { ++ puts ("constructor has not been run"); ++ return 1; ++ } ++ ++ if (ptr_chk_guard_copy != POINTER_CHK_GUARD) ++ { ++ puts ("POINTER_CHK_GUARD changed between constructor and do_test"); ++ return 1; ++ } ++ ++ if (child) ++ { ++ write (2, &ptr_chk_guard_copy, sizeof (ptr_chk_guard_copy)); ++ return 0; ++ } ++ ++ if (command == NULL) ++ { ++ puts ("missing --command or --child argument"); ++ return 1; ++ } ++ ++#define N 16 ++ uintptr_t child_ptr_chk_guards[N + 1]; ++ child_ptr_chk_guards[N] = ptr_chk_guard_copy; ++ int i; ++ for (i = 0; i < N; ++i) ++ { ++ if (pipe (fds) < 0) ++ { ++ printf ("couldn't create pipe: %m\n"); ++ return 1; ++ } ++ ++ pid_t pid = fork (); ++ if (pid < 0) ++ { ++ printf ("fork failed: %m\n"); ++ return 1; ++ } ++ ++ if (!pid) ++ { ++ if (ptr_chk_guard_copy != POINTER_CHK_GUARD) ++ { ++ puts ("POINTER_CHK_GUARD changed after fork"); ++ exit (1); ++ } ++ ++ close (fds[0]); ++ close (2); ++ dup2 (fds[1], 2); ++ close (fds[1]); ++ ++ system (command); ++ exit (0); ++ } ++ ++ close (fds[1]); ++ ++ if (TEMP_FAILURE_RETRY (read (fds[0], &child_ptr_chk_guards[i], ++ sizeof (uintptr_t))) != sizeof (uintptr_t)) ++ { ++ puts ("could not read ptr_chk_guard value from child"); ++ return 1; ++ } ++ ++ close (fds[0]); ++ ++ pid_t termpid; ++ int status; ++ termpid = TEMP_FAILURE_RETRY (waitpid (pid, &status, 0)); ++ if (termpid == -1) ++ { ++ printf ("waitpid failed: %m\n"); ++ return 1; ++ } ++ else if (termpid != pid) ++ { ++ printf ("waitpid returned %ld != %ld\n", ++ (long int) termpid, (long int) pid); ++ return 1; ++ } ++ else if (!WIFEXITED (status) || WEXITSTATUS (status)) ++ { ++ puts ("child hasn't exited with exit status 0"); ++ return 1; ++ } ++ } ++ ++ qsort (child_ptr_chk_guards, N + 1, sizeof (uintptr_t), uintptr_t_cmp); ++ ++ /* The default pointer guard is the same as the default stack guard. ++ They are only set to default if dl_random is NULL. */ ++ uintptr_t default_guard = 0; ++ unsigned char *p = (unsigned char *) &default_guard; ++ p[sizeof (uintptr_t) - 1] = 255; ++ p[sizeof (uintptr_t) - 2] = '\n'; ++ p[0] = 0; ++ ++ /* Test if the pointer guard canaries are either randomized, ++ or equal to the default pointer guard value. ++ Even with randomized pointer guards it might happen ++ that the random number generator generates the same ++ values, but if that happens in more than half from ++ the 16 runs, something is very wrong. */ ++ int ndifferences = 0; ++ int ndefaults = 0; ++ for (i = 0; i < N; ++i) ++ { ++ if (child_ptr_chk_guards[i] != child_ptr_chk_guards[i+1]) ++ ndifferences++; ++ else if (child_ptr_chk_guards[i] == default_guard) ++ ndefaults++; ++ } ++ ++ printf ("differences %d defaults %d\n", ndifferences, ndefaults); ++ ++ if (ndifferences < N / 2 && ndefaults < N / 2) ++ { ++ puts ("pointer guard values are not randomized enough"); ++ puts ("nor equal to the default value"); ++ return 1; ++ } ++ ++ return 0; ++} ++ ++#define OPT_COMMAND 10000 ++#define OPT_CHILD 10001 ++#define CMDLINE_OPTIONS \ ++ { "command", required_argument, NULL, OPT_COMMAND }, \ ++ { "child", no_argument, NULL, OPT_CHILD }, ++#define CMDLINE_PROCESS \ ++ case OPT_COMMAND: \ ++ command = optarg; \ ++ break; \ ++ case OPT_CHILD: \ ++ child = true; \ ++ break; ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +--- a/ports/sysdeps/ia64/stackguard-macros.h ++++ b/ports/sysdeps/ia64/stackguard-macros.h +@@ -2,3 +2,6 @@ + + #define STACK_CHK_GUARD \ + ({ uintptr_t x; asm ("adds %0 = -8, r13;; ld8 %0 = [%0]" : "=r" (x)); x; }) ++ ++#define POINTER_CHK_GUARD \ ++ ({ uintptr_t x; asm ("adds %0 = -16, r13;; ld8 %0 = [%0]" : "=r" (x)); x; }) +--- a/ports/sysdeps/tile/stackguard-macros.h ++++ b/ports/sysdeps/tile/stackguard-macros.h +@@ -4,11 +4,17 @@ + # if __WORDSIZE == 64 + # define STACK_CHK_GUARD \ + ({ uintptr_t x; asm ("addi %0, tp, -16; ld %0, %0" : "=r" (x)); x; }) ++# define POINTER_CHK_GUARD \ ++ ({ uintptr_t x; asm ("addi %0, tp, -24; ld %0, %0" : "=r" (x)); x; }) + # else + # define STACK_CHK_GUARD \ + ({ uintptr_t x; asm ("addi %0, tp, -8; ld4s %0, %0" : "=r" (x)); x; }) ++# define POINTER_CHK_GUARD \ ++ ({ uintptr_t x; asm ("addi %0, tp, -12; ld4s %0, %0" : "=r" (x)); x; }) + # endif + #else + # define STACK_CHK_GUARD \ + ({ uintptr_t x; asm ("addi %0, tp, -8; lw %0, %0" : "=r" (x)); x; }) ++# define POINTER_CHK_GUARD \ ++ ({ uintptr_t x; asm ("addi %0, tp, -12; lw %0, %0" : "=r" (x)); x; }) + #endif +--- a/sysdeps/generic/stackguard-macros.h ++++ b/sysdeps/generic/stackguard-macros.h +@@ -2,3 +2,6 @@ + + extern uintptr_t __stack_chk_guard; + #define STACK_CHK_GUARD __stack_chk_guard ++ ++extern uintptr_t __pointer_chk_guard_local; ++#define POINTER_CHK_GUARD __pointer_chk_guard_local +--- a/sysdeps/i386/stackguard-macros.h ++++ b/sysdeps/i386/stackguard-macros.h +@@ -2,3 +2,11 @@ + + #define STACK_CHK_GUARD \ + ({ uintptr_t x; asm ("movl %%gs:0x14, %0" : "=r" (x)); x; }) ++ ++#define POINTER_CHK_GUARD \ ++ ({ \ ++ uintptr_t x; \ ++ asm ("movl %%gs:%c1, %0" : "=r" (x) \ ++ : "i" (offsetof (tcbhead_t, pointer_guard))); \ ++ x; \ ++ }) +--- a/sysdeps/powerpc/powerpc32/stackguard-macros.h ++++ b/sysdeps/powerpc/powerpc32/stackguard-macros.h +@@ -2,3 +2,13 @@ + + #define STACK_CHK_GUARD \ + ({ uintptr_t x; asm ("lwz %0,-28680(2)" : "=r" (x)); x; }) ++ ++#define POINTER_CHK_GUARD \ ++ ({ \ ++ uintptr_t x; \ ++ asm ("lwz %0,%1(2)" \ ++ : "=r" (x) \ ++ : "i" (offsetof (tcbhead_t, pointer_guard) - TLS_TCB_OFFSET - sizeof (tcbhead_t)) \ ++ ); \ ++ x; \ ++ }) +--- a/sysdeps/powerpc/powerpc64/stackguard-macros.h ++++ b/sysdeps/powerpc/powerpc64/stackguard-macros.h +@@ -2,3 +2,13 @@ + + #define STACK_CHK_GUARD \ + ({ uintptr_t x; asm ("ld %0,-28688(13)" : "=r" (x)); x; }) ++ ++#define POINTER_CHK_GUARD \ ++ ({ \ ++ uintptr_t x; \ ++ asm ("ld %0,%1(2)" \ ++ : "=r" (x) \ ++ : "i" (offsetof (tcbhead_t, pointer_guard) - TLS_TCB_OFFSET - sizeof (tcbhead_t)) \ ++ ); \ ++ x; \ ++ }) +--- a/sysdeps/s390/s390-32/stackguard-macros.h ++++ b/sysdeps/s390/s390-32/stackguard-macros.h +@@ -2,3 +2,14 @@ + + #define STACK_CHK_GUARD \ + ({ uintptr_t x; asm ("ear %0,%%a0; l %0,0x14(%0)" : "=a" (x)); x; }) ++ ++/* On s390/s390x there is no unique pointer guard, instead we use the ++ same value as the stack guard. */ ++#define POINTER_CHK_GUARD \ ++ ({ \ ++ uintptr_t x; \ ++ asm ("ear %0,%%a0; l %0,%1(%0)" \ ++ : "=a" (x) \ ++ : "i" (offsetof (tcbhead_t, stack_guard))); \ ++ x; \ ++ }) +--- a/sysdeps/s390/s390-64/stackguard-macros.h ++++ b/sysdeps/s390/s390-64/stackguard-macros.h +@@ -2,3 +2,17 @@ + + #define STACK_CHK_GUARD \ + ({ uintptr_t x; asm ("ear %0,%%a0; sllg %0,%0,32; ear %0,%%a1; lg %0,0x28(%0)" : "=a" (x)); x; }) ++ ++/* On s390/s390x there is no unique pointer guard, instead we use the ++ same value as the stack guard. */ ++#define POINTER_CHK_GUARD \ ++ ({ \ ++ uintptr_t x; \ ++ asm ("ear %0,%%a0;" \ ++ "sllg %0,%0,32;" \ ++ "ear %0,%%a1;" \ ++ "lg %0,%1(%0)" \ ++ : "=a" (x) \ ++ : "i" (offsetof (tcbhead_t, stack_guard))); \ ++ x; \ ++ }) +--- a/sysdeps/sparc/sparc32/stackguard-macros.h ++++ b/sysdeps/sparc/sparc32/stackguard-macros.h +@@ -2,3 +2,6 @@ + + #define STACK_CHK_GUARD \ + ({ uintptr_t x; asm ("ld [%%g7+0x14], %0" : "=r" (x)); x; }) ++ ++#define POINTER_CHK_GUARD \ ++ ({ uintptr_t x; asm ("ld [%%g7+0x18], %0" : "=r" (x)); x; }) +--- a/sysdeps/sparc/sparc64/stackguard-macros.h ++++ b/sysdeps/sparc/sparc64/stackguard-macros.h +@@ -2,3 +2,6 @@ + + #define STACK_CHK_GUARD \ + ({ uintptr_t x; asm ("ldx [%%g7+0x28], %0" : "=r" (x)); x; }) ++ ++#define POINTER_CHK_GUARD \ ++ ({ uintptr_t x; asm ("ldx [%%g7+0x30], %0" : "=r" (x)); x; }) +--- a/sysdeps/x86_64/stackguard-macros.h ++++ b/sysdeps/x86_64/stackguard-macros.h +@@ -4,3 +4,8 @@ + ({ uintptr_t x; \ + asm ("mov %%fs:%c1, %0" : "=r" (x) \ + : "i" (offsetof (tcbhead_t, stack_guard))); x; }) ++ ++#define POINTER_CHK_GUARD \ ++ ({ uintptr_t x; \ ++ asm ("mov %%fs:%c1, %0" : "=r" (x) \ ++ : "i" (offsetof (tcbhead_t, pointer_guard))); x; }) diff --git a/patches/source/glibc/glibc-2.17_CVE-2014-0475.diff b/patches/source/glibc/glibc-2.17_CVE-2014-0475.diff new file mode 100644 index 000000000..b28b8c5a3 --- /dev/null +++ b/patches/source/glibc/glibc-2.17_CVE-2014-0475.diff @@ -0,0 +1,404 @@ +From a1a7089da053642f09f84715dfe06cd3938de8da Mon Sep 17 00:00:00 2001 +From: mancha +Date: Fri, 5 Sep 2014 +Subject: CVE-2014-0475 + +This fixes a potential for directory traversal via crafted +locale-related environment variables. This is particularly +worrisome in the case suid/sgid programs inherit these +variables potentially resulting in arbitrary code execution +with elevated privileges. + +This fix for use with glibc 2.17 is based on the following +upstream commits: + +https://sourceware.org/git/?p=glibc.git;h=4e8f95a0df7c +https://sourceware.org/git/?p=glibc.git;h=d183645616b0 + +--- + locale/findlocale.c | 74 +++++++++++-- + locale/setlocale.c | 14 ++ + localedata/Makefile | 3 + + localedata/tst-setlocale3.c | 203 ++++++++++++++++++++++++++++++++++++ + 4 files changed, 278 insertions(+), 16 deletions(-) + +--- a/locale/findlocale.c ++++ b/locale/findlocale.c +@@ -17,6 +17,7 @@ + . */ + + #include ++#include + #include + #include + #include +@@ -57,6 +58,45 @@ struct loaded_l10nfile *_nl_locale_file_list[__LC_LAST]; + + const char _nl_default_locale_path[] attribute_hidden = LOCALEDIR; + ++/* Checks if the name is actually present, that is, not NULL and not ++ empty. */ ++static inline int ++name_present (const char *name) ++{ ++ return name != NULL && name[0] != '\0'; ++} ++ ++/* Checks that the locale name neither extremely long, nor contains a ++ ".." path component (to prevent directory traversal). */ ++static inline int ++valid_locale_name (const char *name) ++{ ++ /* Not set. */ ++ size_t namelen = strlen (name); ++ /* Name too long. The limit is arbitrary and prevents stack overflow ++ issues later. */ ++ if (__glibc_unlikely (namelen > 255)) ++ return 0; ++ /* Directory traversal attempt. */ ++ static const char slashdot[4] = {'/', '.', '.', '/'}; ++ if (__glibc_unlikely (memmem (name, namelen, ++ slashdot, sizeof (slashdot)) != NULL)) ++ return 0; ++ if (namelen == 2 && __glibc_unlikely (name[0] == '.' && name [1] == '.')) ++ return 0; ++ if (namelen >= 3 ++ && __glibc_unlikely (((name[0] == '.' ++ && name[1] == '.' ++ && name[2] == '/') ++ || (name[namelen - 3] == '/' ++ && name[namelen - 2] == '.' ++ && name[namelen - 1] == '.')))) ++ return 0; ++ /* If there is a slash in the name, it must start with one. */ ++ if (__glibc_unlikely (memchr (name, '/', namelen) != NULL) && name[0] != '/') ++ return 0; ++ return 1; ++} + + struct __locale_data * + internal_function +@@ -65,7 +105,7 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len, + { + int mask; + /* Name of the locale for this category. */ +- char *loc_name; ++ char *loc_name = (char *) *name; + const char *language; + const char *modifier; + const char *territory; +@@ -73,31 +113,39 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len, + const char *normalized_codeset; + struct loaded_l10nfile *locale_file; + +- if ((*name)[0] == '\0') ++ if (loc_name[0] == '\0') + { + /* The user decides which locale to use by setting environment + variables. */ +- *name = getenv ("LC_ALL"); +- if (*name == NULL || (*name)[0] == '\0') +- *name = getenv (_nl_category_names.str ++ loc_name = getenv ("LC_ALL"); ++ if (!name_present (loc_name)) ++ loc_name = getenv (_nl_category_names.str + + _nl_category_name_idxs[category]); +- if (*name == NULL || (*name)[0] == '\0') +- *name = getenv ("LANG"); ++ if (!name_present (loc_name)) ++ loc_name = getenv ("LANG"); ++ if (!name_present (loc_name)) ++ loc_name = (char *) _nl_C_name; + } + +- if (*name == NULL || (*name)[0] == '\0' +- || (__builtin_expect (__libc_enable_secure, 0) +- && strchr (*name, '/') != NULL)) +- *name = (char *) _nl_C_name; ++ /* We used to fall back to the C locale if the name contains a slash ++ character '/', but we now check for directory traversal in ++ valid_locale_name, so this is no longer necessary. */ + +- if (__builtin_expect (strcmp (*name, _nl_C_name), 1) == 0 +- || __builtin_expect (strcmp (*name, _nl_POSIX_name), 1) == 0) ++ if (__builtin_expect (strcmp (loc_name, _nl_C_name), 1) == 0 ++ || __builtin_expect (strcmp (loc_name, _nl_POSIX_name), 1) == 0) + { + /* We need not load anything. The needed data is contained in + the library itself. */ + *name = (char *) _nl_C_name; + return _nl_C[category]; + } ++ else if (!valid_locale_name (loc_name)) ++ { ++ __set_errno (EINVAL); ++ return NULL; ++ } ++ ++ *name = loc_name; + + /* We really have to load some data. First we try the archive, + but only if there was no LOCPATH environment variable specified. */ +--- a/localedata/Makefile ++++ b/localedata/Makefile +@@ -77,7 +77,8 @@ locale_test_suite := tst_iswalnum tst_is + + tests = $(locale_test_suite) tst-digits tst-setlocale bug-iconv-trans \ + tst-leaks tst-mbswcs6 tst-xlocale1 tst-xlocale2 bug-usesetlocale \ +- tst-strfmon1 tst-sscanf bug-setlocale1 tst-setlocale2 ++ tst-strfmon1 tst-sscanf bug-setlocale1 tst-setlocale2 \ ++ tst-setlocale3 + ifeq (yes,$(build-shared)) + ifneq (no,$(PERL)) + tests: $(objpfx)mtrace-tst-leaks +--- /dev/null ++++ b/localedata/tst-setlocale3.c +@@ -0,0 +1,203 @@ ++/* Regression test for setlocale invalid environment variable handling. ++ Copyright (C) 2014 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#include ++#include ++#include ++#include ++ ++/* The result of setlocale may be overwritten by subsequent calls, so ++ this wrapper makes a copy. */ ++static char * ++setlocale_copy (int category, const char *locale) ++{ ++ const char *result = setlocale (category, locale); ++ if (result == NULL) ++ return NULL; ++ return strdup (result); ++} ++ ++static char *de_locale; ++ ++static void ++setlocale_fail (const char *envstring) ++{ ++ setenv ("LC_CTYPE", envstring, 1); ++ if (setlocale (LC_CTYPE, "") != NULL) ++ { ++ printf ("unexpected setlocale success for \"%s\" locale\n", envstring); ++ exit (1); ++ } ++ const char *newloc = setlocale (LC_CTYPE, NULL); ++ if (strcmp (newloc, de_locale) != 0) ++ { ++ printf ("failed setlocale call \"%s\" changed locale to \"%s\"\n", ++ envstring, newloc); ++ exit (1); ++ } ++} ++ ++static void ++setlocale_success (const char *envstring) ++{ ++ setenv ("LC_CTYPE", envstring, 1); ++ char *newloc = setlocale_copy (LC_CTYPE, ""); ++ if (newloc == NULL) ++ { ++ printf ("setlocale for \"%s\": %m\n", envstring); ++ exit (1); ++ } ++ if (strcmp (newloc, de_locale) == 0) ++ { ++ printf ("setlocale with LC_CTYPE=\"%s\" left locale at \"%s\"\n", ++ envstring, de_locale); ++ exit (1); ++ } ++ if (setlocale (LC_CTYPE, de_locale) == NULL) ++ { ++ printf ("restoring locale \"%s\" with LC_CTYPE=\"%s\": %m\n", ++ de_locale, envstring); ++ exit (1); ++ } ++ char *newloc2 = setlocale_copy (LC_CTYPE, newloc); ++ if (newloc2 == NULL) ++ { ++ printf ("restoring locale \"%s\" following \"%s\": %m\n", ++ newloc, envstring); ++ exit (1); ++ } ++ if (strcmp (newloc, newloc2) != 0) ++ { ++ printf ("representation of locale \"%s\" changed from \"%s\" to \"%s\"", ++ envstring, newloc, newloc2); ++ exit (1); ++ } ++ free (newloc); ++ free (newloc2); ++ ++ if (setlocale (LC_CTYPE, de_locale) == NULL) ++ { ++ printf ("restoring locale \"%s\" with LC_CTYPE=\"%s\": %m\n", ++ de_locale, envstring); ++ exit (1); ++ } ++} ++ ++/* Checks that a known-good locale still works if LC_ALL contains a ++ value which should be ignored. */ ++static void ++setlocale_ignore (const char *to_ignore) ++{ ++ const char *fr_locale = "fr_FR.UTF-8"; ++ setenv ("LC_CTYPE", fr_locale, 1); ++ char *expected_locale = setlocale_copy (LC_CTYPE, ""); ++ if (expected_locale == NULL) ++ { ++ printf ("setlocale with LC_CTYPE=\"%s\" failed: %m\n", fr_locale); ++ exit (1); ++ } ++ if (setlocale (LC_CTYPE, de_locale) == NULL) ++ { ++ printf ("failed to restore locale: %m\n"); ++ exit (1); ++ } ++ unsetenv ("LC_CTYPE"); ++ ++ setenv ("LC_ALL", to_ignore, 1); ++ setenv ("LC_CTYPE", fr_locale, 1); ++ const char *actual_locale = setlocale (LC_CTYPE, ""); ++ if (actual_locale == NULL) ++ { ++ printf ("setlocale with LC_ALL, LC_CTYPE=\"%s\" failed: %m\n", ++ fr_locale); ++ exit (1); ++ } ++ if (strcmp (actual_locale, expected_locale) != 0) ++ { ++ printf ("setlocale under LC_ALL failed: got \"%s\", expected \"%s\"\n", ++ actual_locale, expected_locale); ++ exit (1); ++ } ++ unsetenv ("LC_CTYPE"); ++ setlocale_success (fr_locale); ++ unsetenv ("LC_ALL"); ++ free (expected_locale); ++} ++ ++static int ++do_test (void) ++{ ++ /* The glibc test harness sets this environment variable ++ uncondionally. */ ++ unsetenv ("LC_ALL"); ++ ++ de_locale = setlocale_copy (LC_CTYPE, "de_DE.UTF-8"); ++ if (de_locale == NULL) ++ { ++ printf ("setlocale (LC_CTYPE, \"de_DE.UTF-8\"): %m\n"); ++ return 1; ++ } ++ setlocale_success ("C"); ++ setlocale_success ("en_US.UTF-8"); ++ setlocale_success ("/en_US.UTF-8"); ++ setlocale_success ("//en_US.UTF-8"); ++ setlocale_ignore (""); ++ ++ setlocale_fail ("does-not-exist"); ++ setlocale_fail ("/"); ++ setlocale_fail ("/../localedata/en_US.UTF-8"); ++ setlocale_fail ("en_US.UTF-8/"); ++ setlocale_fail ("en_US.UTF-8/.."); ++ setlocale_fail ("en_US.UTF-8/../en_US.UTF-8"); ++ setlocale_fail ("../localedata/en_US.UTF-8"); ++ { ++ size_t large_length = 1024; ++ char *large_name = malloc (large_length + 1); ++ if (large_name == NULL) ++ { ++ puts ("malloc failure"); ++ return 1; ++ } ++ memset (large_name, '/', large_length); ++ const char *suffix = "en_US.UTF-8"; ++ strcpy (large_name + large_length - strlen (suffix), suffix); ++ setlocale_fail (large_name); ++ free (large_name); ++ } ++ { ++ size_t huge_length = 64 * 1024 * 1024; ++ char *huge_name = malloc (huge_length + 1); ++ if (huge_name == NULL) ++ { ++ puts ("malloc failure"); ++ return 1; ++ } ++ memset (huge_name, 'X', huge_length); ++ huge_name[huge_length] = '\0'; ++ /* Construct a composite locale specification. */ ++ const char *prefix = "LC_CTYPE=de_DE.UTF-8;LC_TIME="; ++ memcpy (huge_name, prefix, strlen (prefix)); ++ setlocale_fail (huge_name); ++ free (huge_name); ++ } ++ ++ return 0; ++} ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +--- a/locale/setlocale.c ++++ b/locale/setlocale.c +@@ -273,6 +273,8 @@ setlocale (int category, const char *locale) + of entries of the form `CATEGORY=VALUE'. */ + const char *newnames[__LC_LAST]; + struct __locale_data *newdata[__LC_LAST]; ++ /* Copy of the locale argument, for in-place splitting. */ ++ char *locale_copy = NULL; + + /* Set all name pointers to the argument name. */ + for (category = 0; category < __LC_LAST; ++category) +@@ -282,7 +284,13 @@ setlocale (int category, const char *locale) + if (__builtin_expect (strchr (locale, ';') != NULL, 0)) + { + /* This is a composite name. Make a copy and split it up. */ +- char *np = strdupa (locale); ++ locale_copy = strdup (locale); ++ if (__glibc_unlikely (locale_copy == NULL)) ++ { ++ __libc_rwlock_unlock (__libc_setlocale_lock); ++ return NULL; ++ } ++ char *np = locale_copy; + char *cp; + int cnt; + +@@ -300,6 +308,7 @@ setlocale (int category, const char *locale) + { + error_return: + __libc_rwlock_unlock (__libc_setlocale_lock); ++ free (locale_copy); + + /* Bogus category name. */ + ERROR_RETURN; +@@ -392,8 +401,9 @@ setlocale (int category, const char *locale) + /* Critical section left. */ + __libc_rwlock_unlock (__libc_setlocale_lock); + +- /* Free the resources (the locale path variable). */ ++ /* Free the resources. */ + free (locale_path); ++ free (locale_copy); + + return composite; + } diff --git a/patches/source/glibc/glibc-2.17_CVE-2014-4043.diff b/patches/source/glibc/glibc-2.17_CVE-2014-4043.diff new file mode 100644 index 000000000..399f22eed --- /dev/null +++ b/patches/source/glibc/glibc-2.17_CVE-2014-4043.diff @@ -0,0 +1,142 @@ +From 9ec14ba8436e795b5573fee6685240721d7ca727 Mon Sep 17 00:00:00 2001 +From: mancha +Date: Fri, 13 Jun 2014 +Subject: CVE-2014-4043 + +POSIX requires that we make a copy, so we allocate a new string +and free it in posix_spawn_file_actions_destroy. + +Reported by David Reid, Alex Gaynor, and Glyph Lefkowitz. This bug +may have security implications. + +This backported fix for use on glibc 2.17 is based on the following +upstream commits: + +https://sourceware.org/git/?p=glibc.git;h=89e435f3559c +https://sourceware.org/git/?p=glibc.git;h=35a5e3e338ae + +--- + posix/spawn_faction_addopen.c | 14 +++++++++++--- + posix/spawn_faction_destroy.c | 22 ++++++++++++++++++++-- + posix/spawn_int.h | 2 +- + posix/tst-spawn.c | 10 +++++++++- + 4 files changed, 41 insertions(+), 7 deletions(-) + +--- a/posix/spawn_faction_addopen.c ++++ b/posix/spawn_faction_addopen.c +@@ -18,6 +18,7 @@ + #include + #include + #include ++#include + + #include "spawn_int.h" + +@@ -35,17 +35,24 @@ posix_spawn_file_actions_addopen (posix_spawn_file_actions_t *file_actions, + if (fd < 0 || fd >= maxfd) + return EBADF; + ++ char *path_copy = strdup (path); ++ if (path_copy == NULL) ++ return ENOMEM; ++ + /* Allocate more memory if needed. */ + if (file_actions->__used == file_actions->__allocated + && __posix_spawn_file_actions_realloc (file_actions) != 0) +- /* This can only mean we ran out of memory. */ +- return ENOMEM; ++ { ++ /* This can only mean we ran out of memory. */ ++ free (path_copy); ++ return ENOMEM; ++ } + + /* Add the new value. */ + rec = &file_actions->__actions[file_actions->__used]; + rec->tag = spawn_do_open; + rec->action.open_action.fd = fd; +- rec->action.open_action.path = path; ++ rec->action.open_action.path = path_copy; + rec->action.open_action.oflag = oflag; + rec->action.open_action.mode = mode; + +--- a/posix/spawn_faction_destroy.c ++++ b/posix/spawn_faction_destroy.c +@@ -18,11 +18,29 @@ + #include + #include + +-/* Initialize data structure for file attribute for `spawn' call. */ ++#include "spawn_int.h" ++ ++/* Deallocate the file actions. */ + int + posix_spawn_file_actions_destroy (posix_spawn_file_actions_t *file_actions) + { +- /* Free the memory allocated. */ ++ /* Free the paths in the open actions. */ ++ for (int i = 0; i < file_actions->__used; ++i) ++ { ++ struct __spawn_action *sa = &file_actions->__actions[i]; ++ switch (sa->tag) ++ { ++ case spawn_do_open: ++ free (sa->action.open_action.path); ++ break; ++ case spawn_do_close: ++ case spawn_do_dup2: ++ /* No cleanup required. */ ++ break; ++ } ++ } ++ ++ /* Free the array of actions. */ + free (file_actions->__actions); + return 0; + } +--- a/posix/spawn_int.h ++++ b/posix/spawn_int.h +@@ -22,7 +22,7 @@ struct __spawn_action + struct + { + int fd; +- const char *path; ++ char *path; + int oflag; + mode_t mode; + } open_action; +--- a/posix/tst-spawn.c ++++ b/posix/tst-spawn.c +@@ -168,6 +168,7 @@ do_test (int argc, char *argv[]) + char fd2name[18]; + char fd3name[18]; + char fd4name[18]; ++ char *name3_copy; + char *spargv[12]; + + /* We must have +@@ -221,9 +222,15 @@ do_test (int argc, char *argv[]) + if (posix_spawn_file_actions_addclose (&actions, fd1) != 0) + error (EXIT_FAILURE, errno, "posix_spawn_file_actions_addclose"); + /* We want to open the third file. */ +- if (posix_spawn_file_actions_addopen (&actions, fd3, name3, ++ name3_copy = strdup (name3); ++ if (name3_copy == NULL) ++ error (EXIT_FAILURE, errno, "strdup"); ++ if (posix_spawn_file_actions_addopen (&actions, fd3, name3_copy, + O_RDONLY, 0666) != 0) + error (EXIT_FAILURE, errno, "posix_spawn_file_actions_addopen"); ++ /* Overwrite the name to check that a copy has been made. */ ++ memset (name3_copy, 'X', strlen (name3_copy)); ++ + /* We dup the second descriptor. */ + fd4 = MAX (2, MAX (fd1, MAX (fd2, fd3))) + 1; + if (posix_spawn_file_actions_adddup2 (&actions, fd2, fd4) != 0) +@@ -254,6 +261,7 @@ do_test (int argc, char *argv[]) + /* Cleanup. */ + if (posix_spawn_file_actions_destroy (&actions) != 0) + error (EXIT_FAILURE, errno, "posix_spawn_file_actions_destroy"); ++ free (name3_copy); + + /* Wait for the child. */ + if (waitpid (pid, &status, 0) != pid) diff --git a/patches/source/glibc/glibc-2.17_CVE-2014-5119.diff b/patches/source/glibc/glibc-2.17_CVE-2014-5119.diff new file mode 100644 index 000000000..c12408383 --- /dev/null +++ b/patches/source/glibc/glibc-2.17_CVE-2014-5119.diff @@ -0,0 +1,206 @@ +From 46baa0ddfee8b1fdbf0b6c1daf5473bfdaad2295 Mon Sep 17 00:00:00 2001 +From: mancha +Date: Thu, 4 Sep 2014 +Subject: CVE-2014-5119 + +Loadable gconv transliteration modules have never worked correctly +and their implementation contains security vulnerabilities. This +patch removes this feature. + +This fix for use with glibc 2.17 is based on the following +upstream commit: + +https://sourceware.org/git/?p=glibc.git;h=a1a6a401ab0a + +--- + iconv/gconv_trans.c | 177 +------------------------------------------- + 1 file changed, 4 insertions(+), 173 deletions(-) + +--- a/iconv/gconv_trans.c ++++ b/iconv/gconv_trans.c +@@ -238,181 +238,12 @@ __gconv_transliterate (struct __gconv_step *step, + return __GCONV_ILLEGAL_INPUT; + } + +- +-/* Structure to represent results of found (or not) transliteration +- modules. */ +-struct known_trans +-{ +- /* This structure must remain the first member. */ +- struct trans_struct info; +- +- char *fname; +- void *handle; +- int open_count; +-}; +- +- +-/* Tree with results of previous calls to __gconv_translit_find. */ +-static void *search_tree; +- +-/* We modify global data. */ +-__libc_lock_define_initialized (static, lock); +- +- +-/* Compare two transliteration entries. */ +-static int +-trans_compare (const void *p1, const void *p2) +-{ +- const struct known_trans *s1 = (const struct known_trans *) p1; +- const struct known_trans *s2 = (const struct known_trans *) p2; +- +- return strcmp (s1->info.name, s2->info.name); +-} +- +- +-/* Open (maybe reopen) the module named in the struct. Get the function +- and data structure pointers we need. */ +-static int +-open_translit (struct known_trans *trans) +-{ +- __gconv_trans_query_fct queryfct; +- +- trans->handle = __libc_dlopen (trans->fname); +- if (trans->handle == NULL) +- /* Not available. */ +- return 1; +- +- /* Find the required symbol. */ +- queryfct = __libc_dlsym (trans->handle, "gconv_trans_context"); +- if (queryfct == NULL) +- { +- /* We cannot live with that. */ +- close_and_out: +- __libc_dlclose (trans->handle); +- trans->handle = NULL; +- return 1; +- } +- +- /* Get the context. */ +- if (queryfct (trans->info.name, &trans->info.csnames, &trans->info.ncsnames) +- != 0) +- goto close_and_out; +- +- /* Of course we also have to have the actual function. */ +- trans->info.trans_fct = __libc_dlsym (trans->handle, "gconv_trans"); +- if (trans->info.trans_fct == NULL) +- goto close_and_out; +- +- /* Now the optional functions. */ +- trans->info.trans_init_fct = +- __libc_dlsym (trans->handle, "gconv_trans_init"); +- trans->info.trans_context_fct = +- __libc_dlsym (trans->handle, "gconv_trans_context"); +- trans->info.trans_end_fct = +- __libc_dlsym (trans->handle, "gconv_trans_end"); +- +- trans->open_count = 1; +- +- return 0; +-} +- +- + int + internal_function + __gconv_translit_find (struct trans_struct *trans) + { +- struct known_trans **found; +- const struct path_elem *runp; +- int res = 1; +- +- /* We have to have a name. */ +- assert (trans->name != NULL); +- +- /* Acquire the lock. */ +- __libc_lock_lock (lock); +- +- /* See whether we know this module already. */ +- found = __tfind (trans, &search_tree, trans_compare); +- if (found != NULL) +- { +- /* Is this module available? */ +- if ((*found)->handle != NULL) +- { +- /* Maybe we have to reopen the file. */ +- if ((*found)->handle != (void *) -1) +- /* The object is not unloaded. */ +- res = 0; +- else if (open_translit (*found) == 0) +- { +- /* Copy the data. */ +- *trans = (*found)->info; +- (*found)->open_count++; +- res = 0; +- } +- } +- } +- else +- { +- size_t name_len = strlen (trans->name) + 1; +- int need_so = 0; +- struct known_trans *newp; +- +- /* We have to continue looking for the module. */ +- if (__gconv_path_elem == NULL) +- __gconv_get_path (); +- +- /* See whether we have to append .so. */ +- if (name_len <= 4 || memcmp (&trans->name[name_len - 4], ".so", 3) != 0) +- need_so = 1; +- +- /* Create a new entry. */ +- newp = (struct known_trans *) malloc (sizeof (struct known_trans) +- + (__gconv_max_path_elem_len +- + name_len + 3) +- + name_len); +- if (newp != NULL) +- { +- char *cp; +- +- /* Clear the struct. */ +- memset (newp, '\0', sizeof (struct known_trans)); +- +- /* Store a copy of the module name. */ +- newp->info.name = cp = (char *) (newp + 1); +- cp = __mempcpy (cp, trans->name, name_len); +- +- newp->fname = cp; +- +- /* Search in all the directories. */ +- for (runp = __gconv_path_elem; runp->name != NULL; ++runp) +- { +- cp = __mempcpy (__stpcpy ((char *) newp->fname, runp->name), +- trans->name, name_len); +- if (need_so) +- memcpy (cp, ".so", sizeof (".so")); +- +- if (open_translit (newp) == 0) +- { +- /* We found a module. */ +- res = 0; +- break; +- } +- } +- +- if (res) +- newp->fname = NULL; +- +- /* In any case we'll add the entry to our search tree. */ +- if (__tsearch (newp, &search_tree, trans_compare) == NULL) +- { +- /* Yickes, this should not happen. Unload the object. */ +- res = 1; +- /* XXX unload here. */ +- } +- } +- } +- +- __libc_lock_unlock (lock); +- +- return res; ++ /* Transliteration module loading has been removed because it never ++ worked as intended and suffered from a security vulnerability. ++ Consequently, this function always fails. */ ++ return 1; + } diff --git a/patches/source/glibc/glibc-2.17_CVE-2014-6040.diff b/patches/source/glibc/glibc-2.17_CVE-2014-6040.diff new file mode 100644 index 000000000..07a310372 --- /dev/null +++ b/patches/source/glibc/glibc-2.17_CVE-2014-6040.diff @@ -0,0 +1,153 @@ +From 3ca00de1ccc97fae843330fe3335289ac6aab703 Mon Sep 17 00:00:00 2001 +From: mancha +Date: Tue, 21 Oct 2014 +Subject: CVE-2014-6040 + +A flaw in the validation of input sequences in the character sets +IBM933, IBM935, IBM937, IBM939, IBM1364 can lead to OOB array +access and application DoS. + +This fix for use on glibc 2.17 is based on the following upstream +commit: + +https://sourceware.org/git/?p=glibc.git;h=41488498b6d9 + +--- + iconvdata/Makefile | 1 + + iconvdata/ibm1364.c | 3 ++- + iconvdata/ibm932.c | 5 +++-- + iconvdata/ibm933.c | 2 +- + iconvdata/ibm935.c | 2 +- + iconvdata/ibm937.c | 2 +- + iconvdata/ibm939.c | 2 +- + iconvdata/ibm943.c | 5 +++-- + iconvdata/run-iconv-test.sh | 18 ++++++++++++++++++ + 9 files changed, 31 insertions(+), 9 deletions(-) + +--- a/iconvdata/Makefile ++++ b/iconvdata/Makefile +@@ -299,6 +299,7 @@ $(objpfx)tst-iconv7.out: $(objpfx)gconv-modules \ + $(objpfx)iconv-test.out: run-iconv-test.sh $(objpfx)gconv-modules \ + $(addprefix $(objpfx),$(modules.so)) \ + $(common-objdir)/iconv/iconv_prog TESTS ++ iconv_modules="$(modules)" \ + $(SHELL) $< $(common-objdir) '$(test-wrapper)' > $@ + + $(objpfx)tst-tables.out: tst-tables.sh $(objpfx)gconv-modules \ +--- a/iconvdata/ibm1364.c ++++ b/iconvdata/ibm1364.c +@@ -220,7 +220,8 @@ enum + ++rp2; \ + \ + uint32_t res; \ +- if (__builtin_expect (ch < rp2->start, 0) \ ++ if (__builtin_expect (rp2->start == 0xffff, 0) \ ++ || __builtin_expect (ch < rp2->start, 0) \ + || (res = DB_TO_UCS4[ch + rp2->idx], \ + __builtin_expect (res, L'\1') == L'\0' && ch != '\0')) \ + { \ +--- a/iconvdata/ibm932.c ++++ b/iconvdata/ibm932.c +@@ -73,11 +73,12 @@ + } \ + \ + ch = (ch * 0x100) + inptr[1]; \ ++ /* ch was less than 0xfd. */ \ ++ assert (ch < 0xfd00); \ + while (ch > rp2->end) \ + ++rp2; \ + \ +- if (__builtin_expect (rp2 == NULL, 0) \ +- || __builtin_expect (ch < rp2->start, 0) \ ++ if (__builtin_expect (ch < rp2->start, 0) \ + || (res = __ibm932db_to_ucs4[ch + rp2->idx], \ + __builtin_expect (res, '\1') == 0 && ch !=0)) \ + { \ +--- a/iconvdata/ibm933.c ++++ b/iconvdata/ibm933.c +@@ -161,7 +161,7 @@ enum + while (ch > rp2->end) \ + ++rp2; \ + \ +- if (__builtin_expect (rp2 == NULL, 0) \ ++ if (__builtin_expect (rp2->start == 0xffff, 0) \ + || __builtin_expect (ch < rp2->start, 0) \ + || (res = __ibm933db_to_ucs4[ch + rp2->idx], \ + __builtin_expect (res, L'\1') == L'\0' && ch != '\0')) \ +--- a/iconvdata/ibm935.c ++++ b/iconvdata/ibm935.c +@@ -161,7 +161,7 @@ enum + while (ch > rp2->end) \ + ++rp2; \ + \ +- if (__builtin_expect (rp2 == NULL, 0) \ ++ if (__builtin_expect (rp2->start == 0xffff, 0) \ + || __builtin_expect (ch < rp2->start, 0) \ + || (res = __ibm935db_to_ucs4[ch + rp2->idx], \ + __builtin_expect (res, L'\1') == L'\0' && ch != '\0')) \ +--- a/iconvdata/ibm937.c ++++ b/iconvdata/ibm937.c +@@ -161,7 +161,7 @@ enum + while (ch > rp2->end) \ + ++rp2; \ + \ +- if (__builtin_expect (rp2 == NULL, 0) \ ++ if (__builtin_expect (rp2->start == 0xffff, 0) \ + || __builtin_expect (ch < rp2->start, 0) \ + || (res = __ibm937db_to_ucs4[ch + rp2->idx], \ + __builtin_expect (res, L'\1') == L'\0' && ch != '\0')) \ +--- a/iconvdata/ibm939.c ++++ b/iconvdata/ibm939.c +@@ -161,7 +161,7 @@ enum + while (ch > rp2->end) \ + ++rp2; \ + \ +- if (__builtin_expect (rp2 == NULL, 0) \ ++ if (__builtin_expect (rp2->start == 0xffff, 0) \ + || __builtin_expect (ch < rp2->start, 0) \ + || (res = __ibm939db_to_ucs4[ch + rp2->idx], \ + __builtin_expect (res, L'\1') == L'\0' && ch != '\0')) \ +--- a/iconvdata/ibm943.c ++++ b/iconvdata/ibm943.c +@@ -74,11 +74,12 @@ + } \ + \ + ch = (ch * 0x100) + inptr[1]; \ ++ /* ch was less than 0xfd. */ \ ++ assert (ch < 0xfd00); \ + while (ch > rp2->end) \ + ++rp2; \ + \ +- if (__builtin_expect (rp2 == NULL, 0) \ +- || __builtin_expect (ch < rp2->start, 0) \ ++ if (__builtin_expect (ch < rp2->start, 0) \ + || (res = __ibm943db_to_ucs4[ch + rp2->idx], \ + __builtin_expect (res, '\1') == 0 && ch !=0)) \ + { \ +--- a/iconvdata/run-iconv-test.sh ++++ b/iconvdata/run-iconv-test.sh +@@ -188,6 +188,24 @@ while read utf8 from filename; do + + done < TESTS2 + ++# Check for crashes in decoders. ++printf '\016\377\377\377\377\377\377\377' > $temp1 ++for from in $iconv_modules ; do ++ echo $ac_n "test decoder $from $ac_c" ++ PROG=`eval echo $ICONV` ++ if $PROG < $temp1 >/dev/null 2>&1 ; then ++ : # fall through ++ else ++ status=$? ++ if test $status -gt 1 ; then ++ echo "/FAILED" ++ failed=1 ++ continue ++ fi ++ fi ++ echo "OK" ++done ++ + exit $failed + # Local Variables: + # mode:shell-script diff --git a/patches/source/glibc/glibc-2.17_CVE-2015-7547.diff b/patches/source/glibc/glibc-2.17_CVE-2015-7547.diff new file mode 100644 index 000000000..0a6c98fc6 --- /dev/null +++ b/patches/source/glibc/glibc-2.17_CVE-2015-7547.diff @@ -0,0 +1,571 @@ +From 36485f1a46c66498a68862c5d245bc5019aafd47 Mon Sep 17 00:00:00 2001 +From: mancha +Date: Wed, 17 Feb 2016 +Subject: CVE-2015-7547 + +getaddrinfo() stack-based buffer overflow (Bug 18665) + +A stack-based buffer overflow was found in libresolv when invoked from +libnss_dns, allowing specially crafted DNS responses to seize control +of execution flow in the DNS client. The buffer overflow occurs in +the functions send_dg (send datagram) and send_vc (send TCP) for the +NSS module libnss_dns.so.2 when calling getaddrinfo with AF_UNSPEC +family. The use of AF_UNSPEC triggers the low-level resolver code to +send out two parallel queries for A and AAAA. A mismanagement of the +buffers used for those queries could result in the response of a query +writing beyond the alloca allocated buffer created by +nss_dns_gethostbyname4_r. Buffer management is simplified to remove +the overflow. Thanks to the Google Security Team and Red Hat for +reporting the security impact of this issue, and Robert Holiday of +Ciena for reporting the related bug 18665. (CVE-2015-7547) + +See also: + https://sourceware.org/ml/libc-alpha/2016-02/msg00416.html + https://sourceware.org/ml/libc-alpha/2016-02/msg00418.html + +Backported e9db92d3ac for glibc 2.17. + +--- + resolv/nss_dns/dns-host.c | 111 +++++++++++++++ + resolv/res_query.c | 3 + + resolv/res_send.c | 259 ++++++++++++++++++++++++++-------- + 3 files changed, 311 insertions(+), 62 deletions(-) + +--- a/resolv/nss_dns/dns-host.c ++++ b/resolv/nss_dns/dns-host.c +@@ -1049,7 +1049,10 @@ gaih_getanswer_slice (const querybuf *answer, int anslen, const char *qname, + int h_namelen = 0; + + if (ancount == 0) +- return NSS_STATUS_NOTFOUND; ++ { ++ *h_errnop = HOST_NOT_FOUND; ++ return NSS_STATUS_NOTFOUND; ++ } + + while (ancount-- > 0 && cp < end_of_message && had_error == 0) + { +@@ -1226,7 +1229,14 @@ gaih_getanswer_slice (const querybuf *answer, int anslen, const char *qname, + /* Special case here: if the resolver sent a result but it only + contains a CNAME while we are looking for a T_A or T_AAAA record, + we fail with NOTFOUND instead of TRYAGAIN. */ +- return canon == NULL ? NSS_STATUS_TRYAGAIN : NSS_STATUS_NOTFOUND; ++ if (canon != NULL) ++ { ++ *h_errnop = HOST_NOT_FOUND; ++ return NSS_STATUS_NOTFOUND; ++ } ++ ++ *h_errnop = NETDB_INTERNAL; ++ return NSS_STATUS_TRYAGAIN; + } + + +@@ -1240,11 +1250,101 @@ gaih_getanswer (const querybuf *answer1, int anslen1, const querybuf *answer2, + + enum nss_status status = NSS_STATUS_NOTFOUND; + ++ /* Combining the NSS status of two distinct queries requires some ++ compromise and attention to symmetry (A or AAAA queries can be ++ returned in any order). What follows is a breakdown of how this ++ code is expected to work and why. We discuss only SUCCESS, ++ TRYAGAIN, NOTFOUND and UNAVAIL, since they are the only returns ++ that apply (though RETURN and MERGE exist). We make a distinction ++ between TRYAGAIN (recoverable) and TRYAGAIN' (not-recoverable). ++ A recoverable TRYAGAIN is almost always due to buffer size issues ++ and returns ERANGE in errno and the caller is expected to retry ++ with a larger buffer. ++ ++ Lastly, you may be tempted to make significant changes to the ++ conditions in this code to bring about symmetry between responses. ++ Please don't change anything without due consideration for ++ expected application behaviour. Some of the synthesized responses ++ aren't very well thought out and sometimes appear to imply that ++ IPv4 responses are always answer 1, and IPv6 responses are always ++ answer 2, but that's not true (see the implementation of send_dg ++ and send_vc to see response can arrive in any order, particularly ++ for UDP). However, we expect it holds roughly enough of the time ++ that this code works, but certainly needs to be fixed to make this ++ a more robust implementation. ++ ++ ---------------------------------------------- ++ | Answer 1 Status / | Synthesized | Reason | ++ | Answer 2 Status | Status | | ++ |--------------------------------------------| ++ | SUCCESS/SUCCESS | SUCCESS | [1] | ++ | SUCCESS/TRYAGAIN | TRYAGAIN | [5] | ++ | SUCCESS/TRYAGAIN' | SUCCESS | [1] | ++ | SUCCESS/NOTFOUND | SUCCESS | [1] | ++ | SUCCESS/UNAVAIL | SUCCESS | [1] | ++ | TRYAGAIN/SUCCESS | TRYAGAIN | [2] | ++ | TRYAGAIN/TRYAGAIN | TRYAGAIN | [2] | ++ | TRYAGAIN/TRYAGAIN' | TRYAGAIN | [2] | ++ | TRYAGAIN/NOTFOUND | TRYAGAIN | [2] | ++ | TRYAGAIN/UNAVAIL | TRYAGAIN | [2] | ++ | TRYAGAIN'/SUCCESS | SUCCESS | [3] | ++ | TRYAGAIN'/TRYAGAIN | TRYAGAIN | [3] | ++ | TRYAGAIN'/TRYAGAIN' | TRYAGAIN' | [3] | ++ | TRYAGAIN'/NOTFOUND | TRYAGAIN' | [3] | ++ | TRYAGAIN'/UNAVAIL | UNAVAIL | [3] | ++ | NOTFOUND/SUCCESS | SUCCESS | [3] | ++ | NOTFOUND/TRYAGAIN | TRYAGAIN | [3] | ++ | NOTFOUND/TRYAGAIN' | TRYAGAIN' | [3] | ++ | NOTFOUND/NOTFOUND | NOTFOUND | [3] | ++ | NOTFOUND/UNAVAIL | UNAVAIL | [3] | ++ | UNAVAIL/SUCCESS | UNAVAIL | [4] | ++ | UNAVAIL/TRYAGAIN | UNAVAIL | [4] | ++ | UNAVAIL/TRYAGAIN' | UNAVAIL | [4] | ++ | UNAVAIL/NOTFOUND | UNAVAIL | [4] | ++ | UNAVAIL/UNAVAIL | UNAVAIL | [4] | ++ ---------------------------------------------- ++ ++ [1] If the first response is a success we return success. ++ This ignores the state of the second answer and in fact ++ incorrectly sets errno and h_errno to that of the second ++ answer. However because the response is a success we ignore ++ *errnop and *h_errnop (though that means you touched errno on ++ success). We are being conservative here and returning the ++ likely IPv4 response in the first answer as a success. ++ ++ [2] If the first response is a recoverable TRYAGAIN we return ++ that instead of looking at the second response. The ++ expectation here is that we have failed to get an IPv4 response ++ and should retry both queries. ++ ++ [3] If the first response was not a SUCCESS and the second ++ response is not NOTFOUND (had a SUCCESS, need to TRYAGAIN, ++ or failed entirely e.g. TRYAGAIN' and UNAVAIL) then use the ++ result from the second response, otherwise the first responses ++ status is used. Again we have some odd side-effects when the ++ second response is NOTFOUND because we overwrite *errnop and ++ *h_errnop that means that a first answer of NOTFOUND might see ++ its *errnop and *h_errnop values altered. Whether it matters ++ in practice that a first response NOTFOUND has the wrong ++ *errnop and *h_errnop is undecided. ++ ++ [4] If the first response is UNAVAIL we return that instead of ++ looking at the second response. The expectation here is that ++ it will have failed similarly e.g. configuration failure. ++ ++ [5] Testing this code is complicated by the fact that truncated ++ second response buffers might be returned as SUCCESS if the ++ first answer is a SUCCESS. To fix this we add symmetry to ++ TRYAGAIN with the second response. If the second response ++ is a recoverable error we now return TRYAGIN even if the first ++ response was SUCCESS. */ ++ + if (anslen1 > 0) + status = gaih_getanswer_slice(answer1, anslen1, qname, + &pat, &buffer, &buflen, + errnop, h_errnop, ttlp, + &first); ++ + if ((status == NSS_STATUS_SUCCESS || status == NSS_STATUS_NOTFOUND + || (status == NSS_STATUS_TRYAGAIN + /* We want to look at the second answer in case of an +@@ -1260,8 +1360,15 @@ gaih_getanswer (const querybuf *answer1, int anslen1, const querybuf *answer2, + &pat, &buffer, &buflen, + errnop, h_errnop, ttlp, + &first); ++ /* Use the second response status in some cases. */ + if (status != NSS_STATUS_SUCCESS && status2 != NSS_STATUS_NOTFOUND) + status = status2; ++ /* Do not return a truncated second response (unless it was ++ unavoidable e.g. unrecoverable TRYAGAIN). */ ++ if (status == NSS_STATUS_SUCCESS ++ && (status2 == NSS_STATUS_TRYAGAIN ++ && *errnop == ERANGE && *h_errnop != NO_RECOVERY)) ++ status = NSS_STATUS_TRYAGAIN; + } + + return status; +--- a/resolv/res_query.c ++++ b/resolv/res_query.c +@@ -391,6 +391,7 @@ __libc_res_nsearch(res_state statp, + { + free (*answerp2); + *answerp2 = NULL; ++ *nanswerp2 = 0; + } + } + +@@ -431,6 +432,7 @@ __libc_res_nsearch(res_state statp, + { + free (*answerp2); + *answerp2 = NULL; ++ *nanswerp2 = 0; + } + + /* +@@ -502,6 +504,7 @@ __libc_res_nsearch(res_state statp, + { + free (*answerp2); + *answerp2 = NULL; ++ *nanswerp2 = 0; + } + if (saved_herrno != -1) + RES_SET_H_ERRNO(statp, saved_herrno); +--- a/resolv/res_send.c ++++ b/resolv/res_send.c +@@ -1,3 +1,20 @@ ++/* Copyright (C) 2016 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ + /* + * Copyright (c) 1985, 1989, 1993 + * The Regents of the University of California. All rights reserved. +@@ -361,6 +361,8 @@ __libc_res_nsend(res_state statp, const + if (__builtin_expect (statp->qhook || statp->rhook, 0)) { + if (anssiz < MAXPACKET && ansp) { + u_char *buf = malloc (MAXPACKET); ++ /* Always allocate MAXPACKET, callers expect ++ this specific size. */ + if (buf == NULL) + return (-1); + memcpy (buf, ans, HFIXEDSZ); +@@ -652,6 +654,78 @@ libresolv_hidden_def (res_nsend) + + /* Private */ + ++/* The send_vc function is responsible for sending a DNS query over TCP ++ to the nameserver numbered NS from the res_state STATP i.e. ++ EXT(statp).nssocks[ns]. The function supports sending both IPv4 and ++ IPv6 queries at the same serially on the same socket. ++ ++ Please note that for TCP there is no way to disable sending both ++ queries, unlike UDP, which honours RES_SNGLKUP and RES_SNGLKUPREOP ++ and sends the queries serially and waits for the result after each ++ sent query. This implemetnation should be corrected to honour these ++ options. ++ ++ Please also note that for TCP we send both queries over the same ++ socket one after another. This technically violates best practice ++ since the server is allowed to read the first query, respond, and ++ then close the socket (to service another client). If the server ++ does this, then the remaining second query in the socket data buffer ++ will cause the server to send the client an RST which will arrive ++ asynchronously and the client's OS will likely tear down the socket ++ receive buffer resulting in a potentially short read and lost ++ response data. This will force the client to retry the query again, ++ and this process may repeat until all servers and connection resets ++ are exhausted and then the query will fail. It's not known if this ++ happens with any frequency in real DNS server implementations. This ++ implementation should be corrected to use two sockets by default for ++ parallel queries. ++ ++ The query stored in BUF of BUFLEN length is sent first followed by ++ the query stored in BUF2 of BUFLEN2 length. Queries are sent ++ serially on the same socket. ++ ++ Answers to the query are stored firstly in *ANSP up to a max of ++ *ANSSIZP bytes. If more than *ANSSIZP bytes are needed and ANSCP ++ is non-NULL (to indicate that modifying the answer buffer is allowed) ++ then malloc is used to allocate a new response buffer and ANSCP and ++ ANSP will both point to the new buffer. If more than *ANSSIZP bytes ++ are needed but ANSCP is NULL, then as much of the response as ++ possible is read into the buffer, but the results will be truncated. ++ When truncation happens because of a small answer buffer the DNS ++ packets header field TC will bet set to 1, indicating a truncated ++ message and the rest of the socket data will be read and discarded. ++ ++ Answers to the query are stored secondly in *ANSP2 up to a max of ++ *ANSSIZP2 bytes, with the actual response length stored in ++ *RESPLEN2. If more than *ANSSIZP bytes are needed and ANSP2 ++ is non-NULL (required for a second query) then malloc is used to ++ allocate a new response buffer, *ANSSIZP2 is set to the new buffer ++ size and *ANSP2_MALLOCED is set to 1. ++ ++ The ANSP2_MALLOCED argument will eventually be removed as the ++ change in buffer pointer can be used to detect the buffer has ++ changed and that the caller should use free on the new buffer. ++ ++ Note that the answers may arrive in any order from the server and ++ therefore the first and second answer buffers may not correspond to ++ the first and second queries. ++ ++ It is not supported to call this function with a non-NULL ANSP2 ++ but a NULL ANSCP. Put another way, you can call send_vc with a ++ single unmodifiable buffer or two modifiable buffers, but no other ++ combination is supported. ++ ++ It is the caller's responsibility to free the malloc allocated ++ buffers by detecting that the pointers have changed from their ++ original values i.e. *ANSCP or *ANSP2 has changed. ++ ++ If errors are encountered then *TERRNO is set to an appropriate ++ errno value and a zero result is returned for a recoverable error, ++ and a less-than zero result is returned for a non-recoverable error. ++ ++ If no errors are encountered then *TERRNO is left unmodified and ++ a the length of the first response in bytes is returned. */ ++ + static int + send_vc(res_state statp, + const u_char *buf, int buflen, const u_char *buf2, int buflen2, +@@ -661,11 +735,7 @@ send_vc(res_state statp, + { + const HEADER *hp = (HEADER *) buf; + const HEADER *hp2 = (HEADER *) buf2; +- u_char *ans = *ansp; +- int orig_anssizp = *anssizp; +- // XXX REMOVE +- // int anssiz = *anssizp; +- HEADER *anhp = (HEADER *) ans; ++ HEADER *anhp = (HEADER *) *ansp; + struct sockaddr_in6 *nsap = EXT(statp).nsaddrs[ns]; + int truncating, connreset, resplen, n; + struct iovec iov[4]; +@@ -741,6 +811,8 @@ send_vc(res_state statp, + * Receive length & response + */ + int recvresp1 = 0; ++ /* Skip the second response if there is no second query. ++ To do that we mark the second response as received. */ + int recvresp2 = buf2 == NULL; + uint16_t rlen16; + read_len: +@@ -777,33 +849,14 @@ send_vc(res_state statp, + u_char **thisansp; + int *thisresplenp; + if ((recvresp1 | recvresp2) == 0 || buf2 == NULL) { ++ /* We have not received any responses ++ yet or we only have one response to ++ receive. */ + thisanssizp = anssizp; + thisansp = anscp ?: ansp; + assert (anscp != NULL || ansp2 == NULL); + thisresplenp = &resplen; + } else { +- if (*anssizp != MAXPACKET) { +- /* No buffer allocated for the first +- reply. We can try to use the rest +- of the user-provided buffer. */ +-#ifdef _STRING_ARCH_unaligned +- *anssizp2 = orig_anssizp - resplen; +- *ansp2 = *ansp + resplen; +-#else +- int aligned_resplen +- = ((resplen + __alignof__ (HEADER) - 1) +- & ~(__alignof__ (HEADER) - 1)); +- *anssizp2 = orig_anssizp - aligned_resplen; +- *ansp2 = *ansp + aligned_resplen; +-#endif +- } else { +- /* The first reply did not fit into the +- user-provided buffer. Maybe the second +- answer will. */ +- *anssizp2 = orig_anssizp; +- *ansp2 = *ansp; +- } +- + thisanssizp = anssizp2; + thisansp = ansp2; + thisresplenp = resplen2; +@@ -811,10 +864,14 @@ send_vc(res_state statp, + anhp = (HEADER *) *thisansp; + + *thisresplenp = rlen; +- if (rlen > *thisanssizp) { +- /* Yes, we test ANSCP here. If we have two buffers +- both will be allocatable. */ +- if (__builtin_expect (anscp != NULL, 1)) { ++ /* Is the answer buffer too small? */ ++ if (*thisanssizp < rlen) { ++ /* If the current buffer is not the the static ++ user-supplied buffer then we can reallocate ++ it. */ ++ if (thisansp != NULL && thisansp != ansp) { ++ /* Always allocate MAXPACKET, callers expect ++ this specific size. */ + u_char *newp = malloc (MAXPACKET); + if (newp == NULL) { + *terrno = ENOMEM; +@@ -824,6 +881,9 @@ send_vc(res_state statp, + *thisanssizp = MAXPACKET; + *thisansp = newp; + anhp = (HEADER *) newp; ++ /* A uint16_t can't be larger than MAXPACKET ++ thus it's safe to allocate MAXPACKET but ++ read RLEN bytes instead. */ + len = rlen; + } else { + Dprint(statp->options & RES_DEBUG, +@@ -987,6 +1047,67 @@ reopen (res_state statp, int *terrno, in + return 1; + } + ++/* The send_dg function is responsible for sending a DNS query over UDP ++ to the nameserver numbered NS from the res_state STATP i.e. ++ EXT(statp).nssocks[ns]. The function supports IPv4 and IPv6 queries ++ along with the ability to send the query in parallel for both stacks ++ (default) or serially (RES_SINGLKUP). It also supports serial lookup ++ with a close and reopen of the socket used to talk to the server ++ (RES_SNGLKUPREOP) to work around broken name servers. ++ ++ The query stored in BUF of BUFLEN length is sent first followed by ++ the query stored in BUF2 of BUFLEN2 length. Queries are sent ++ in parallel (default) or serially (RES_SINGLKUP or RES_SNGLKUPREOP). ++ ++ Answers to the query are stored firstly in *ANSP up to a max of ++ *ANSSIZP bytes. If more than *ANSSIZP bytes are needed and ANSCP ++ is non-NULL (to indicate that modifying the answer buffer is allowed) ++ then malloc is used to allocate a new response buffer and ANSCP and ++ ANSP will both point to the new buffer. If more than *ANSSIZP bytes ++ are needed but ANSCP is NULL, then as much of the response as ++ possible is read into the buffer, but the results will be truncated. ++ When truncation happens because of a small answer buffer the DNS ++ packets header field TC will bet set to 1, indicating a truncated ++ message, while the rest of the UDP packet is discarded. ++ ++ Answers to the query are stored secondly in *ANSP2 up to a max of ++ *ANSSIZP2 bytes, with the actual response length stored in ++ *RESPLEN2. If more than *ANSSIZP bytes are needed and ANSP2 ++ is non-NULL (required for a second query) then malloc is used to ++ allocate a new response buffer, *ANSSIZP2 is set to the new buffer ++ size and *ANSP2_MALLOCED is set to 1. ++ ++ The ANSP2_MALLOCED argument will eventually be removed as the ++ change in buffer pointer can be used to detect the buffer has ++ changed and that the caller should use free on the new buffer. ++ ++ Note that the answers may arrive in any order from the server and ++ therefore the first and second answer buffers may not correspond to ++ the first and second queries. ++ ++ It is not supported to call this function with a non-NULL ANSP2 ++ but a NULL ANSCP. Put another way, you can call send_vc with a ++ single unmodifiable buffer or two modifiable buffers, but no other ++ combination is supported. ++ ++ It is the caller's responsibility to free the malloc allocated ++ buffers by detecting that the pointers have changed from their ++ original values i.e. *ANSCP or *ANSP2 has changed. ++ ++ If an answer is truncated because of UDP datagram DNS limits then ++ *V_CIRCUIT is set to 1 and the return value non-zero to indicate to ++ the caller to retry with TCP. The value *GOTSOMEWHERE is set to 1 ++ if any progress was made reading a response from the nameserver and ++ is used by the caller to distinguish between ECONNREFUSED and ++ ETIMEDOUT (the latter if *GOTSOMEWHERE is 1). ++ ++ If errors are encountered then *TERRNO is set to an appropriate ++ errno value and a zero result is returned for a recoverable error, ++ and a less-than zero result is returned for a non-recoverable error. ++ ++ If no errors are encountered then *TERRNO is left unmodified and ++ a the length of the first response in bytes is returned. */ ++ + static int + send_dg(res_state statp, + const u_char *buf, int buflen, const u_char *buf2, int buflen2, +@@ -996,8 +1117,6 @@ send_dg(res_state statp, + { + const HEADER *hp = (HEADER *) buf; + const HEADER *hp2 = (HEADER *) buf2; +- u_char *ans = *ansp; +- int orig_anssizp = *anssizp; + struct timespec now, timeout, finish; + struct pollfd pfd[1]; + int ptimeout; +@@ -1030,6 +1149,8 @@ send_dg(res_state statp, + int need_recompute = 0; + int nwritten = 0; + int recvresp1 = 0; ++ /* Skip the second response if there is no second query. ++ To do that we mark the second response as received. */ + int recvresp2 = buf2 == NULL; + pfd[0].fd = EXT(statp).nssocks[ns]; + pfd[0].events = POLLOUT; +@@ -1193,50 +1314,51 @@ send_dg(res_state statp, + int *thisresplenp; + + if ((recvresp1 | recvresp2) == 0 || buf2 == NULL) { ++ /* We have not received any responses ++ yet or we only have one response to ++ receive. */ + thisanssizp = anssizp; + thisansp = anscp ?: ansp; + assert (anscp != NULL || ansp2 == NULL); + thisresplenp = &resplen; + } else { +- if (*anssizp != MAXPACKET) { +- /* No buffer allocated for the first +- reply. We can try to use the rest +- of the user-provided buffer. */ +-#ifdef _STRING_ARCH_unaligned +- *anssizp2 = orig_anssizp - resplen; +- *ansp2 = *ansp + resplen; +-#else +- int aligned_resplen +- = ((resplen + __alignof__ (HEADER) - 1) +- & ~(__alignof__ (HEADER) - 1)); +- *anssizp2 = orig_anssizp - aligned_resplen; +- *ansp2 = *ansp + aligned_resplen; +-#endif +- } else { +- /* The first reply did not fit into the +- user-provided buffer. Maybe the second +- answer will. */ +- *anssizp2 = orig_anssizp; +- *ansp2 = *ansp; +- } +- + thisanssizp = anssizp2; + thisansp = ansp2; + thisresplenp = resplen2; + } + + if (*thisanssizp < MAXPACKET +- /* Yes, we test ANSCP here. If we have two buffers +- both will be allocatable. */ +- && anscp ++ /* If the current buffer is not the the static ++ user-supplied buffer then we can reallocate ++ it. */ ++ && (thisansp != NULL && thisansp != ansp) ++ /* Is the size too small? */ + && (ioctl (pfd[0].fd, FIONREAD, thisresplenp) < 0 + || *thisanssizp < *thisresplenp)) { ++ /* Always allocate MAXPACKET, callers expect ++ this specific size. */ + u_char *newp = malloc (MAXPACKET); + if (newp != NULL) { +- *anssizp = MAXPACKET; +- *thisansp = ans = newp; ++ *thisanssizp = MAXPACKET; ++ *thisansp = newp; + } + } ++ /* We could end up with truncation if anscp was NULL ++ (not allowed to change caller's buffer) and the ++ response buffer size is too small. This isn't a ++ reliable way to detect truncation because the ioctl ++ may be an inaccurate report of the UDP message size. ++ Therefore we use this only to issue debug output. ++ To do truncation accurately with UDP we need ++ MSG_TRUNC which is only available on Linux. We ++ can abstract out the Linux-specific feature in the ++ future to detect truncation. */ ++ if (__builtin_expect (*thisanssizp < *thisresplenp, 0)) { ++ Dprint(statp->options & RES_DEBUG, ++ (stdout, ";; response may be truncated (UDP)\n") ++ ); ++ } ++ + HEADER *anhp = (HEADER *) *thisansp; + socklen_t fromlen = sizeof(struct sockaddr_in6); + assert (sizeof(from) <= fromlen); diff --git a/patches/source/glibc/glibc-2.17_gcc48-unsafe-optim.diff b/patches/source/glibc/glibc-2.17_gcc48-unsafe-optim.diff new file mode 100644 index 000000000..4de9fe583 --- /dev/null +++ b/patches/source/glibc/glibc-2.17_gcc48-unsafe-optim.diff @@ -0,0 +1,49 @@ +From ea723210a76778c7e86b8df21cb284fc2665ee4f Mon Sep 17 00:00:00 2001 +From: mancha +Date: Wed, 22 Oct 2014 +Subject: Fix unsafe compiler optimization + +GCC 4.8 enables -ftree-loop-distribute-patterns at -O3 by default and +this optimization may transform loops into memset/memmove calls. Without +proper handling this may generate unexpected PLT calls on GLIBC. +This patch fixes by creating memset/memmove aliases to internal GLIBC +__GI_memset/__GI_memmove symbols. + +This fix for use on glibc 2.17 is based on the following upstream +commits: + +https://sourceware.org/git/?p=glibc.git;h=6a97b62a5b4f +https://sourceware.org/git/?p=glibc.git;h=4959e284ca9c + +--- + sysdeps/generic/symbol-hacks.h | 7 ++++++- + sysdeps/wordsize-32/symbol-hacks.h | 2 ++ + sysdeps/x86_64/x32/symbol-hacks.h | 2 +- + 3 files changed, 9 insertions(+), 2 deletions(-) + +--- a/sysdeps/generic/symbol-hacks.h ++++ b/sysdeps/generic/symbol-hacks.h +@@ -1 +1,6 @@ +-/* Fortunately nothing to do. */ ++/* Some compiler optimizations may transform loops into memset/memmove ++ calls and without proper declaration it may generate PLT calls. */ ++#if !defined __ASSEMBLER__ && !defined NOT_IN_libc && defined SHARED ++asm ("memmove = __GI_memmove"); ++asm ("memset = __GI_memset"); ++#endif +--- a/sysdeps/wordsize-32/symbol-hacks.h ++++ b/sysdeps/wordsize-32/symbol-hacks.h +@@ -16,6 +16,8 @@ + License along with the GNU C Library; if not, see + . */ + ++#include_next "symbol-hacks.h" ++ + /* A very dirty trick: gcc emits references to __divdi3, __udivdi3, + __moddi3, and __umoddi3. These functions are exported and + therefore we get PLTs. Unnecessarily so. Changing gcc is a big +--- a/sysdeps/x86_64/x32/symbol-hacks.h ++++ b/sysdeps/x86_64/x32/symbol-hacks.h +@@ -1 +1 @@ +-/* Fortunately nothing to do. */ ++#include diff --git a/patches/source/glibc/glibc-2.17_hardening.diff b/patches/source/glibc/glibc-2.17_hardening.diff new file mode 100644 index 000000000..7c437874e --- /dev/null +++ b/patches/source/glibc/glibc-2.17_hardening.diff @@ -0,0 +1,33 @@ +From e92cd23a2bbc7d3e038187e6d35af03d307a1e43 Mon Sep 17 00:00:00 2001 +From: mancha +Date: Tue, 21 Oct 2014 +Subject: Hardening patch + +As reported by the projectzero developer who designed the recent off-by-one +glibc root exploit, extending glibc metadata hardening would have made +exploitation much more difficult and potentially impossible. + +This fix for use on glibc 2.17 is based on the following upstream +commit: + +https://sourceware.org/git/?p=glibc.git;h=52ffbdf25a11 + +--- + malloc/malloc.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +--- a/malloc/malloc.c ++++ b/malloc/malloc.c +@@ -1435,8 +1435,10 @@ typedef struct malloc_chunk* mbinptr; + BK->fd = FD; \ + if (!in_smallbin_range (P->size) \ + && __builtin_expect (P->fd_nextsize != NULL, 0)) { \ +- assert (P->fd_nextsize->bk_nextsize == P); \ +- assert (P->bk_nextsize->fd_nextsize == P); \ ++ if (__builtin_expect (P->fd_nextsize->bk_nextsize != P, 0) \ ++ || __builtin_expect (P->bk_nextsize->fd_nextsize != P, 0)) \ ++ malloc_printerr (check_action, \ ++ "corrupted double-linked list (not small)", P);\ + if (FD->fd_nextsize == NULL) { \ + if (P->fd_nextsize == P) \ + FD->fd_nextsize = FD->bk_nextsize = FD; \ diff --git a/patches/source/glibc/glibc-2.17_strcoll-change.diff b/patches/source/glibc/glibc-2.17_strcoll-change.diff new file mode 100644 index 000000000..f92241498 --- /dev/null +++ b/patches/source/glibc/glibc-2.17_strcoll-change.diff @@ -0,0 +1,802 @@ +From c2428380d42e8fb594cdd0304fc591c73b152a24 Mon Sep 17 00:00:00 2001 +From: mancha +Date: Wed, 23 Oct 2013 +Subject: Simplify strcoll implementation + +Break up strcoll into simpler functions so that the logic is easier to +follow and maintain. + +This is needed in order to backport the fixes for CVE-2012-4412 and +CVE-2012-4424. + +--- +This patch was adapted for glibc 2.17 based on: +https://sourceware.org/git/?p=glibc.git;a=commit;h=1326ba1af220 +--- + + strcoll_l.c | 701 +++++++++++++++++++++++++----------------------------------- + 1 file changed, 295 insertions(+), 406 deletions(-) + +--- a/string/strcoll_l.c ++++ b/string/strcoll_l.c +@@ -41,11 +41,244 @@ + + #include "../locale/localeinfo.h" + ++/* Track status while looking for sequences in a string. */ ++typedef struct ++{ ++ int len; /* Length of the current sequence. */ ++ int val; /* Position of the sequence relative to the ++ previous non-ignored sequence. */ ++ size_t idxnow; /* Current index in sequences. */ ++ size_t idxmax; /* Maximum index in sequences. */ ++ size_t idxcnt; /* Current count of indices. */ ++ size_t backw; /* Current Backward sequence index. */ ++ size_t backw_stop; /* Index where the backward sequences stop. */ ++ const USTRING_TYPE *us; /* The string. */ ++ int32_t *idxarr; /* Array to cache weight indices. */ ++ unsigned char *rulearr; /* Array to cache rules. */ ++} coll_seq; ++ ++/* Get next sequence. The weight indices are cached, so we don't need to ++ traverse the string. */ ++static void ++get_next_seq_cached (coll_seq *seq, int nrules, int pass, ++ const unsigned char *rulesets, ++ const USTRING_TYPE *weights) ++{ ++ int val = seq->val = 0; ++ int len = seq->len; ++ size_t backw_stop = seq->backw_stop; ++ size_t backw = seq->backw; ++ size_t idxcnt = seq->idxcnt; ++ size_t idxmax = seq->idxmax; ++ size_t idxnow = seq->idxnow; ++ unsigned char *rulearr = seq->rulearr; ++ int32_t *idxarr = seq->idxarr; ++ ++ while (len == 0) ++ { ++ ++val; ++ if (backw_stop != ~0ul) ++ { ++ /* There is something pushed. */ ++ if (backw == backw_stop) ++ { ++ /* The last pushed character was handled. Continue ++ with forward characters. */ ++ if (idxcnt < idxmax) ++ { ++ idxnow = idxcnt; ++ backw_stop = ~0ul; ++ } ++ else ++ { ++ /* Nothing any more. The backward sequence ++ ended with the last sequence in the string. */ ++ idxnow = ~0ul; ++ break; ++ } ++ } ++ else ++ idxnow = --backw; ++ } ++ else ++ { ++ backw_stop = idxcnt; ++ ++ while (idxcnt < idxmax) ++ { ++ if ((rulesets[rulearr[idxcnt] * nrules + pass] ++ & sort_backward) == 0) ++ /* No more backward characters to push. */ ++ break; ++ ++idxcnt; ++ } ++ ++ if (backw_stop == idxcnt) ++ { ++ /* No sequence at all or just one. */ ++ if (idxcnt == idxmax) ++ /* Note that LEN is still zero. */ ++ break; ++ ++ backw_stop = ~0ul; ++ idxnow = idxcnt++; ++ } ++ else ++ /* We pushed backward sequences. */ ++ idxnow = backw = idxcnt - 1; ++ } ++ len = weights[idxarr[idxnow]++]; ++ } ++ ++ /* Update the structure. */ ++ seq->val = val; ++ seq->len = len; ++ seq->backw_stop = backw_stop; ++ seq->backw = backw; ++ seq->idxcnt = idxcnt; ++ seq->idxnow = idxnow; ++} ++ ++/* Get next sequence. Traverse the string as required. */ ++static void ++get_next_seq (coll_seq *seq, int nrules, const unsigned char *rulesets, ++ const USTRING_TYPE *weights, const int32_t *table, ++ const USTRING_TYPE *extra, const int32_t *indirect) ++{ ++#include WEIGHT_H ++ int val = seq->val = 0; ++ int len = seq->len; ++ size_t backw_stop = seq->backw_stop; ++ size_t backw = seq->backw; ++ size_t idxcnt = seq->idxcnt; ++ size_t idxmax = seq->idxmax; ++ size_t idxnow = seq->idxnow; ++ unsigned char *rulearr = seq->rulearr; ++ int32_t *idxarr = seq->idxarr; ++ const USTRING_TYPE *us = seq->us; ++ ++ while (len == 0) ++ { ++ ++val; ++ if (backw_stop != ~0ul) ++ { ++ /* The is something pushed. */ ++ if (backw == backw_stop) ++ { ++ /* The last pushed character was handled. Continue ++ with forward characters. */ ++ if (idxcnt < idxmax) ++ { ++ idxnow = idxcnt; ++ backw_stop = ~0ul; ++ } ++ else ++ /* Nothing any more. The backward sequence ended with ++ the last sequence in the string. Note that LEN ++ is still zero. */ ++ break; ++ } ++ else ++ idxnow = --backw; ++ } ++ else ++ { ++ backw_stop = idxmax; ++ ++ while (*us != L('\0')) ++ { ++ int32_t tmp = findidx (&us, -1); ++ rulearr[idxmax] = tmp >> 24; ++ idxarr[idxmax] = tmp & 0xffffff; ++ idxcnt = idxmax++; ++ ++ if ((rulesets[rulearr[idxcnt] * nrules] ++ & sort_backward) == 0) ++ /* No more backward characters to push. */ ++ break; ++ ++idxcnt; ++ } ++ ++ if (backw_stop >= idxcnt) ++ { ++ /* No sequence at all or just one. */ ++ if (idxcnt == idxmax || backw_stop > idxcnt) ++ /* Note that LEN is still zero. */ ++ break; ++ ++ backw_stop = ~0ul; ++ idxnow = idxcnt; ++ } ++ else ++ /* We pushed backward sequences. */ ++ idxnow = backw = idxcnt - 1; ++ } ++ len = weights[idxarr[idxnow]++]; ++ } ++ ++ /* Update the structure. */ ++ seq->val = val; ++ seq->len = len; ++ seq->backw_stop = backw_stop; ++ seq->backw = backw; ++ seq->idxcnt = idxcnt; ++ seq->idxmax = idxmax; ++ seq->idxnow = idxnow; ++ seq->us = us; ++} ++ ++/* Compare two sequences. */ ++static int ++do_compare (coll_seq *seq1, coll_seq *seq2, int position, ++ const USTRING_TYPE *weights) ++{ ++ int seq1len = seq1->len; ++ int seq2len = seq2->len; ++ int val1 = seq1->val; ++ int val2 = seq2->val; ++ int32_t *idx1arr = seq1->idxarr; ++ int32_t *idx2arr = seq2->idxarr; ++ int idx1now = seq1->idxnow; ++ int idx2now = seq2->idxnow; ++ int result = 0; ++ ++ /* Test for position if necessary. */ ++ if (position && val1 != val2) ++ { ++ result = val1 - val2; ++ goto out; ++ } ++ ++ /* Compare the two sequences. */ ++ do ++ { ++ if (weights[idx1arr[idx1now]] != weights[idx2arr[idx2now]]) ++ { ++ /* The sequences differ. */ ++ result = weights[idx1arr[idx1now]] - weights[idx2arr[idx2now]]; ++ goto out; ++ } ++ ++ /* Increment the offsets. */ ++ ++idx1arr[idx1now]; ++ ++idx2arr[idx2now]; ++ ++ --seq1len; ++ --seq2len; ++ } ++ while (seq1len > 0 && seq2len > 0); ++ ++ if (position && seq1len != seq2len) ++ result = seq1len - seq2len; ++ ++out: ++ seq1->len = seq1len; ++ seq2->len = seq2len; ++ return result; ++} ++ + int +-STRCOLL (s1, s2, l) +- const STRING_TYPE *s1; +- const STRING_TYPE *s2; +- __locale_t l; ++STRCOLL (const STRING_TYPE *s1, const STRING_TYPE *s2, __locale_t l) + { + struct __locale_data *current = l->__locales[LC_COLLATE]; + uint_fast32_t nrules = current->values[_NL_ITEM_INDEX (_NL_COLLATE_NRULES)].word; +@@ -56,34 +289,6 @@ STRCOLL (s1, s2, l) + const USTRING_TYPE *weights; + const USTRING_TYPE *extra; + const int32_t *indirect; +- uint_fast32_t pass; +- int result = 0; +- const USTRING_TYPE *us1; +- const USTRING_TYPE *us2; +- size_t s1len; +- size_t s2len; +- int32_t *idx1arr; +- int32_t *idx2arr; +- unsigned char *rule1arr; +- unsigned char *rule2arr; +- size_t idx1max; +- size_t idx2max; +- size_t idx1cnt; +- size_t idx2cnt; +- size_t idx1now; +- size_t idx2now; +- size_t backw1_stop; +- size_t backw2_stop; +- size_t backw1; +- size_t backw2; +- int val1; +- int val2; +- int position; +- int seq1len; +- int seq2len; +- int use_malloc; +- +-#include WEIGHT_H + + if (nrules == 0) + return STRCMP (s1, s2); +@@ -98,7 +303,6 @@ STRCOLL (s1, s2, l) + current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_EXTRA,SUFFIX))].string; + indirect = (const int32_t *) + current->values[_NL_ITEM_INDEX (CONCAT(_NL_COLLATE_INDIRECT,SUFFIX))].string; +- use_malloc = 0; + + assert (((uintptr_t) table) % __alignof__ (table[0]) == 0); + assert (((uintptr_t) weights) % __alignof__ (weights[0]) == 0); +@@ -106,18 +310,13 @@ STRCOLL (s1, s2, l) + assert (((uintptr_t) indirect) % __alignof__ (indirect[0]) == 0); + + /* We need this a few times. */ +- s1len = STRLEN (s1); +- s2len = STRLEN (s2); ++ size_t s1len = STRLEN (s1); ++ size_t s2len = STRLEN (s2); + + /* Catch empty strings. */ +- if (__builtin_expect (s1len == 0, 0) || __builtin_expect (s2len == 0, 0)) ++ if (__glibc_unlikely (s1len == 0) || __glibc_unlikely (s2len == 0)) + return (s1len != 0) - (s2len != 0); + +- /* We need the elements of the strings as unsigned values since they +- are used as indeces. */ +- us1 = (const USTRING_TYPE *) s1; +- us2 = (const USTRING_TYPE *) s2; +- + /* Perform the first pass over the string and while doing this find + and store the weights for each character. Since we want this to + be as fast as possible we are using `alloca' to store the temporary +@@ -127,411 +326,101 @@ STRCOLL (s1, s2, l) + + Please note that the localedef programs makes sure that `position' + is not used at the first level. */ ++ ++ coll_seq seq1, seq2; ++ bool use_malloc = false; ++ int result = 0; ++ ++ memset (&seq1, 0, sizeof (seq1)); ++ seq2 = seq1; ++ ++ /* We need the elements of the strings as unsigned values since they ++ are used as indices. */ ++ seq1.us = (const USTRING_TYPE *) s1; ++ seq2.us = (const USTRING_TYPE *) s2; ++ + if (! __libc_use_alloca ((s1len + s2len) * (sizeof (int32_t) + 1))) + { +- idx1arr = (int32_t *) malloc ((s1len + s2len) * (sizeof (int32_t) + 1)); +- idx2arr = &idx1arr[s1len]; +- rule1arr = (unsigned char *) &idx2arr[s2len]; +- rule2arr = &rule1arr[s1len]; ++ seq1.idxarr = (int32_t *) malloc ((s1len + s2len) * (sizeof (int32_t) + 1)); ++ seq2.idxarr = &seq1.idxarr[s1len]; ++ seq1.rulearr = (unsigned char *) &seq2.idxarr[s2len]; ++ seq2.rulearr = &seq1.rulearr[s1len]; + +- if (idx1arr == NULL) ++ if (seq1.idxarr == NULL) + /* No memory. Well, go with the stack then. + + XXX Once this implementation is stable we will handle this +- differently. Instead of precomputing the indeces we will ++ differently. Instead of precomputing the indices we will + do this in time. This means, though, that this happens for + every pass again. */ + goto try_stack; +- use_malloc = 1; ++ use_malloc = true; + } + else + { + try_stack: +- idx1arr = (int32_t *) alloca (s1len * sizeof (int32_t)); +- idx2arr = (int32_t *) alloca (s2len * sizeof (int32_t)); +- rule1arr = (unsigned char *) alloca (s1len); +- rule2arr = (unsigned char *) alloca (s2len); ++ seq1.idxarr = (int32_t *) alloca (s1len * sizeof (int32_t)); ++ seq2.idxarr = (int32_t *) alloca (s2len * sizeof (int32_t)); ++ seq1.rulearr = (unsigned char *) alloca (s1len); ++ seq2.rulearr = (unsigned char *) alloca (s2len); + } + +- idx1cnt = 0; +- idx2cnt = 0; +- idx1max = 0; +- idx2max = 0; +- idx1now = 0; +- idx2now = 0; +- backw1_stop = ~0ul; +- backw2_stop = ~0ul; +- backw1 = ~0ul; +- backw2 = ~0ul; +- seq1len = 0; +- seq2len = 0; +- position = rulesets[0] & sort_position; +- while (1) +- { +- val1 = 0; +- val2 = 0; +- +- /* Get the next non-IGNOREd element for string `s1'. */ +- if (seq1len == 0) +- do +- { +- ++val1; +- +- if (backw1_stop != ~0ul) +- { +- /* The is something pushed. */ +- if (backw1 == backw1_stop) +- { +- /* The last pushed character was handled. Continue +- with forward characters. */ +- if (idx1cnt < idx1max) +- { +- idx1now = idx1cnt; +- backw1_stop = ~0ul; +- } +- else +- /* Nothing anymore. The backward sequence ended with +- the last sequence in the string. Note that seq1len +- is still zero. */ +- break; +- } +- else +- idx1now = --backw1; +- } +- else +- { +- backw1_stop = idx1max; +- +- while (*us1 != L('\0')) +- { +- int32_t tmp = findidx (&us1, -1); +- rule1arr[idx1max] = tmp >> 24; +- idx1arr[idx1max] = tmp & 0xffffff; +- idx1cnt = idx1max++; +- +- if ((rulesets[rule1arr[idx1cnt] * nrules] +- & sort_backward) == 0) +- /* No more backward characters to push. */ +- break; +- ++idx1cnt; +- } +- +- if (backw1_stop >= idx1cnt) +- { +- /* No sequence at all or just one. */ +- if (idx1cnt == idx1max || backw1_stop > idx1cnt) +- /* Note that seq1len is still zero. */ +- break; +- +- backw1_stop = ~0ul; +- idx1now = idx1cnt; +- } +- else +- /* We pushed backward sequences. */ +- idx1now = backw1 = idx1cnt - 1; +- } +- } +- while ((seq1len = weights[idx1arr[idx1now]++]) == 0); +- +- /* And the same for string `s2'. */ +- if (seq2len == 0) +- do +- { +- ++val2; +- +- if (backw2_stop != ~0ul) +- { +- /* The is something pushed. */ +- if (backw2 == backw2_stop) +- { +- /* The last pushed character was handled. Continue +- with forward characters. */ +- if (idx2cnt < idx2max) +- { +- idx2now = idx2cnt; +- backw2_stop = ~0ul; +- } +- else +- /* Nothing anymore. The backward sequence ended with +- the last sequence in the string. Note that seq2len +- is still zero. */ +- break; +- } +- else +- idx2now = --backw2; +- } +- else +- { +- backw2_stop = idx2max; +- +- while (*us2 != L('\0')) +- { +- int32_t tmp = findidx (&us2, -1); +- rule2arr[idx2max] = tmp >> 24; +- idx2arr[idx2max] = tmp & 0xffffff; +- idx2cnt = idx2max++; +- +- if ((rulesets[rule2arr[idx2cnt] * nrules] +- & sort_backward) == 0) +- /* No more backward characters to push. */ +- break; +- ++idx2cnt; +- } +- +- if (backw2_stop >= idx2cnt) +- { +- /* No sequence at all or just one. */ +- if (idx2cnt == idx2max || backw2_stop > idx2cnt) +- /* Note that seq1len is still zero. */ +- break; +- +- backw2_stop = ~0ul; +- idx2now = idx2cnt; +- } +- else +- /* We pushed backward sequences. */ +- idx2now = backw2 = idx2cnt - 1; +- } +- } +- while ((seq2len = weights[idx2arr[idx2now]++]) == 0); +- +- /* See whether any or both strings are empty. */ +- if (seq1len == 0 || seq2len == 0) +- { +- if (seq1len == seq2len) +- /* Both ended. So far so good, both strings are equal at the +- first level. */ +- break; +- +- /* This means one string is shorter than the other. Find out +- which one and return an appropriate value. */ +- result = seq1len == 0 ? -1 : 1; +- goto free_and_return; +- } +- +- /* Test for position if necessary. */ +- if (position && val1 != val2) +- { +- result = val1 - val2; +- goto free_and_return; +- } +- +- /* Compare the two sequences. */ +- do +- { +- if (weights[idx1arr[idx1now]] != weights[idx2arr[idx2now]]) +- { +- /* The sequences differ. */ +- result = weights[idx1arr[idx1now]] - weights[idx2arr[idx2now]]; +- goto free_and_return; +- } +- +- /* Increment the offsets. */ +- ++idx1arr[idx1now]; +- ++idx2arr[idx2now]; ++ seq1.rulearr[0] = 0; + +- --seq1len; +- --seq2len; +- } +- while (seq1len > 0 && seq2len > 0); +- +- if (position && seq1len != seq2len) +- { +- result = seq1len - seq2len; +- goto free_and_return; +- } +- } +- +- /* Now the remaining passes over the weights. We now use the +- indeces we found before. */ +- for (pass = 1; pass < nrules; ++pass) ++ /* Cache values in the first pass and if needed, use them in subsequent ++ passes. */ ++ for (int pass = 0; pass < nrules; ++pass) + { ++ seq1.idxcnt = 0; ++ seq1.backw_stop = ~0ul; ++ seq1.backw = ~0ul; ++ seq2.idxcnt = 0; ++ seq2.backw_stop = ~0ul; ++ seq2.backw = ~0ul; ++ + /* We assume that if a rule has defined `position' in one section + this is true for all of them. */ +- idx1cnt = 0; +- idx2cnt = 0; +- backw1_stop = ~0ul; +- backw2_stop = ~0ul; +- backw1 = ~0ul; +- backw2 = ~0ul; +- position = rulesets[rule1arr[0] * nrules + pass] & sort_position; ++ int position = rulesets[seq1.rulearr[0] * nrules + pass] & sort_position; + + while (1) + { +- val1 = 0; +- val2 = 0; +- +- /* Get the next non-IGNOREd element for string `s1'. */ +- if (seq1len == 0) +- do +- { +- ++val1; +- +- if (backw1_stop != ~0ul) +- { +- /* The is something pushed. */ +- if (backw1 == backw1_stop) +- { +- /* The last pushed character was handled. Continue +- with forward characters. */ +- if (idx1cnt < idx1max) +- { +- idx1now = idx1cnt; +- backw1_stop = ~0ul; +- } +- else +- { +- /* Nothing anymore. The backward sequence +- ended with the last sequence in the string. */ +- idx1now = ~0ul; +- break; +- } +- } +- else +- idx1now = --backw1; +- } +- else +- { +- backw1_stop = idx1cnt; +- +- while (idx1cnt < idx1max) +- { +- if ((rulesets[rule1arr[idx1cnt] * nrules + pass] +- & sort_backward) == 0) +- /* No more backward characters to push. */ +- break; +- ++idx1cnt; +- } +- +- if (backw1_stop == idx1cnt) +- { +- /* No sequence at all or just one. */ +- if (idx1cnt == idx1max) +- /* Note that seq1len is still zero. */ +- break; +- +- backw1_stop = ~0ul; +- idx1now = idx1cnt++; +- } +- else +- /* We pushed backward sequences. */ +- idx1now = backw1 = idx1cnt - 1; +- } +- } +- while ((seq1len = weights[idx1arr[idx1now]++]) == 0); +- +- /* And the same for string `s2'. */ +- if (seq2len == 0) +- do +- { +- ++val2; +- +- if (backw2_stop != ~0ul) +- { +- /* The is something pushed. */ +- if (backw2 == backw2_stop) +- { +- /* The last pushed character was handled. Continue +- with forward characters. */ +- if (idx2cnt < idx2max) +- { +- idx2now = idx2cnt; +- backw2_stop = ~0ul; +- } +- else +- { +- /* Nothing anymore. The backward sequence +- ended with the last sequence in the string. */ +- idx2now = ~0ul; +- break; +- } +- } +- else +- idx2now = --backw2; +- } +- else +- { +- backw2_stop = idx2cnt; +- +- while (idx2cnt < idx2max) +- { +- if ((rulesets[rule2arr[idx2cnt] * nrules + pass] +- & sort_backward) == 0) +- /* No more backward characters to push. */ +- break; +- ++idx2cnt; +- } +- +- if (backw2_stop == idx2cnt) +- { +- /* No sequence at all or just one. */ +- if (idx2cnt == idx2max) +- /* Note that seq2len is still zero. */ +- break; +- +- backw2_stop = ~0ul; +- idx2now = idx2cnt++; +- } +- else +- /* We pushed backward sequences. */ +- idx2now = backw2 = idx2cnt - 1; +- } +- } +- while ((seq2len = weights[idx2arr[idx2now]++]) == 0); ++ if (pass == 0) ++ { ++ get_next_seq (&seq1, nrules, rulesets, weights, table, extra, ++ indirect); ++ get_next_seq (&seq2, nrules, rulesets, weights, table, extra, ++ indirect); ++ } ++ else ++ { ++ get_next_seq_cached (&seq1, nrules, pass, rulesets, weights); ++ get_next_seq_cached (&seq2, nrules, pass, rulesets, weights); ++ } + + /* See whether any or both strings are empty. */ +- if (seq1len == 0 || seq2len == 0) ++ if (seq1.len == 0 || seq2.len == 0) + { +- if (seq1len == seq2len) ++ if (seq1.len == seq2.len) + /* Both ended. So far so good, both strings are equal + at this level. */ + break; + + /* This means one string is shorter than the other. Find out + which one and return an appropriate value. */ +- result = seq1len == 0 ? -1 : 1; ++ result = seq1.len == 0 ? -1 : 1; + goto free_and_return; + } + +- /* Test for position if necessary. */ +- if (position && val1 != val2) +- { +- result = val1 - val2; +- goto free_and_return; +- } +- +- /* Compare the two sequences. */ +- do +- { +- if (weights[idx1arr[idx1now]] != weights[idx2arr[idx2now]]) +- { +- /* The sequences differ. */ +- result = (weights[idx1arr[idx1now]] +- - weights[idx2arr[idx2now]]); +- goto free_and_return; +- } +- +- /* Increment the offsets. */ +- ++idx1arr[idx1now]; +- ++idx2arr[idx2now]; +- +- --seq1len; +- --seq2len; +- } +- while (seq1len > 0 && seq2len > 0); +- +- if (position && seq1len != seq2len) +- { +- result = seq1len - seq2len; +- goto free_and_return; +- } ++ result = do_compare (&seq1, &seq2, position, weights); ++ if (result != 0) ++ goto free_and_return; + } + } + + /* Free the memory if needed. */ + free_and_return: + if (use_malloc) +- free (idx1arr); ++ free (seq1.idxarr); + + return result; + } diff --git a/patches/source/glibc/glibc-cvs-checkout.sh b/patches/source/glibc/glibc-cvs-checkout.sh new file mode 100755 index 000000000..022d0117b --- /dev/null +++ b/patches/source/glibc/glibc-cvs-checkout.sh @@ -0,0 +1,3 @@ +echo "The password below is \"anoncvs\":" +cvs -z 9 -d :pserver:anoncvs@sources.redhat.com:/cvs/glibc login +cvs -z 9 -d :pserver:anoncvs@sources.redhat.com:/cvs/glibc co libc diff --git a/patches/source/glibc/glibc.CVE-2013-0242.diff b/patches/source/glibc/glibc.CVE-2013-0242.diff new file mode 100644 index 000000000..e35a0bcec --- /dev/null +++ b/patches/source/glibc/glibc.CVE-2013-0242.diff @@ -0,0 +1,189 @@ +From libc-alpha-return-36620-listarch-libc-alpha=sources dot redhat dot com at sourceware dot org Tue Jan 29 16:13:50 2013 +Return-Path: +Delivered-To: listarch-libc-alpha at sources dot redhat dot com +Received: (qmail 32082 invoked by alias); 29 Jan 2013 16:13:48 -0000 +Received: (qmail 32049 invoked by uid 22791); 29 Jan 2013 16:13:43 -0000 +X-SWARE-Spam-Status: No, hits=-5.2 required=5.0 + tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,TW_BK +X-Spam-Check-By: sourceware.org +From: Andreas Schwab +To: libc-alpha at sourceware dot org +Subject: [PATCH] Fix buffer overrun in regexp matcher +X-Yow: Are you selling NYLON OIL WELLS?? If so, we can use TWO DOZEN!! +Date: Tue, 29 Jan 2013 17:13:35 +0100 +Message-ID: +User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.2.92 (gnu/linux) +MIME-Version: 1.0 +Content-Type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +Mailing-List: contact libc-alpha-help at sourceware dot org; run by ezmlm +Precedence: bulk +List-Id: +List-Subscribe: +List-Archive: +List-Post: +List-Help: , +Sender: libc-alpha-owner at sourceware dot org +Delivered-To: mailing list libc-alpha at sourceware dot org + +When extending regex buffers, make sure we allocate enough room for the +state log. Merely doubling the space may not be enough if the current +node has accepted a long run of characters. This part of the code only +triggers with multibyte characters. + +Andreas. + + [BZ #15078] + * posix/regexec.c (extend_buffers): Add parameter min_len. + (check_matching): Pass minimum needed length. + (clean_state_log_if_needed): Likewise. + (get_subexp): Likewise. + * posix/Makefile (tests): Add bug-regex34. + (bug-regex34-ENV): Define. + * posix/bug-regex34.c: New file. + +diff --git a/posix/Makefile b/posix/Makefile +index 57672d8..6ceb440 100644 +--- a/posix/Makefile ++++ b/posix/Makefile +@@ -86,7 +86,7 @@ tests := tstgetopt testfnm runtests runptests \ + tst-rfc3484-3 \ + tst-getaddrinfo3 tst-fnmatch2 tst-cpucount tst-cpuset \ + bug-getopt1 bug-getopt2 bug-getopt3 bug-getopt4 \ +- bug-getopt5 tst-getopt_long1 ++ bug-getopt5 tst-getopt_long1 bug-regex34 + xtests := bug-ga2 + ifeq (yes,$(build-shared)) + test-srcs := globtest +@@ -199,6 +199,7 @@ bug-regex26-ENV = LOCPATH=$(common-objpfx)localedata + bug-regex30-ENV = LOCPATH=$(common-objpfx)localedata + bug-regex32-ENV = LOCPATH=$(common-objpfx)localedata + bug-regex33-ENV = LOCPATH=$(common-objpfx)localedata ++bug-regex34-ENV = LOCPATH=$(common-objpfx)localedata + tst-rxspencer-ARGS = --utf8 rxspencer/tests + tst-rxspencer-ENV = LOCPATH=$(common-objpfx)localedata + tst-pcre-ARGS = PCRE.tests +diff --git a/posix/bug-regex34.c b/posix/bug-regex34.c +new file mode 100644 +index 0000000..bb3b613 +--- /dev/null ++++ b/posix/bug-regex34.c +@@ -0,0 +1,46 @@ ++/* Test re_search with multi-byte characters in UTF-8. ++ Copyright (C) 2013 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++#define _GNU_SOURCE 1 ++#include ++#include ++#include ++#include ++ ++static int ++do_test (void) ++{ ++ struct re_pattern_buffer r; ++ /* ????????x */ ++ const char *s = "\xe1\x80\x80\xe1\x80\xbb\xe1\x80\xbd\xe1\x80\x94\xe1\x80\xba\xe1\x80\xaf\xe1\x80\x95\xe1\x80\xbax"; ++ ++ if (setlocale (LC_ALL, "en_US.UTF-8") == NULL) ++ { ++ puts ("setlocale failed"); ++ return 1; ++ } ++ memset (&r, 0, sizeof (r)); ++ ++ re_compile_pattern ("[^x]x", 5, &r); ++ /* This was triggering a buffer overflow. */ ++ re_search (&r, s, strlen (s), 0, strlen (s), 0); ++ return 0; ++} ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +diff --git a/posix/regexec.c b/posix/regexec.c +index 7f2de85..5ca2bf6 100644 +--- a/posix/regexec.c ++++ b/posix/regexec.c +@@ -197,7 +197,7 @@ static int group_nodes_into_DFAstates (const re_dfa_t *dfa, + static int check_node_accept (const re_match_context_t *mctx, + const re_token_t *node, int idx) + internal_function; +-static reg_errcode_t extend_buffers (re_match_context_t *mctx) ++static reg_errcode_t extend_buffers (re_match_context_t *mctx, int min_len) + internal_function; + + /* Entry point for POSIX code. */ +@@ -1160,7 +1160,7 @@ check_matching (re_match_context_t *mctx, int fl_longest_match, + || (BE (next_char_idx >= mctx->input.valid_len, 0) + && mctx->input.valid_len < mctx->input.len)) + { +- err = extend_buffers (mctx); ++ err = extend_buffers (mctx, next_char_idx + 1); + if (BE (err != REG_NOERROR, 0)) + { + assert (err == REG_ESPACE); +@@ -1738,7 +1738,7 @@ clean_state_log_if_needed (re_match_context_t *mctx, int next_state_log_idx) + && mctx->input.valid_len < mctx->input.len)) + { + reg_errcode_t err; +- err = extend_buffers (mctx); ++ err = extend_buffers (mctx, next_state_log_idx + 1); + if (BE (err != REG_NOERROR, 0)) + return err; + } +@@ -2792,7 +2792,7 @@ get_subexp (re_match_context_t *mctx, int bkref_node, int bkref_str_idx) + if (bkref_str_off >= mctx->input.len) + break; + +- err = extend_buffers (mctx); ++ err = extend_buffers (mctx, bkref_str_off + 1); + if (BE (err != REG_NOERROR, 0)) + return err; + +@@ -4102,7 +4102,7 @@ check_node_accept (const re_match_context_t *mctx, const re_token_t *node, + + static reg_errcode_t + internal_function __attribute_warn_unused_result__ +-extend_buffers (re_match_context_t *mctx) ++extend_buffers (re_match_context_t *mctx, int min_len) + { + reg_errcode_t ret; + re_string_t *pstr = &mctx->input; +@@ -4111,8 +4111,10 @@ extend_buffers (re_match_context_t *mctx) + if (BE (INT_MAX / 2 / sizeof (re_dfastate_t *) <= pstr->bufs_len, 0)) + return REG_ESPACE; + +- /* Double the lengthes of the buffers. */ +- ret = re_string_realloc_buffers (pstr, MIN (pstr->len, pstr->bufs_len * 2)); ++ /* Double the lengthes of the buffers, but allocate at least MIN_LEN. */ ++ ret = re_string_realloc_buffers (pstr, ++ MAX (min_len, ++ MIN (pstr->len, pstr->bufs_len * 2))); + if (BE (ret != REG_NOERROR, 0)) + return ret; + +-- +1.8.1.2 + + +-- +Andreas Schwab, SUSE Labs, schwab@suse.de +GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7 +"And now for something completely different." + + diff --git a/patches/source/glibc/glibc.CVE-2013-1914.diff b/patches/source/glibc/glibc.CVE-2013-1914.diff new file mode 100644 index 000000000..fc844829c --- /dev/null +++ b/patches/source/glibc/glibc.CVE-2013-1914.diff @@ -0,0 +1,53 @@ +From: Andreas Schwab +Date: Thu, 21 Mar 2013 14:50:27 +0000 (+0100) +Subject: Fix stack overflow in getaddrinfo with many results +X-Git-Url: http://sourceware.org/git/?p=glibc.git;a=commitdiff_plain;h=1cef1b19089528db11f221e938f60b9b048945d7 + +Fix stack overflow in getaddrinfo with many results +--- + +diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c +index d95c2d1..2309281 100644 +--- a/sysdeps/posix/getaddrinfo.c ++++ b/sysdeps/posix/getaddrinfo.c +@@ -2489,11 +2489,27 @@ getaddrinfo (const char *name, const char *service, + __typeof (once) old_once = once; + __libc_once (once, gaiconf_init); + /* Sort results according to RFC 3484. */ +- struct sort_result results[nresults]; +- size_t order[nresults]; ++ struct sort_result *results; ++ size_t *order; + struct addrinfo *q; + struct addrinfo *last = NULL; + char *canonname = NULL; ++ bool malloc_results; ++ ++ malloc_results ++ = !__libc_use_alloca (nresults * (sizeof (*results) + sizeof (size_t))); ++ if (malloc_results) ++ { ++ results = malloc (nresults * (sizeof (*results) + sizeof (size_t))); ++ if (results == NULL) ++ { ++ __free_in6ai (in6ai); ++ return EAI_MEMORY; ++ } ++ } ++ else ++ results = alloca (nresults * (sizeof (*results) + sizeof (size_t))); ++ order = (size_t *) (results + nresults); + + /* Now we definitely need the interface information. */ + if (! check_pf_called) +@@ -2664,6 +2680,9 @@ getaddrinfo (const char *name, const char *service, + + /* Fill in the canonical name into the new first entry. */ + p->ai_canonname = canonname; ++ ++ if (malloc_results) ++ free (results); + } + + __free_in6ai (in6ai); + diff --git a/patches/source/glibc/glibc.CVE-2013-2207.diff b/patches/source/glibc/glibc.CVE-2013-2207.diff new file mode 100644 index 000000000..c43ccf5cd --- /dev/null +++ b/patches/source/glibc/glibc.CVE-2013-2207.diff @@ -0,0 +1,241 @@ +From 5d96012d9978efe4bad88a38e2efcbeada9f7585 Mon Sep 17 00:00:00 2001 +From: mancha +Date: Thu, 22 Aug 2013 +Subject: CVE-2013-2207, BZ #15755: Disable pt_chown. + +Using the setuid installed pt_chown and a weak check on whether a file +descriptor is a tty, an attacker could fake a pty check using FUSE and +trick pt_chown to grant ownership of a pty descriptor that the current +user does not own. It cannot access /dev/pts/ptmx however. + +Pre-conditions for the attack: + + * Attacker with local user account + * Kernel with FUSE support + * "user_allow_other" in /etc/fuse.conf + * Victim with allocated slave in /dev/pts + +In most modern distributions pt_chown is not needed because devpts +is enabled by default. The fix for this CVE is to disable building +and using pt_chown by default. We still provide a configure option +to enable the use of pt_chown but distributions do so at their own +risk. + +--- +This patch was adapted for glibc 2.17 point release from: +http://sourceware.org/git/?p=glibc.git;a=commit;h=e4608715e6e1 +--- + + INSTALL | 12 ++++++++++++ + config.h.in | 3 +++ + config.make.in | 1 + + configure | 15 +++++++++++++++ + configure.in | 10 ++++++++++ + login/Makefile | 8 +++++++- + manual/install.texi | 14 ++++++++++++++ + sysdeps/unix/grantpt.c | 8 +++++--- + sysdeps/unix/sysv/linux/grantpt.c | 5 +++-- + 9 files changed, 70 insertions(+), 6 deletions(-) +--- + +--- a/INSTALL ++++ b/INSTALL +@@ -128,6 +128,18 @@ will be used, and CFLAGS sets optimizati + this can be prevented though there generally is no reason since it + creates compatibility problems. + ++`--enable-pt_chown' ++ The file `pt_chown' is a helper binary for `grantpt' (*note ++ Pseudo-Terminals: Allocation.) that is installed setuid root to ++ fix up pseudo-terminal ownership. It is not built by default ++ because systems using the Linux kernel are commonly built with the ++ `devpts' filesystem enabled and mounted at `/dev/pts', which ++ manages pseudo-terminal ownership automatically. By using ++ `--enable-pt_chown', you may build `pt_chown' and install it ++ setuid and owned by `root'. The use of `pt_chown' introduces ++ additional security risks to the system and you should enable it ++ only if you understand and accept those risks. ++ + `--build=BUILD-SYSTEM' + `--host=HOST-SYSTEM' + These options are for cross-compiling. If you specify both +--- a/config.h.in ++++ b/config.h.in +@@ -232,4 +232,7 @@ + /* The ARM hard-float ABI is being used. */ + #undef HAVE_ARM_PCS_VFP + ++/* The pt_chown binary is being built and used by grantpt. */ ++#undef HAVE_PT_CHOWN ++ + #endif +--- a/config.make.in ++++ b/config.make.in +@@ -101,6 +101,7 @@ force-install = @force_install@ + link-obsolete-rpc = @link_obsolete_rpc@ + build-nscd = @build_nscd@ + use-nscd = @use_nscd@ ++build-pt-chown = @build_pt_chown@ + + # Build tools. + CC = @CC@ +--- a/configure ++++ b/configure +@@ -653,6 +653,7 @@ multi_arch + base_machine + add_on_subdirs + add_ons ++build_pt_chown + build_nscd + link_obsolete_rpc + libc_cv_nss_crypt +@@ -759,6 +760,7 @@ enable_obsolete_rpc + enable_systemtap + enable_build_nscd + enable_nscd ++enable_pt_chown + with_cpu + ' + ac_precious_vars='build_alias +@@ -1419,6 +1421,7 @@ Optional Features: + --enable-systemtap enable systemtap static probe points [default=no] + --disable-build-nscd disable building and installing the nscd daemon + --disable-nscd library functions will not contact the nscd daemon ++ --enable-pt_chown Enable building and installing pt_chown + + Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] +@@ -3933,6 +3936,18 @@ else + use_nscd=yes + fi + ++# Check whether --enable-pt_chown was given. ++if test "${enable_pt_chown+set}" = set; then : ++ enableval=$enable_pt_chown; build_pt_chown=$enableval ++else ++ build_pt_chown=no ++fi ++ ++ ++if test $build_pt_chown = yes; then ++ $as_echo "#define HAVE_PT_CHOWN 1" >>confdefs.h ++ ++fi + + # The way shlib-versions is used to generate soversions.mk uses a + # fairly simplistic model for name recognition that can't distinguish +--- a/configure.in ++++ b/configure.in +@@ -315,6 +315,16 @@ AC_ARG_ENABLE([nscd], + [use_nscd=$enableval], + [use_nscd=yes]) + ++AC_ARG_ENABLE([pt_chown], ++ [AS_HELP_STRING([--enable-pt_chown], ++ [Enable building and installing pt_chown])], ++ [build_pt_chown=$enableval], ++ [build_pt_chown=no]) ++AC_SUBST(build_pt_chown) ++if test $build_pt_chown = yes; then ++ AC_DEFINE(HAVE_PT_CHOWN) ++fi ++ + # The way shlib-versions is used to generate soversions.mk uses a + # fairly simplistic model for name recognition that can't distinguish + # i486-pc-linux-gnu fully from i486-pc-gnu. So we mutate a $host_os +--- a/login/Makefile ++++ b/login/Makefile +@@ -29,9 +29,15 @@ routines := getutent getutent_r getutid + + CFLAGS-grantpt.c = -DLIBEXECDIR='"$(libexecdir)"' + +-others = utmpdump pt_chown ++others = utmpdump ++ ++include ../Makeconfig ++ ++ifeq (yes,$(build-pt-chown)) ++others += pt_chown + others-pie = pt_chown + install-others-programs = $(inst_libexecdir)/pt_chown ++endif + + subdir-dirs = programs + vpath %.c programs +--- a/manual/install.texi ++++ b/manual/install.texi +@@ -155,6 +155,20 @@ if the used tools support it. By using + prevented though there generally is no reason since it creates + compatibility problems. + ++@pindex pt_chown ++@findex grantpt ++@item --enable-pt_chown ++The file @file{pt_chown} is a helper binary for @code{grantpt} ++(@pxref{Allocation, Pseudo-Terminals}) that is installed setuid root to ++fix up pseudo-terminal ownership. It is not built by default because ++systems using the Linux kernel are commonly built with the @code{devpts} ++filesystem enabled and mounted at @file{/dev/pts}, which manages ++pseudo-terminal ownership automatically. By using ++@samp{--enable-pt_chown}, you may build @file{pt_chown} and install it ++setuid and owned by @code{root}. The use of @file{pt_chown} introduces ++additional security risks to the system and you should enable it only if ++you understand and accept those risks. ++ + @item --build=@var{build-system} + @itemx --host=@var{host-system} + These options are for cross-compiling. If you specify both options and +--- a/sysdeps/unix/grantpt.c ++++ b/sysdeps/unix/grantpt.c +@@ -173,9 +173,10 @@ grantpt (int fd) + retval = 0; + goto cleanup; + +- /* We have to use the helper program. */ ++ /* We have to use the helper program if it is available.. */ + helper:; + ++#ifdef HAVE_PT_CHOWN + pid_t pid = __fork (); + if (pid == -1) + goto cleanup; +@@ -190,9 +191,9 @@ grantpt (int fd) + if (__dup2 (fd, PTY_FILENO) < 0) + _exit (FAIL_EBADF); + +-#ifdef CLOSE_ALL_FDS ++# ifdef CLOSE_ALL_FDS + CLOSE_ALL_FDS (); +-#endif ++# endif + + execle (_PATH_PT_CHOWN, basename (_PATH_PT_CHOWN), NULL, NULL); + _exit (FAIL_EXEC); +@@ -231,6 +232,7 @@ grantpt (int fd) + assert(! "getpt: internal error: invalid exit code from pt_chown"); + } + } ++#endif + + cleanup: + if (buf != _buf) +--- a/sysdeps/unix/sysv/linux/grantpt.c ++++ b/sysdeps/unix/sysv/linux/grantpt.c +@@ -11,7 +11,7 @@ + + #include "pty-private.h" + +- ++#if HAVE_PT_CHOWN + /* Close all file descriptors except the one specified. */ + static void + close_all_fds (void) +@@ -38,6 +38,7 @@ close_all_fds (void) + __dup2 (STDOUT_FILENO, STDERR_FILENO); + } + } +-#define CLOSE_ALL_FDS() close_all_fds() ++# define CLOSE_ALL_FDS() close_all_fds() ++#endif + + #include diff --git a/patches/source/glibc/glibc.CVE-2013-4332.diff b/patches/source/glibc/glibc.CVE-2013-4332.diff new file mode 100644 index 000000000..9f7f5886c --- /dev/null +++ b/patches/source/glibc/glibc.CVE-2013-4332.diff @@ -0,0 +1,64 @@ +From 0d6085cb1b4330b835ad08a3ec8f80b30f0cadb4 Mon Sep 17 00:00:00 2001 +From: mancha +Date: Wed, 11 Sep 2013 +Subject: CVE-2013-4332 + +malloc: Check for integer overflow in pvalloc, valloc, and memalign. + +A large bytes parameter to pvalloc, valloc, or memalign could cause +an integer overflow and corrupt allocator internals. Check the +overflow does not occur before continuing with the allocation. + +Note: This is a backport to glibc 2.17 of the following three commits: + * https://sourceware.org/git/?p=glibc.git;a=commit;h=1159a193696a + * https://sourceware.org/git/?p=glibc.git;a=commit;h=55e17aadc1ef + * https://sourceware.org/git/?p=glibc.git;a=commit;h=b73ed247781d +--- + +malloc.c | 21 +++++++++++++++++++++ + 1 file changed, 21 insertions(+) + +--- a/malloc/malloc.c ++++ b/malloc/malloc.c +@@ -3020,6 +3020,13 @@ __libc_memalign(size_t alignment, size_t + /* Otherwise, ensure that it is at least a minimum chunk size */ + if (alignment < MINSIZE) alignment = MINSIZE; + ++ /* Check for overflow. */ ++ if (bytes > SIZE_MAX - alignment - MINSIZE) ++ { ++ __set_errno (ENOMEM); ++ return 0; ++ } ++ + arena_get(ar_ptr, bytes + alignment + MINSIZE); + if(!ar_ptr) + return 0; +@@ -3051,6 +3058,13 @@ __libc_valloc(size_t bytes) + + size_t pagesz = GLRO(dl_pagesize); + ++ /* Check for overflow. */ ++ if (bytes > SIZE_MAX - pagesz - MINSIZE) ++ { ++ __set_errno (ENOMEM); ++ return 0; ++ } ++ + __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t, + const __malloc_ptr_t)) = + force_reg (__memalign_hook); +@@ -3088,6 +3102,13 @@ __libc_pvalloc(size_t bytes) + size_t page_mask = GLRO(dl_pagesize) - 1; + size_t rounded_bytes = (bytes + page_mask) & ~(page_mask); + ++ /* Check for overflow. */ ++ if (bytes > SIZE_MAX - 2*pagesz - MINSIZE) ++ { ++ __set_errno (ENOMEM); ++ return 0; ++ } ++ + __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t, + const __malloc_ptr_t)) = + force_reg (__memalign_hook); diff --git a/patches/source/glibc/glibc.CVE-2015-0235.glibc217.diff b/patches/source/glibc/glibc.CVE-2015-0235.glibc217.diff new file mode 100644 index 000000000..06d482e89 --- /dev/null +++ b/patches/source/glibc/glibc.CVE-2015-0235.glibc217.diff @@ -0,0 +1,217 @@ +--- ./nss/getXXbyYY_r.c.orig 2012-12-24 21:02:13.000000000 -0600 ++++ ./nss/getXXbyYY_r.c 2015-01-27 17:36:40.945070889 -0600 +@@ -179,6 +179,9 @@ + case -1: + return errno; + case 1: ++#ifdef NEED_H_ERRNO ++ any_service = true; ++#endif + goto done; + } + #endif +@@ -288,7 +291,7 @@ + /* Either we failed to lookup the functions or the functions themselves + had a system error. Set NETDB_INTERNAL here to let the caller know + that the errno may have the real reason for failure. */ +- *h_errnop = NETDB_INTERNAL; ++ *h_errnop = NETDB_INTERNAL; + else if (status != NSS_STATUS_SUCCESS && !any_service) + /* We were not able to use any service. */ + *h_errnop = NO_RECOVERY; +--- ./nss/digits_dots.c.orig 2012-12-24 21:02:13.000000000 -0600 ++++ ./nss/digits_dots.c 2015-01-27 17:36:40.945070889 -0600 +@@ -46,7 +46,10 @@ + { + if (h_errnop) + *h_errnop = NETDB_INTERNAL; +- *result = NULL; ++ if (buffer_size == NULL) ++ *status = NSS_STATUS_TRYAGAIN; ++ else ++ *result = NULL; + return -1; + } + +@@ -83,14 +86,16 @@ + } + + size_needed = (sizeof (*host_addr) +- + sizeof (*h_addr_ptrs) + strlen (name) + 1); ++ + sizeof (*h_addr_ptrs) ++ + sizeof (*h_alias_ptr) + strlen (name) + 1); + + if (buffer_size == NULL) + { + if (buflen < size_needed) + { ++ *status = NSS_STATUS_TRYAGAIN; + if (h_errnop != NULL) +- *h_errnop = TRY_AGAIN; ++ *h_errnop = NETDB_INTERNAL; + __set_errno (ERANGE); + goto done; + } +@@ -109,7 +114,7 @@ + *buffer_size = 0; + __set_errno (save); + if (h_errnop != NULL) +- *h_errnop = TRY_AGAIN; ++ *h_errnop = NETDB_INTERNAL; + *result = NULL; + goto done; + } +@@ -149,7 +154,9 @@ + if (! ok) + { + *h_errnop = HOST_NOT_FOUND; +- if (buffer_size) ++ if (buffer_size == NULL) ++ *status = NSS_STATUS_NOTFOUND; ++ else + *result = NULL; + goto done; + } +@@ -190,7 +197,7 @@ + if (buffer_size == NULL) + *status = NSS_STATUS_SUCCESS; + else +- *result = resbuf; ++ *result = resbuf; + goto done; + } + +@@ -201,15 +208,6 @@ + + if ((isxdigit (name[0]) && strchr (name, ':') != NULL) || name[0] == ':') + { +- const char *cp; +- char *hostname; +- typedef unsigned char host_addr_t[16]; +- host_addr_t *host_addr; +- typedef char *host_addr_list_t[2]; +- host_addr_list_t *h_addr_ptrs; +- size_t size_needed; +- int addr_size; +- + switch (af) + { + default: +@@ -225,7 +223,10 @@ + /* This is not possible. We cannot represent an IPv6 address + in an `struct in_addr' variable. */ + *h_errnop = HOST_NOT_FOUND; +- *result = NULL; ++ if (buffer_size == NULL) ++ *status = NSS_STATUS_NOTFOUND; ++ else ++ *result = NULL; + goto done; + + case AF_INET6: +@@ -233,42 +234,6 @@ + break; + } + +- size_needed = (sizeof (*host_addr) +- + sizeof (*h_addr_ptrs) + strlen (name) + 1); +- +- if (buffer_size == NULL && buflen < size_needed) +- { +- if (h_errnop != NULL) +- *h_errnop = TRY_AGAIN; +- __set_errno (ERANGE); +- goto done; +- } +- else if (buffer_size != NULL && *buffer_size < size_needed) +- { +- char *new_buf; +- *buffer_size = size_needed; +- new_buf = realloc (*buffer, *buffer_size); +- +- if (new_buf == NULL) +- { +- save = errno; +- free (*buffer); +- __set_errno (save); +- *buffer = NULL; +- *buffer_size = 0; +- *result = NULL; +- goto done; +- } +- *buffer = new_buf; +- } +- +- memset (*buffer, '\0', size_needed); +- +- host_addr = (host_addr_t *) *buffer; +- h_addr_ptrs = (host_addr_list_t *) +- ((char *) host_addr + sizeof (*host_addr)); +- hostname = (char *) h_addr_ptrs + sizeof (*h_addr_ptrs); +- + for (cp = name;; ++cp) + { + if (!*cp) +@@ -281,7 +246,9 @@ + if (inet_pton (AF_INET6, name, host_addr) <= 0) + { + *h_errnop = HOST_NOT_FOUND; +- if (buffer_size) ++ if (buffer_size == NULL) ++ *status = NSS_STATUS_NOTFOUND; ++ else + *result = NULL; + goto done; + } +--- ./nss/test-digits-dots.c.orig 2015-01-27 17:36:40.946070889 -0600 ++++ ./nss/test-digits-dots.c 2015-01-27 17:36:40.946070889 -0600 +@@ -0,0 +1,38 @@ ++/* Copyright (C) 2013 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, see ++ . */ ++ ++/* Testcase for BZ #15014 */ ++ ++#include ++#include ++#include ++ ++static int ++do_test (void) ++{ ++ char buf[32]; ++ struct hostent *result = NULL; ++ struct hostent ret; ++ int h_err = 0; ++ int err; ++ ++ err = gethostbyname_r ("1.2.3.4", &ret, buf, sizeof (buf), &result, &h_err); ++ return err == ERANGE && h_err == NETDB_INTERNAL ? EXIT_SUCCESS : EXIT_FAILURE; ++} ++ ++#define TEST_FUNCTION do_test () ++#include "../test-skeleton.c" +--- ./nss/Makefile.orig 2012-12-24 21:02:13.000000000 -0600 ++++ ./nss/Makefile 2015-01-27 17:36:40.944070889 -0600 +@@ -38,7 +38,7 @@ + makedb-modules = xmalloc hash-string + extra-objs += $(makedb-modules:=.o) + +-tests = test-netdb tst-nss-test1 ++tests = test-netdb tst-nss-test1 test-digits-dots + xtests = bug-erange + + include ../Makeconfig diff --git a/patches/source/glibc/glibc.SlackBuild b/patches/source/glibc/glibc.SlackBuild new file mode 100755 index 000000000..6b7d23187 --- /dev/null +++ b/patches/source/glibc/glibc.SlackBuild @@ -0,0 +1,536 @@ +#!/bin/sh + +# Copyright 2006, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2016 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +## build glibc-$VERSION for Slackware + +VERSION=${VERSION:-2.17} +CHECKOUT=${CHECKOUT:-""} +BUILD=${BUILD:-11_slack14.1} + +# I was considering disabling NSCD, but MoZes talked me out of it. :) +#DISABLE_NSCD=" --disable-nscd " + +# $ARCH may be preset, otherwise i486 compatibility with i686 binary +# structuring is the Slackware default, since this is what gcc-3.2+ +# requires for binary compatibility with previous releases. +if [ -z "$ARCH" ]; then + case "$( uname -m )" in + i?86) export ARCH=i486 ;; + arm*) export ARCH=arm ;; + # Unless $ARCH is already set, use uname -m for all other archs: + *) export ARCH=$( uname -m ) ;; + esac +fi + +# I'll break this out as an option for fun :-) +case $ARCH in + i386) + OPTIMIZ="-O3 -march=i386 -mcpu=i686" + LIBDIRSUFFIX="" + ;; + i486) + OPTIMIZ="-O3 -march=i486 -mtune=i686" + LIBDIRSUFFIX="" + ;; + i586) + OPTIMIZ="-O3 -march=i586" + LIBDIRSUFFIX="" + ;; + i686) + OPTIMIZ="-O3 -march=i686" + LIBDIRSUFFIX="" + ;; + athlon) + OPTIMIZ="-O3 -march=athlon" + LIBDIRSUFFIX="" + ;; + s390) + OPTIMIZ="-O3" + LIBDIRSUFFIX="" + ;; + x86_64) + OPTIMIZ="-O3 -fPIC" + LIBDIRSUFFIX="64" + ;; + *) + OPTIMIZ="-O3" + LIBDIRSUFFIX="" + ;; +esac + +case $ARCH in + x86_64) + TARGET=${TARGET:-x86_64} + ;; + i486) + # This should be i486 for all 32-bit x86 arch: + TARGET=${TARGET:-i486} + ;; +esac + +# Hand off the $ARCH variable to $SLACKWARE_ARCH to avoid confusing glibc: +SLACKWARE_ARCH=$ARCH +unset ARCH + +CVSVER=${VERSION}${CHECKOUT} + +# NOTE!!! glibc needs to be built against the sanitized kernel headers, +# which will be installed under /usr/include by the kernel-headers package. +# Be sure the correct version of the headers package is installed BEFORE +# building glibc! + +CWD=$(pwd) +# Temporary build location. This should not be a directory +# path a non-root user could create later... +TMP=${TMP:-/glibc-tmp-$(mcookie)} +mkdir -p $TMP + +NUMJOBS=${NUMJOBS:--j4} + +# Sanity check on the version number in the install scripts: +if ! grep -vq libutil-${VERSION}.so $CWD/doinst.sh-glibc ; then + echo "FATAL: doinst.sh scripts have wrong version numbers." + exit 1 +fi + +# This function fixes a doinst.sh file for x86_64. +# With thanks to Fred Emmott. +fix_doinst() { + if [ "x$LIBDIRSUFFIX" = "x" ]; then + return; + fi; + # Fix "( cd usr/lib ;" occurrences + sed -i "s#lib ;#lib${LIBDIRSUFFIX} ;#" install/doinst.sh + # Fix "lib/" occurrences + sed -i "s#lib/#lib${LIBDIRSUFFIX}/#g" install/doinst.sh + # Fix "( cd lib" occurrences + sed -i "s#( cd lib\$#( cd lib${LIBDIRSUFFIX}#" install/doinst.sh + + if [ "$SLACKWARE_ARCH" = "x86_64" ]; then + sed -i 's#ld-linux.so.2#ld-linux-x86-64.so.2#' install/doinst.sh + fi +} + +# This is a patch function to put all glibc patches in the build script +# up near the top. +apply_patches() { + # Use old-style locale directories rather than a single (and strangely + # formatted) /usr/lib/locale/locale-archive file: + zcat $CWD/glibc.locale.no-archive.diff.gz | patch -p1 --verbose || exit 1 + # The is_IS locale is causing a strange error about the "echn" command + # not existing. This patch reverts is_IS to the version shipped in + # glibc-2.5: + zcat $CWD/is_IS.diff.gz | patch -p1 --verbose || exit 1 + # Fix NIS netgroups: + zcat $CWD/glibc.nis-netgroups.diff.gz | patch -p1 --verbose || exit 1 + # Support ru_RU.CP1251 locale: + zcat $CWD/glibc.ru_RU.CP1251.diff.gz | patch -p1 --verbose || exit 1 + # Fix missing MAX macro in getcwd.c: + zcat $CWD/glibc.getcwd.max.macro.diff.gz | patch -p1 --verbose || exit 1 + # Fix resolver problem with glibc-2.9: + zcat $CWD/glibc-2.10-dns-no-gethostbyname4.diff.gz | patch -p0 --verbose || exit 1 + # This reverts a patch that was made to glibc to fix "namespace leakage", + # which seems to cause some build failures (e.g. with conntrack): + zcat $CWD/glibc.revert.to.fix.build.breakages.diff.gz | patch -p1 --verbose || exit 1 + # This partial security patch still applies and might be needed: + zcat $CWD/glibc.git-96611391ad8823ba58405325d78cefeae5cdf699-CVE-2010-3847b.patch.gz | patch -p1 --verbose || exit 1 + # Make it harder for people to trick ldd into running code: + zcat $CWD/glibc.ldd.trace.through.dynamic.linker.diff.gz | patch -p1 --verbose || exit 1 + # Make glibc compile with binutils using --enable-initfini-array. + # At this time, we do not recommend this due to probable ABI breakage. + # The also patch needs work before it would apply. + # ***NOT READY*** + #zcat $CWD/glibc.git-4a531bb0b3b582cb693de9f76d2d97d970f9a5d5.patch.gz | patch -p1 --verbose || exit 1 + # + # Avoid the Intel optimized asm routines for now because they break + # the flash player. We'll phase this in when it's safer to do so. + zcat $CWD/glibc.disable.broken.optimized.memcpy.diff.gz | patch -p1 --verbose || exit 1 + # Fix buffer overrun in regexp matcher. This bug is deemed low impact since + # the buffer contents cannot be controlled, but could lead to a crash. + zcat $CWD/glibc.CVE-2013-0242.diff.gz | patch -p1 --verbose || exit 1 + # Fix stack overflow in getaddrinfo with many results. This bug can only be + # triggered through DNS poisoning or through the use of a hostile DNS + # server (in which case you already have problems), and requires large + # amounts of data to be sent to the targeted machine. May lead to a + # crash. Considered low impact. + zcat $CWD/glibc.CVE-2013-1914.diff.gz | patch -p1 --verbose || exit 1 + # Remove pt_chown by default, as it can be used for a local privilege + # escalation. However, although this is worth patching in the -current + # version, it requires a non-default (and known to weaken security) setting + # for FUSE. Additionally, the patch is not portable to older versions of + # glibc (but thanks Mancha for porting it to 2.17!). On older versions + # of glibc, making /usr/libexec/pt_chown a symlink to /bin/true will + # provide the same fix, if needed. But the insecure setting for FUSE + # probably opens up many other possible exploits and should be avoided. + zcat $CWD/glibc.CVE-2013-2207.diff.gz | patch -p1 --verbose || exit 1 + # Patch integer overflows in pvalloc, valloc, and + # posix_memalign/memalign/aligned_alloc (CVE-2013-4332). + zcat $CWD/glibc.CVE-2013-4332.diff.gz | patch -p1 --verbose || exit 1 + # Security patches: + patch -p1 --verbose < $CWD/glibc-2.17_strcoll-change.diff || exit 1 + patch -p1 --verbose < $CWD/glibc-2.17_CVE-2012-4424.diff || exit 1 + patch -p1 --verbose < $CWD/glibc-2.17_CVE-2012-4412.diff || exit 1 + patch -p1 --verbose < $CWD/glibc-2.17_CVE-2013-4237.diff || exit 1 + patch -p1 --verbose < $CWD/glibc-2.17_CVE-2013-4788.diff || exit 1 + patch -p1 --verbose < $CWD/glibc-2.17_CVE-2013-4458.diff || exit 1 + patch -p1 --verbose < $CWD/glibc-2.17_CVE-2014-4043.diff || exit 1 + patch -p1 --verbose < $CWD/glibc-2.17_CVE-2014-0475.diff || exit 1 + patch -p1 --verbose < $CWD/glibc-2.17_CVE-2014-5119.diff || exit 1 + patch -p1 --verbose < $CWD/glibc-2.17_CVE-2014-6040.diff || exit 1 + # Security hardening patch from Florian Weimer: + patch -p1 --verbose < $CWD/glibc-2.17_hardening.diff || exit 1 + # Bugfix patch for optimization in gcc-4.8+: + patch -p1 --verbose < $CWD/glibc-2.17_gcc48-unsafe-optim.diff || exit 1 + # Fix parsing of numeric hosts in gethostbyname_r: + zcat $CWD/glibc.CVE-2015-0235.glibc217.diff.gz | patch -p1 --verbose || exit 1 + # Patch CVE-2015-7547: + zcat $CWD/glibc-2.17_CVE-2015-7547.diff.gz | patch -p1 --verbose || exit 1 +} + +# This is going to be the initial $DESTDIR: +export PKG=$TMP/package-glibc-incoming-tree +PGLIBC=$TMP/package-glibc +PSOLIBS=$TMP/package-glibc-solibs +PZONE=$TMP/package-glibc-zoneinfo +PI18N=$TMP/package-glibc-i18n +PPROFILE=$TMP/package-glibc-profile +PDEBUG=$TMP/package-glibc-debug + +# Empty these locations first: +for dir in $PKG $PGLIBC $PSOLIBS $PZONE $PI18N $PPROFILE $PDEBUG ; do + if [ -d $dir ]; then + rm -rf $dir + fi + mkdir -p $dir +done +if [ -d $TMP/glibc-$VERSION ]; then + rm -rf $TMP/glibc-$VERSION +fi + +# Create an incoming directory structure for glibc to be built into: +mkdir -p $PKG/lib${LIBDIRSUFFIX} +mkdir -p $PKG/sbin +mkdir -p $PKG/usr/bin +mkdir -p $PKG/usr/lib${LIBDIRSUFFIX} +mkdir -p $PKG/usr/sbin +mkdir -p $PKG/usr/include +mkdir -p $PKG/usr/doc +mkdir -p $PKG/usr/man +mkdir -p $PKG/usr/share +mkdir -p $PKG/var/db/nscd +mkdir -p $PKG/var/run/nscd + +# Begin extract/compile: +cd $TMP +rm -rf glibc-$CVSVER +tar xvf $CWD/glibc-$CVSVER.tar.xz \ + || tar xvf $CWD/glibc-$CVSVER.tar.bz2 \ + || tar xvf $CWD/glibc-$CVSVER.tar.gz +cd glibc-$CVSVER + +chown -R root:root . +find . -perm 666 -exec chmod 644 {} \; +find . -perm 664 -exec chmod 644 {} \; +find . -perm 600 -exec chmod 644 {} \; +find . -perm 444 -exec chmod 644 {} \; +find . -perm 400 -exec chmod 644 {} \; +find . -perm 440 -exec chmod 644 {} \; +find . -perm 777 -exec chmod 755 {} \; +find . -perm 775 -exec chmod 755 {} \; +find . -perm 511 -exec chmod 755 {} \; +find . -perm 711 -exec chmod 755 {} \; +find . -perm 555 -exec chmod 755 {} \; + +# Clean up leftover CVS directories: +find . -type d -name CVS -exec rm -r {} \; 2> /dev/null + +# Apply patches; exit if any fail. +apply_patches +if [ ! $? = 0 ]; then + exit 1 +fi + +# Make build directory: +mkdir build-glibc-$VERSION +cd build-glibc-$VERSION || exit 1 + +echo "BUILDING DAS NPTL GLIBC" +CFLAGS="-g $OPTIMIZ" \ +../configure \ + --prefix=/usr \ + --libdir=/usr/lib${LIBDIRSUFFIX} \ + --enable-kernel=2.6.32 \ + --with-headers=/usr/include \ + --enable-add-ons=libidn,nptl \ + --enable-obsolete-rpc \ + --enable-profile \ + $DISABLE_NSCD \ + --infodir=/usr/info \ + --mandir=/usr/man \ + --with-tls \ + --with-__thread \ + --without-cvs \ + $TARGET-slackware-linux + +make $NUMJOBS || make || exit 1 +make install install_root=$PKG || exit 1 +make localedata/install-locales install_root=$PKG || exit 1 + +# The prevailing standard seems to be putting unstripped libraries in +# /usr/lib/debug/ and stripping the debugging symbols from all the other +# libraries. +mkdir -p $PKG/usr/lib${LIBDIRSUFFIX}/debug +cp -a $PKG/lib${LIBDIRSUFFIX}/l*.so* $PKG/usr/lib${LIBDIRSUFFIX}/debug +cp -a $PKG/usr/lib${LIBDIRSUFFIX}/*.a $PKG/usr/lib${LIBDIRSUFFIX}/debug +# Don't need debug+profile: +( cd $PKG/usr/lib${LIBDIRSUFFIX}/debug ; rm -f *_p.* ) +# NOTE: Is there really a reason for the glibc-debug package? +# If you're debugging glibc, you can also compile it, right? + +## COMMENTED OUT: There's no reason for profile libs to include -g information. +## Put back unstripped profiling libraries: +#mv $PKG/usr/lib${LIBDIRSUFFIX}/debug/*_p.a $PKG/usr/lib${LIBDIRSUFFIX} +# It might be best to put the unstripped and profiling libraries in glibc-debug and glibc-profile. + +# I don't think "strip -g" causes the pthread problems. It's --strip-unneeded that does. +strip -g $PKG/lib${LIBDIRSUFFIX}/l*.so* +strip -g $PKG/usr/lib${LIBDIRSUFFIX}/l*.so* +strip -g $PKG/usr/lib${LIBDIRSUFFIX}/lib*.a + +# Build and install the zoneinfo database: +cd $TMP +rm -rf tzcodedata-build +mkdir tzcodedata-build +cd tzcodedata-build +tar xzf $CWD/tzdata?????.tar.gz +tar xzf $CWD/tzcode?????.tar.gz +sed -i "s,/usr/local,$(pwd),g" Makefile +sed -i "s,/etc/zoneinfo,/zoneinfo,g" Makefile +make +make install +mkdir -p $PKG/usr/share/zoneinfo/{posix,right} +cd etc +cp -a zoneinfo/* $PKG/usr/share/zoneinfo +cp -a zoneinfo-posix/* $PKG/usr/share/zoneinfo/posix +cp -a zoneinfo-leaps/* $PKG/usr/share/zoneinfo/right +# Remove $PKG/usr/share/zoneinfo/localtime -- the install script will +# create it as a link to /etc/localtime. +rm -f $PKG/usr/share/zoneinfo/localtime + +# Back to the sources dir to add some files/docs: +cd $TMP/glibc-$CVSVER + +# We'll automatically install the config file for the Name Server Cache Daemon. +# Perhaps this should also have some commented-out startup code in rc.inet2... +mkdir -p $PKG/etc +cat nscd/nscd.conf > $PKG/etc/nscd.conf.new + +# Install some scripts to help select a timezone: +( cd $CWD/timezone-scripts + # Try to rebuild this: + sh output-updated-timeconfig.sh $PKG/usr/share/zoneinfo > timeconfig 2> /dev/null +) +mkdir -p $PKG/var/log/setup +cp -a $CWD/timezone-scripts/setup.timeconfig $PKG/var/log/setup +chown root:root $PKG/var/log/setup/setup.timeconfig +chmod 755 $PKG/var/log/setup/setup.timeconfig +mkdir -p $PKG/usr/sbin +cp -a $CWD/timezone-scripts/timeconfig $PKG/usr/sbin +chown root:root $PKG/usr/sbin/timeconfig +chmod 755 $PKG/usr/sbin/timeconfig + +## Install docs: +( mkdir -p $PKG/usr/doc/glibc-$VERSION + cp -a \ + BUGS CONFORMANCE COPYING COPYING.LIB FAQ INSTALL LICENSES NAMESPACE \ + NEWS NOTES PROJECTS README README.libm \ + $PKG/usr/doc/glibc-$VERSION +) + +# Don't forget to add the /usr/share/zoneinfo/localtime -> /etc/localtime symlink! :) +if [ ! -r $PKG/usr/share/zoneinfo/localtime ]; then + ( cd $PKG/usr/share/zoneinfo ; ln -sf /etc/localtime . ) +fi + +# OK, there are some very old Linux standards that say that any binaries in a /bin or +# /sbin directory (and the directories themselves) should be group bin rather than +# group root, unless a specific group is really needed for some reason. +# +# I can't find any mention of this in more recent standards docs, and always thought +# that it was pretty cosmetic anyway (hey, if there's a reason -- fill me in!), so +# it's possible that this ownership change won't be followed in the near future +# (it's a PITA, and causes many bug reports when the perms change is occasionally +# forgotten). +# +# But, it's hard to get me to break old habits, so we'll continue the tradition here: +# +# No, no we won't. You know how we love to break traditions. + +# Strip most binaries: +( cd $PKG + find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip --strip-debug 2> /dev/null + find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip -g 2> /dev/null +) + +# Fix info dir: +rm $PKG/usr/info/dir +gzip -9 $PKG/usr/info/* + +# This is junk +rm $PKG/etc/ld.so.cache +( cd $PKG + find . -name "*.orig" -exec rm {} \; +) + +################################## +# OK, time to make some packages # +################################## + +# glibc-zoneinfo. We will start with an easy one to avoid breaking a sweat. ;-) +cd $CWD +ZONE_VERSIONS="$(echo tzdata* | cut -f1 -d . | cut -b7-11)" +echo $ZONE_VERSIONS +cd $PZONE +# Install some scripts to help select a timezone: +mkdir -p $PZONE/var/log/setup +cp -a $CWD/timezone-scripts/setup.timeconfig $PZONE/var/log/setup +chown root:root $PZONE/var/log/setup/setup.timeconfig +chmod 755 $PZONE/var/log/setup/setup.timeconfig +mkdir -p $PZONE/usr/sbin +cp -a $CWD/timezone-scripts/timeconfig $PZONE/usr/sbin +chown root:root $PZONE/usr/sbin/timeconfig +chmod 755 $PZONE/usr/sbin/timeconfig +mkdir $PZONE/install +cat $CWD/doinst.sh-glibc-zoneinfo > $PZONE/install/doinst.sh +cat $CWD/slack-desc.glibc-zoneinfo > $PZONE/install/slack-desc +mkdir -p $PZONE/usr/share +cd $PZONE/usr/share +cp -a --verbose $PKG/usr/share/zoneinfo . +cd $PZONE +mkdir -p $PZONE/etc +# This is already hard-coded into doinst.sh (like it'll be there anyway ;-): +rm -f etc/localtime +# Wrap it up: +makepkg -l y -c n $TMP/glibc-zoneinfo-$ZONE_VERSIONS-noarch-$BUILD.txz + +# glibc-profile: +cd $PPROFILE +mkdir -p usr/lib${LIBDIRSUFFIX} +# Might as well just grab these with 'mv' to simplify things later: +mv $PKG/usr/lib${LIBDIRSUFFIX}/lib*_p.a usr/lib${LIBDIRSUFFIX} +# Profile libs should be stripped. Use the debug libs to debug... +( cd usr/lib${LIBDIRSUFFIX} ; strip -g *.a ) +mkdir install +cp -a $CWD/slack-desc.glibc-profile install/slack-desc +makepkg -l y -c n $TMP/glibc-profile-$VERSION-$SLACKWARE_ARCH-$BUILD.txz + +# THIS IS NO LONGER PACKAGED (or is it? might be better to let it be made, and then ship it or not...) +# glibc-debug: +cd $PDEBUG +mkdir -p usr/lib${LIBDIRSUFFIX} +# Might as well just grab these with 'mv' to simplify things later: +mv $PKG/usr/lib${LIBDIRSUFFIX}/debug usr/lib${LIBDIRSUFFIX} +mkdir install +cp -a $CWD/slack-desc.glibc-debug install/slack-desc +makepkg -l y -c n $TMP/glibc-debug-$VERSION-$SLACKWARE_ARCH-$BUILD.txz +## INSTEAD, NUKE THESE LIBS +#rm -rf $PKG/usr/lib${LIBDIRSUFFIX}/debug + +# glibc-i18n: +cd $PI18N +mkdir -p usr/lib${LIBDIRSUFFIX} +rm -rf usr/lib${LIBDIRSUFFIX}/locale +cp -a $PKG/usr/lib${LIBDIRSUFFIX}/locale usr/lib${LIBDIRSUFFIX} +mkdir -p usr/share +cp -a $PKG/usr/share/i18n usr/share +cp -a $PKG/usr/share/locale usr/share +mkdir install +cp -a $CWD/slack-desc.glibc-i18n install/slack-desc +makepkg -l y -c n $TMP/glibc-i18n-$VERSION-$SLACKWARE_ARCH-$BUILD.txz + +# glibc-solibs: +cd $PSOLIBS +mkdir -p etc/profile.d +cp -a $CWD/profile.d/* etc/profile.d +chown -R root:root etc +chmod 755 etc/profile.d/* +mkdir -p lib${LIBDIRSUFFIX} +cp -a $PKG/lib${LIBDIRSUFFIX}/* lib${LIBDIRSUFFIX} +( cd lib${LIBDIRSUFFIX} + mkdir incoming + mv *so* incoming + mv incoming/libSegFault.so . +) +mkdir -p usr +cp -a $PKG/usr/bin usr +mv usr/bin/ldd . +rm usr/bin/* +mv ldd usr/bin +mkdir -p usr/lib${LIBDIRSUFFIX} +# The gconv directory has a lot of stuff, but including it here will save some problems. +# Seems standard elsewhere. +cp -a $PKG/usr/lib${LIBDIRSUFFIX}/gconv usr/lib${LIBDIRSUFFIX} +# Another manpage abandoned by GNU... +#mkdir -p usr/man/man1 +#cp -a $PKG/usr/man/man1/ldd.1.gz usr/man/man1 +mkdir -p usr/libexec +cp -a $PKG/usr/libexec/pt_chown usr/libexec +# Same usr.bin deal: +cp -a $PKG/sbin . +mv sbin/ldconfig . +rm sbin/* +mv ldconfig sbin +mkdir install +cp -a $CWD/slack-desc.glibc-solibs install/slack-desc +cp -a $CWD/doinst.sh-glibc-solibs install/doinst.sh +fix_doinst +# Ditch links: +find . -type l -exec rm {} \; +# Build the package: +makepkg -l y -c n $TMP/glibc-solibs-$VERSION-$SLACKWARE_ARCH-$BUILD.txz + +# And finally, the complete "all-in-one" glibc package is created +# from whatever was leftover: +cd $PGLIBC +mv $PKG/* . +mkdir -p etc/profile.d +cp -a $CWD/profile.d/* etc/profile.d +chown -R root:root etc +chmod 755 etc/profile.d/* +# Ditch links (these are in doinst.sh-glibc): +find . -type l -exec rm {} \; +mkdir install +cp -a $CWD/slack-desc.glibc install/slack-desc +cp -a $CWD/doinst.sh-glibc install/doinst.sh +fix_doinst +( cd lib${LIBDIRSUFFIX} + mkdir incoming + mv *so* incoming + mv incoming/libSegFault.so . +) +# Build the package: +/sbin/makepkg -l y -c n $TMP/glibc-$VERSION-$SLACKWARE_ARCH-$BUILD.txz + +# Done! +echo +echo "glibc packages built in $TMP!" + diff --git a/patches/source/glibc/glibc.disable.broken.optimized.memcpy.diff b/patches/source/glibc/glibc.disable.broken.optimized.memcpy.diff new file mode 100644 index 000000000..8034f1201 --- /dev/null +++ b/patches/source/glibc/glibc.disable.broken.optimized.memcpy.diff @@ -0,0 +1,30 @@ +--- ./sysdeps/x86_64/multiarch/memcpy.S.orig 2011-01-17 22:34:07.000000000 -0600 ++++ ./sysdeps/x86_64/multiarch/memcpy.S 2011-02-08 19:36:26.000000000 -0600 +@@ -32,12 +32,6 @@ + jne 1f + call __init_cpu_features + 1: leaq __memcpy_sse2(%rip), %rax +- testl $bit_SSSE3, __cpu_features+CPUID_OFFSET+index_SSSE3(%rip) +- jz 2f +- leaq __memcpy_ssse3(%rip), %rax +- testl $bit_Fast_Copy_Backward, __cpu_features+FEATURE_OFFSET+index_Fast_Copy_Backward(%rip) +- jz 2f +- leaq __memcpy_ssse3_back(%rip), %rax + 2: ret + END(memcpy) + +--- ./sysdeps/x86_64/multiarch/mempcpy.S.orig 2011-01-17 22:34:07.000000000 -0600 ++++ ./sysdeps/x86_64/multiarch/mempcpy.S 2011-02-08 19:36:37.000000000 -0600 +@@ -31,12 +31,6 @@ + jne 1f + call __init_cpu_features + 1: leaq __mempcpy_sse2(%rip), %rax +- testl $bit_SSSE3, __cpu_features+CPUID_OFFSET+index_SSSE3(%rip) +- jz 2f +- leaq __mempcpy_ssse3(%rip), %rax +- testl $bit_Fast_Copy_Backward, __cpu_features+FEATURE_OFFSET+index_Fast_Copy_Backward(%rip) +- jz 2f +- leaq __mempcpy_ssse3_back(%rip), %rax + 2: ret + END(__mempcpy) + diff --git a/patches/source/glibc/glibc.getcwd.max.macro.diff b/patches/source/glibc/glibc.getcwd.max.macro.diff new file mode 100644 index 000000000..e26e14d95 --- /dev/null +++ b/patches/source/glibc/glibc.getcwd.max.macro.diff @@ -0,0 +1,10 @@ +--- ./sysdeps/unix/sysv/linux/getcwd.c.orig 2006-04-02 12:58:28.000000000 -0500 ++++ ./sysdeps/unix/sysv/linux/getcwd.c 2006-10-10 22:11:02.000000000 -0500 +@@ -28,6 +28,7 @@ + #include + #include + #include ++#include + + #include + diff --git a/patches/source/glibc/glibc.git-4a531bb0b3b582cb693de9f76d2d97d970f9a5d5.patch b/patches/source/glibc/glibc.git-4a531bb0b3b582cb693de9f76d2d97d970f9a5d5.patch new file mode 100644 index 000000000..9b58674c7 --- /dev/null +++ b/patches/source/glibc/glibc.git-4a531bb0b3b582cb693de9f76d2d97d970f9a5d5.patch @@ -0,0 +1,1212 @@ +From 4a531bb0b3b582cb693de9f76d2d97d970f9a5d5 Mon Sep 17 00:00:00 2001 +From: H.J. Lu +Date: Fri, 24 Dec 2010 20:14:37 -0500 +Subject: [PATCH] Remove `.ctors' and `.dtors' output sections + +--- + ChangeLog | 15 ++ + config.h.in | 3 + + configure | 334 +++++++++++++++++--------------- + configure.in | 2 + + elf/sofini.c | 2 + + elf/soinit.c | 2 + + sysdeps/i386/init-first.c | 2 + + sysdeps/mach/hurd/i386/init-first.c | 2 +- + sysdeps/mach/hurd/powerpc/init-first.c | 2 +- + sysdeps/sh/init-first.c | 2 + + sysdeps/unix/sysv/linux/init-first.c | 2 +- + 11 files changed, 209 insertions(+), 159 deletions(-) + +diff --git a/ChangeLog b/ChangeLog +index 958c76a..497de67 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,18 @@ ++2010-12-15 H.J. Lu ++ ++ * config.h.in (NO_CTORS_DTORS_SECTIONS): Define. ++ * configure.in: Define NO_CTORS_DTORS_SECTIONS if linker ++ script has SORT_BY_INIT_PRIORITY. ++ * elf/sofini.c: Remove `.ctors' and `.dtors' sections if ++ NO_CTORS_DTORS_SECTIONS is defined. ++ * elf/soinit.c: Likewise. ++ * sysdeps/i386/init-first.c: Don't call __libc_global_ctors if ++ NO_CTORS_DTORS_SECTIONS is defined. ++ * sysdeps/mach/hurd/i386/init-first.c: Likewise. ++ * sysdeps/mach/hurd/powerpc/init-first.c: Likewise. ++ * sysdeps/sh/init-first.c: Likewise. ++ * sysdeps/unix/sysv/linux/init-first.c: Likewise. ++ + 2010-12-24 Ulrich Drepper + + * stdio-common/vfprintf.c (vfprintf): If printf handlers are installed +diff --git a/config.h.in b/config.h.in +index 18bf01a..9e797eb 100644 +--- a/config.h.in ++++ b/config.h.in +@@ -201,6 +201,9 @@ + /* Define if multi-arch DSOs should be generated. */ + #undef USE_MULTIARCH + ++/* Define if `.ctors' and `.dtors' sections shouldn't be used. */ ++#undef NO_CTORS_DTORS_SECTIONS ++ + /* + */ + +diff --git a/configure b/configure +index eae35ba..823f15e 100755 +--- a/configure ++++ b/configure +@@ -1,14 +1,14 @@ + #! /bin/sh + # From configure.in CVSid. + # Guess values for system-dependent variables and create Makefiles. +-# Generated by GNU Autoconf 2.65 for GNU C Library (see version.h). ++# Generated by GNU Autoconf 2.66 for GNU C Library (see version.h). + # + # Report bugs to . + # + # + # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +-# Inc. ++# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software ++# Foundation, Inc. + # + # + # This configure script is free software; the Free Software Foundation +@@ -319,7 +319,7 @@ $as_echo X"$as_dir" | + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" +- } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" ++ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + + } # as_fn_mkdir_p +@@ -359,19 +359,19 @@ else + fi # as_fn_arith + + +-# as_fn_error ERROR [LINENO LOG_FD] +-# --------------------------------- ++# as_fn_error STATUS ERROR [LINENO LOG_FD] ++# ---------------------------------------- + # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are + # provided, also output the error to LOG_FD, referencing LINENO. Then exit the +-# script with status $?, using 1 if that was 0. ++# script with STATUS, using 1 if that was 0. + as_fn_error () + { +- as_status=$?; test $as_status -eq 0 && as_status=1 +- if test "$3"; then +- as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 ++ as_status=$1; test $as_status -eq 0 && as_status=1 ++ if test "$4"; then ++ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack ++ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi +- $as_echo "$as_me: error: $1" >&2 ++ $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status + } # as_fn_error + +@@ -533,7 +533,7 @@ test -n "$DJDIR" || exec 7<&0 &1 + + # Name of the host. +-# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, ++# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, + # so uname gets run too. + ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +@@ -907,7 +907,7 @@ do + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && +- as_fn_error "invalid feature name: $ac_useropt" ++ as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in +@@ -933,7 +933,7 @@ do + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && +- as_fn_error "invalid feature name: $ac_useropt" ++ as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in +@@ -1137,7 +1137,7 @@ do + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && +- as_fn_error "invalid package name: $ac_useropt" ++ as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in +@@ -1153,7 +1153,7 @@ do + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && +- as_fn_error "invalid package name: $ac_useropt" ++ as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in +@@ -1183,8 +1183,8 @@ do + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + +- -*) as_fn_error "unrecognized option: \`$ac_option' +-Try \`$0 --help' for more information." ++ -*) as_fn_error $? "unrecognized option: \`$ac_option' ++Try \`$0 --help' for more information" + ;; + + *=*) +@@ -1192,7 +1192,7 @@ Try \`$0 --help' for more information." + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) +- as_fn_error "invalid variable name: \`$ac_envvar'" ;; ++ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; +@@ -1210,13 +1210,13 @@ done + + if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` +- as_fn_error "missing argument to $ac_option" ++ as_fn_error $? "missing argument to $ac_option" + fi + + if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; +- fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; ++ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac + fi +@@ -1239,7 +1239,7 @@ do + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac +- as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" ++ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" + done + + # There might be people who depend on the old broken behavior: `$host' +@@ -1253,8 +1253,8 @@ target=$target_alias + if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe +- $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. +- If a cross compiler is detected then cross compile mode will be used." >&2 ++ $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. ++ If a cross compiler is detected then cross compile mode will be used" >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +@@ -1269,9 +1269,9 @@ test "$silent" = yes && exec 6>/dev/null + ac_pwd=`pwd` && test -n "$ac_pwd" && + ac_ls_di=`ls -di .` && + ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || +- as_fn_error "working directory cannot be determined" ++ as_fn_error $? "working directory cannot be determined" + test "X$ac_ls_di" = "X$ac_pwd_ls_di" || +- as_fn_error "pwd does not report name of working directory" ++ as_fn_error $? "pwd does not report name of working directory" + + + # Find the source files, if location was not specified. +@@ -1310,11 +1310,11 @@ else + fi + if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." +- as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" ++ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" + fi + ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" + ac_abs_confdir=`( +- cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" ++ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` + # When building in place, set srcdir=. + if test "$ac_abs_confdir" = "$ac_pwd"; then +@@ -1354,7 +1354,7 @@ Configuration: + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit +- -q, --quiet, --silent do not print \`checking...' messages ++ -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files +@@ -1544,9 +1544,9 @@ test -n "$ac_init_help" && exit $ac_status + if $ac_init_version; then + cat <<\_ACEOF + GNU C Library configure (see version.h) +-generated by GNU Autoconf 2.65 ++generated by GNU Autoconf 2.66 + +-Copyright (C) 2009 Free Software Foundation, Inc. ++Copyright (C) 2010 Free Software Foundation, Inc. + This configure script is free software; the Free Software Foundation + gives unlimited permission to copy, distribute and modify it. + _ACEOF +@@ -1945,7 +1945,7 @@ ac_fn_c_check_header_compile () + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 + $as_echo_n "checking for $2... " >&6; } +-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : ++if eval "test \"\${$3+set}\"" = set; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -1971,7 +1971,7 @@ This file contains any messages produced by compilers while + running configure, to aid debugging if configure makes a mistake. + + It was created by GNU C Library $as_me (see version.h), which was +-generated by GNU Autoconf 2.65. Invocation command line was ++generated by GNU Autoconf 2.66. Invocation command line was + + $ $0 $@ + +@@ -2081,11 +2081,9 @@ trap 'exit_status=$? + { + echo + +- cat <<\_ASBOX +-## ---------------- ## ++ $as_echo "## ---------------- ## + ## Cache variables. ## +-## ---------------- ## +-_ASBOX ++## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, + ( +@@ -2119,11 +2117,9 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + ) + echo + +- cat <<\_ASBOX +-## ----------------- ## ++ $as_echo "## ----------------- ## + ## Output variables. ## +-## ----------------- ## +-_ASBOX ++## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do +@@ -2136,11 +2132,9 @@ _ASBOX + echo + + if test -n "$ac_subst_files"; then +- cat <<\_ASBOX +-## ------------------- ## ++ $as_echo "## ------------------- ## + ## File substitutions. ## +-## ------------------- ## +-_ASBOX ++## ------------------- ##" + echo + for ac_var in $ac_subst_files + do +@@ -2154,11 +2148,9 @@ _ASBOX + fi + + if test -s confdefs.h; then +- cat <<\_ASBOX +-## ----------- ## ++ $as_echo "## ----------- ## + ## confdefs.h. ## +-## ----------- ## +-_ASBOX ++## ----------- ##" + echo + cat confdefs.h + echo +@@ -2213,7 +2205,12 @@ _ACEOF + ac_site_file1=NONE + ac_site_file2=NONE + if test -n "$CONFIG_SITE"; then +- ac_site_file1=$CONFIG_SITE ++ # We do not want a PATH search for config.site. ++ case $CONFIG_SITE in #(( ++ -*) ac_site_file1=./$CONFIG_SITE;; ++ */*) ac_site_file1=$CONFIG_SITE;; ++ *) ac_site_file1=./$CONFIG_SITE;; ++ esac + elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +@@ -2228,7 +2225,11 @@ do + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 + $as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 +- . "$ac_site_file" ++ . "$ac_site_file" \ ++ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++as_fn_error $? "failed to load site script $ac_site_file ++See \`config.log' for more details" "$LINENO" 5; } + fi + done + +@@ -2304,7 +2305,7 @@ if $ac_cache_corrupted; then + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 + $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} +- as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 ++ as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 + fi + ## -------------------- ## + ## Main body of script. ## +@@ -2322,16 +2323,22 @@ ac_config_headers="$ac_config_headers config.h" + + ac_aux_dir= + for ac_dir in scripts "$srcdir"/scripts; do +- for ac_t in install-sh install.sh shtool; do +- if test -f "$ac_dir/$ac_t"; then +- ac_aux_dir=$ac_dir +- ac_install_sh="$ac_aux_dir/$ac_t -c" +- break 2 +- fi +- done ++ if test -f "$ac_dir/install-sh"; then ++ ac_aux_dir=$ac_dir ++ ac_install_sh="$ac_aux_dir/install-sh -c" ++ break ++ elif test -f "$ac_dir/install.sh"; then ++ ac_aux_dir=$ac_dir ++ ac_install_sh="$ac_aux_dir/install.sh -c" ++ break ++ elif test -f "$ac_dir/shtool"; then ++ ac_aux_dir=$ac_dir ++ ac_install_sh="$ac_aux_dir/shtool install -c" ++ break ++ fi + done + if test -z "$ac_aux_dir"; then +- as_fn_error "cannot find install-sh, install.sh, or shtool in scripts \"$srcdir\"/scripts" "$LINENO" 5 ++ as_fn_error $? "cannot find install-sh, install.sh, or shtool in scripts \"$srcdir\"/scripts" "$LINENO" 5 + fi + + # These three variables are undocumented and unsupported, +@@ -2351,7 +2358,7 @@ subdirs="$subdirs " + + # Make sure we can run config.sub. + $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || +- as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 ++ as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 + $as_echo_n "checking build system type... " >&6; } +@@ -2362,16 +2369,16 @@ else + test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` + test "x$ac_build_alias" = x && +- as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5 ++ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 + ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || +- as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 ++ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 + $as_echo "$ac_cv_build" >&6; } + case $ac_cv_build in + *-*-*) ;; +-*) as_fn_error "invalid value of canonical build" "$LINENO" 5;; ++*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; + esac + build=$ac_cv_build + ac_save_IFS=$IFS; IFS='-' +@@ -2396,7 +2403,7 @@ else + ac_cv_host=$ac_cv_build + else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || +- as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 ++ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 + fi + + fi +@@ -2404,7 +2411,7 @@ fi + $as_echo "$ac_cv_host" >&6; } + case $ac_cv_host in + *-*-*) ;; +-*) as_fn_error "invalid value of canonical host" "$LINENO" 5;; ++*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; + esac + host=$ac_cv_host + ac_save_IFS=$IFS; IFS='-' +@@ -2721,8 +2728,8 @@ fi + + test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error "no acceptable C compiler found in \$PATH +-See \`config.log' for more details." "$LINENO" 5; } ++as_fn_error $? "no acceptable C compiler found in \$PATH ++See \`config.log' for more details" "$LINENO" 5; } + + # Provide some information about the compiler. + $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +@@ -2792,8 +2799,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 + + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error "cannot compute suffix of object files: cannot compile +-See \`config.log' for more details." "$LINENO" 5; } ++as_fn_error $? "cannot compute suffix of object files: cannot compile ++See \`config.log' for more details" "$LINENO" 5; } + fi + rm -f conftest.$ac_cv_objext conftest.$ac_ext + fi +@@ -3185,8 +3192,8 @@ if $ac_preproc_ok; then : + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error "C preprocessor \"$CPP\" fails sanity check +-See \`config.log' for more details." "$LINENO" 5; } ++as_fn_error $? "C preprocessor \"$CPP\" fails sanity check ++See \`config.log' for more details" "$LINENO" 5; } + fi + + ac_ext=c +@@ -3455,7 +3462,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + if test "`cd $srcdir; /bin/pwd`" = "`/bin/pwd`"; then +- as_fn_error "you must configure in a separate build directory" "$LINENO" 5 ++ as_fn_error $? "you must configure in a separate build directory" "$LINENO" 5 + fi + + # This will get text that should go into config.make. +@@ -3767,7 +3774,7 @@ fi + if test x$nss_crypt = xyes; then + nss_includes=-I$(nss-config --includedir 2>/dev/null) + if test $? -ne 0; then +- as_fn_error "cannot find include directory with nss-config" "$LINENO" 5 ++ as_fn_error $? "cannot find include directory with nss-config" "$LINENO" 5 + fi + old_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $nss_includes" +@@ -3782,7 +3789,7 @@ _ACEOF + if ac_fn_c_try_compile "$LINENO"; then : + libc_cv_nss_crypt=yes + else +- as_fn_error " ++ as_fn_error $? " + cannot find NSS headers with lowlevel hash function interfaces" "$LINENO" 5 + fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +@@ -3804,7 +3811,7 @@ _ACEOF + if ac_fn_c_try_link "$LINENO"; then : + libc_cv_nss_crypt=yes + else +- as_fn_error " ++ as_fn_error $? " + cannot link program using lowlevel NSS hash functions" "$LINENO" 5 + fi + rm -f core conftest.err conftest.$ac_objext \ +@@ -3880,7 +3887,7 @@ submachine= + # Check whether --with-cpu was given. + if test "${with_cpu+set}" = set; then : + withval=$with_cpu; case "$withval" in +- yes|'') as_fn_error "--with-cpu requires an argument" "$LINENO" 5 ;; ++ yes|'') as_fn_error $? "--with-cpu requires an argument" "$LINENO" 5 ;; + no) ;; + *) submachine="$withval" ;; + esac +@@ -3913,14 +3920,14 @@ if test x"$add_ons" != x; then + # Some sanity checks + case "$f" in + crypt) +- as_fn_error " ++ as_fn_error $? " + *** It seems that you're using an old \`crypt' add-on. crypt is now + *** part of glibc and using the old add-on will not work with this + *** release. Start again with fresh sources and without the old + *** \`crypt' add-on." "$LINENO" 5 + ;; + localedata) +- as_fn_error " ++ as_fn_error $? " + *** It seems that you're using an old \`localedata' add-on. localedata + *** is now part of glibc and using the old add-on will not work with + *** this release. Start again with fresh sources and without the old +@@ -3947,7 +3954,7 @@ if test x"$add_ons" != x; then + if test -d "$libc_add_on"; then + libc_add_on="`pwd`/$libc_add_on" + else +- as_fn_error "add-on directory \"$libc_add_on\" does not exist" "$LINENO" 5 ++ as_fn_error $? "add-on directory \"$libc_add_on\" does not exist" "$LINENO" 5 + fi + } + libc_add_on_srcdir=$srcdir/$libc_add_on +@@ -3966,7 +3973,7 @@ $as_echo "$as_me: running configure fragment for add-on $libc_add_on" >&6;} + test -z "$libc_add_on" || { + configured_add_ons="$configured_add_ons $libc_add_on" + if test "x$libc_add_on_canonical" = xunknown; then +- as_fn_error "fragment must set \$libc_add_on_canonical" "$LINENO" 5 ++ as_fn_error $? "fragment must set \$libc_add_on_canonical" "$LINENO" 5 + fi + for d in $libc_add_on_subdirs; do + case "$libc_add_on" in +@@ -3991,13 +3998,13 @@ $d-srcdir = $subdir_srcdir" + done + for d in $libc_add_on_config_subdirs; do + case "$d" in +- /*) as_fn_error "fragment uses absolute path in \$libc_add_on_config_subdirs" "$LINENO" 5 ;; ++ /*) as_fn_error $? "fragment uses absolute path in \$libc_add_on_config_subdirs" "$LINENO" 5 ;; + esac + if test ! -d "$libc_add_on_srcdir/$d"; then +- as_fn_error "fragment wants to configure missing directory $d" "$LINENO" 5 ++ as_fn_error $? "fragment wants to configure missing directory $d" "$LINENO" 5 + fi + case "$libc_add_on" in +- /*) as_fn_error "relative path required for add-on using \$libc_add_on_config_subdirs" "$LINENO" 5 ;; ++ /*) as_fn_error $? "relative path required for add-on using \$libc_add_on_config_subdirs" "$LINENO" 5 ;; + esac + subdirs="$subdirs $libc_add_on/$d" + done +@@ -4174,7 +4181,7 @@ fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_asm_global_directive" >&5 + $as_echo "$libc_cv_asm_global_directive" >&6; } + if test $libc_cv_asm_global_directive = UNKNOWN; then +- as_fn_error "cannot determine asm global directive" "$LINENO" 5 ++ as_fn_error $? "cannot determine asm global directive" "$LINENO" 5 + else + cat >>confdefs.h <<_ACEOF + #define ASM_GLOBAL_DIRECTIVE ${libc_cv_asm_global_directive} +@@ -4220,7 +4227,7 @@ fi + + if test x"$libc_cv_asm_gnu_indirect_function" != xyes -a x"$libc_cv_asm_type_prefix" = xno; then + if test x"$multi_arch" = xyes; then +- as_fn_error "--enable-multi-arch support requires assembler and linker support" "$LINENO" 5 ++ as_fn_error $? "--enable-multi-arch support requires assembler and linker support" "$LINENO" 5 + else + multi_arch=no + fi +@@ -4359,13 +4366,13 @@ fi + + + if test -z "$os_used" && test "$os" != none; then +- as_fn_error "Operating system $os is not supported." "$LINENO" 5 ++ as_fn_error $? "Operating system $os is not supported." "$LINENO" 5 + fi + if test -z "$machine_used" && test "$machine" != none; then +- as_fn_error "The $machine is not supported." "$LINENO" 5 ++ as_fn_error $? "The $machine is not supported." "$LINENO" 5 + fi + if test -z "$submachine_used" && test -n "$submachine"; then +- as_fn_error "The $submachine subspecies of $host_cpu is not supported." "$LINENO" 5 ++ as_fn_error $? "The $submachine subspecies of $host_cpu is not supported." "$LINENO" 5 + fi + + +@@ -4492,7 +4499,7 @@ for add_on in $add_ons; do + case "$configured_add_ons " in + *" $add_on "*) ;; + *|'') +- as_fn_error "add-on $add_on has no configure fragment or sysdeps tree" "$LINENO" 5 ++ as_fn_error $? "add-on $add_on has no configure fragment or sysdeps tree" "$LINENO" 5 + ;; + esac + continue +@@ -4978,7 +4985,7 @@ fi + + + if test "$PWD_P" = no; then +- as_fn_error "*** A pwd binary could not be found." "$LINENO" 5 ++ as_fn_error $? "*** A pwd binary could not be found." "$LINENO" 5 + fi + + # These programs are version sensitive. +@@ -5367,7 +5374,7 @@ if test "x$with_cvs" = xyes && test "x$AUTOCONF" = xno; then + aux_missing="$aux_missing autoconf" + fi + +-test -n "$critic_missing" && as_fn_error " ++test -n "$critic_missing" && as_fn_error $? " + *** These critical programs are missing or too old:$critic_missing + *** Check the INSTALL file for required versions." "$LINENO" 5 + +@@ -5450,7 +5457,7 @@ esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_library_path_setting" >&5 + $as_echo "$ld_library_path_setting" >&6; } + if test "$ld_library_path_setting" != "ok"; then +-as_fn_error " ++as_fn_error $? " + *** LD_LIBRARY_PATH shouldn't contain the current directory when + *** building glibc. Please change the environment variable + *** and run configure again." "$LINENO" 5 +@@ -6053,7 +6060,7 @@ EOF + test $ac_status = 0; }; }; then + libc_cv_asm_protected_directive=yes + else +- as_fn_error "assembler support for symbol visibility is required" "$LINENO" 5 ++ as_fn_error $? "assembler support for symbol visibility is required" "$LINENO" 5 + fi + rm -f conftest* + fi +@@ -6089,7 +6096,7 @@ fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_visibility_attribute" >&5 + $as_echo "$libc_cv_visibility_attribute" >&6; } + if test $libc_cv_visibility_attribute != yes; then +- as_fn_error "compiler support for visibility attribute is required" "$LINENO" 5 ++ as_fn_error $? "compiler support for visibility attribute is required" "$LINENO" 5 + fi + fi + +@@ -6121,7 +6128,7 @@ fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_broken_visibility_attribute" >&5 + $as_echo "$libc_cv_broken_visibility_attribute" >&6; } + if test $libc_cv_broken_visibility_attribute = yes; then +- as_fn_error "working compiler support for visibility attribute is required" "$LINENO" 5 ++ as_fn_error $? "working compiler support for visibility attribute is required" "$LINENO" 5 + fi + fi + +@@ -6156,7 +6163,7 @@ fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_broken_alias_attribute" >&5 + $as_echo "$libc_cv_broken_alias_attribute" >&6; } + if test $libc_cv_broken_alias_attribute = yes; then +- as_fn_error "working alias attribute support required" "$LINENO" 5 ++ as_fn_error $? "working alias attribute support required" "$LINENO" 5 + fi + + if test $libc_cv_visibility_attribute = yes; then +@@ -6214,7 +6221,15 @@ fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_initfini_array" >&5 + $as_echo "$libc_cv_initfini_array" >&6; } + if test $libc_cv_initfini_array != yes; then +- as_fn_error "Need linker with .init_array/.fini_array support." "$LINENO" 5 ++ as_fn_error $? "Need linker with .init_array/.fini_array support." "$LINENO" 5 ++ elif { ac_try='${CC-cc} -Wl,--verbose 2>&1|grep SORT_BY_INIT_PRIORITY 1>&5' ++ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; }; }; then ++ $as_echo "#define NO_CTORS_DTORS_SECTIONS 1" >>confdefs.h ++ + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libunwind-support in compiler" >&5 +@@ -6262,7 +6277,7 @@ EOF + then + libc_cv_z_nodelete=yes + else +- as_fn_error "linker with -z nodelete support required" "$LINENO" 5 ++ as_fn_error $? "linker with -z nodelete support required" "$LINENO" 5 + fi + rm -f conftest* + fi +@@ -6289,7 +6304,7 @@ EOF + then + libc_cv_z_nodlopen=yes + else +- as_fn_error "linker with -z nodlopen support required" "$LINENO" 5 ++ as_fn_error $? "linker with -z nodlopen support required" "$LINENO" 5 + fi + rm -f conftest* + fi +@@ -6316,7 +6331,7 @@ EOF + then + libc_cv_z_initfirst=yes + else +- as_fn_error "linker with -z initfirst support required" "$LINENO" 5 ++ as_fn_error $? "linker with -z initfirst support required" "$LINENO" 5 + fi + rm -f conftest* + fi +@@ -6352,7 +6367,7 @@ fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_z_relro" >&5 + $as_echo "$libc_cv_z_relro" >&6; } + if test "$libc_cv_z_relro" = no; then +- as_fn_error "linker with -z relro support required" "$LINENO" 5 ++ as_fn_error $? "linker with -z relro support required" "$LINENO" 5 + fi + ;; + *) ;; +@@ -7202,7 +7217,7 @@ fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_submachine" >&5 + $as_echo "$libc_cv_cc_submachine" >&6; } + if test "x$libc_cv_cc_submachine" = xno; then +- as_fn_error "${CC-cc} does not support $submachine" "$LINENO" 5 ++ as_fn_error $? "${CC-cc} does not support $submachine" "$LINENO" 5 + fi + fi + +@@ -7322,7 +7337,7 @@ $as_echo "$have_selinux" >&6; } + + if test x$with_selinux = xyes ; then + if test x$have_selinux = xno ; then +- as_fn_error "SELinux explicitly required, but sufficiently recent SELinux library not found" "$LINENO" 5 ++ as_fn_error $? "SELinux explicitly required, but sufficiently recent SELinux library not found" "$LINENO" 5 + fi + fi + fi +@@ -7486,7 +7501,7 @@ esac + done + IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then +- as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 ++ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi + else + ac_cv_path_GREP=$GREP +@@ -7552,7 +7567,7 @@ esac + done + IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then +- as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 ++ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi + else + ac_cv_path_EGREP=$EGREP +@@ -7684,8 +7699,7 @@ do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` + ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default + " +-eval as_val=\$$as_ac_Header +- if test "x$as_val" = x""yes; then : ++if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF + #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 + _ACEOF +@@ -7710,9 +7724,8 @@ else + if test "$ac_cv_type_long_double" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-{ as_fn_set_status 77 +-as_fn_error "cannot compute sizeof (long double) +-See \`config.log' for more details." "$LINENO" 5; }; } ++as_fn_error 77 "cannot compute sizeof (long double) ++See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_long_double=0 + fi +@@ -7943,6 +7956,7 @@ DEFS=-DHAVE_CONFIG_H + + ac_libobjs= + ac_ltlibobjs= ++U= + for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' +@@ -8104,19 +8118,19 @@ export LANGUAGE + (unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +-# as_fn_error ERROR [LINENO LOG_FD] +-# --------------------------------- ++# as_fn_error STATUS ERROR [LINENO LOG_FD] ++# ---------------------------------------- + # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are + # provided, also output the error to LOG_FD, referencing LINENO. Then exit the +-# script with status $?, using 1 if that was 0. ++# script with STATUS, using 1 if that was 0. + as_fn_error () + { +- as_status=$?; test $as_status -eq 0 && as_status=1 +- if test "$3"; then +- as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 ++ as_status=$1; test $as_status -eq 0 && as_status=1 ++ if test "$4"; then ++ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack ++ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi +- $as_echo "$as_me: error: $1" >&2 ++ $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status + } # as_fn_error + +@@ -8312,7 +8326,7 @@ $as_echo X"$as_dir" | + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" +- } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" ++ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + + } # as_fn_mkdir_p +@@ -8366,7 +8380,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + # values after options handling. + ac_log=" + This file was extended by GNU C Library $as_me (see version.h), which was +-generated by GNU Autoconf 2.65. Invocation command line was ++generated by GNU Autoconf 2.66. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS +@@ -8434,10 +8448,10 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" + ac_cs_version="\\ + GNU C Library config.status (see version.h) +-configured by $0, generated by GNU Autoconf 2.65, ++configured by $0, generated by GNU Autoconf 2.66, + with options \\"\$ac_cs_config\\" + +-Copyright (C) 2009 Free Software Foundation, Inc. ++Copyright (C) 2010 Free Software Foundation, Inc. + This config.status script is free software; the Free Software Foundation + gives unlimited permission to copy, distribute and modify it." + +@@ -8492,7 +8506,7 @@ do + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header +- as_fn_error "ambiguous option: \`$1' ++ as_fn_error $? "ambiguous option: \`$1' + Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; +@@ -8501,7 +8515,7 @@ Try \`$0 --help' for more information.";; + ac_cs_silent=: ;; + + # This is an error. +- -*) as_fn_error "unrecognized option: \`$1' ++ -*) as_fn_error $? "unrecognized option: \`$1' + Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" +@@ -8560,7 +8574,7 @@ do + "${config_makefile}") CONFIG_FILES="$CONFIG_FILES ${config_makefile}" ;; + "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; + +- *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; ++ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac + done + +@@ -8598,7 +8612,7 @@ $debug || + { + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +-} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 ++} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 + + # Set up the scripts for CONFIG_FILES section. + # No need to generate them if there are no CONFIG_FILES. +@@ -8615,7 +8629,7 @@ if test "x$ac_cr" = x; then + fi + ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` + if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then +- ac_cs_awk_cr='\r' ++ ac_cs_awk_cr='\\r' + else + ac_cs_awk_cr=$ac_cr + fi +@@ -8629,18 +8643,18 @@ _ACEOF + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" + } >conf$$subs.sh || +- as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 +-ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` ++ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ++ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` + ac_delim='%!_!# ' + for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || +- as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ++ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then +- as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ++ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +@@ -8729,20 +8743,28 @@ if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + else + cat + fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ +- || as_fn_error "could not setup config files machinery" "$LINENO" 5 ++ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 + _ACEOF + +-# VPATH may cause trouble with some makes, so we remove $(srcdir), +-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and ++# VPATH may cause trouble with some makes, so we remove sole $(srcdir), ++# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and + # trailing colons and then remove the whole line if VPATH becomes empty + # (actually we leave an empty line to preserve line numbers). + if test "x$srcdir" = x.; then +- ac_vpsub='/^[ ]*VPATH[ ]*=/{ +-s/:*\$(srcdir):*/:/ +-s/:*\${srcdir}:*/:/ +-s/:*@srcdir@:*/:/ +-s/^\([^=]*=[ ]*\):*/\1/ ++ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ ++h ++s/// ++s/^/:/ ++s/[ ]*$/:/ ++s/:\$(srcdir):/:/g ++s/:\${srcdir}:/:/g ++s/:@srcdir@:/:/g ++s/^:*// + s/:*$// ++x ++s/\(=[ ]*\).*/\1/ ++G ++s/\n// + s/^[^=]*=[ ]*$// + }' + fi +@@ -8770,7 +8792,7 @@ for ac_last_try in false false :; do + if test -z "$ac_t"; then + break + elif $ac_last_try; then +- as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 ++ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +@@ -8855,7 +8877,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + _ACAWK + _ACEOF + cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +- as_fn_error "could not setup config headers machinery" "$LINENO" 5 ++ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 + fi # test -n "$CONFIG_HEADERS" + + +@@ -8868,7 +8890,7 @@ do + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; +- :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; ++ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac +@@ -8896,7 +8918,7 @@ do + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || +- as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; ++ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" +@@ -8923,7 +8945,7 @@ $as_echo "$as_me: creating $ac_file" >&6;} + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ +- || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; ++ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac +@@ -9054,22 +9076,22 @@ s&@INSTALL@&$ac_INSTALL&;t t + $ac_datarootdir_hack + " + eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ +- || as_fn_error "could not create $ac_file" "$LINENO" 5 ++ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + + test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +-which seems to be undefined. Please make sure it is defined." >&5 ++which seems to be undefined. Please make sure it is defined" >&5 + $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +-which seems to be undefined. Please make sure it is defined." >&2;} ++which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ +- || as_fn_error "could not create $ac_file" "$LINENO" 5 ++ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # +@@ -9080,19 +9102,19 @@ which seems to be undefined. Please make sure it is defined." >&2;} + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ +- || as_fn_error "could not create $ac_file" "$LINENO" 5 ++ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 + $as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ +- || as_fn_error "could not create $ac_file" "$LINENO" 5 ++ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ +- || as_fn_error "could not create -" "$LINENO" 5 ++ || as_fn_error $? "could not create -" "$LINENO" 5 + fi + ;; + +@@ -9118,7 +9140,7 @@ _ACEOF + ac_clean_files=$ac_clean_files_save + + test $ac_write_fail = 0 || +- as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 ++ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + + # configure is writing to config.log, and then calls config.status. +@@ -9139,7 +9161,7 @@ if test "$no_create" != yes; then + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. +- $ac_cs_success || as_fn_exit $? ++ $ac_cs_success || as_fn_exit 1 + fi + + # +@@ -9280,7 +9302,7 @@ $as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cach + # The eval makes quoting arguments work. + eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \ + --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || +- as_fn_error "$ac_sub_configure failed for $ac_dir" "$LINENO" 5 ++ as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5 + fi + + cd "$ac_popdir" +diff --git a/configure.in b/configure.in +index d8cd5f1..ad25b9b 100644 +--- a/configure.in ++++ b/configure.in +@@ -1497,6 +1497,8 @@ EOF + rm -f conftest*]) + if test $libc_cv_initfini_array != yes; then + AC_MSG_ERROR([Need linker with .init_array/.fini_array support.]) ++ elif AC_TRY_COMMAND([${CC-cc} -Wl,--verbose 2>&1|grep SORT_BY_INIT_PRIORITY 1>&AS_MESSAGE_LOG_FD]); then ++ AC_DEFINE(NO_CTORS_DTORS_SECTIONS) + fi + + AC_CACHE_CHECK(for libunwind-support in compiler, +diff --git a/elf/sofini.c b/elf/sofini.c +index 5e06f0c..13e74b7 100644 +--- a/elf/sofini.c ++++ b/elf/sofini.c +@@ -1,12 +1,14 @@ + /* Finalizer module for ELF shared C library. This provides terminating + null pointer words in the `.ctors' and `.dtors' sections. */ + ++#ifndef NO_CTORS_DTORS_SECTIONS + static void (*const __CTOR_END__[1]) (void) + __attribute__ ((used, section (".ctors"))) + = { 0 }; + static void (*const __DTOR_END__[1]) (void) + __attribute__ ((used, section (".dtors"))) + = { 0 }; ++#endif + + /* Terminate the frame unwind info section with a 4byte 0 as a sentinel; + this would be the 'length' field in a real FDE. */ +diff --git a/elf/soinit.c b/elf/soinit.c +index 6fecbb5..1db676a 100644 +--- a/elf/soinit.c ++++ b/elf/soinit.c +@@ -3,6 +3,7 @@ + the `.ctors' and `.dtors' sections so the lists are terminated, and + calling those lists of functions. */ + ++#ifndef NO_CTORS_DTORS_SECTIONS + #include + #include + +@@ -40,3 +41,4 @@ __libc_fini (void) + + void (*_fini_ptr) (void) __attribute__ ((section (".fini_array"))) + = &__libc_fini; ++#endif +diff --git a/sysdeps/i386/init-first.c b/sysdeps/i386/init-first.c +index c6355a8..2af042f 100644 +--- a/sysdeps/i386/init-first.c ++++ b/sysdeps/i386/init-first.c +@@ -59,7 +59,9 @@ _init (int argc, ...) + { + init (&argc); + ++#ifndef NO_CTORS_DTORS_SECTIONS + __libc_global_ctors (); ++#endif + } + #endif + +diff --git a/sysdeps/mach/hurd/i386/init-first.c b/sysdeps/mach/hurd/i386/init-first.c +index f9a7a58..60823bd 100644 +--- a/sysdeps/mach/hurd/i386/init-first.c ++++ b/sysdeps/mach/hurd/i386/init-first.c +@@ -92,7 +92,7 @@ posixland_init (int argc, char **argv, char **envp) + __getopt_clean_environment (envp); + #endif + +-#ifdef SHARED ++#if defined SHARED && !defined NO_CTORS_DTORS_SECTIONS + __libc_global_ctors (); + #endif + } +diff --git a/sysdeps/mach/hurd/powerpc/init-first.c b/sysdeps/mach/hurd/powerpc/init-first.c +index 20fa1d4..21b5054 100644 +--- a/sysdeps/mach/hurd/powerpc/init-first.c ++++ b/sysdeps/mach/hurd/powerpc/init-first.c +@@ -82,7 +82,7 @@ posixland_init (int argc, char **argv, char **envp) + __getopt_clean_environment (__environ); + #endif + +-#ifdef SHARED ++#if defined SHARED && !defined NO_CTORS_DTORS_SECTIONS + __libc_global_ctors (); + #endif + } +diff --git a/sysdeps/sh/init-first.c b/sysdeps/sh/init-first.c +index d816625..1f3a821 100644 +--- a/sysdeps/sh/init-first.c ++++ b/sysdeps/sh/init-first.c +@@ -59,7 +59,9 @@ _init (int argc, ...) + { + init (&argc); + ++#ifndef NO_CTORS_DTORS_SECTIONS + __libc_global_ctors (); ++#endif + } + #endif + +diff --git a/sysdeps/unix/sysv/linux/init-first.c b/sysdeps/unix/sysv/linux/init-first.c +index 7b2333d..a60212f 100644 +--- a/sysdeps/unix/sysv/linux/init-first.c ++++ b/sysdeps/unix/sysv/linux/init-first.c +@@ -93,7 +93,7 @@ _init (int argc, char **argv, char **envp) + __getopt_clean_environment (envp); + #endif + +-#ifdef SHARED ++#if defined SHARED && !defined NO_CTORS_DTORS_SECTIONS + __libc_global_ctors (); + #endif + } +-- +1.7.3.4 + diff --git a/patches/source/glibc/glibc.git-96611391ad8823ba58405325d78cefeae5cdf699-CVE-2010-3847b.patch b/patches/source/glibc/glibc.git-96611391ad8823ba58405325d78cefeae5cdf699-CVE-2010-3847b.patch new file mode 100644 index 000000000..b33b5a0db --- /dev/null +++ b/patches/source/glibc/glibc.git-96611391ad8823ba58405325d78cefeae5cdf699-CVE-2010-3847b.patch @@ -0,0 +1,27 @@ +From 96611391ad8823ba58405325d78cefeae5cdf699 Mon Sep 17 00:00:00 2001 +From: Andreas Schwab +Date: Thu, 9 Dec 2010 15:00:59 +0100 +Subject: [PATCH] Ignore origin of privileged program + +--- + ChangeLog | 5 +++++ + elf/dl-object.c | 3 +++ + 2 files changed, 8 insertions(+), 0 deletions(-) + +diff --git a/elf/dl-object.c b/elf/dl-object.c +index 5d15ce1..a34e902 100644 +--- a/elf/dl-object.c ++++ b/elf/dl-object.c +@@ -220,6 +220,9 @@ _dl_new_object (char *realname, const char *libname, int type, + out: + new->l_origin = origin; + } ++ else if (INTUSE(__libc_enable_secure) && type == lt_executable) ++ /* The origin of a privileged program cannot be trusted. */ ++ new->l_origin = (char *) -1; + + return new; + } +-- +1.7.3.4 + diff --git a/patches/source/glibc/glibc.ldd.trace.through.dynamic.linker.diff b/patches/source/glibc/glibc.ldd.trace.through.dynamic.linker.diff new file mode 100644 index 000000000..6b1f5c843 --- /dev/null +++ b/patches/source/glibc/glibc.ldd.trace.through.dynamic.linker.diff @@ -0,0 +1,49 @@ +2009-11-08 Aurelien Jarno + + * elf/ldd.bash.in: also handle error code 126 (ld.so non + executable). Always trace dynamic library dependencies through + the dynamic linker. + +--- a/elf/ldd.bash.in ++++ b/elf/ldd.bash.in +@@ -153,8 +153,6 @@ for file do + echo "ldd: ${file}:" $"not regular file" >&2 + result=1 + elif test -r "$file"; then +- test -x "$file" || echo 'ldd:' $"\ +-warning: you do not have execution permission for" "\`$file'" >&2 + RTLD= + ret=1 + for rtld in ${RTLDLIST}; do +@@ -167,28 +165,16 @@ warning: you do not have execution permission for" "\`$file'" >&2 + fi + done + case $ret in +- 0) +- # If the program exits with exit code 5, it means the process has been +- # invoked with __libc_enable_secure. Fall back to running it through +- # the dynamic linker. +- try_trace "$file" +- rc=$? +- if [ $rc = 5 ]; then +- try_trace "$RTLD" "$file" +- rc=$? +- fi +- [ $rc = 0 ] || result=1 ++ 0|2) ++ try_trace "$RTLD" "$file" || result=1 + ;; +- 1) ++ 1|126) + # This can be a non-ELF binary or no binary at all. + nonelf "$file" || { + echo $" not a dynamic executable" + result=1 + } + ;; +- 2) +- try_trace "$RTLD" "$file" || result=1 +- ;; + *) + echo 'ldd:' ${RTLD} $"exited with unknown exit code" "($ret)" >&2 + exit 1 diff --git a/patches/source/glibc/glibc.locale.no-archive.diff b/patches/source/glibc/glibc.locale.no-archive.diff new file mode 100644 index 000000000..bf1a83b71 --- /dev/null +++ b/patches/source/glibc/glibc.locale.no-archive.diff @@ -0,0 +1,10 @@ +--- ./localedata/Makefile.orig 2003-11-20 15:31:38.000000000 -0800 ++++ ./localedata/Makefile 2004-08-03 17:20:54.000000000 -0700 +@@ -222,6 +222,7 @@ + echo -n '...'; \ + input=`echo $$locale | sed 's/\([^.]*\)[^@]*\(.*\)/\1\2/'`; \ + $(LOCALEDEF) --alias-file=../intl/locale.alias \ ++ --no-archive \ + -i locales/$$input -c -f charmaps/$$charset \ + $(addprefix --prefix=,$(install_root)) $$locale; \ + echo ' done'; \ diff --git a/patches/source/glibc/glibc.make-3.82.diff b/patches/source/glibc/glibc.make-3.82.diff new file mode 100644 index 000000000..56b0675b3 --- /dev/null +++ b/patches/source/glibc/glibc.make-3.82.diff @@ -0,0 +1,28 @@ +Submitted By: Matt Burgess +Date: 2010-07-26 +Initial Package Version: 2.11.2 +Upstream Status: Not submitted +Origin: Denis Onischenko + (http://www.mail-archive.com/help-make@gnu.org/msg08847.html) +Description: Fixes an incompatibility with Make-3.82. + +diff -Naur glibc-2.11.2.orig/manual/Makefile glibc-2.11.2/manual/Makefile +--- glibc-2.11.2.orig/manual/Makefile 2010-05-19 20:38:20.000000000 +0000 ++++ glibc-2.11.2/manual/Makefile 2010-07-26 06:51:27.049899308 +0000 +@@ -232,9 +232,13 @@ + .PHONY: stubs + stubs: $(objpfx)stubs + endif +-$(objpfx)stubs ../po/manual.pot $(objpfx)stamp%: +- $(make-target-directory) +- touch $@ ++$(objpfx)stubs ../po/manual.pot: ++ $(make-target-directory) ++ touch $@ ++ ++$(objpfx)stamp%: ++ $(make-target-directory) ++ touch $@ + + # Make the target directory if it doesn't exist, using the `mkinstalldirs' + # script that does `mkdir -p' even if `mkdir' doesn't support that flag. diff --git a/patches/source/glibc/glibc.nis-netgroups.diff b/patches/source/glibc/glibc.nis-netgroups.diff new file mode 100644 index 000000000..2473e9766 --- /dev/null +++ b/patches/source/glibc/glibc.nis-netgroups.diff @@ -0,0 +1,12 @@ +--- ./nis/nss_nis/nis-netgrp.c.orig 2006-04-08 21:08:28.000000000 -0500 ++++ ./nis/nss_nis/nis-netgrp.c 2006-10-10 20:49:11.000000000 -0500 +@@ -72,7 +72,8 @@ + and the last byte is filled with NUL. So we can simply + use that buffer. */ + assert (len >= 0); +- assert (malloc_usable_size (netgrp->data) >= len + 1); ++ /* The next line break NIS netgroups on non-PAM systems, so we will comment it out */ ++ /* assert (malloc_usable_size (netgrp->data) >= len + 1); */ + assert (netgrp->data[len] == '\0'); + + netgrp->data_size = len; diff --git a/patches/source/glibc/glibc.revert.to.fix.build.breakages.diff b/patches/source/glibc/glibc.revert.to.fix.build.breakages.diff new file mode 100644 index 000000000..9c8e93b9b --- /dev/null +++ b/patches/source/glibc/glibc.revert.to.fix.build.breakages.diff @@ -0,0 +1,13 @@ +--- ./sysdeps/unix/sysv/linux/bits/socket.h.orig 2008-07-27 03:25:30.000000000 -0500 ++++ ./sysdeps/unix/sysv/linux/bits/socket.h 2009-02-24 17:38:52.000000000 -0600 +@@ -26,8 +26,9 @@ + #endif + + #define __need_size_t ++#define __need_NULL + #include +- ++#include + #include + + /* Type for length arguments in socket calls. */ diff --git a/patches/source/glibc/glibc.ru_RU.CP1251.diff b/patches/source/glibc/glibc.ru_RU.CP1251.diff new file mode 100644 index 000000000..376cf76a7 --- /dev/null +++ b/patches/source/glibc/glibc.ru_RU.CP1251.diff @@ -0,0 +1,10 @@ +--- ./localedata/SUPPORTED.orig 2005-07-17 20:50:35.000000000 -0500 ++++ ./localedata/SUPPORTED 2006-08-22 01:33:09.000000000 -0500 +@@ -270,6 +270,7 @@ + ro_RO/ISO-8859-2 \ + ru_RU.KOI8-R/KOI8-R \ + ru_RU.UTF-8/UTF-8 \ ++ru_RU.CP1251/CP1251 \ + ru_RU/ISO-8859-5 \ + ru_UA.UTF-8/UTF-8 \ + ru_UA/KOI8-U \ diff --git a/patches/source/glibc/is_IS.diff b/patches/source/glibc/is_IS.diff new file mode 100644 index 000000000..52a99696c --- /dev/null +++ b/patches/source/glibc/is_IS.diff @@ -0,0 +1,19 @@ +--- ./localedata/locales/is_IS.orig 2007-09-30 17:30:17.000000000 -0500 ++++ ./localedata/locales/is_IS 2006-07-30 17:19:43.000000000 -0500 +@@ -947,6 +947,7 @@ + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; ++<"=> IGNORE;IGNORE;IGNORE;<"=> + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; +@@ -955,6 +956,8 @@ + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; ++ IGNORE;IGNORE;IGNORE; ++ IGNORE;IGNORE;IGNORE; + UNDEFINED IGNORE;IGNORE;IGNORE + + ;;IGNORE;IGNORE diff --git a/patches/source/glibc/profile.d/glibc.csh.new b/patches/source/glibc/profile.d/glibc.csh.new new file mode 100755 index 000000000..1f33e9663 --- /dev/null +++ b/patches/source/glibc/profile.d/glibc.csh.new @@ -0,0 +1,9 @@ +#!/bin/csh +# Set more relaxed (glibc-2.3.5 like) malloc() checking. +# +# This relaxes the default paranoia level so that it reports +# bugs, but does not kill the questionable process. You can +# get away with running broken programs with this setting, +# but at a possible performance and security cost. +# +#setenv MALLOC_CHECK_ 1 diff --git a/patches/source/glibc/profile.d/glibc.sh.new b/patches/source/glibc/profile.d/glibc.sh.new new file mode 100755 index 000000000..979f4879e --- /dev/null +++ b/patches/source/glibc/profile.d/glibc.sh.new @@ -0,0 +1,8 @@ +#!/bin/sh +# Set more relaxed (glibc-2.3.5 like) malloc() checking. +# +# This relaxes the default paranoia level so that it reports +# bugs, but does not kill the questionable process. You can +# get away with running broken programs with this setting, +# but at a possible performance and security cost. +#export MALLOC_CHECK_=1 diff --git a/patches/source/glibc/slack-desc.glibc b/patches/source/glibc/slack-desc.glibc new file mode 100644 index 000000000..c9c35c2da --- /dev/null +++ b/patches/source/glibc/slack-desc.glibc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' on +# the right side marks the last column you can put a character in. You must make +# exactly 11 lines for the formatting to be correct. It's also customary to +# leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +glibc: glibc (GNU C libraries) +glibc: +glibc: This package contains the GNU C libraries and header files. The GNU +glibc: C library was written originally by Roland McGrath, and is currently +glibc: maintained by Ulrich Drepper. Some parts of the library were +glibc: contributed or worked on by other people. +glibc: +glibc: You'll need this package to compile programs. +glibc: +glibc: +glibc: diff --git a/patches/source/glibc/slack-desc.glibc-debug b/patches/source/glibc/slack-desc.glibc-debug new file mode 100644 index 000000000..79398d0b6 --- /dev/null +++ b/patches/source/glibc/slack-desc.glibc-debug @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' on +# the right side marks the last column you can put a character in. You must make +# exactly 11 lines for the formatting to be correct. It's also customary to +# leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +glibc-debug: glibc-debug (GNU C libraries with debugging symbols) +glibc-debug: +glibc-debug: This package contains versions of the GNU C libraries with debugging +glibc-debug: information. These are needed only if you wish to be able to step +glibc-debug: through C library routines while debugging programs. Most debugging +glibc-debug: efforts will not require these. +glibc-debug: To use these libraries, set LD_LIBRARY_PATH when calling the debugger: +glibc-debug: LD_LIBRARY_PATH=/usr/lib/debug gdb +glibc-debug: +glibc-debug: Or, use this approach if you need to debug a setuid binary: +glibc-debug: su user -c "LD_LIBRARY_PATH=/usr/lib/debug gdb " diff --git a/patches/source/glibc/slack-desc.glibc-i18n b/patches/source/glibc/slack-desc.glibc-i18n new file mode 100644 index 000000000..71f5336c0 --- /dev/null +++ b/patches/source/glibc/slack-desc.glibc-i18n @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' on +# the right side marks the last column you can put a character in. You must make +# exactly 11 lines for the formatting to be correct. It's also customary to +# leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +glibc-i18n: glibc-i18n (locale files from glibc) +glibc-i18n: +glibc-i18n: These files go in /usr/lib/locale and /usr/share/i18n/ to provide +glibc-i18n: internationalization support. You'll need this package unless you +glibc-i18n: will be using US English only. +glibc-i18n: +glibc-i18n: +glibc-i18n: +glibc-i18n: +glibc-i18n: +glibc-i18n: diff --git a/patches/source/glibc/slack-desc.glibc-profile b/patches/source/glibc/slack-desc.glibc-profile new file mode 100644 index 000000000..8c873fd92 --- /dev/null +++ b/patches/source/glibc/slack-desc.glibc-profile @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' on +# the right side marks the last column you can put a character in. You must make +# exactly 11 lines for the formatting to be correct. It's also customary to +# leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +glibc-profile: glibc-profile (GNU C libraries with profiling support) +glibc-profile: +glibc-profile: This package contains static versions of the GNU C libraries with +glibc-profile: support for profiling binaries using gprof. gprof calculates how +glibc-profile: much time a program spends in each routine which can suggest where +glibc-profile: to concentrate efforts to improve performance. +glibc-profile: +glibc-profile: See the gprof man page for more details. +glibc-profile: +glibc-profile: +glibc-profile: diff --git a/patches/source/glibc/slack-desc.glibc-solibs b/patches/source/glibc/slack-desc.glibc-solibs new file mode 100644 index 000000000..807df645a --- /dev/null +++ b/patches/source/glibc/slack-desc.glibc-solibs @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' on +# the right side marks the last column you can put a character in. You must make +# exactly 11 lines for the formatting to be correct. It's also customary to +# leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +glibc-solibs: glibc-solibs (shared GNU C libraries) +glibc-solibs: +glibc-solibs: This package contains the shared libraries, binaries, and support +glibc-solibs: files required to run most Linux applications linked with glibc. +glibc-solibs: +glibc-solibs: +glibc-solibs: +glibc-solibs: +glibc-solibs: +glibc-solibs: +glibc-solibs: diff --git a/patches/source/glibc/slack-desc.glibc-solibs-linuxthreads b/patches/source/glibc/slack-desc.glibc-solibs-linuxthreads new file mode 100644 index 000000000..9efe3bf1d --- /dev/null +++ b/patches/source/glibc/slack-desc.glibc-solibs-linuxthreads @@ -0,0 +1,18 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' on +# the right side marks the last column you can put a character in. You must make +# exactly 11 lines for the formatting to be correct. It's also customary to +# leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +glibc-solibs-linuxthreads: glibc-solibs-linuxthreads (LinuxThreads shared GNU C libraries) +glibc-solibs-linuxthreads: +glibc-solibs-linuxthreads: This package contains the shared libraries for glibc that uses +glibc-solibs-linuxthreads: LinuxThreads, the threading implementation in Linux 2.4.x and +glibc-solibs-linuxthreads: earlier kernels. In some cases you'll need to use these libraries +glibc-solibs-linuxthreads: to run old binaries by setting these environment variables: +glibc-solibs-linuxthreads: export LD_ASSUME_KERNEL=2.4.33 +glibc-solibs-linuxthreads: export LD_LIBRARY_PATH=/lib/obsolete/linuxthreads +glibc-solibs-linuxthreads: old-program +glibc-solibs-linuxthreads: Most users should have no need for this package. Recompile. :-) diff --git a/patches/source/glibc/slack-desc.glibc-zoneinfo b/patches/source/glibc/slack-desc.glibc-zoneinfo new file mode 100644 index 000000000..69420f78d --- /dev/null +++ b/patches/source/glibc/slack-desc.glibc-zoneinfo @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' on +# the right side marks the last column you can put a character in. You must make +# exactly 11 lines for the formatting to be correct. It's also customary to +# leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +glibc-zoneinfo: glibc-zoneinfo (timezone database) +glibc-zoneinfo: +glibc-zoneinfo: This package allows you to configure your time zone. +glibc-zoneinfo: +glibc-zoneinfo: This timezone database comes from the tzdata and tzcode packages by +glibc-zoneinfo: Arthur David Olson et.al. The latest version and more information +glibc-zoneinfo: may be found at: http://www.iana.org/time-zones +glibc-zoneinfo: +glibc-zoneinfo: Use the timeconfig utility to set your local time zone. +glibc-zoneinfo: +glibc-zoneinfo: diff --git a/patches/source/glibc/slack-desc.glibc-zoneinfo.olson b/patches/source/glibc/slack-desc.glibc-zoneinfo.olson new file mode 100644 index 000000000..24dfd0e9f --- /dev/null +++ b/patches/source/glibc/slack-desc.glibc-zoneinfo.olson @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' on +# the right side marks the last column you can put a character in. You must make +# exactly 11 lines for the formatting to be correct. It's also customary to +# leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +glibc-zoneinfo: glibc-zoneinfo (timezone database) +glibc-zoneinfo: +glibc-zoneinfo: This package allows you to configure your time zone. +glibc-zoneinfo: +glibc-zoneinfo: This timezone database comes from the tzdata and tzcode packages by +glibc-zoneinfo: Arthur David Olson et.al. The latest version and more information +glibc-zoneinfo: may be found at ftp://elsie.nci.nih.gov/pub/ +glibc-zoneinfo: +glibc-zoneinfo: Use the timeconfig utility to set your local time zone. +glibc-zoneinfo: +glibc-zoneinfo: diff --git a/patches/source/glibc/timezone-scripts/output-updated-timeconfig.sh b/patches/source/glibc/timezone-scripts/output-updated-timeconfig.sh new file mode 100644 index 000000000..a04f1b67f --- /dev/null +++ b/patches/source/glibc/timezone-scripts/output-updated-timeconfig.sh @@ -0,0 +1,53 @@ +#!/bin/sh +# Copyright 2000, 2001, 2006, 2007, 2008, 2012 Patrick J. Volkerding, Sebeka, MN, USA. +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +if [ ! "$(basename "$1")" = "zoneinfo" -o ! -d "$1" ]; then + echo " Usage: output-updated-timeconfig.sh " + exit 1 +fi + +CWD=$(pwd) +cat $CWD/parts/00 +# Sorry, I'd rather not be US-centric but some people here have a hard +# time finding things. ;-) +( cd $1 + find . -type f | xargs file | grep "timezone data" | cut -f 1 -d : | cut -f 2- -d / | sort | grep "^US/" | while read zone ; do + echo "\"${zone}\" \" \" \\" + done +) +( cd $1 + find . -type f | xargs file | grep "timezone data" | cut -f 1 -d : | cut -f 2- -d / | sort | grep -v "^US/" | while read zone ; do + echo "\"${zone}\" \" \" \\" + done +) +cat $CWD/parts/02 +( cd $1 + find . -type f | xargs file | grep "timezone data" | cut -f 1 -d : | cut -f 2- -d / | sort | grep "^US/" | while read zone ; do + echo "${zone}" + done +) +( cd $1 + find . -type f | xargs file | grep "timezone data" | cut -f 1 -d : | cut -f 2- -d / | sort | grep -v "^US/" | while read zone ; do + echo "${zone}" + done +) +cat $CWD/parts/04 diff --git a/patches/source/glibc/timezone-scripts/parts/00 b/patches/source/glibc/timezone-scripts/parts/00 new file mode 100644 index 000000000..a1601faaf --- /dev/null +++ b/patches/source/glibc/timezone-scripts/parts/00 @@ -0,0 +1,131 @@ +#!/bin/sh +# +# timeconfig Slackware Linux timezone configuration utility. +# +# Author: Patrick Volkerding +# Modified by: David Cantrell , 06-Oct-2000 +# +# ChangeLog: +# 2014-10-22: Updated timezones from tzdata2014i. +# 2012-12-12: Updated timezones from tzdata2012j. +# 2008-03-10: Updated timezones from tzdata2008a. +# 2007-12-21: Updated timezones from tzdata2007j. +# 2006-12-03: Updated timezones from tzdata2006p. +# 2006-09-14: Updated timezones from tzdata2006k. +# 2006-08-22: Updated timezones from tzdata2006j. +# 2006-08-13: Updated timezones from tzdata2006g. +# 2006-03-13: Updated timezones from tzdata2006c. +# 19-Feb-2001 Add new timezones from glibc-2.2.2. +# 06-Oct-2000 Fixed a problem with selecting UTC time. It was writing +# the hardwareclock file to the root disk and not your dest +# partition. Changed the HWCLOCK_CONF variable to be +# $T_PX/etc/hardwareclock to fix this. Thanks to David L. +# Dickman for finding this and +# submitting a patch. +# +# 15-Mar-2000 Added the writeconf function to write out the +# /etc/hardwareclock file which tells what the hardware clock +# is set to (UTC or localtime). +# +# 03-Mar-2000 Reorganized script. Made one timezone set block, added +# stage that asks the user if the hardware clock is set to +# UTC. + +# setup our temp locations and variables +TMP=/var/log/setup/tmp +if [ -r $TMP/SeTT_PX ]; then + T_PX="`cat $TMP/SeTT_PX`" +elif [ ! "$!" = "" ]; then + T_PX=$1 +else + T_PX=/ +fi + +# the hardware clock configuration file +HWCLOCK_CONF=$T_PX/etc/hardwareclock + +# setzone( $TIMEZONE ) +# +# This function accepts a time zone as the only parameter and sets it as +# the default system time zone. +setzone() +{ + TZ=$1 + + cd $T_PX/etc + if [ -r $T_PX/usr/share/zoneinfo/$TZ -o \ + -r /var/log/mount/usr/share/zoneinfo/$TZ -o \ + -L $T_PX/usr/share/zoneinfo/$TZ -o \ + -L /var/log/mount/usr/share/zoneinfo/$TZ ]; then + ln -sf /usr/share/zoneinfo/$TZ localtime-copied-from + rm -f localtime + cd .. + chroot . cp etc/localtime-copied-from etc/localtime + fi +} + +# writeconf( $CLOCK_SET_TO ) +# +# Writes out $HWCLOCK_CONF that tells rc.S how the hardware clock +# value is stored. +writeconf() +{ + echo "# /etc/hardwareclock" > $HWCLOCK_CONF + echo "#" >> $HWCLOCK_CONF + echo "# Tells how the hardware clock time is stored." >> $HWCLOCK_CONF + echo "# You should run timeconfig to edit this file." >> $HWCLOCK_CONF + echo >> $HWCLOCK_CONF + echo $1 >> $HWCLOCK_CONF +} + +# ask the user if the hardware clock is set for UTC/GMT +if [ "$COLOR" = "on" -o -r $TMP/SeTcolor -o "$T_PX" = "/" ]; then + ### + ### use color menus here + ### + dialog --title "HARDWARE CLOCK SET TO UTC?" --menu "Is the hardware clock set \ +to Coordinated Universal Time (UTC/GMT)? If it is, select YES here. If the \ +hardware clock is set to the current local time (this is how most PCs are set \ +up), then say NO here. If you are not sure what this is, you should answer NO \ +here." 13 60 2 \ + "NO" "Hardware clock is set to local time" \ + "YES" "Hardware clock is set to UTC" \ + 2> $TMP/utc + if [ $? = 1 -o $? = 255 ]; then + rm -f $TMP/utc + exit + fi + if [ "`cat $TMP/utc`" = "YES" ]; then + # yes, the hardware clock is UTC + writeconf "UTC" + else # must be NO + writeconf "localtime" + fi + rm -f $TMP/utc +else + ### + ### use text prompts + ### + echo "Is the hardware clock set to Coordinated Universal Time (UTC/GMT)?" + echo "If it is, select 'y' here. If the hardware clock is set to the" + echo "current local time (this is how most PCs are set up), then say 'n'" + echo "here. If you are not sure what this is, you should answer 'n' here." + echo + echo -n "Is your hardware clock set to UTC ([y]es, [n]o)? " + read HEJAZ + + if [ "$HEJAZ" = "y" -o "$HEJAZ" = "Y" -o "$HEJAZ" = "YES" -o "$HEJAZ" = "yes" ]; then + # yes, the hardware clock is UTC + writeconf "UTC" + else + # default to localtime + writeconf "localtime" + fi +fi + +# Now set the correct timezone link: +if [ "$COLOR" = "on" -o -r $TMP/SeTcolor -o "$T_PX" = "/" ]; then + ### + ### use color menus here + ### + dialog --title "TIMEZONE CONFIGURATION" --menu "Please select one of the following timezones for your machine:" 21 50 13 \ diff --git a/patches/source/glibc/timezone-scripts/parts/01 b/patches/source/glibc/timezone-scripts/parts/01 new file mode 100644 index 000000000..7fc8fb1d4 --- /dev/null +++ b/patches/source/glibc/timezone-scripts/parts/01 @@ -0,0 +1,1658 @@ +"US/Alaska" " " \ +"US/Aleutian" " " \ +"US/Arizona" " " \ +"US/Central" " " \ +"US/East-Indiana" " " \ +"US/Eastern" " " \ +"US/Hawaii" " " \ +"US/Indiana-Starke" " " \ +"US/Michigan" " " \ +"US/Mountain" " " \ +"US/Pacific" " " \ +"US/Pacific-New" " " \ +"US/Samoa" " " \ +"Africa/Abidjan" " " \ +"Africa/Accra" " " \ +"Africa/Addis_Ababa" " " \ +"Africa/Algiers" " " \ +"Africa/Asmera" " " \ +"Africa/Bamako" " " \ +"Africa/Bangui" " " \ +"Africa/Banjul" " " \ +"Africa/Bissau" " " \ +"Africa/Blantyre" " " \ +"Africa/Brazzaville" " " \ +"Africa/Bujumbura" " " \ +"Africa/Cairo" " " \ +"Africa/Casablanca" " " \ +"Africa/Ceuta" " " \ +"Africa/Conakry" " " \ +"Africa/Dakar" " " \ +"Africa/Dar_es_Salaam" " " \ +"Africa/Djibouti" " " \ +"Africa/Douala" " " \ +"Africa/El_Aaiun" " " \ +"Africa/Freetown" " " \ +"Africa/Gaborone" " " \ +"Africa/Harare" " " \ +"Africa/Johannesburg" " " \ +"Africa/Kampala" " " \ +"Africa/Khartoum" " " \ +"Africa/Kigali" " " \ +"Africa/Kinshasa" " " \ +"Africa/Lagos" " " \ +"Africa/Libreville" " " \ +"Africa/Lome" " " \ +"Africa/Luanda" " " \ +"Africa/Lubumbashi" " " \ +"Africa/Lusaka" " " \ +"Africa/Malabo" " " \ +"Africa/Maputo" " " \ +"Africa/Maseru" " " \ +"Africa/Mbabane" " " \ +"Africa/Mogadishu" " " \ +"Africa/Monrovia" " " \ +"Africa/Nairobi" " " \ +"Africa/Ndjamena" " " \ +"Africa/Niamey" " " \ +"Africa/Nouakchott" " " \ +"Africa/Ouagadougou" " " \ +"Africa/Porto-Novo" " " \ +"Africa/Sao_Tome" " " \ +"Africa/Timbuktu" " " \ +"Africa/Tripoli" " " \ +"Africa/Tunis" " " \ +"Africa/Windhoek" " " \ +"America/Adak" " " \ +"America/Anchorage" " " \ +"America/Anguilla" " " \ +"America/Antigua" " " \ +"America/Araguaina" " " \ +"America/Argentina/Buenos_Aires" " " \ +"America/Argentina/Catamarca" " " \ +"America/Argentina/ComodRivadavia" " " \ +"America/Argentina/Cordoba" " " \ +"America/Argentina/Jujuy" " " \ +"America/Argentina/La_Rioja" " " \ +"America/Argentina/Mendoza" " " \ +"America/Argentina/Rio_Gallegos" " " \ +"America/Argentina/San_Juan" " " \ +"America/Argentina/Tucuman" " " \ +"America/Argentina/Ushuaia" " " \ +"America/Aruba" " " \ +"America/Asuncion" " " \ +"America/Atikokan" " " \ +"America/Atka" " " \ +"America/Bahia" " " \ +"America/Barbados" " " \ +"America/Belem" " " \ +"America/Belize" " " \ +"America/Blanc-Sablon" " " \ +"America/Boa_Vista" " " \ +"America/Bogota" " " \ +"America/Boise" " " \ +"America/Buenos_Aires" " " \ +"America/Cambridge_Bay" " " \ +"America/Campo_Grande" " " \ +"America/Cancun" " " \ +"America/Caracas" " " \ +"America/Catamarca" " " \ +"America/Cayenne" " " \ +"America/Cayman" " " \ +"America/Chicago" " " \ +"America/Chihuahua" " " \ +"America/Coral_Harbour" " " \ +"America/Cordoba" " " \ +"America/Costa_Rica" " " \ +"America/Cuiaba" " " \ +"America/Curacao" " " \ +"America/Danmarkshavn" " " \ +"America/Dawson" " " \ +"America/Dawson_Creek" " " \ +"America/Denver" " " \ +"America/Detroit" " " \ +"America/Dominica" " " \ +"America/Edmonton" " " \ +"America/Eirunepe" " " \ +"America/El_Salvador" " " \ +"America/Ensenada" " " \ +"America/Fort_Wayne" " " \ +"America/Fortaleza" " " \ +"America/Glace_Bay" " " \ +"America/Godthab" " " \ +"America/Goose_Bay" " " \ +"America/Grand_Turk" " " \ +"America/Grenada" " " \ +"America/Guadeloupe" " " \ +"America/Guatemala" " " \ +"America/Guayaquil" " " \ +"America/Guyana" " " \ +"America/Halifax" " " \ +"America/Havana" " " \ +"America/Hermosillo" " " \ +"America/Indiana/Indianapolis" " " \ +"America/Indiana/Knox" " " \ +"America/Indiana/Marengo" " " \ +"America/Indiana/Petersburg" " " \ +"America/Indiana/Tell_City" " " \ +"America/Indiana/Vevay" " " \ +"America/Indiana/Vincennes" " " \ +"America/Indianapolis" " " \ +"America/Inuvik" " " \ +"America/Iqaluit" " " \ +"America/Jamaica" " " \ +"America/Jujuy" " " \ +"America/Juneau" " " \ +"America/Kentucky/Louisville" " " \ +"America/Kentucky/Monticello" " " \ +"America/Knox_IN" " " \ +"America/La_Paz" " " \ +"America/Lima" " " \ +"America/Los_Angeles" " " \ +"America/Louisville" " " \ +"America/Maceio" " " \ +"America/Managua" " " \ +"America/Manaus" " " \ +"America/Martinique" " " \ +"America/Mazatlan" " " \ +"America/Mendoza" " " \ +"America/Menominee" " " \ +"America/Merida" " " \ +"America/Mexico_City" " " \ +"America/Miquelon" " " \ +"America/Moncton" " " \ +"America/Monterrey" " " \ +"America/Montevideo" " " \ +"America/Montreal" " " \ +"America/Montserrat" " " \ +"America/Nassau" " " \ +"America/New_York" " " \ +"America/Nipigon" " " \ +"America/Nome" " " \ +"America/Noronha" " " \ +"America/North_Dakota/Center" " " \ +"America/North_Dakota/New_Salem" " " \ +"America/Panama" " " \ +"America/Pangnirtung" " " \ +"America/Paramaribo" " " \ +"America/Phoenix" " " \ +"America/Port-au-Prince" " " \ +"America/Port_of_Spain" " " \ +"America/Porto_Acre" " " \ +"America/Porto_Velho" " " \ +"America/Puerto_Rico" " " \ +"America/Rainy_River" " " \ +"America/Rankin_Inlet" " " \ +"America/Recife" " " \ +"America/Regina" " " \ +"America/Rio_Branco" " " \ +"America/Rosario" " " \ +"America/Santiago" " " \ +"America/Santo_Domingo" " " \ +"America/Sao_Paulo" " " \ +"America/Scoresbysund" " " \ +"America/Shiprock" " " \ +"America/St_Johns" " " \ +"America/St_Kitts" " " \ +"America/St_Lucia" " " \ +"America/St_Thomas" " " \ +"America/St_Vincent" " " \ +"America/Swift_Current" " " \ +"America/Tegucigalpa" " " \ +"America/Thule" " " \ +"America/Thunder_Bay" " " \ +"America/Tijuana" " " \ +"America/Toronto" " " \ +"America/Tortola" " " \ +"America/Vancouver" " " \ +"America/Virgin" " " \ +"America/Whitehorse" " " \ +"America/Winnipeg" " " \ +"America/Yakutat" " " \ +"America/Yellowknife" " " \ +"Antarctica/Casey" " " \ +"Antarctica/Davis" " " \ +"Antarctica/DumontDUrville" " " \ +"Antarctica/Mawson" " " \ +"Antarctica/McMurdo" " " \ +"Antarctica/Palmer" " " \ +"Antarctica/Rothera" " " \ +"Antarctica/South_Pole" " " \ +"Antarctica/Syowa" " " \ +"Antarctica/Troll" " " \ +"Antarctica/Vostok" " " \ +"Arctic/Longyearbyen" " " \ +"Asia/Aden" " " \ +"Asia/Almaty" " " \ +"Asia/Amman" " " \ +"Asia/Anadyr" " " \ +"Asia/Aqtau" " " \ +"Asia/Aqtobe" " " \ +"Asia/Ashgabat" " " \ +"Asia/Ashkhabad" " " \ +"Asia/Baghdad" " " \ +"Asia/Bahrain" " " \ +"Asia/Baku" " " \ +"Asia/Bangkok" " " \ +"Asia/Beirut" " " \ +"Asia/Bishkek" " " \ +"Asia/Brunei" " " \ +"Asia/Calcutta" " " \ +"Asia/Chita" " " \ +"Asia/Choibalsan" " " \ +"Asia/Chongqing" " " \ +"Asia/Chungking" " " \ +"Asia/Colombo" " " \ +"Asia/Dacca" " " \ +"Asia/Damascus" " " \ +"Asia/Dhaka" " " \ +"Asia/Dili" " " \ +"Asia/Dubai" " " \ +"Asia/Dushanbe" " " \ +"Asia/Gaza" " " \ +"Asia/Harbin" " " \ +"Asia/Hong_Kong" " " \ +"Asia/Hovd" " " \ +"Asia/Irkutsk" " " \ +"Asia/Istanbul" " " \ +"Asia/Jakarta" " " \ +"Asia/Jayapura" " " \ +"Asia/Jerusalem" " " \ +"Asia/Kabul" " " \ +"Asia/Kamchatka" " " \ +"Asia/Karachi" " " \ +"Asia/Kashgar" " " \ +"Asia/Katmandu" " " \ +"Asia/Khandyga" " " \ +"Asia/Khandyga" " " \ +"Asia/Krasnoyarsk" " " \ +"Asia/Kuala_Lumpur" " " \ +"Asia/Kuching" " " \ +"Asia/Kuwait" " " \ +"Asia/Macao" " " \ +"Asia/Macau" " " \ +"Asia/Magadan" " " \ +"Asia/Makassar" " " \ +"Asia/Manila" " " \ +"Asia/Muscat" " " \ +"Asia/Nicosia" " " \ +"Asia/Novosibirsk" " " \ +"Asia/Omsk" " " \ +"Asia/Oral" " " \ +"Asia/Phnom_Penh" " " \ +"Asia/Pontianak" " " \ +"Asia/Pyongyang" " " \ +"Asia/Qatar" " " \ +"Asia/Qyzylorda" " " \ +"Asia/Rangoon" " " \ +"Asia/Riyadh" " " \ +"Asia/Saigon" " " \ +"Asia/Sakhalin" " " \ +"Asia/Samarkand" " " \ +"Asia/Seoul" " " \ +"Asia/Shanghai" " " \ +"Asia/Singapore" " " \ +"Asia/Srednekolymsk" " " \ +"Asia/Taipei" " " \ +"Asia/Tashkent" " " \ +"Asia/Tbilisi" " " \ +"Asia/Tehran" " " \ +"Asia/Tel_Aviv" " " \ +"Asia/Thimbu" " " \ +"Asia/Thimphu" " " \ +"Asia/Tokyo" " " \ +"Asia/Ujung_Pandang" " " \ +"Asia/Ulaanbaatar" " " \ +"Asia/Ulan_Bator" " " \ +"Asia/Urumqi" " " \ +"Asia/Ust-Nera" " " \ +"Asia/Vientiane" " " \ +"Asia/Vladivostok" " " \ +"Asia/Yakutsk" " " \ +"Asia/Yekaterinburg" " " \ +"Asia/Yerevan" " " \ +"Atlantic/Azores" " " \ +"Atlantic/Bermuda" " " \ +"Atlantic/Canary" " " \ +"Atlantic/Cape_Verde" " " \ +"Atlantic/Faeroe" " " \ +"Atlantic/Jan_Mayen" " " \ +"Atlantic/Madeira" " " \ +"Atlantic/Reykjavik" " " \ +"Atlantic/South_Georgia" " " \ +"Atlantic/St_Helena" " " \ +"Atlantic/Stanley" " " \ +"Australia/ACT" " " \ +"Australia/Adelaide" " " \ +"Australia/Brisbane" " " \ +"Australia/Broken_Hill" " " \ +"Australia/Canberra" " " \ +"Australia/Currie" " " \ +"Australia/Darwin" " " \ +"Australia/Hobart" " " \ +"Australia/LHI" " " \ +"Australia/Lindeman" " " \ +"Australia/Lord_Howe" " " \ +"Australia/Melbourne" " " \ +"Australia/NSW" " " \ +"Australia/North" " " \ +"Australia/Perth" " " \ +"Australia/Queensland" " " \ +"Australia/South" " " \ +"Australia/Sydney" " " \ +"Australia/Tasmania" " " \ +"Australia/Victoria" " " \ +"Australia/West" " " \ +"Australia/Yancowinna" " " \ +"Brazil/Acre" " " \ +"Brazil/DeNoronha" " " \ +"Brazil/East" " " \ +"Brazil/West" " " \ +"CET" " " \ +"CST6CDT" " " \ +"Canada/Atlantic" " " \ +"Canada/Central" " " \ +"Canada/East-Saskatchewan" " " \ +"Canada/Eastern" " " \ +"Canada/Mountain" " " \ +"Canada/Newfoundland" " " \ +"Canada/Pacific" " " \ +"Canada/Saskatchewan" " " \ +"Canada/Yukon" " " \ +"Chile/Continental" " " \ +"Chile/EasterIsland" " " \ +"Cuba" " " \ +"EET" " " \ +"EST" " " \ +"EST5EDT" " " \ +"Egypt" " " \ +"Eire" " " \ +"Etc/GMT" " " \ +"Etc/GMT+0" " " \ +"Etc/GMT+1" " " \ +"Etc/GMT+10" " " \ +"Etc/GMT+11" " " \ +"Etc/GMT+12" " " \ +"Etc/GMT+2" " " \ +"Etc/GMT+3" " " \ +"Etc/GMT+4" " " \ +"Etc/GMT+5" " " \ +"Etc/GMT+6" " " \ +"Etc/GMT+7" " " \ +"Etc/GMT+8" " " \ +"Etc/GMT+9" " " \ +"Etc/GMT-0" " " \ +"Etc/GMT-1" " " \ +"Etc/GMT-10" " " \ +"Etc/GMT-11" " " \ +"Etc/GMT-12" " " \ +"Etc/GMT-13" " " \ +"Etc/GMT-14" " " \ +"Etc/GMT-2" " " \ +"Etc/GMT-3" " " \ +"Etc/GMT-4" " " \ +"Etc/GMT-5" " " \ +"Etc/GMT-6" " " \ +"Etc/GMT-7" " " \ +"Etc/GMT-8" " " \ +"Etc/GMT-9" " " \ +"Etc/GMT0" " " \ +"Etc/Greenwich" " " \ +"Etc/UCT" " " \ +"Etc/UTC" " " \ +"Etc/Universal" " " \ +"Etc/Zulu" " " \ +"Europe/Amsterdam" " " \ +"Europe/Andorra" " " \ +"Europe/Athens" " " \ +"Europe/Belfast" " " \ +"Europe/Belgrade" " " \ +"Europe/Berlin" " " \ +"Europe/Bratislava" " " \ +"Europe/Brussels" " " \ +"Europe/Bucharest" " " \ +"Europe/Budapest" " " \ +"Europe/Busingen" " " \ +"Europe/Chisinau" " " \ +"Europe/Copenhagen" " " \ +"Europe/Dublin" " " \ +"Europe/Gibraltar" " " \ +"Europe/Guernsey" " " \ +"Europe/Helsinki" " " \ +"Europe/Isle_of_Man" " " \ +"Europe/Istanbul" " " \ +"Europe/Jersey" " " \ +"Europe/Kaliningrad" " " \ +"Europe/Kiev" " " \ +"Europe/Lisbon" " " \ +"Europe/Ljubljana" " " \ +"Europe/London" " " \ +"Europe/Luxembourg" " " \ +"Europe/Madrid" " " \ +"Europe/Malta" " " \ +"Europe/Mariehamn" " " \ +"Europe/Minsk" " " \ +"Europe/Monaco" " " \ +"Europe/Moscow" " " \ +"Europe/Nicosia" " " \ +"Europe/Oslo" " " \ +"Europe/Paris" " " \ +"Europe/Podgorica" " " \ +"Europe/Prague" " " \ +"Europe/Riga" " " \ +"Europe/Rome" " " \ +"Europe/Samara" " " \ +"Europe/San_Marino" " " \ +"Europe/Sarajevo" " " \ +"Europe/Simferopol" " " \ +"Europe/Skopje" " " \ +"Europe/Sofia" " " \ +"Europe/Stockholm" " " \ +"Europe/Tallinn" " " \ +"Europe/Tirane" " " \ +"Europe/Tiraspol" " " \ +"Europe/Uzhgorod" " " \ +"Europe/Vaduz" " " \ +"Europe/Vatican" " " \ +"Europe/Vienna" " " \ +"Europe/Vilnius" " " \ +"Europe/Volgograd" " " \ +"Europe/Warsaw" " " \ +"Europe/Zagreb" " " \ +"Europe/Zaporozhye" " " \ +"Europe/Zurich" " " \ +"Factory" " " \ +"GB" " " \ +"GB-Eire" " " \ +"GMT" " " \ +"GMT+0" " " \ +"GMT-0" " " \ +"GMT0" " " \ +"Greenwich" " " \ +"HST" " " \ +"Hongkong" " " \ +"Iceland" " " \ +"Indian/Antananarivo" " " \ +"Indian/Chagos" " " \ +"Indian/Christmas" " " \ +"Indian/Cocos" " " \ +"Indian/Comoro" " " \ +"Indian/Kerguelen" " " \ +"Indian/Mahe" " " \ +"Indian/Maldives" " " \ +"Indian/Mauritius" " " \ +"Indian/Mayotte" " " \ +"Indian/Reunion" " " \ +"Iran" " " \ +"Israel" " " \ +"Jamaica" " " \ +"Japan" " " \ +"Kwajalein" " " \ +"Libya" " " \ +"MET" " " \ +"MST" " " \ +"MST7MDT" " " \ +"Mexico/BajaNorte" " " \ +"Mexico/BajaSur" " " \ +"Mexico/General" " " \ +"NZ" " " \ +"NZ-CHAT" " " \ +"Navajo" " " \ +"PRC" " " \ +"PST8PDT" " " \ +"Pacific/Apia" " " \ +"Pacific/Auckland" " " \ +"Pacific/Bougainville" " " \ +"Pacific/Chatham" " " \ +"Pacific/Easter" " " \ +"Pacific/Efate" " " \ +"Pacific/Enderbury" " " \ +"Pacific/Fakaofo" " " \ +"Pacific/Fiji" " " \ +"Pacific/Funafuti" " " \ +"Pacific/Galapagos" " " \ +"Pacific/Gambier" " " \ +"Pacific/Guadalcanal" " " \ +"Pacific/Guam" " " \ +"Pacific/Honolulu" " " \ +"Pacific/Johnston" " " \ +"Pacific/Kiritimati" " " \ +"Pacific/Kosrae" " " \ +"Pacific/Kwajalein" " " \ +"Pacific/Majuro" " " \ +"Pacific/Marquesas" " " \ +"Pacific/Midway" " " \ +"Pacific/Nauru" " " \ +"Pacific/Niue" " " \ +"Pacific/Norfolk" " " \ +"Pacific/Noumea" " " \ +"Pacific/Pago_Pago" " " \ +"Pacific/Palau" " " \ +"Pacific/Pitcairn" " " \ +"Pacific/Ponape" " " \ +"Pacific/Port_Moresby" " " \ +"Pacific/Rarotonga" " " \ +"Pacific/Saipan" " " \ +"Pacific/Samoa" " " \ +"Pacific/Tahiti" " " \ +"Pacific/Tarawa" " " \ +"Pacific/Tongatapu" " " \ +"Pacific/Truk" " " \ +"Pacific/Wake" " " \ +"Pacific/Wallis" " " \ +"Pacific/Yap" " " \ +"Poland" " " \ +"Portugal" " " \ +"ROC" " " \ +"ROK" " " \ +"Singapore" " " \ +"Turkey" " " \ +"UCT" " " \ +"UTC" " " \ +"Universal" " " \ +"W-SU" " " \ +"WET" " " \ +"Zulu" " " \ +"posix/Africa/Abidjan" " " \ +"posix/Africa/Accra" " " \ +"posix/Africa/Addis_Ababa" " " \ +"posix/Africa/Algiers" " " \ +"posix/Africa/Asmera" " " \ +"posix/Africa/Bamako" " " \ +"posix/Africa/Bangui" " " \ +"posix/Africa/Banjul" " " \ +"posix/Africa/Bissau" " " \ +"posix/Africa/Blantyre" " " \ +"posix/Africa/Brazzaville" " " \ +"posix/Africa/Bujumbura" " " \ +"posix/Africa/Cairo" " " \ +"posix/Africa/Casablanca" " " \ +"posix/Africa/Ceuta" " " \ +"posix/Africa/Conakry" " " \ +"posix/Africa/Dakar" " " \ +"posix/Africa/Dar_es_Salaam" " " \ +"posix/Africa/Djibouti" " " \ +"posix/Africa/Douala" " " \ +"posix/Africa/El_Aaiun" " " \ +"posix/Africa/Freetown" " " \ +"posix/Africa/Gaborone" " " \ +"posix/Africa/Harare" " " \ +"posix/Africa/Johannesburg" " " \ +"posix/Africa/Kampala" " " \ +"posix/Africa/Khartoum" " " \ +"posix/Africa/Kigali" " " \ +"posix/Africa/Kinshasa" " " \ +"posix/Africa/Lagos" " " \ +"posix/Africa/Libreville" " " \ +"posix/Africa/Lome" " " \ +"posix/Africa/Luanda" " " \ +"posix/Africa/Lubumbashi" " " \ +"posix/Africa/Lusaka" " " \ +"posix/Africa/Malabo" " " \ +"posix/Africa/Maputo" " " \ +"posix/Africa/Maseru" " " \ +"posix/Africa/Mbabane" " " \ +"posix/Africa/Mogadishu" " " \ +"posix/Africa/Monrovia" " " \ +"posix/Africa/Nairobi" " " \ +"posix/Africa/Ndjamena" " " \ +"posix/Africa/Niamey" " " \ +"posix/Africa/Nouakchott" " " \ +"posix/Africa/Ouagadougou" " " \ +"posix/Africa/Porto-Novo" " " \ +"posix/Africa/Sao_Tome" " " \ +"posix/Africa/Timbuktu" " " \ +"posix/Africa/Tripoli" " " \ +"posix/Africa/Tunis" " " \ +"posix/Africa/Windhoek" " " \ +"posix/America/Adak" " " \ +"posix/America/Anchorage" " " \ +"posix/America/Anguilla" " " \ +"posix/America/Antigua" " " \ +"posix/America/Araguaina" " " \ +"posix/America/Argentina/Buenos_Aires" " " \ +"posix/America/Argentina/Catamarca" " " \ +"posix/America/Argentina/ComodRivadavia" " " \ +"posix/America/Argentina/Cordoba" " " \ +"posix/America/Argentina/Jujuy" " " \ +"posix/America/Argentina/La_Rioja" " " \ +"posix/America/Argentina/Mendoza" " " \ +"posix/America/Argentina/Rio_Gallegos" " " \ +"posix/America/Argentina/San_Juan" " " \ +"posix/America/Argentina/Tucuman" " " \ +"posix/America/Argentina/Ushuaia" " " \ +"posix/America/Aruba" " " \ +"posix/America/Asuncion" " " \ +"posix/America/Atikokan" " " \ +"posix/America/Atka" " " \ +"posix/America/Bahia" " " \ +"posix/America/Barbados" " " \ +"posix/America/Belem" " " \ +"posix/America/Belize" " " \ +"posix/America/Blanc-Sablon" " " \ +"posix/America/Boa_Vista" " " \ +"posix/America/Bogota" " " \ +"posix/America/Boise" " " \ +"posix/America/Buenos_Aires" " " \ +"posix/America/Cambridge_Bay" " " \ +"posix/America/Campo_Grande" " " \ +"posix/America/Cancun" " " \ +"posix/America/Caracas" " " \ +"posix/America/Catamarca" " " \ +"posix/America/Cayenne" " " \ +"posix/America/Cayman" " " \ +"posix/America/Chicago" " " \ +"posix/America/Chihuahua" " " \ +"posix/America/Coral_Harbour" " " \ +"posix/America/Cordoba" " " \ +"posix/America/Costa_Rica" " " \ +"posix/America/Cuiaba" " " \ +"posix/America/Curacao" " " \ +"posix/America/Danmarkshavn" " " \ +"posix/America/Dawson" " " \ +"posix/America/Dawson_Creek" " " \ +"posix/America/Denver" " " \ +"posix/America/Detroit" " " \ +"posix/America/Dominica" " " \ +"posix/America/Edmonton" " " \ +"posix/America/Eirunepe" " " \ +"posix/America/El_Salvador" " " \ +"posix/America/Ensenada" " " \ +"posix/America/Fort_Wayne" " " \ +"posix/America/Fortaleza" " " \ +"posix/America/Glace_Bay" " " \ +"posix/America/Godthab" " " \ +"posix/America/Goose_Bay" " " \ +"posix/America/Grand_Turk" " " \ +"posix/America/Grenada" " " \ +"posix/America/Guadeloupe" " " \ +"posix/America/Guatemala" " " \ +"posix/America/Guayaquil" " " \ +"posix/America/Guyana" " " \ +"posix/America/Halifax" " " \ +"posix/America/Havana" " " \ +"posix/America/Hermosillo" " " \ +"posix/America/Indiana/Indianapolis" " " \ +"posix/America/Indiana/Knox" " " \ +"posix/America/Indiana/Marengo" " " \ +"posix/America/Indiana/Petersburg" " " \ +"posix/America/Indiana/Tell_City" " " \ +"posix/America/Indiana/Vevay" " " \ +"posix/America/Indiana/Vincennes" " " \ +"posix/America/Indianapolis" " " \ +"posix/America/Inuvik" " " \ +"posix/America/Iqaluit" " " \ +"posix/America/Jamaica" " " \ +"posix/America/Jujuy" " " \ +"posix/America/Juneau" " " \ +"posix/America/Kentucky/Louisville" " " \ +"posix/America/Kentucky/Monticello" " " \ +"posix/America/Knox_IN" " " \ +"posix/America/La_Paz" " " \ +"posix/America/Lima" " " \ +"posix/America/Los_Angeles" " " \ +"posix/America/Louisville" " " \ +"posix/America/Maceio" " " \ +"posix/America/Managua" " " \ +"posix/America/Manaus" " " \ +"posix/America/Martinique" " " \ +"posix/America/Mazatlan" " " \ +"posix/America/Mendoza" " " \ +"posix/America/Menominee" " " \ +"posix/America/Merida" " " \ +"posix/America/Mexico_City" " " \ +"posix/America/Miquelon" " " \ +"posix/America/Moncton" " " \ +"posix/America/Monterrey" " " \ +"posix/America/Montevideo" " " \ +"posix/America/Montreal" " " \ +"posix/America/Montserrat" " " \ +"posix/America/Nassau" " " \ +"posix/America/New_York" " " \ +"posix/America/Nipigon" " " \ +"posix/America/Nome" " " \ +"posix/America/Noronha" " " \ +"posix/America/North_Dakota/Center" " " \ +"posix/America/North_Dakota/New_Salem" " " \ +"posix/America/Panama" " " \ +"posix/America/Pangnirtung" " " \ +"posix/America/Paramaribo" " " \ +"posix/America/Phoenix" " " \ +"posix/America/Port-au-Prince" " " \ +"posix/America/Port_of_Spain" " " \ +"posix/America/Porto_Acre" " " \ +"posix/America/Porto_Velho" " " \ +"posix/America/Puerto_Rico" " " \ +"posix/America/Rainy_River" " " \ +"posix/America/Rankin_Inlet" " " \ +"posix/America/Recife" " " \ +"posix/America/Regina" " " \ +"posix/America/Rio_Branco" " " \ +"posix/America/Rosario" " " \ +"posix/America/Santiago" " " \ +"posix/America/Santo_Domingo" " " \ +"posix/America/Sao_Paulo" " " \ +"posix/America/Scoresbysund" " " \ +"posix/America/Shiprock" " " \ +"posix/America/St_Johns" " " \ +"posix/America/St_Kitts" " " \ +"posix/America/St_Lucia" " " \ +"posix/America/St_Thomas" " " \ +"posix/America/St_Vincent" " " \ +"posix/America/Swift_Current" " " \ +"posix/America/Tegucigalpa" " " \ +"posix/America/Thule" " " \ +"posix/America/Thunder_Bay" " " \ +"posix/America/Tijuana" " " \ +"posix/America/Toronto" " " \ +"posix/America/Tortola" " " \ +"posix/America/Vancouver" " " \ +"posix/America/Virgin" " " \ +"posix/America/Whitehorse" " " \ +"posix/America/Winnipeg" " " \ +"posix/America/Yakutat" " " \ +"posix/America/Yellowknife" " " \ +"posix/Antarctica/Casey" " " \ +"posix/Antarctica/Davis" " " \ +"posix/Antarctica/DumontDUrville" " " \ +"posix/Antarctica/Mawson" " " \ +"posix/Antarctica/McMurdo" " " \ +"posix/Antarctica/Palmer" " " \ +"posix/Antarctica/Rothera" " " \ +"posix/Antarctica/South_Pole" " " \ +"posix/Antarctica/Syowa" " " \ +"posix/Antarctica/Troll" " " \ +"posix/Antarctica/Vostok" " " \ +"posix/Arctic/Longyearbyen" " " \ +"posix/Asia/Aden" " " \ +"posix/Asia/Almaty" " " \ +"posix/Asia/Amman" " " \ +"posix/Asia/Anadyr" " " \ +"posix/Asia/Aqtau" " " \ +"posix/Asia/Aqtobe" " " \ +"posix/Asia/Ashgabat" " " \ +"posix/Asia/Ashkhabad" " " \ +"posix/Asia/Baghdad" " " \ +"posix/Asia/Bahrain" " " \ +"posix/Asia/Baku" " " \ +"posix/Asia/Bangkok" " " \ +"posix/Asia/Beirut" " " \ +"posix/Asia/Bishkek" " " \ +"posix/Asia/Brunei" " " \ +"posix/Asia/Calcutta" " " \ +"posix/Asia/Chita" " " \ +"posix/Asia/Choibalsan" " " \ +"posix/Asia/Chongqing" " " \ +"posix/Asia/Chungking" " " \ +"posix/Asia/Colombo" " " \ +"posix/Asia/Dacca" " " \ +"posix/Asia/Damascus" " " \ +"posix/Asia/Dhaka" " " \ +"posix/Asia/Dili" " " \ +"posix/Asia/Dubai" " " \ +"posix/Asia/Dushanbe" " " \ +"posix/Asia/Gaza" " " \ +"posix/Asia/Harbin" " " \ +"posix/Asia/Hong_Kong" " " \ +"posix/Asia/Hovd" " " \ +"posix/Asia/Irkutsk" " " \ +"posix/Asia/Istanbul" " " \ +"posix/Asia/Jakarta" " " \ +"posix/Asia/Jayapura" " " \ +"posix/Asia/Jerusalem" " " \ +"posix/Asia/Kabul" " " \ +"posix/Asia/Kamchatka" " " \ +"posix/Asia/Karachi" " " \ +"posix/Asia/Kashgar" " " \ +"posix/Asia/Katmandu" " " \ +"posix/Asia/Krasnoyarsk" " " \ +"posix/Asia/Kuala_Lumpur" " " \ +"posix/Asia/Kuching" " " \ +"posix/Asia/Kuwait" " " \ +"posix/Asia/Macao" " " \ +"posix/Asia/Macau" " " \ +"posix/Asia/Magadan" " " \ +"posix/Asia/Makassar" " " \ +"posix/Asia/Manila" " " \ +"posix/Asia/Muscat" " " \ +"posix/Asia/Nicosia" " " \ +"posix/Asia/Novosibirsk" " " \ +"posix/Asia/Omsk" " " \ +"posix/Asia/Oral" " " \ +"posix/Asia/Phnom_Penh" " " \ +"posix/Asia/Pontianak" " " \ +"posix/Asia/Pyongyang" " " \ +"posix/Asia/Qatar" " " \ +"posix/Asia/Qyzylorda" " " \ +"posix/Asia/Rangoon" " " \ +"posix/Asia/Riyadh" " " \ +"posix/Asia/Saigon" " " \ +"posix/Asia/Sakhalin" " " \ +"posix/Asia/Samarkand" " " \ +"posix/Asia/Seoul" " " \ +"posix/Asia/Shanghai" " " \ +"posix/Asia/Singapore" " " \ +"posix/Asia/Srednekolymsk" " " \ +"posix/Asia/Taipei" " " \ +"posix/Asia/Tashkent" " " \ +"posix/Asia/Tbilisi" " " \ +"posix/Asia/Tehran" " " \ +"posix/Asia/Tel_Aviv" " " \ +"posix/Asia/Thimbu" " " \ +"posix/Asia/Thimphu" " " \ +"posix/Asia/Tokyo" " " \ +"posix/Asia/Ujung_Pandang" " " \ +"posix/Asia/Ulaanbaatar" " " \ +"posix/Asia/Ulan_Bator" " " \ +"posix/Asia/Urumqi" " " \ +"posix/Asia/Vientiane" " " \ +"posix/Asia/Vladivostok" " " \ +"posix/Asia/Yakutsk" " " \ +"posix/Asia/Yekaterinburg" " " \ +"posix/Asia/Yerevan" " " \ +"posix/Atlantic/Azores" " " \ +"posix/Atlantic/Bermuda" " " \ +"posix/Atlantic/Canary" " " \ +"posix/Atlantic/Cape_Verde" " " \ +"posix/Atlantic/Faeroe" " " \ +"posix/Atlantic/Jan_Mayen" " " \ +"posix/Atlantic/Madeira" " " \ +"posix/Atlantic/Reykjavik" " " \ +"posix/Atlantic/South_Georgia" " " \ +"posix/Atlantic/St_Helena" " " \ +"posix/Atlantic/Stanley" " " \ +"posix/Australia/ACT" " " \ +"posix/Australia/Adelaide" " " \ +"posix/Australia/Brisbane" " " \ +"posix/Australia/Broken_Hill" " " \ +"posix/Australia/Canberra" " " \ +"posix/Australia/Currie" " " \ +"posix/Australia/Darwin" " " \ +"posix/Australia/Hobart" " " \ +"posix/Australia/LHI" " " \ +"posix/Australia/Lindeman" " " \ +"posix/Australia/Lord_Howe" " " \ +"posix/Australia/Melbourne" " " \ +"posix/Australia/NSW" " " \ +"posix/Australia/North" " " \ +"posix/Australia/Perth" " " \ +"posix/Australia/Queensland" " " \ +"posix/Australia/South" " " \ +"posix/Australia/Sydney" " " \ +"posix/Australia/Tasmania" " " \ +"posix/Australia/Victoria" " " \ +"posix/Australia/West" " " \ +"posix/Australia/Yancowinna" " " \ +"posix/Brazil/Acre" " " \ +"posix/Brazil/DeNoronha" " " \ +"posix/Brazil/East" " " \ +"posix/Brazil/West" " " \ +"posix/CET" " " \ +"posix/CST6CDT" " " \ +"posix/Canada/Atlantic" " " \ +"posix/Canada/Central" " " \ +"posix/Canada/East-Saskatchewan" " " \ +"posix/Canada/Eastern" " " \ +"posix/Canada/Mountain" " " \ +"posix/Canada/Newfoundland" " " \ +"posix/Canada/Pacific" " " \ +"posix/Canada/Saskatchewan" " " \ +"posix/Canada/Yukon" " " \ +"posix/Chile/Continental" " " \ +"posix/Chile/EasterIsland" " " \ +"posix/Cuba" " " \ +"posix/EET" " " \ +"posix/EST" " " \ +"posix/EST5EDT" " " \ +"posix/Egypt" " " \ +"posix/Eire" " " \ +"posix/Etc/GMT" " " \ +"posix/Etc/GMT+0" " " \ +"posix/Etc/GMT+1" " " \ +"posix/Etc/GMT+10" " " \ +"posix/Etc/GMT+11" " " \ +"posix/Etc/GMT+12" " " \ +"posix/Etc/GMT+2" " " \ +"posix/Etc/GMT+3" " " \ +"posix/Etc/GMT+4" " " \ +"posix/Etc/GMT+5" " " \ +"posix/Etc/GMT+6" " " \ +"posix/Etc/GMT+7" " " \ +"posix/Etc/GMT+8" " " \ +"posix/Etc/GMT+9" " " \ +"posix/Etc/GMT-0" " " \ +"posix/Etc/GMT-1" " " \ +"posix/Etc/GMT-10" " " \ +"posix/Etc/GMT-11" " " \ +"posix/Etc/GMT-12" " " \ +"posix/Etc/GMT-13" " " \ +"posix/Etc/GMT-14" " " \ +"posix/Etc/GMT-2" " " \ +"posix/Etc/GMT-3" " " \ +"posix/Etc/GMT-4" " " \ +"posix/Etc/GMT-5" " " \ +"posix/Etc/GMT-6" " " \ +"posix/Etc/GMT-7" " " \ +"posix/Etc/GMT-8" " " \ +"posix/Etc/GMT-9" " " \ +"posix/Etc/GMT0" " " \ +"posix/Etc/Greenwich" " " \ +"posix/Etc/UCT" " " \ +"posix/Etc/UTC" " " \ +"posix/Etc/Universal" " " \ +"posix/Etc/Zulu" " " \ +"posix/Europe/Amsterdam" " " \ +"posix/Europe/Andorra" " " \ +"posix/Europe/Athens" " " \ +"posix/Europe/Belfast" " " \ +"posix/Europe/Belgrade" " " \ +"posix/Europe/Berlin" " " \ +"posix/Europe/Bratislava" " " \ +"posix/Europe/Brussels" " " \ +"posix/Europe/Bucharest" " " \ +"posix/Europe/Budapest" " " \ +"posix/Europe/Chisinau" " " \ +"posix/Europe/Copenhagen" " " \ +"posix/Europe/Dublin" " " \ +"posix/Europe/Gibraltar" " " \ +"posix/Europe/Guernsey" " " \ +"posix/Europe/Helsinki" " " \ +"posix/Europe/Isle_of_Man" " " \ +"posix/Europe/Istanbul" " " \ +"posix/Europe/Jersey" " " \ +"posix/Europe/Kaliningrad" " " \ +"posix/Europe/Kiev" " " \ +"posix/Europe/Lisbon" " " \ +"posix/Europe/Ljubljana" " " \ +"posix/Europe/London" " " \ +"posix/Europe/Luxembourg" " " \ +"posix/Europe/Madrid" " " \ +"posix/Europe/Malta" " " \ +"posix/Europe/Mariehamn" " " \ +"posix/Europe/Minsk" " " \ +"posix/Europe/Monaco" " " \ +"posix/Europe/Moscow" " " \ +"posix/Europe/Nicosia" " " \ +"posix/Europe/Oslo" " " \ +"posix/Europe/Paris" " " \ +"posix/Europe/Podgorica" " " \ +"posix/Europe/Prague" " " \ +"posix/Europe/Riga" " " \ +"posix/Europe/Rome" " " \ +"posix/Europe/Samara" " " \ +"posix/Europe/San_Marino" " " \ +"posix/Europe/Sarajevo" " " \ +"posix/Europe/Simferopol" " " \ +"posix/Europe/Skopje" " " \ +"posix/Europe/Sofia" " " \ +"posix/Europe/Stockholm" " " \ +"posix/Europe/Tallinn" " " \ +"posix/Europe/Tirane" " " \ +"posix/Europe/Tiraspol" " " \ +"posix/Europe/Uzhgorod" " " \ +"posix/Europe/Vaduz" " " \ +"posix/Europe/Vatican" " " \ +"posix/Europe/Vienna" " " \ +"posix/Europe/Vilnius" " " \ +"posix/Europe/Volgograd" " " \ +"posix/Europe/Warsaw" " " \ +"posix/Europe/Zagreb" " " \ +"posix/Europe/Zaporozhye" " " \ +"posix/Europe/Zurich" " " \ +"posix/Factory" " " \ +"posix/GB" " " \ +"posix/GB-Eire" " " \ +"posix/GMT" " " \ +"posix/GMT+0" " " \ +"posix/GMT-0" " " \ +"posix/GMT0" " " \ +"posix/Greenwich" " " \ +"posix/HST" " " \ +"posix/Hongkong" " " \ +"posix/Iceland" " " \ +"posix/Indian/Antananarivo" " " \ +"posix/Indian/Chagos" " " \ +"posix/Indian/Christmas" " " \ +"posix/Indian/Cocos" " " \ +"posix/Indian/Comoro" " " \ +"posix/Indian/Kerguelen" " " \ +"posix/Indian/Mahe" " " \ +"posix/Indian/Maldives" " " \ +"posix/Indian/Mauritius" " " \ +"posix/Indian/Mayotte" " " \ +"posix/Indian/Reunion" " " \ +"posix/Iran" " " \ +"posix/Israel" " " \ +"posix/Jamaica" " " \ +"posix/Japan" " " \ +"posix/Kwajalein" " " \ +"posix/Libya" " " \ +"posix/MET" " " \ +"posix/MST" " " \ +"posix/MST7MDT" " " \ +"posix/Mexico/BajaNorte" " " \ +"posix/Mexico/BajaSur" " " \ +"posix/Mexico/General" " " \ +"posix/NZ" " " \ +"posix/NZ-CHAT" " " \ +"posix/Navajo" " " \ +"posix/PRC" " " \ +"posix/PST8PDT" " " \ +"posix/Pacific/Apia" " " \ +"posix/Pacific/Auckland" " " \ +"posix/Pacific/Bougainville" " " \ +"posix/Pacific/Chatham" " " \ +"posix/Pacific/Easter" " " \ +"posix/Pacific/Efate" " " \ +"posix/Pacific/Enderbury" " " \ +"posix/Pacific/Fakaofo" " " \ +"posix/Pacific/Fiji" " " \ +"posix/Pacific/Funafuti" " " \ +"posix/Pacific/Galapagos" " " \ +"posix/Pacific/Gambier" " " \ +"posix/Pacific/Guadalcanal" " " \ +"posix/Pacific/Guam" " " \ +"posix/Pacific/Honolulu" " " \ +"posix/Pacific/Johnston" " " \ +"posix/Pacific/Kiritimati" " " \ +"posix/Pacific/Kosrae" " " \ +"posix/Pacific/Kwajalein" " " \ +"posix/Pacific/Majuro" " " \ +"posix/Pacific/Marquesas" " " \ +"posix/Pacific/Midway" " " \ +"posix/Pacific/Nauru" " " \ +"posix/Pacific/Niue" " " \ +"posix/Pacific/Norfolk" " " \ +"posix/Pacific/Noumea" " " \ +"posix/Pacific/Pago_Pago" " " \ +"posix/Pacific/Palau" " " \ +"posix/Pacific/Pitcairn" " " \ +"posix/Pacific/Ponape" " " \ +"posix/Pacific/Port_Moresby" " " \ +"posix/Pacific/Rarotonga" " " \ +"posix/Pacific/Saipan" " " \ +"posix/Pacific/Samoa" " " \ +"posix/Pacific/Tahiti" " " \ +"posix/Pacific/Tarawa" " " \ +"posix/Pacific/Tongatapu" " " \ +"posix/Pacific/Truk" " " \ +"posix/Pacific/Wake" " " \ +"posix/Pacific/Wallis" " " \ +"posix/Pacific/Yap" " " \ +"posix/Poland" " " \ +"posix/Portugal" " " \ +"posix/ROC" " " \ +"posix/ROK" " " \ +"posix/Singapore" " " \ +"posix/Turkey" " " \ +"posix/UCT" " " \ +"posix/US/Alaska" " " \ +"posix/US/Aleutian" " " \ +"posix/US/Arizona" " " \ +"posix/US/Central" " " \ +"posix/US/East-Indiana" " " \ +"posix/US/Eastern" " " \ +"posix/US/Hawaii" " " \ +"posix/US/Indiana-Starke" " " \ +"posix/US/Michigan" " " \ +"posix/US/Mountain" " " \ +"posix/US/Pacific" " " \ +"posix/US/Pacific-New" " " \ +"posix/US/Samoa" " " \ +"posix/UTC" " " \ +"posix/Universal" " " \ +"posix/W-SU" " " \ +"posix/WET" " " \ +"posix/Zulu" " " \ +"posixrules" " " \ +"right/Africa/Abidjan" " " \ +"right/Africa/Accra" " " \ +"right/Africa/Addis_Ababa" " " \ +"right/Africa/Algiers" " " \ +"right/Africa/Asmera" " " \ +"right/Africa/Bamako" " " \ +"right/Africa/Bangui" " " \ +"right/Africa/Banjul" " " \ +"right/Africa/Bissau" " " \ +"right/Africa/Blantyre" " " \ +"right/Africa/Brazzaville" " " \ +"right/Africa/Bujumbura" " " \ +"right/Africa/Cairo" " " \ +"right/Africa/Casablanca" " " \ +"right/Africa/Ceuta" " " \ +"right/Africa/Conakry" " " \ +"right/Africa/Dakar" " " \ +"right/Africa/Dar_es_Salaam" " " \ +"right/Africa/Djibouti" " " \ +"right/Africa/Douala" " " \ +"right/Africa/El_Aaiun" " " \ +"right/Africa/Freetown" " " \ +"right/Africa/Gaborone" " " \ +"right/Africa/Harare" " " \ +"right/Africa/Johannesburg" " " \ +"right/Africa/Kampala" " " \ +"right/Africa/Khartoum" " " \ +"right/Africa/Kigali" " " \ +"right/Africa/Kinshasa" " " \ +"right/Africa/Lagos" " " \ +"right/Africa/Libreville" " " \ +"right/Africa/Lome" " " \ +"right/Africa/Luanda" " " \ +"right/Africa/Lubumbashi" " " \ +"right/Africa/Lusaka" " " \ +"right/Africa/Malabo" " " \ +"right/Africa/Maputo" " " \ +"right/Africa/Maseru" " " \ +"right/Africa/Mbabane" " " \ +"right/Africa/Mogadishu" " " \ +"right/Africa/Monrovia" " " \ +"right/Africa/Nairobi" " " \ +"right/Africa/Ndjamena" " " \ +"right/Africa/Niamey" " " \ +"right/Africa/Nouakchott" " " \ +"right/Africa/Ouagadougou" " " \ +"right/Africa/Porto-Novo" " " \ +"right/Africa/Sao_Tome" " " \ +"right/Africa/Timbuktu" " " \ +"right/Africa/Tripoli" " " \ +"right/Africa/Tunis" " " \ +"right/Africa/Windhoek" " " \ +"right/America/Adak" " " \ +"right/America/Anchorage" " " \ +"right/America/Anguilla" " " \ +"right/America/Antigua" " " \ +"right/America/Araguaina" " " \ +"right/America/Argentina/Buenos_Aires" " " \ +"right/America/Argentina/Catamarca" " " \ +"right/America/Argentina/ComodRivadavia" " " \ +"right/America/Argentina/Cordoba" " " \ +"right/America/Argentina/Jujuy" " " \ +"right/America/Argentina/La_Rioja" " " \ +"right/America/Argentina/Mendoza" " " \ +"right/America/Argentina/Rio_Gallegos" " " \ +"right/America/Argentina/San_Juan" " " \ +"right/America/Argentina/Tucuman" " " \ +"right/America/Argentina/Ushuaia" " " \ +"right/America/Aruba" " " \ +"right/America/Asuncion" " " \ +"right/America/Atikokan" " " \ +"right/America/Atka" " " \ +"right/America/Bahia" " " \ +"right/America/Barbados" " " \ +"right/America/Belem" " " \ +"right/America/Belize" " " \ +"right/America/Blanc-Sablon" " " \ +"right/America/Boa_Vista" " " \ +"right/America/Bogota" " " \ +"right/America/Boise" " " \ +"right/America/Buenos_Aires" " " \ +"right/America/Cambridge_Bay" " " \ +"right/America/Campo_Grande" " " \ +"right/America/Cancun" " " \ +"right/America/Caracas" " " \ +"right/America/Catamarca" " " \ +"right/America/Cayenne" " " \ +"right/America/Cayman" " " \ +"right/America/Chicago" " " \ +"right/America/Chihuahua" " " \ +"right/America/Coral_Harbour" " " \ +"right/America/Cordoba" " " \ +"right/America/Costa_Rica" " " \ +"right/America/Cuiaba" " " \ +"right/America/Curacao" " " \ +"right/America/Danmarkshavn" " " \ +"right/America/Dawson" " " \ +"right/America/Dawson_Creek" " " \ +"right/America/Denver" " " \ +"right/America/Detroit" " " \ +"right/America/Dominica" " " \ +"right/America/Edmonton" " " \ +"right/America/Eirunepe" " " \ +"right/America/El_Salvador" " " \ +"right/America/Ensenada" " " \ +"right/America/Fort_Wayne" " " \ +"right/America/Fortaleza" " " \ +"right/America/Glace_Bay" " " \ +"right/America/Godthab" " " \ +"right/America/Goose_Bay" " " \ +"right/America/Grand_Turk" " " \ +"right/America/Grenada" " " \ +"right/America/Guadeloupe" " " \ +"right/America/Guatemala" " " \ +"right/America/Guayaquil" " " \ +"right/America/Guyana" " " \ +"right/America/Halifax" " " \ +"right/America/Havana" " " \ +"right/America/Hermosillo" " " \ +"right/America/Indiana/Indianapolis" " " \ +"right/America/Indiana/Knox" " " \ +"right/America/Indiana/Marengo" " " \ +"right/America/Indiana/Petersburg" " " \ +"right/America/Indiana/Tell_City" " " \ +"right/America/Indiana/Vevay" " " \ +"right/America/Indiana/Vincennes" " " \ +"right/America/Indianapolis" " " \ +"right/America/Inuvik" " " \ +"right/America/Iqaluit" " " \ +"right/America/Jamaica" " " \ +"right/America/Jujuy" " " \ +"right/America/Juneau" " " \ +"right/America/Kentucky/Louisville" " " \ +"right/America/Kentucky/Monticello" " " \ +"right/America/Knox_IN" " " \ +"right/America/La_Paz" " " \ +"right/America/Lima" " " \ +"right/America/Los_Angeles" " " \ +"right/America/Louisville" " " \ +"right/America/Maceio" " " \ +"right/America/Managua" " " \ +"right/America/Manaus" " " \ +"right/America/Martinique" " " \ +"right/America/Mazatlan" " " \ +"right/America/Mendoza" " " \ +"right/America/Menominee" " " \ +"right/America/Merida" " " \ +"right/America/Mexico_City" " " \ +"right/America/Miquelon" " " \ +"right/America/Moncton" " " \ +"right/America/Monterrey" " " \ +"right/America/Montevideo" " " \ +"right/America/Montreal" " " \ +"right/America/Montserrat" " " \ +"right/America/Nassau" " " \ +"right/America/New_York" " " \ +"right/America/Nipigon" " " \ +"right/America/Nome" " " \ +"right/America/Noronha" " " \ +"right/America/North_Dakota/Center" " " \ +"right/America/North_Dakota/New_Salem" " " \ +"right/America/Panama" " " \ +"right/America/Pangnirtung" " " \ +"right/America/Paramaribo" " " \ +"right/America/Phoenix" " " \ +"right/America/Port-au-Prince" " " \ +"right/America/Port_of_Spain" " " \ +"right/America/Porto_Acre" " " \ +"right/America/Porto_Velho" " " \ +"right/America/Puerto_Rico" " " \ +"right/America/Rainy_River" " " \ +"right/America/Rankin_Inlet" " " \ +"right/America/Recife" " " \ +"right/America/Regina" " " \ +"right/America/Rio_Branco" " " \ +"right/America/Rosario" " " \ +"right/America/Santiago" " " \ +"right/America/Santo_Domingo" " " \ +"right/America/Sao_Paulo" " " \ +"right/America/Scoresbysund" " " \ +"right/America/Shiprock" " " \ +"right/America/St_Johns" " " \ +"right/America/St_Kitts" " " \ +"right/America/St_Lucia" " " \ +"right/America/St_Thomas" " " \ +"right/America/St_Vincent" " " \ +"right/America/Swift_Current" " " \ +"right/America/Tegucigalpa" " " \ +"right/America/Thule" " " \ +"right/America/Thunder_Bay" " " \ +"right/America/Tijuana" " " \ +"right/America/Toronto" " " \ +"right/America/Tortola" " " \ +"right/America/Vancouver" " " \ +"right/America/Virgin" " " \ +"right/America/Whitehorse" " " \ +"right/America/Winnipeg" " " \ +"right/America/Yakutat" " " \ +"right/America/Yellowknife" " " \ +"right/Antarctica/Casey" " " \ +"right/Antarctica/Davis" " " \ +"right/Antarctica/DumontDUrville" " " \ +"right/Antarctica/Mawson" " " \ +"right/Antarctica/McMurdo" " " \ +"right/Antarctica/Palmer" " " \ +"right/Antarctica/Rothera" " " \ +"right/Antarctica/South_Pole" " " \ +"right/Antarctica/Syowa" " " \ +"right/Antarctica/Troll" " " \ +"right/Antarctica/Vostok" " " \ +"right/Arctic/Longyearbyen" " " \ +"right/Asia/Aden" " " \ +"right/Asia/Almaty" " " \ +"right/Asia/Amman" " " \ +"right/Asia/Anadyr" " " \ +"right/Asia/Aqtau" " " \ +"right/Asia/Aqtobe" " " \ +"right/Asia/Ashgabat" " " \ +"right/Asia/Ashkhabad" " " \ +"right/Asia/Baghdad" " " \ +"right/Asia/Bahrain" " " \ +"right/Asia/Baku" " " \ +"right/Asia/Bangkok" " " \ +"right/Asia/Beirut" " " \ +"right/Asia/Bishkek" " " \ +"right/Asia/Brunei" " " \ +"right/Asia/Calcutta" " " \ +"right/Asia/Chita" " " \ +"right/Asia/Choibalsan" " " \ +"right/Asia/Chongqing" " " \ +"right/Asia/Chungking" " " \ +"right/Asia/Colombo" " " \ +"right/Asia/Dacca" " " \ +"right/Asia/Damascus" " " \ +"right/Asia/Dhaka" " " \ +"right/Asia/Dili" " " \ +"right/Asia/Dubai" " " \ +"right/Asia/Dushanbe" " " \ +"right/Asia/Gaza" " " \ +"right/Asia/Harbin" " " \ +"right/Asia/Hong_Kong" " " \ +"right/Asia/Hovd" " " \ +"right/Asia/Irkutsk" " " \ +"right/Asia/Istanbul" " " \ +"right/Asia/Jakarta" " " \ +"right/Asia/Jayapura" " " \ +"right/Asia/Jerusalem" " " \ +"right/Asia/Kabul" " " \ +"right/Asia/Kamchatka" " " \ +"right/Asia/Karachi" " " \ +"right/Asia/Kashgar" " " \ +"right/Asia/Katmandu" " " \ +"right/Asia/Krasnoyarsk" " " \ +"right/Asia/Kuala_Lumpur" " " \ +"right/Asia/Kuching" " " \ +"right/Asia/Kuwait" " " \ +"right/Asia/Macao" " " \ +"right/Asia/Macau" " " \ +"right/Asia/Magadan" " " \ +"right/Asia/Makassar" " " \ +"right/Asia/Manila" " " \ +"right/Asia/Muscat" " " \ +"right/Asia/Nicosia" " " \ +"right/Asia/Novosibirsk" " " \ +"right/Asia/Omsk" " " \ +"right/Asia/Oral" " " \ +"right/Asia/Phnom_Penh" " " \ +"right/Asia/Pontianak" " " \ +"right/Asia/Pyongyang" " " \ +"right/Asia/Qatar" " " \ +"right/Asia/Qyzylorda" " " \ +"right/Asia/Rangoon" " " \ +"right/Asia/Riyadh" " " \ +"right/Asia/Saigon" " " \ +"right/Asia/Sakhalin" " " \ +"right/Asia/Samarkand" " " \ +"right/Asia/Seoul" " " \ +"right/Asia/Shanghai" " " \ +"right/Asia/Singapore" " " \ +"right/Asia/Srednekolymsk" " " \ +"right/Asia/Taipei" " " \ +"right/Asia/Tashkent" " " \ +"right/Asia/Tbilisi" " " \ +"right/Asia/Tehran" " " \ +"right/Asia/Tel_Aviv" " " \ +"right/Asia/Thimbu" " " \ +"right/Asia/Thimphu" " " \ +"right/Asia/Tokyo" " " \ +"right/Asia/Ujung_Pandang" " " \ +"right/Asia/Ulaanbaatar" " " \ +"right/Asia/Ulan_Bator" " " \ +"right/Asia/Urumqi" " " \ +"right/Asia/Vientiane" " " \ +"right/Asia/Vladivostok" " " \ +"right/Asia/Yakutsk" " " \ +"right/Asia/Yekaterinburg" " " \ +"right/Asia/Yerevan" " " \ +"right/Atlantic/Azores" " " \ +"right/Atlantic/Bermuda" " " \ +"right/Atlantic/Canary" " " \ +"right/Atlantic/Cape_Verde" " " \ +"right/Atlantic/Faeroe" " " \ +"right/Atlantic/Jan_Mayen" " " \ +"right/Atlantic/Madeira" " " \ +"right/Atlantic/Reykjavik" " " \ +"right/Atlantic/South_Georgia" " " \ +"right/Atlantic/St_Helena" " " \ +"right/Atlantic/Stanley" " " \ +"right/Australia/ACT" " " \ +"right/Australia/Adelaide" " " \ +"right/Australia/Brisbane" " " \ +"right/Australia/Broken_Hill" " " \ +"right/Australia/Canberra" " " \ +"right/Australia/Currie" " " \ +"right/Australia/Darwin" " " \ +"right/Australia/Hobart" " " \ +"right/Australia/LHI" " " \ +"right/Australia/Lindeman" " " \ +"right/Australia/Lord_Howe" " " \ +"right/Australia/Melbourne" " " \ +"right/Australia/NSW" " " \ +"right/Australia/North" " " \ +"right/Australia/Perth" " " \ +"right/Australia/Queensland" " " \ +"right/Australia/South" " " \ +"right/Australia/Sydney" " " \ +"right/Australia/Tasmania" " " \ +"right/Australia/Victoria" " " \ +"right/Australia/West" " " \ +"right/Australia/Yancowinna" " " \ +"right/Brazil/Acre" " " \ +"right/Brazil/DeNoronha" " " \ +"right/Brazil/East" " " \ +"right/Brazil/West" " " \ +"right/CET" " " \ +"right/CST6CDT" " " \ +"right/Canada/Atlantic" " " \ +"right/Canada/Central" " " \ +"right/Canada/East-Saskatchewan" " " \ +"right/Canada/Eastern" " " \ +"right/Canada/Mountain" " " \ +"right/Canada/Newfoundland" " " \ +"right/Canada/Pacific" " " \ +"right/Canada/Saskatchewan" " " \ +"right/Canada/Yukon" " " \ +"right/Chile/Continental" " " \ +"right/Chile/EasterIsland" " " \ +"right/Cuba" " " \ +"right/EET" " " \ +"right/EST" " " \ +"right/EST5EDT" " " \ +"right/Egypt" " " \ +"right/Eire" " " \ +"right/Etc/GMT" " " \ +"right/Etc/GMT+0" " " \ +"right/Etc/GMT+1" " " \ +"right/Etc/GMT+10" " " \ +"right/Etc/GMT+11" " " \ +"right/Etc/GMT+12" " " \ +"right/Etc/GMT+2" " " \ +"right/Etc/GMT+3" " " \ +"right/Etc/GMT+4" " " \ +"right/Etc/GMT+5" " " \ +"right/Etc/GMT+6" " " \ +"right/Etc/GMT+7" " " \ +"right/Etc/GMT+8" " " \ +"right/Etc/GMT+9" " " \ +"right/Etc/GMT-0" " " \ +"right/Etc/GMT-1" " " \ +"right/Etc/GMT-10" " " \ +"right/Etc/GMT-11" " " \ +"right/Etc/GMT-12" " " \ +"right/Etc/GMT-13" " " \ +"right/Etc/GMT-14" " " \ +"right/Etc/GMT-2" " " \ +"right/Etc/GMT-3" " " \ +"right/Etc/GMT-4" " " \ +"right/Etc/GMT-5" " " \ +"right/Etc/GMT-6" " " \ +"right/Etc/GMT-7" " " \ +"right/Etc/GMT-8" " " \ +"right/Etc/GMT-9" " " \ +"right/Etc/GMT0" " " \ +"right/Etc/Greenwich" " " \ +"right/Etc/UCT" " " \ +"right/Etc/UTC" " " \ +"right/Etc/Universal" " " \ +"right/Etc/Zulu" " " \ +"right/Europe/Amsterdam" " " \ +"right/Europe/Andorra" " " \ +"right/Europe/Athens" " " \ +"right/Europe/Belfast" " " \ +"right/Europe/Belgrade" " " \ +"right/Europe/Berlin" " " \ +"right/Europe/Bratislava" " " \ +"right/Europe/Brussels" " " \ +"right/Europe/Bucharest" " " \ +"right/Europe/Budapest" " " \ +"right/Europe/Chisinau" " " \ +"right/Europe/Copenhagen" " " \ +"right/Europe/Dublin" " " \ +"right/Europe/Gibraltar" " " \ +"right/Europe/Guernsey" " " \ +"right/Europe/Helsinki" " " \ +"right/Europe/Isle_of_Man" " " \ +"right/Europe/Istanbul" " " \ +"right/Europe/Jersey" " " \ +"right/Europe/Kaliningrad" " " \ +"right/Europe/Kiev" " " \ +"right/Europe/Lisbon" " " \ +"right/Europe/Ljubljana" " " \ +"right/Europe/London" " " \ +"right/Europe/Luxembourg" " " \ +"right/Europe/Madrid" " " \ +"right/Europe/Malta" " " \ +"right/Europe/Mariehamn" " " \ +"right/Europe/Minsk" " " \ +"right/Europe/Monaco" " " \ +"right/Europe/Moscow" " " \ +"right/Europe/Nicosia" " " \ +"right/Europe/Oslo" " " \ +"right/Europe/Paris" " " \ +"right/Europe/Podgorica" " " \ +"right/Europe/Prague" " " \ +"right/Europe/Riga" " " \ +"right/Europe/Rome" " " \ +"right/Europe/Samara" " " \ +"right/Europe/San_Marino" " " \ +"right/Europe/Sarajevo" " " \ +"right/Europe/Simferopol" " " \ +"right/Europe/Skopje" " " \ +"right/Europe/Sofia" " " \ +"right/Europe/Stockholm" " " \ +"right/Europe/Tallinn" " " \ +"right/Europe/Tirane" " " \ +"right/Europe/Tiraspol" " " \ +"right/Europe/Uzhgorod" " " \ +"right/Europe/Vaduz" " " \ +"right/Europe/Vatican" " " \ +"right/Europe/Vienna" " " \ +"right/Europe/Vilnius" " " \ +"right/Europe/Volgograd" " " \ +"right/Europe/Warsaw" " " \ +"right/Europe/Zagreb" " " \ +"right/Europe/Zaporozhye" " " \ +"right/Europe/Zurich" " " \ +"right/Factory" " " \ +"right/GB" " " \ +"right/GB-Eire" " " \ +"right/GMT" " " \ +"right/GMT+0" " " \ +"right/GMT-0" " " \ +"right/GMT0" " " \ +"right/Greenwich" " " \ +"right/HST" " " \ +"right/Hongkong" " " \ +"right/Iceland" " " \ +"right/Indian/Antananarivo" " " \ +"right/Indian/Chagos" " " \ +"right/Indian/Christmas" " " \ +"right/Indian/Cocos" " " \ +"right/Indian/Comoro" " " \ +"right/Indian/Kerguelen" " " \ +"right/Indian/Mahe" " " \ +"right/Indian/Maldives" " " \ +"right/Indian/Mauritius" " " \ +"right/Indian/Mayotte" " " \ +"right/Indian/Reunion" " " \ +"right/Iran" " " \ +"right/Israel" " " \ +"right/Jamaica" " " \ +"right/Japan" " " \ +"right/Kwajalein" " " \ +"right/Libya" " " \ +"right/MET" " " \ +"right/MST" " " \ +"right/MST7MDT" " " \ +"right/Mexico/BajaNorte" " " \ +"right/Mexico/BajaSur" " " \ +"right/Mexico/General" " " \ +"right/NZ" " " \ +"right/NZ-CHAT" " " \ +"right/Navajo" " " \ +"right/PRC" " " \ +"right/PST8PDT" " " \ +"right/Pacific/Apia" " " \ +"right/Pacific/Auckland" " " \ +"right/Pacific/Bougainville" " " \ +"right/Pacific/Chatham" " " \ +"right/Pacific/Easter" " " \ +"right/Pacific/Efate" " " \ +"right/Pacific/Enderbury" " " \ +"right/Pacific/Fakaofo" " " \ +"right/Pacific/Fiji" " " \ +"right/Pacific/Funafuti" " " \ +"right/Pacific/Galapagos" " " \ +"right/Pacific/Gambier" " " \ +"right/Pacific/Guadalcanal" " " \ +"right/Pacific/Guam" " " \ +"right/Pacific/Honolulu" " " \ +"right/Pacific/Johnston" " " \ +"right/Pacific/Kiritimati" " " \ +"right/Pacific/Kosrae" " " \ +"right/Pacific/Kwajalein" " " \ +"right/Pacific/Majuro" " " \ +"right/Pacific/Marquesas" " " \ +"right/Pacific/Midway" " " \ +"right/Pacific/Nauru" " " \ +"right/Pacific/Niue" " " \ +"right/Pacific/Norfolk" " " \ +"right/Pacific/Noumea" " " \ +"right/Pacific/Pago_Pago" " " \ +"right/Pacific/Palau" " " \ +"right/Pacific/Pitcairn" " " \ +"right/Pacific/Ponape" " " \ +"right/Pacific/Port_Moresby" " " \ +"right/Pacific/Rarotonga" " " \ +"right/Pacific/Saipan" " " \ +"right/Pacific/Samoa" " " \ +"right/Pacific/Tahiti" " " \ +"right/Pacific/Tarawa" " " \ +"right/Pacific/Tongatapu" " " \ +"right/Pacific/Truk" " " \ +"right/Pacific/Wake" " " \ +"right/Pacific/Wallis" " " \ +"right/Pacific/Yap" " " \ +"right/Poland" " " \ +"right/Portugal" " " \ +"right/ROC" " " \ +"right/ROK" " " \ +"right/Singapore" " " \ +"right/Turkey" " " \ +"right/UCT" " " \ +"right/US/Alaska" " " \ +"right/US/Aleutian" " " \ +"right/US/Arizona" " " \ +"right/US/Central" " " \ +"right/US/East-Indiana" " " \ +"right/US/Eastern" " " \ +"right/US/Hawaii" " " \ +"right/US/Indiana-Starke" " " \ +"right/US/Michigan" " " \ +"right/US/Mountain" " " \ +"right/US/Pacific" " " \ +"right/US/Pacific-New" " " \ +"right/US/Samoa" " " \ +"right/UTC" " " \ +"right/Universal" " " \ +"right/W-SU" " " \ +"right/WET" " " \ +"right/Zulu" " " \ diff --git a/patches/source/glibc/timezone-scripts/parts/02 b/patches/source/glibc/timezone-scripts/parts/02 new file mode 100644 index 000000000..bd5a50bb0 --- /dev/null +++ b/patches/source/glibc/timezone-scripts/parts/02 @@ -0,0 +1,28 @@ + 2> $TMP/tz + + if [ $? = 1 -o $? = 255 ]; then + rm -f $TMP/tz + exit + fi + + TIMEZONE="`cat $TMP/tz`" + rm -f $TMP/tz + + setzone $TIMEZONE + exit +else + ### + ### use text prompts + ### + while [ 0 ]; do + echo -n "Would you like to configure your timezone ([y]es, [n]o)? " + read TIMECONF; + echo + + if [ "$TIMECONF" = "n" ]; then + break + fi + + cat << EOF +Select one of these timezones: + diff --git a/patches/source/glibc/timezone-scripts/parts/03 b/patches/source/glibc/timezone-scripts/parts/03 new file mode 100644 index 000000000..7da2043d8 --- /dev/null +++ b/patches/source/glibc/timezone-scripts/parts/03 @@ -0,0 +1,1658 @@ +US/Alaska +US/Aleutian +US/Arizona +US/Central +US/East-Indiana +US/Eastern +US/Hawaii +US/Indiana-Starke +US/Michigan +US/Mountain +US/Pacific +US/Pacific-New +US/Samoa +Africa/Abidjan +Africa/Accra +Africa/Addis_Ababa +Africa/Algiers +Africa/Asmera +Africa/Bamako +Africa/Bangui +Africa/Banjul +Africa/Bissau +Africa/Blantyre +Africa/Brazzaville +Africa/Bujumbura +Africa/Cairo +Africa/Casablanca +Africa/Ceuta +Africa/Conakry +Africa/Dakar +Africa/Dar_es_Salaam +Africa/Djibouti +Africa/Douala +Africa/El_Aaiun +Africa/Freetown +Africa/Gaborone +Africa/Harare +Africa/Johannesburg +Africa/Kampala +Africa/Khartoum +Africa/Kigali +Africa/Kinshasa +Africa/Lagos +Africa/Libreville +Africa/Lome +Africa/Luanda +Africa/Lubumbashi +Africa/Lusaka +Africa/Malabo +Africa/Maputo +Africa/Maseru +Africa/Mbabane +Africa/Mogadishu +Africa/Monrovia +Africa/Nairobi +Africa/Ndjamena +Africa/Niamey +Africa/Nouakchott +Africa/Ouagadougou +Africa/Porto-Novo +Africa/Sao_Tome +Africa/Timbuktu +Africa/Tripoli +Africa/Tunis +Africa/Windhoek +America/Adak +America/Anchorage +America/Anguilla +America/Antigua +America/Araguaina +America/Argentina/Buenos_Aires +America/Argentina/Catamarca +America/Argentina/ComodRivadavia +America/Argentina/Cordoba +America/Argentina/Jujuy +America/Argentina/La_Rioja +America/Argentina/Mendoza +America/Argentina/Rio_Gallegos +America/Argentina/San_Juan +America/Argentina/Tucuman +America/Argentina/Ushuaia +America/Aruba +America/Asuncion +America/Atikokan +America/Atka +America/Bahia +America/Barbados +America/Belem +America/Belize +America/Blanc-Sablon +America/Boa_Vista +America/Bogota +America/Boise +America/Buenos_Aires +America/Cambridge_Bay +America/Campo_Grande +America/Cancun +America/Caracas +America/Catamarca +America/Cayenne +America/Cayman +America/Chicago +America/Chihuahua +America/Coral_Harbour +America/Cordoba +America/Costa_Rica +America/Cuiaba +America/Curacao +America/Danmarkshavn +America/Dawson +America/Dawson_Creek +America/Denver +America/Detroit +America/Dominica +America/Edmonton +America/Eirunepe +America/El_Salvador +America/Ensenada +America/Fort_Wayne +America/Fortaleza +America/Glace_Bay +America/Godthab +America/Goose_Bay +America/Grand_Turk +America/Grenada +America/Guadeloupe +America/Guatemala +America/Guayaquil +America/Guyana +America/Halifax +America/Havana +America/Hermosillo +America/Indiana/Indianapolis +America/Indiana/Knox +America/Indiana/Marengo +America/Indiana/Petersburg +America/Indiana/Tell_City +America/Indiana/Vevay +America/Indiana/Vincennes +America/Indianapolis +America/Inuvik +America/Iqaluit +America/Jamaica +America/Jujuy +America/Juneau +America/Kentucky/Louisville +America/Kentucky/Monticello +America/Knox_IN +America/La_Paz +America/Lima +America/Los_Angeles +America/Louisville +America/Maceio +America/Managua +America/Manaus +America/Martinique +America/Mazatlan +America/Mendoza +America/Menominee +America/Merida +America/Mexico_City +America/Miquelon +America/Moncton +America/Monterrey +America/Montevideo +America/Montreal +America/Montserrat +America/Nassau +America/New_York +America/Nipigon +America/Nome +America/Noronha +America/North_Dakota/Center +America/North_Dakota/New_Salem +America/Panama +America/Pangnirtung +America/Paramaribo +America/Phoenix +America/Port-au-Prince +America/Port_of_Spain +America/Porto_Acre +America/Porto_Velho +America/Puerto_Rico +America/Rainy_River +America/Rankin_Inlet +America/Recife +America/Regina +America/Rio_Branco +America/Rosario +America/Santiago +America/Santo_Domingo +America/Sao_Paulo +America/Scoresbysund +America/Shiprock +America/St_Johns +America/St_Kitts +America/St_Lucia +America/St_Thomas +America/St_Vincent +America/Swift_Current +America/Tegucigalpa +America/Thule +America/Thunder_Bay +America/Tijuana +America/Toronto +America/Tortola +America/Vancouver +America/Virgin +America/Whitehorse +America/Winnipeg +America/Yakutat +America/Yellowknife +Antarctica/Casey +Antarctica/Davis +Antarctica/DumontDUrville +Antarctica/Mawson +Antarctica/McMurdo +Antarctica/Palmer +Antarctica/Rothera +Antarctica/South_Pole +Antarctica/Syowa +Antarctica/Troll +Antarctica/Vostok +Arctic/Longyearbyen +Asia/Aden +Asia/Almaty +Asia/Amman +Asia/Anadyr +Asia/Aqtau +Asia/Aqtobe +Asia/Ashgabat +Asia/Ashkhabad +Asia/Baghdad +Asia/Bahrain +Asia/Baku +Asia/Bangkok +Asia/Beirut +Asia/Bishkek +Asia/Brunei +Asia/Calcutta +Asia/Chita +Asia/Choibalsan +Asia/Chongqing +Asia/Chungking +Asia/Colombo +Asia/Dacca +Asia/Damascus +Asia/Dhaka +Asia/Dili +Asia/Dubai +Asia/Dushanbe +Asia/Gaza +Asia/Harbin +Asia/Hong_Kong +Asia/Hovd +Asia/Irkutsk +Asia/Istanbul +Asia/Jakarta +Asia/Jayapura +Asia/Jerusalem +Asia/Kabul +Asia/Kamchatka +Asia/Karachi +Asia/Kashgar +Asia/Katmandu +Asia/Khandyga +Asia/Kolkata +Asia/Krasnoyarsk +Asia/Kuala_Lumpur +Asia/Kuching +Asia/Kuwait +Asia/Macao +Asia/Macau +Asia/Magadan +Asia/Makassar +Asia/Manila +Asia/Muscat +Asia/Nicosia +Asia/Novosibirsk +Asia/Omsk +Asia/Oral +Asia/Phnom_Penh +Asia/Pontianak +Asia/Pyongyang +Asia/Qatar +Asia/Qyzylorda +Asia/Rangoon +Asia/Riyadh +Asia/Saigon +Asia/Sakhalin +Asia/Samarkand +Asia/Seoul +Asia/Shanghai +Asia/Singapore +Asia/Srednekolymsk +Asia/Taipei +Asia/Tashkent +Asia/Tbilisi +Asia/Tehran +Asia/Tel_Aviv +Asia/Thimbu +Asia/Thimphu +Asia/Tokyo +Asia/Ujung_Pandang +Asia/Ulaanbaatar +Asia/Ulan_Bator +Asia/Urumqi +Asia/Ust-Nera +Asia/Vientiane +Asia/Vladivostok +Asia/Yakutsk +Asia/Yekaterinburg +Asia/Yerevan +Atlantic/Azores +Atlantic/Bermuda +Atlantic/Canary +Atlantic/Cape_Verde +Atlantic/Faeroe +Atlantic/Jan_Mayen +Atlantic/Madeira +Atlantic/Reykjavik +Atlantic/South_Georgia +Atlantic/St_Helena +Atlantic/Stanley +Australia/ACT +Australia/Adelaide +Australia/Brisbane +Australia/Broken_Hill +Australia/Canberra +Australia/Currie +Australia/Darwin +Australia/Hobart +Australia/LHI +Australia/Lindeman +Australia/Lord_Howe +Australia/Melbourne +Australia/NSW +Australia/North +Australia/Perth +Australia/Queensland +Australia/South +Australia/Sydney +Australia/Tasmania +Australia/Victoria +Australia/West +Australia/Yancowinna +Brazil/Acre +Brazil/DeNoronha +Brazil/East +Brazil/West +CET +CST6CDT +Canada/Atlantic +Canada/Central +Canada/East-Saskatchewan +Canada/Eastern +Canada/Mountain +Canada/Newfoundland +Canada/Pacific +Canada/Saskatchewan +Canada/Yukon +Chile/Continental +Chile/EasterIsland +Cuba +EET +EST +EST5EDT +Egypt +Eire +Etc/GMT +Etc/GMT+0 +Etc/GMT+1 +Etc/GMT+10 +Etc/GMT+11 +Etc/GMT+12 +Etc/GMT+2 +Etc/GMT+3 +Etc/GMT+4 +Etc/GMT+5 +Etc/GMT+6 +Etc/GMT+7 +Etc/GMT+8 +Etc/GMT+9 +Etc/GMT-0 +Etc/GMT-1 +Etc/GMT-10 +Etc/GMT-11 +Etc/GMT-12 +Etc/GMT-13 +Etc/GMT-14 +Etc/GMT-2 +Etc/GMT-3 +Etc/GMT-4 +Etc/GMT-5 +Etc/GMT-6 +Etc/GMT-7 +Etc/GMT-8 +Etc/GMT-9 +Etc/GMT0 +Etc/Greenwich +Etc/UCT +Etc/UTC +Etc/Universal +Etc/Zulu +Europe/Amsterdam +Europe/Andorra +Europe/Athens +Europe/Belfast +Europe/Belgrade +Europe/Berlin +Europe/Bratislava +Europe/Brussels +Europe/Bucharest +Europe/Budapest +Europe/Busingen +Europe/Chisinau +Europe/Copenhagen +Europe/Dublin +Europe/Gibraltar +Europe/Guernsey +Europe/Helsinki +Europe/Isle_of_Man +Europe/Istanbul +Europe/Jersey +Europe/Kaliningrad +Europe/Kiev +Europe/Lisbon +Europe/Ljubljana +Europe/London +Europe/Luxembourg +Europe/Madrid +Europe/Malta +Europe/Mariehamn +Europe/Minsk +Europe/Monaco +Europe/Moscow +Europe/Nicosia +Europe/Oslo +Europe/Paris +Europe/Podgorica +Europe/Prague +Europe/Riga +Europe/Rome +Europe/Samara +Europe/San_Marino +Europe/Sarajevo +Europe/Simferopol +Europe/Skopje +Europe/Sofia +Europe/Stockholm +Europe/Tallinn +Europe/Tirane +Europe/Tiraspol +Europe/Uzhgorod +Europe/Vaduz +Europe/Vatican +Europe/Vienna +Europe/Vilnius +Europe/Volgograd +Europe/Warsaw +Europe/Zagreb +Europe/Zaporozhye +Europe/Zurich +Factory +GB +GB-Eire +GMT +GMT+0 +GMT-0 +GMT0 +Greenwich +HST +Hongkong +Iceland +Indian/Antananarivo +Indian/Chagos +Indian/Christmas +Indian/Cocos +Indian/Comoro +Indian/Kerguelen +Indian/Mahe +Indian/Maldives +Indian/Mauritius +Indian/Mayotte +Indian/Reunion +Iran +Israel +Jamaica +Japan +Kwajalein +Libya +MET +MST +MST7MDT +Mexico/BajaNorte +Mexico/BajaSur +Mexico/General +NZ +NZ-CHAT +Navajo +PRC +PST8PDT +Pacific/Apia +Pacific/Auckland +Pacific/Bougainville +Pacific/Chatham +Pacific/Easter +Pacific/Efate +Pacific/Enderbury +Pacific/Fakaofo +Pacific/Fiji +Pacific/Funafuti +Pacific/Galapagos +Pacific/Gambier +Pacific/Guadalcanal +Pacific/Guam +Pacific/Honolulu +Pacific/Johnston +Pacific/Kiritimati +Pacific/Kosrae +Pacific/Kwajalein +Pacific/Majuro +Pacific/Marquesas +Pacific/Midway +Pacific/Nauru +Pacific/Niue +Pacific/Norfolk +Pacific/Noumea +Pacific/Pago_Pago +Pacific/Palau +Pacific/Pitcairn +Pacific/Ponape +Pacific/Port_Moresby +Pacific/Rarotonga +Pacific/Saipan +Pacific/Samoa +Pacific/Tahiti +Pacific/Tarawa +Pacific/Tongatapu +Pacific/Truk +Pacific/Wake +Pacific/Wallis +Pacific/Yap +Poland +Portugal +ROC +ROK +Singapore +Turkey +UCT +UTC +Universal +W-SU +WET +Zulu +posix/Africa/Abidjan +posix/Africa/Accra +posix/Africa/Addis_Ababa +posix/Africa/Algiers +posix/Africa/Asmera +posix/Africa/Bamako +posix/Africa/Bangui +posix/Africa/Banjul +posix/Africa/Bissau +posix/Africa/Blantyre +posix/Africa/Brazzaville +posix/Africa/Bujumbura +posix/Africa/Cairo +posix/Africa/Casablanca +posix/Africa/Ceuta +posix/Africa/Conakry +posix/Africa/Dakar +posix/Africa/Dar_es_Salaam +posix/Africa/Djibouti +posix/Africa/Douala +posix/Africa/El_Aaiun +posix/Africa/Freetown +posix/Africa/Gaborone +posix/Africa/Harare +posix/Africa/Johannesburg +posix/Africa/Kampala +posix/Africa/Khartoum +posix/Africa/Kigali +posix/Africa/Kinshasa +posix/Africa/Lagos +posix/Africa/Libreville +posix/Africa/Lome +posix/Africa/Luanda +posix/Africa/Lubumbashi +posix/Africa/Lusaka +posix/Africa/Malabo +posix/Africa/Maputo +posix/Africa/Maseru +posix/Africa/Mbabane +posix/Africa/Mogadishu +posix/Africa/Monrovia +posix/Africa/Nairobi +posix/Africa/Ndjamena +posix/Africa/Niamey +posix/Africa/Nouakchott +posix/Africa/Ouagadougou +posix/Africa/Porto-Novo +posix/Africa/Sao_Tome +posix/Africa/Timbuktu +posix/Africa/Tripoli +posix/Africa/Tunis +posix/Africa/Windhoek +posix/America/Adak +posix/America/Anchorage +posix/America/Anguilla +posix/America/Antigua +posix/America/Araguaina +posix/America/Argentina/Buenos_Aires +posix/America/Argentina/Catamarca +posix/America/Argentina/ComodRivadavia +posix/America/Argentina/Cordoba +posix/America/Argentina/Jujuy +posix/America/Argentina/La_Rioja +posix/America/Argentina/Mendoza +posix/America/Argentina/Rio_Gallegos +posix/America/Argentina/San_Juan +posix/America/Argentina/Tucuman +posix/America/Argentina/Ushuaia +posix/America/Aruba +posix/America/Asuncion +posix/America/Atikokan +posix/America/Atka +posix/America/Bahia +posix/America/Barbados +posix/America/Belem +posix/America/Belize +posix/America/Blanc-Sablon +posix/America/Boa_Vista +posix/America/Bogota +posix/America/Boise +posix/America/Buenos_Aires +posix/America/Cambridge_Bay +posix/America/Campo_Grande +posix/America/Cancun +posix/America/Caracas +posix/America/Catamarca +posix/America/Cayenne +posix/America/Cayman +posix/America/Chicago +posix/America/Chihuahua +posix/America/Coral_Harbour +posix/America/Cordoba +posix/America/Costa_Rica +posix/America/Cuiaba +posix/America/Curacao +posix/America/Danmarkshavn +posix/America/Dawson +posix/America/Dawson_Creek +posix/America/Denver +posix/America/Detroit +posix/America/Dominica +posix/America/Edmonton +posix/America/Eirunepe +posix/America/El_Salvador +posix/America/Ensenada +posix/America/Fort_Wayne +posix/America/Fortaleza +posix/America/Glace_Bay +posix/America/Godthab +posix/America/Goose_Bay +posix/America/Grand_Turk +posix/America/Grenada +posix/America/Guadeloupe +posix/America/Guatemala +posix/America/Guayaquil +posix/America/Guyana +posix/America/Halifax +posix/America/Havana +posix/America/Hermosillo +posix/America/Indiana/Indianapolis +posix/America/Indiana/Knox +posix/America/Indiana/Marengo +posix/America/Indiana/Petersburg +posix/America/Indiana/Tell_City +posix/America/Indiana/Vevay +posix/America/Indiana/Vincennes +posix/America/Indianapolis +posix/America/Inuvik +posix/America/Iqaluit +posix/America/Jamaica +posix/America/Jujuy +posix/America/Juneau +posix/America/Kentucky/Louisville +posix/America/Kentucky/Monticello +posix/America/Knox_IN +posix/America/La_Paz +posix/America/Lima +posix/America/Los_Angeles +posix/America/Louisville +posix/America/Maceio +posix/America/Managua +posix/America/Manaus +posix/America/Martinique +posix/America/Mazatlan +posix/America/Mendoza +posix/America/Menominee +posix/America/Merida +posix/America/Mexico_City +posix/America/Miquelon +posix/America/Moncton +posix/America/Monterrey +posix/America/Montevideo +posix/America/Montreal +posix/America/Montserrat +posix/America/Nassau +posix/America/New_York +posix/America/Nipigon +posix/America/Nome +posix/America/Noronha +posix/America/North_Dakota/Center +posix/America/North_Dakota/New_Salem +posix/America/Panama +posix/America/Pangnirtung +posix/America/Paramaribo +posix/America/Phoenix +posix/America/Port-au-Prince +posix/America/Port_of_Spain +posix/America/Porto_Acre +posix/America/Porto_Velho +posix/America/Puerto_Rico +posix/America/Rainy_River +posix/America/Rankin_Inlet +posix/America/Recife +posix/America/Regina +posix/America/Rio_Branco +posix/America/Rosario +posix/America/Santiago +posix/America/Santo_Domingo +posix/America/Sao_Paulo +posix/America/Scoresbysund +posix/America/Shiprock +posix/America/St_Johns +posix/America/St_Kitts +posix/America/St_Lucia +posix/America/St_Thomas +posix/America/St_Vincent +posix/America/Swift_Current +posix/America/Tegucigalpa +posix/America/Thule +posix/America/Thunder_Bay +posix/America/Tijuana +posix/America/Toronto +posix/America/Tortola +posix/America/Vancouver +posix/America/Virgin +posix/America/Whitehorse +posix/America/Winnipeg +posix/America/Yakutat +posix/America/Yellowknife +posix/Antarctica/Casey +posix/Antarctica/Davis +posix/Antarctica/DumontDUrville +posix/Antarctica/Mawson +posix/Antarctica/McMurdo +posix/Antarctica/Palmer +posix/Antarctica/Rothera +posix/Antarctica/South_Pole +posix/Antarctica/Syowa +posix/Antarctica/Troll +posix/Antarctica/Vostok +posix/Arctic/Longyearbyen +posix/Asia/Aden +posix/Asia/Almaty +posix/Asia/Amman +posix/Asia/Anadyr +posix/Asia/Aqtau +posix/Asia/Aqtobe +posix/Asia/Ashgabat +posix/Asia/Ashkhabad +posix/Asia/Baghdad +posix/Asia/Bahrain +posix/Asia/Baku +posix/Asia/Bangkok +posix/Asia/Beirut +posix/Asia/Bishkek +posix/Asia/Brunei +posix/Asia/Calcutta +posix/Asia/Chita +posix/Asia/Choibalsan +posix/Asia/Chongqing +posix/Asia/Chungking +posix/Asia/Colombo +posix/Asia/Dacca +posix/Asia/Damascus +posix/Asia/Dhaka +posix/Asia/Dili +posix/Asia/Dubai +posix/Asia/Dushanbe +posix/Asia/Gaza +posix/Asia/Harbin +posix/Asia/Hong_Kong +posix/Asia/Hovd +posix/Asia/Irkutsk +posix/Asia/Istanbul +posix/Asia/Jakarta +posix/Asia/Jayapura +posix/Asia/Jerusalem +posix/Asia/Kabul +posix/Asia/Kamchatka +posix/Asia/Karachi +posix/Asia/Kashgar +posix/Asia/Katmandu +posix/Asia/Krasnoyarsk +posix/Asia/Kuala_Lumpur +posix/Asia/Kuching +posix/Asia/Kuwait +posix/Asia/Macao +posix/Asia/Macau +posix/Asia/Magadan +posix/Asia/Makassar +posix/Asia/Manila +posix/Asia/Muscat +posix/Asia/Nicosia +posix/Asia/Novosibirsk +posix/Asia/Omsk +posix/Asia/Oral +posix/Asia/Phnom_Penh +posix/Asia/Pontianak +posix/Asia/Pyongyang +posix/Asia/Qatar +posix/Asia/Qyzylorda +posix/Asia/Rangoon +posix/Asia/Riyadh +posix/Asia/Saigon +posix/Asia/Sakhalin +posix/Asia/Samarkand +posix/Asia/Seoul +posix/Asia/Shanghai +posix/Asia/Singapore +posix/Asia/Srednekolymsk +posix/Asia/Taipei +posix/Asia/Tashkent +posix/Asia/Tbilisi +posix/Asia/Tehran +posix/Asia/Tel_Aviv +posix/Asia/Thimbu +posix/Asia/Thimphu +posix/Asia/Tokyo +posix/Asia/Ujung_Pandang +posix/Asia/Ulaanbaatar +posix/Asia/Ulan_Bator +posix/Asia/Urumqi +posix/Asia/Vientiane +posix/Asia/Vladivostok +posix/Asia/Yakutsk +posix/Asia/Yekaterinburg +posix/Asia/Yerevan +posix/Atlantic/Azores +posix/Atlantic/Bermuda +posix/Atlantic/Canary +posix/Atlantic/Cape_Verde +posix/Atlantic/Faeroe +posix/Atlantic/Jan_Mayen +posix/Atlantic/Madeira +posix/Atlantic/Reykjavik +posix/Atlantic/South_Georgia +posix/Atlantic/St_Helena +posix/Atlantic/Stanley +posix/Australia/ACT +posix/Australia/Adelaide +posix/Australia/Brisbane +posix/Australia/Broken_Hill +posix/Australia/Canberra +posix/Australia/Currie +posix/Australia/Darwin +posix/Australia/Hobart +posix/Australia/LHI +posix/Australia/Lindeman +posix/Australia/Lord_Howe +posix/Australia/Melbourne +posix/Australia/NSW +posix/Australia/North +posix/Australia/Perth +posix/Australia/Queensland +posix/Australia/South +posix/Australia/Sydney +posix/Australia/Tasmania +posix/Australia/Victoria +posix/Australia/West +posix/Australia/Yancowinna +posix/Brazil/Acre +posix/Brazil/DeNoronha +posix/Brazil/East +posix/Brazil/West +posix/CET +posix/CST6CDT +posix/Canada/Atlantic +posix/Canada/Central +posix/Canada/East-Saskatchewan +posix/Canada/Eastern +posix/Canada/Mountain +posix/Canada/Newfoundland +posix/Canada/Pacific +posix/Canada/Saskatchewan +posix/Canada/Yukon +posix/Chile/Continental +posix/Chile/EasterIsland +posix/Cuba +posix/EET +posix/EST +posix/EST5EDT +posix/Egypt +posix/Eire +posix/Etc/GMT +posix/Etc/GMT+0 +posix/Etc/GMT+1 +posix/Etc/GMT+10 +posix/Etc/GMT+11 +posix/Etc/GMT+12 +posix/Etc/GMT+2 +posix/Etc/GMT+3 +posix/Etc/GMT+4 +posix/Etc/GMT+5 +posix/Etc/GMT+6 +posix/Etc/GMT+7 +posix/Etc/GMT+8 +posix/Etc/GMT+9 +posix/Etc/GMT-0 +posix/Etc/GMT-1 +posix/Etc/GMT-10 +posix/Etc/GMT-11 +posix/Etc/GMT-12 +posix/Etc/GMT-13 +posix/Etc/GMT-14 +posix/Etc/GMT-2 +posix/Etc/GMT-3 +posix/Etc/GMT-4 +posix/Etc/GMT-5 +posix/Etc/GMT-6 +posix/Etc/GMT-7 +posix/Etc/GMT-8 +posix/Etc/GMT-9 +posix/Etc/GMT0 +posix/Etc/Greenwich +posix/Etc/UCT +posix/Etc/UTC +posix/Etc/Universal +posix/Etc/Zulu +posix/Europe/Amsterdam +posix/Europe/Andorra +posix/Europe/Athens +posix/Europe/Belfast +posix/Europe/Belgrade +posix/Europe/Berlin +posix/Europe/Bratislava +posix/Europe/Brussels +posix/Europe/Bucharest +posix/Europe/Budapest +posix/Europe/Chisinau +posix/Europe/Copenhagen +posix/Europe/Dublin +posix/Europe/Gibraltar +posix/Europe/Guernsey +posix/Europe/Helsinki +posix/Europe/Isle_of_Man +posix/Europe/Istanbul +posix/Europe/Jersey +posix/Europe/Kaliningrad +posix/Europe/Kiev +posix/Europe/Lisbon +posix/Europe/Ljubljana +posix/Europe/London +posix/Europe/Luxembourg +posix/Europe/Madrid +posix/Europe/Malta +posix/Europe/Mariehamn +posix/Europe/Minsk +posix/Europe/Monaco +posix/Europe/Moscow +posix/Europe/Nicosia +posix/Europe/Oslo +posix/Europe/Paris +posix/Europe/Podgorica +posix/Europe/Prague +posix/Europe/Riga +posix/Europe/Rome +posix/Europe/Samara +posix/Europe/San_Marino +posix/Europe/Sarajevo +posix/Europe/Simferopol +posix/Europe/Skopje +posix/Europe/Sofia +posix/Europe/Stockholm +posix/Europe/Tallinn +posix/Europe/Tirane +posix/Europe/Tiraspol +posix/Europe/Uzhgorod +posix/Europe/Vaduz +posix/Europe/Vatican +posix/Europe/Vienna +posix/Europe/Vilnius +posix/Europe/Volgograd +posix/Europe/Warsaw +posix/Europe/Zagreb +posix/Europe/Zaporozhye +posix/Europe/Zurich +posix/Factory +posix/GB +posix/GB-Eire +posix/GMT +posix/GMT+0 +posix/GMT-0 +posix/GMT0 +posix/Greenwich +posix/HST +posix/Hongkong +posix/Iceland +posix/Indian/Antananarivo +posix/Indian/Chagos +posix/Indian/Christmas +posix/Indian/Cocos +posix/Indian/Comoro +posix/Indian/Kerguelen +posix/Indian/Mahe +posix/Indian/Maldives +posix/Indian/Mauritius +posix/Indian/Mayotte +posix/Indian/Reunion +posix/Iran +posix/Israel +posix/Jamaica +posix/Japan +posix/Kwajalein +posix/Libya +posix/MET +posix/MST +posix/MST7MDT +posix/Mexico/BajaNorte +posix/Mexico/BajaSur +posix/Mexico/General +posix/NZ +posix/NZ-CHAT +posix/Navajo +posix/PRC +posix/PST8PDT +posix/Pacific/Apia +posix/Pacific/Auckland +posix/Pacific/Bougainville +posix/Pacific/Chatham +posix/Pacific/Easter +posix/Pacific/Efate +posix/Pacific/Enderbury +posix/Pacific/Fakaofo +posix/Pacific/Fiji +posix/Pacific/Funafuti +posix/Pacific/Galapagos +posix/Pacific/Gambier +posix/Pacific/Guadalcanal +posix/Pacific/Guam +posix/Pacific/Honolulu +posix/Pacific/Johnston +posix/Pacific/Kiritimati +posix/Pacific/Kosrae +posix/Pacific/Kwajalein +posix/Pacific/Majuro +posix/Pacific/Marquesas +posix/Pacific/Midway +posix/Pacific/Nauru +posix/Pacific/Niue +posix/Pacific/Norfolk +posix/Pacific/Noumea +posix/Pacific/Pago_Pago +posix/Pacific/Palau +posix/Pacific/Pitcairn +posix/Pacific/Ponape +posix/Pacific/Port_Moresby +posix/Pacific/Rarotonga +posix/Pacific/Saipan +posix/Pacific/Samoa +posix/Pacific/Tahiti +posix/Pacific/Tarawa +posix/Pacific/Tongatapu +posix/Pacific/Truk +posix/Pacific/Wake +posix/Pacific/Wallis +posix/Pacific/Yap +posix/Poland +posix/Portugal +posix/ROC +posix/ROK +posix/Singapore +posix/Turkey +posix/UCT +posix/US/Alaska +posix/US/Aleutian +posix/US/Arizona +posix/US/Central +posix/US/East-Indiana +posix/US/Eastern +posix/US/Hawaii +posix/US/Indiana-Starke +posix/US/Michigan +posix/US/Mountain +posix/US/Pacific +posix/US/Pacific-New +posix/US/Samoa +posix/UTC +posix/Universal +posix/W-SU +posix/WET +posix/Zulu +posixrules +right/Africa/Abidjan +right/Africa/Accra +right/Africa/Addis_Ababa +right/Africa/Algiers +right/Africa/Asmera +right/Africa/Bamako +right/Africa/Bangui +right/Africa/Banjul +right/Africa/Bissau +right/Africa/Blantyre +right/Africa/Brazzaville +right/Africa/Bujumbura +right/Africa/Cairo +right/Africa/Casablanca +right/Africa/Ceuta +right/Africa/Conakry +right/Africa/Dakar +right/Africa/Dar_es_Salaam +right/Africa/Djibouti +right/Africa/Douala +right/Africa/El_Aaiun +right/Africa/Freetown +right/Africa/Gaborone +right/Africa/Harare +right/Africa/Johannesburg +right/Africa/Kampala +right/Africa/Khartoum +right/Africa/Kigali +right/Africa/Kinshasa +right/Africa/Lagos +right/Africa/Libreville +right/Africa/Lome +right/Africa/Luanda +right/Africa/Lubumbashi +right/Africa/Lusaka +right/Africa/Malabo +right/Africa/Maputo +right/Africa/Maseru +right/Africa/Mbabane +right/Africa/Mogadishu +right/Africa/Monrovia +right/Africa/Nairobi +right/Africa/Ndjamena +right/Africa/Niamey +right/Africa/Nouakchott +right/Africa/Ouagadougou +right/Africa/Porto-Novo +right/Africa/Sao_Tome +right/Africa/Timbuktu +right/Africa/Tripoli +right/Africa/Tunis +right/Africa/Windhoek +right/America/Adak +right/America/Anchorage +right/America/Anguilla +right/America/Antigua +right/America/Araguaina +right/America/Argentina/Buenos_Aires +right/America/Argentina/Catamarca +right/America/Argentina/ComodRivadavia +right/America/Argentina/Cordoba +right/America/Argentina/Jujuy +right/America/Argentina/La_Rioja +right/America/Argentina/Mendoza +right/America/Argentina/Rio_Gallegos +right/America/Argentina/San_Juan +right/America/Argentina/Tucuman +right/America/Argentina/Ushuaia +right/America/Aruba +right/America/Asuncion +right/America/Atikokan +right/America/Atka +right/America/Bahia +right/America/Barbados +right/America/Belem +right/America/Belize +right/America/Blanc-Sablon +right/America/Boa_Vista +right/America/Bogota +right/America/Boise +right/America/Buenos_Aires +right/America/Cambridge_Bay +right/America/Campo_Grande +right/America/Cancun +right/America/Caracas +right/America/Catamarca +right/America/Cayenne +right/America/Cayman +right/America/Chicago +right/America/Chihuahua +right/America/Coral_Harbour +right/America/Cordoba +right/America/Costa_Rica +right/America/Cuiaba +right/America/Curacao +right/America/Danmarkshavn +right/America/Dawson +right/America/Dawson_Creek +right/America/Denver +right/America/Detroit +right/America/Dominica +right/America/Edmonton +right/America/Eirunepe +right/America/El_Salvador +right/America/Ensenada +right/America/Fort_Wayne +right/America/Fortaleza +right/America/Glace_Bay +right/America/Godthab +right/America/Goose_Bay +right/America/Grand_Turk +right/America/Grenada +right/America/Guadeloupe +right/America/Guatemala +right/America/Guayaquil +right/America/Guyana +right/America/Halifax +right/America/Havana +right/America/Hermosillo +right/America/Indiana/Indianapolis +right/America/Indiana/Knox +right/America/Indiana/Marengo +right/America/Indiana/Petersburg +right/America/Indiana/Tell_City +right/America/Indiana/Vevay +right/America/Indiana/Vincennes +right/America/Indianapolis +right/America/Inuvik +right/America/Iqaluit +right/America/Jamaica +right/America/Jujuy +right/America/Juneau +right/America/Kentucky/Louisville +right/America/Kentucky/Monticello +right/America/Knox_IN +right/America/La_Paz +right/America/Lima +right/America/Los_Angeles +right/America/Louisville +right/America/Maceio +right/America/Managua +right/America/Manaus +right/America/Martinique +right/America/Mazatlan +right/America/Mendoza +right/America/Menominee +right/America/Merida +right/America/Mexico_City +right/America/Miquelon +right/America/Moncton +right/America/Monterrey +right/America/Montevideo +right/America/Montreal +right/America/Montserrat +right/America/Nassau +right/America/New_York +right/America/Nipigon +right/America/Nome +right/America/Noronha +right/America/North_Dakota/Center +right/America/North_Dakota/New_Salem +right/America/Panama +right/America/Pangnirtung +right/America/Paramaribo +right/America/Phoenix +right/America/Port-au-Prince +right/America/Port_of_Spain +right/America/Porto_Acre +right/America/Porto_Velho +right/America/Puerto_Rico +right/America/Rainy_River +right/America/Rankin_Inlet +right/America/Recife +right/America/Regina +right/America/Rio_Branco +right/America/Rosario +right/America/Santiago +right/America/Santo_Domingo +right/America/Sao_Paulo +right/America/Scoresbysund +right/America/Shiprock +right/America/St_Johns +right/America/St_Kitts +right/America/St_Lucia +right/America/St_Thomas +right/America/St_Vincent +right/America/Swift_Current +right/America/Tegucigalpa +right/America/Thule +right/America/Thunder_Bay +right/America/Tijuana +right/America/Toronto +right/America/Tortola +right/America/Vancouver +right/America/Virgin +right/America/Whitehorse +right/America/Winnipeg +right/America/Yakutat +right/America/Yellowknife +right/Antarctica/Casey +right/Antarctica/Davis +right/Antarctica/DumontDUrville +right/Antarctica/Mawson +right/Antarctica/McMurdo +right/Antarctica/Palmer +right/Antarctica/Rothera +right/Antarctica/South_Pole +right/Antarctica/Syowa +right/Antarctica/Troll +right/Antarctica/Vostok +right/Arctic/Longyearbyen +right/Asia/Aden +right/Asia/Almaty +right/Asia/Amman +right/Asia/Anadyr +right/Asia/Aqtau +right/Asia/Aqtobe +right/Asia/Ashgabat +right/Asia/Ashkhabad +right/Asia/Baghdad +right/Asia/Bahrain +right/Asia/Baku +right/Asia/Bangkok +right/Asia/Beirut +right/Asia/Bishkek +right/Asia/Brunei +right/Asia/Calcutta +right/Asia/Chita +right/Asia/Choibalsan +right/Asia/Chongqing +right/Asia/Chungking +right/Asia/Colombo +right/Asia/Dacca +right/Asia/Damascus +right/Asia/Dhaka +right/Asia/Dili +right/Asia/Dubai +right/Asia/Dushanbe +right/Asia/Gaza +right/Asia/Harbin +right/Asia/Hong_Kong +right/Asia/Hovd +right/Asia/Irkutsk +right/Asia/Istanbul +right/Asia/Jakarta +right/Asia/Jayapura +right/Asia/Jerusalem +right/Asia/Kabul +right/Asia/Kamchatka +right/Asia/Karachi +right/Asia/Kashgar +right/Asia/Katmandu +right/Asia/Krasnoyarsk +right/Asia/Kuala_Lumpur +right/Asia/Kuching +right/Asia/Kuwait +right/Asia/Macao +right/Asia/Macau +right/Asia/Magadan +right/Asia/Makassar +right/Asia/Manila +right/Asia/Muscat +right/Asia/Nicosia +right/Asia/Novosibirsk +right/Asia/Omsk +right/Asia/Oral +right/Asia/Phnom_Penh +right/Asia/Pontianak +right/Asia/Pyongyang +right/Asia/Qatar +right/Asia/Qyzylorda +right/Asia/Rangoon +right/Asia/Riyadh +right/Asia/Saigon +right/Asia/Sakhalin +right/Asia/Samarkand +right/Asia/Seoul +right/Asia/Shanghai +right/Asia/Singapore +right/Asia/Srednekolymsk +right/Asia/Taipei +right/Asia/Tashkent +right/Asia/Tbilisi +right/Asia/Tehran +right/Asia/Tel_Aviv +right/Asia/Thimbu +right/Asia/Thimphu +right/Asia/Tokyo +right/Asia/Ujung_Pandang +right/Asia/Ulaanbaatar +right/Asia/Ulan_Bator +right/Asia/Urumqi +right/Asia/Vientiane +right/Asia/Vladivostok +right/Asia/Yakutsk +right/Asia/Yekaterinburg +right/Asia/Yerevan +right/Atlantic/Azores +right/Atlantic/Bermuda +right/Atlantic/Canary +right/Atlantic/Cape_Verde +right/Atlantic/Faeroe +right/Atlantic/Jan_Mayen +right/Atlantic/Madeira +right/Atlantic/Reykjavik +right/Atlantic/South_Georgia +right/Atlantic/St_Helena +right/Atlantic/Stanley +right/Australia/ACT +right/Australia/Adelaide +right/Australia/Brisbane +right/Australia/Broken_Hill +right/Australia/Canberra +right/Australia/Currie +right/Australia/Darwin +right/Australia/Hobart +right/Australia/LHI +right/Australia/Lindeman +right/Australia/Lord_Howe +right/Australia/Melbourne +right/Australia/NSW +right/Australia/North +right/Australia/Perth +right/Australia/Queensland +right/Australia/South +right/Australia/Sydney +right/Australia/Tasmania +right/Australia/Victoria +right/Australia/West +right/Australia/Yancowinna +right/Brazil/Acre +right/Brazil/DeNoronha +right/Brazil/East +right/Brazil/West +right/CET +right/CST6CDT +right/Canada/Atlantic +right/Canada/Central +right/Canada/East-Saskatchewan +right/Canada/Eastern +right/Canada/Mountain +right/Canada/Newfoundland +right/Canada/Pacific +right/Canada/Saskatchewan +right/Canada/Yukon +right/Chile/Continental +right/Chile/EasterIsland +right/Cuba +right/EET +right/EST +right/EST5EDT +right/Egypt +right/Eire +right/Etc/GMT +right/Etc/GMT+0 +right/Etc/GMT+1 +right/Etc/GMT+10 +right/Etc/GMT+11 +right/Etc/GMT+12 +right/Etc/GMT+2 +right/Etc/GMT+3 +right/Etc/GMT+4 +right/Etc/GMT+5 +right/Etc/GMT+6 +right/Etc/GMT+7 +right/Etc/GMT+8 +right/Etc/GMT+9 +right/Etc/GMT-0 +right/Etc/GMT-1 +right/Etc/GMT-10 +right/Etc/GMT-11 +right/Etc/GMT-12 +right/Etc/GMT-13 +right/Etc/GMT-14 +right/Etc/GMT-2 +right/Etc/GMT-3 +right/Etc/GMT-4 +right/Etc/GMT-5 +right/Etc/GMT-6 +right/Etc/GMT-7 +right/Etc/GMT-8 +right/Etc/GMT-9 +right/Etc/GMT0 +right/Etc/Greenwich +right/Etc/UCT +right/Etc/UTC +right/Etc/Universal +right/Etc/Zulu +right/Europe/Amsterdam +right/Europe/Andorra +right/Europe/Athens +right/Europe/Belfast +right/Europe/Belgrade +right/Europe/Berlin +right/Europe/Bratislava +right/Europe/Brussels +right/Europe/Bucharest +right/Europe/Budapest +right/Europe/Chisinau +right/Europe/Copenhagen +right/Europe/Dublin +right/Europe/Gibraltar +right/Europe/Guernsey +right/Europe/Helsinki +right/Europe/Isle_of_Man +right/Europe/Istanbul +right/Europe/Jersey +right/Europe/Kaliningrad +right/Europe/Kiev +right/Europe/Lisbon +right/Europe/Ljubljana +right/Europe/London +right/Europe/Luxembourg +right/Europe/Madrid +right/Europe/Malta +right/Europe/Mariehamn +right/Europe/Minsk +right/Europe/Monaco +right/Europe/Moscow +right/Europe/Nicosia +right/Europe/Oslo +right/Europe/Paris +right/Europe/Podgorica +right/Europe/Prague +right/Europe/Riga +right/Europe/Rome +right/Europe/Samara +right/Europe/San_Marino +right/Europe/Sarajevo +right/Europe/Simferopol +right/Europe/Skopje +right/Europe/Sofia +right/Europe/Stockholm +right/Europe/Tallinn +right/Europe/Tirane +right/Europe/Tiraspol +right/Europe/Uzhgorod +right/Europe/Vaduz +right/Europe/Vatican +right/Europe/Vienna +right/Europe/Vilnius +right/Europe/Volgograd +right/Europe/Warsaw +right/Europe/Zagreb +right/Europe/Zaporozhye +right/Europe/Zurich +right/Factory +right/GB +right/GB-Eire +right/GMT +right/GMT+0 +right/GMT-0 +right/GMT0 +right/Greenwich +right/HST +right/Hongkong +right/Iceland +right/Indian/Antananarivo +right/Indian/Chagos +right/Indian/Christmas +right/Indian/Cocos +right/Indian/Comoro +right/Indian/Kerguelen +right/Indian/Mahe +right/Indian/Maldives +right/Indian/Mauritius +right/Indian/Mayotte +right/Indian/Reunion +right/Iran +right/Israel +right/Jamaica +right/Japan +right/Kwajalein +right/Libya +right/MET +right/MST +right/MST7MDT +right/Mexico/BajaNorte +right/Mexico/BajaSur +right/Mexico/General +right/NZ +right/NZ-CHAT +right/Navajo +right/PRC +right/PST8PDT +right/Pacific/Apia +right/Pacific/Auckland +right/Pacific/Bougainville +right/Pacific/Chatham +right/Pacific/Easter +right/Pacific/Efate +right/Pacific/Enderbury +right/Pacific/Fakaofo +right/Pacific/Fiji +right/Pacific/Funafuti +right/Pacific/Galapagos +right/Pacific/Gambier +right/Pacific/Guadalcanal +right/Pacific/Guam +right/Pacific/Honolulu +right/Pacific/Johnston +right/Pacific/Kiritimati +right/Pacific/Kosrae +right/Pacific/Kwajalein +right/Pacific/Majuro +right/Pacific/Marquesas +right/Pacific/Midway +right/Pacific/Nauru +right/Pacific/Niue +right/Pacific/Norfolk +right/Pacific/Noumea +right/Pacific/Pago_Pago +right/Pacific/Palau +right/Pacific/Pitcairn +right/Pacific/Ponape +right/Pacific/Port_Moresby +right/Pacific/Rarotonga +right/Pacific/Saipan +right/Pacific/Samoa +right/Pacific/Tahiti +right/Pacific/Tarawa +right/Pacific/Tongatapu +right/Pacific/Truk +right/Pacific/Wake +right/Pacific/Wallis +right/Pacific/Yap +right/Poland +right/Portugal +right/ROC +right/ROK +right/Singapore +right/Turkey +right/UCT +right/US/Alaska +right/US/Aleutian +right/US/Arizona +right/US/Central +right/US/East-Indiana +right/US/Eastern +right/US/Hawaii +right/US/Indiana-Starke +right/US/Michigan +right/US/Mountain +right/US/Pacific +right/US/Pacific-New +right/US/Samoa +right/UTC +right/Universal +right/W-SU +right/WET +right/Zulu diff --git a/patches/source/glibc/timezone-scripts/parts/04 b/patches/source/glibc/timezone-scripts/parts/04 new file mode 100644 index 000000000..ec36338b1 --- /dev/null +++ b/patches/source/glibc/timezone-scripts/parts/04 @@ -0,0 +1,32 @@ + +Type it at the prompt below exactly as it appears above. (NOTE: If you don't +see your timezone, use "timeconfig" again after booting for the verbose list) + +EOF + echo -n "Timezone? " + read TIMEZONE; + echo + + if [ -r $T_PX/usr/share/zoneinfo/$TIMEZONE -o \ + -r /var/log/mount/usr/share/zoneinfo/$TIMEZONE -o \ + -L $T_PX/usr/share/zoneinfo/$TIMEZONE -o \ + -L /var/log/mount/usr/share/zoneinfo/$TIMEZONE ]; then + echo "Creating link from $TIMEZONE to localtime in /etc..." + echo + setzone $TIMEZONE + exit + else + cat << EOF + +Timezone $TIMEZONE could not be found. You may try again if you wish. +Make sure you type the name exactly as it appears - this configuration script +is case sensitive. + +Press [enter] to continue. + +EOF + read JUNK; + fi + done +fi + diff --git a/patches/source/glibc/timezone-scripts/parts/README b/patches/source/glibc/timezone-scripts/parts/README new file mode 100644 index 000000000..80d5cf5b4 --- /dev/null +++ b/patches/source/glibc/timezone-scripts/parts/README @@ -0,0 +1,2 @@ +Files 01 and 03 are samples, showing the format, and are +not necessarily up to date... diff --git a/patches/source/glibc/timezone-scripts/setup.timeconfig b/patches/source/glibc/timezone-scripts/setup.timeconfig new file mode 100644 index 000000000..81ff7055f --- /dev/null +++ b/patches/source/glibc/timezone-scripts/setup.timeconfig @@ -0,0 +1,3 @@ +#!/bin/sh +#BLURB="Select your timezone" +sh usr/sbin/timeconfig $* diff --git a/patches/source/glibc/timezone-scripts/timeconfig b/patches/source/glibc/timezone-scripts/timeconfig new file mode 100644 index 000000000..9f939b360 --- /dev/null +++ b/patches/source/glibc/timezone-scripts/timeconfig @@ -0,0 +1,3695 @@ +#!/bin/sh +# +# timeconfig Slackware Linux timezone configuration utility. +# +# Author: Patrick Volkerding +# Modified by: David Cantrell , 06-Oct-2000 +# +# ChangeLog: +# 2014-10-22: Updated timezones from tzdata2014i. +# 2012-12-12: Updated timezones from tzdata2012j. +# 2008-03-10: Updated timezones from tzdata2008a. +# 2007-12-21: Updated timezones from tzdata2007j. +# 2006-12-03: Updated timezones from tzdata2006p. +# 2006-09-14: Updated timezones from tzdata2006k. +# 2006-08-22: Updated timezones from tzdata2006j. +# 2006-08-13: Updated timezones from tzdata2006g. +# 2006-03-13: Updated timezones from tzdata2006c. +# 19-Feb-2001 Add new timezones from glibc-2.2.2. +# 06-Oct-2000 Fixed a problem with selecting UTC time. It was writing +# the hardwareclock file to the root disk and not your dest +# partition. Changed the HWCLOCK_CONF variable to be +# $T_PX/etc/hardwareclock to fix this. Thanks to David L. +# Dickman for finding this and +# submitting a patch. +# +# 15-Mar-2000 Added the writeconf function to write out the +# /etc/hardwareclock file which tells what the hardware clock +# is set to (UTC or localtime). +# +# 03-Mar-2000 Reorganized script. Made one timezone set block, added +# stage that asks the user if the hardware clock is set to +# UTC. + +# setup our temp locations and variables +TMP=/var/log/setup/tmp +if [ -r $TMP/SeTT_PX ]; then + T_PX="`cat $TMP/SeTT_PX`" +elif [ ! "$!" = "" ]; then + T_PX=$1 +else + T_PX=/ +fi + +# the hardware clock configuration file +HWCLOCK_CONF=$T_PX/etc/hardwareclock + +# setzone( $TIMEZONE ) +# +# This function accepts a time zone as the only parameter and sets it as +# the default system time zone. +setzone() +{ + TZ=$1 + + cd $T_PX/etc + if [ -r $T_PX/usr/share/zoneinfo/$TZ -o \ + -r /var/log/mount/usr/share/zoneinfo/$TZ -o \ + -L $T_PX/usr/share/zoneinfo/$TZ -o \ + -L /var/log/mount/usr/share/zoneinfo/$TZ ]; then + ln -sf /usr/share/zoneinfo/$TZ localtime-copied-from + rm -f localtime + cd .. + chroot . cp etc/localtime-copied-from etc/localtime + fi +} + +# writeconf( $CLOCK_SET_TO ) +# +# Writes out $HWCLOCK_CONF that tells rc.S how the hardware clock +# value is stored. +writeconf() +{ + echo "# /etc/hardwareclock" > $HWCLOCK_CONF + echo "#" >> $HWCLOCK_CONF + echo "# Tells how the hardware clock time is stored." >> $HWCLOCK_CONF + echo "# You should run timeconfig to edit this file." >> $HWCLOCK_CONF + echo >> $HWCLOCK_CONF + echo $1 >> $HWCLOCK_CONF +} + +# ask the user if the hardware clock is set for UTC/GMT +if [ "$COLOR" = "on" -o -r $TMP/SeTcolor -o "$T_PX" = "/" ]; then + ### + ### use color menus here + ### + dialog --title "HARDWARE CLOCK SET TO UTC?" --menu "Is the hardware clock set \ +to Coordinated Universal Time (UTC/GMT)? If it is, select YES here. If the \ +hardware clock is set to the current local time (this is how most PCs are set \ +up), then say NO here. If you are not sure what this is, you should answer NO \ +here." 13 60 2 \ + "NO" "Hardware clock is set to local time" \ + "YES" "Hardware clock is set to UTC" \ + 2> $TMP/utc + if [ $? = 1 -o $? = 255 ]; then + rm -f $TMP/utc + exit + fi + if [ "`cat $TMP/utc`" = "YES" ]; then + # yes, the hardware clock is UTC + writeconf "UTC" + else # must be NO + writeconf "localtime" + fi + rm -f $TMP/utc +else + ### + ### use text prompts + ### + echo "Is the hardware clock set to Coordinated Universal Time (UTC/GMT)?" + echo "If it is, select 'y' here. If the hardware clock is set to the" + echo "current local time (this is how most PCs are set up), then say 'n'" + echo "here. If you are not sure what this is, you should answer 'n' here." + echo + echo -n "Is your hardware clock set to UTC ([y]es, [n]o)? " + read HEJAZ + + if [ "$HEJAZ" = "y" -o "$HEJAZ" = "Y" -o "$HEJAZ" = "YES" -o "$HEJAZ" = "yes" ]; then + # yes, the hardware clock is UTC + writeconf "UTC" + else + # default to localtime + writeconf "localtime" + fi +fi + +# Now set the correct timezone link: +if [ "$COLOR" = "on" -o -r $TMP/SeTcolor -o "$T_PX" = "/" ]; then + ### + ### use color menus here + ### + dialog --title "TIMEZONE CONFIGURATION" --menu "Please select one of the following timezones for your machine:" 21 50 13 \ +"US/Alaska" " " \ +"US/Aleutian" " " \ +"US/Arizona" " " \ +"US/Central" " " \ +"US/East-Indiana" " " \ +"US/Eastern" " " \ +"US/Hawaii" " " \ +"US/Indiana-Starke" " " \ +"US/Michigan" " " \ +"US/Mountain" " " \ +"US/Pacific" " " \ +"US/Pacific-New" " " \ +"US/Samoa" " " \ +"Africa/Abidjan" " " \ +"Africa/Accra" " " \ +"Africa/Addis_Ababa" " " \ +"Africa/Algiers" " " \ +"Africa/Asmara" " " \ +"Africa/Asmera" " " \ +"Africa/Bamako" " " \ +"Africa/Bangui" " " \ +"Africa/Banjul" " " \ +"Africa/Bissau" " " \ +"Africa/Blantyre" " " \ +"Africa/Brazzaville" " " \ +"Africa/Bujumbura" " " \ +"Africa/Cairo" " " \ +"Africa/Casablanca" " " \ +"Africa/Ceuta" " " \ +"Africa/Conakry" " " \ +"Africa/Dakar" " " \ +"Africa/Dar_es_Salaam" " " \ +"Africa/Djibouti" " " \ +"Africa/Douala" " " \ +"Africa/El_Aaiun" " " \ +"Africa/Freetown" " " \ +"Africa/Gaborone" " " \ +"Africa/Harare" " " \ +"Africa/Johannesburg" " " \ +"Africa/Juba" " " \ +"Africa/Kampala" " " \ +"Africa/Khartoum" " " \ +"Africa/Kigali" " " \ +"Africa/Kinshasa" " " \ +"Africa/Lagos" " " \ +"Africa/Libreville" " " \ +"Africa/Lome" " " \ +"Africa/Luanda" " " \ +"Africa/Lubumbashi" " " \ +"Africa/Lusaka" " " \ +"Africa/Malabo" " " \ +"Africa/Maputo" " " \ +"Africa/Maseru" " " \ +"Africa/Mbabane" " " \ +"Africa/Mogadishu" " " \ +"Africa/Monrovia" " " \ +"Africa/Nairobi" " " \ +"Africa/Ndjamena" " " \ +"Africa/Niamey" " " \ +"Africa/Nouakchott" " " \ +"Africa/Ouagadougou" " " \ +"Africa/Porto-Novo" " " \ +"Africa/Sao_Tome" " " \ +"Africa/Timbuktu" " " \ +"Africa/Tripoli" " " \ +"Africa/Tunis" " " \ +"Africa/Windhoek" " " \ +"America/Adak" " " \ +"America/Anchorage" " " \ +"America/Anguilla" " " \ +"America/Antigua" " " \ +"America/Araguaina" " " \ +"America/Argentina/Buenos_Aires" " " \ +"America/Argentina/Catamarca" " " \ +"America/Argentina/ComodRivadavia" " " \ +"America/Argentina/Cordoba" " " \ +"America/Argentina/Jujuy" " " \ +"America/Argentina/La_Rioja" " " \ +"America/Argentina/Mendoza" " " \ +"America/Argentina/Rio_Gallegos" " " \ +"America/Argentina/Salta" " " \ +"America/Argentina/San_Juan" " " \ +"America/Argentina/San_Luis" " " \ +"America/Argentina/Tucuman" " " \ +"America/Argentina/Ushuaia" " " \ +"America/Aruba" " " \ +"America/Asuncion" " " \ +"America/Atikokan" " " \ +"America/Atka" " " \ +"America/Bahia" " " \ +"America/Bahia_Banderas" " " \ +"America/Barbados" " " \ +"America/Belem" " " \ +"America/Belize" " " \ +"America/Blanc-Sablon" " " \ +"America/Boa_Vista" " " \ +"America/Bogota" " " \ +"America/Boise" " " \ +"America/Buenos_Aires" " " \ +"America/Cambridge_Bay" " " \ +"America/Campo_Grande" " " \ +"America/Cancun" " " \ +"America/Caracas" " " \ +"America/Catamarca" " " \ +"America/Cayenne" " " \ +"America/Cayman" " " \ +"America/Chicago" " " \ +"America/Chihuahua" " " \ +"America/Coral_Harbour" " " \ +"America/Cordoba" " " \ +"America/Costa_Rica" " " \ +"America/Creston" " " \ +"America/Cuiaba" " " \ +"America/Curacao" " " \ +"America/Danmarkshavn" " " \ +"America/Dawson" " " \ +"America/Dawson_Creek" " " \ +"America/Denver" " " \ +"America/Detroit" " " \ +"America/Dominica" " " \ +"America/Edmonton" " " \ +"America/Eirunepe" " " \ +"America/El_Salvador" " " \ +"America/Ensenada" " " \ +"America/Fort_Wayne" " " \ +"America/Fortaleza" " " \ +"America/Glace_Bay" " " \ +"America/Godthab" " " \ +"America/Goose_Bay" " " \ +"America/Grand_Turk" " " \ +"America/Grenada" " " \ +"America/Guadeloupe" " " \ +"America/Guatemala" " " \ +"America/Guayaquil" " " \ +"America/Guyana" " " \ +"America/Halifax" " " \ +"America/Havana" " " \ +"America/Hermosillo" " " \ +"America/Indiana/Indianapolis" " " \ +"America/Indiana/Knox" " " \ +"America/Indiana/Marengo" " " \ +"America/Indiana/Petersburg" " " \ +"America/Indiana/Tell_City" " " \ +"America/Indiana/Vevay" " " \ +"America/Indiana/Vincennes" " " \ +"America/Indiana/Winamac" " " \ +"America/Indianapolis" " " \ +"America/Inuvik" " " \ +"America/Iqaluit" " " \ +"America/Jamaica" " " \ +"America/Jujuy" " " \ +"America/Juneau" " " \ +"America/Kentucky/Louisville" " " \ +"America/Kentucky/Monticello" " " \ +"America/Knox_IN" " " \ +"America/Kralendijk" " " \ +"America/La_Paz" " " \ +"America/Lima" " " \ +"America/Los_Angeles" " " \ +"America/Louisville" " " \ +"America/Lower_Princes" " " \ +"America/Maceio" " " \ +"America/Managua" " " \ +"America/Manaus" " " \ +"America/Marigot" " " \ +"America/Martinique" " " \ +"America/Matamoros" " " \ +"America/Mazatlan" " " \ +"America/Mendoza" " " \ +"America/Menominee" " " \ +"America/Merida" " " \ +"America/Metlakatla" " " \ +"America/Mexico_City" " " \ +"America/Miquelon" " " \ +"America/Moncton" " " \ +"America/Monterrey" " " \ +"America/Montevideo" " " \ +"America/Montreal" " " \ +"America/Montserrat" " " \ +"America/Nassau" " " \ +"America/New_York" " " \ +"America/Nipigon" " " \ +"America/Nome" " " \ +"America/Noronha" " " \ +"America/North_Dakota/Beulah" " " \ +"America/North_Dakota/Center" " " \ +"America/North_Dakota/New_Salem" " " \ +"America/Ojinaga" " " \ +"America/Panama" " " \ +"America/Pangnirtung" " " \ +"America/Paramaribo" " " \ +"America/Phoenix" " " \ +"America/Port-au-Prince" " " \ +"America/Port_of_Spain" " " \ +"America/Porto_Acre" " " \ +"America/Porto_Velho" " " \ +"America/Puerto_Rico" " " \ +"America/Rainy_River" " " \ +"America/Rankin_Inlet" " " \ +"America/Recife" " " \ +"America/Regina" " " \ +"America/Resolute" " " \ +"America/Rio_Branco" " " \ +"America/Rosario" " " \ +"America/Santa_Isabel" " " \ +"America/Santarem" " " \ +"America/Santiago" " " \ +"America/Santo_Domingo" " " \ +"America/Sao_Paulo" " " \ +"America/Scoresbysund" " " \ +"America/Shiprock" " " \ +"America/Sitka" " " \ +"America/St_Barthelemy" " " \ +"America/St_Johns" " " \ +"America/St_Kitts" " " \ +"America/St_Lucia" " " \ +"America/St_Thomas" " " \ +"America/St_Vincent" " " \ +"America/Swift_Current" " " \ +"America/Tegucigalpa" " " \ +"America/Thule" " " \ +"America/Thunder_Bay" " " \ +"America/Tijuana" " " \ +"America/Toronto" " " \ +"America/Tortola" " " \ +"America/Vancouver" " " \ +"America/Virgin" " " \ +"America/Whitehorse" " " \ +"America/Winnipeg" " " \ +"America/Yakutat" " " \ +"America/Yellowknife" " " \ +"Antarctica/Casey" " " \ +"Antarctica/Davis" " " \ +"Antarctica/DumontDUrville" " " \ +"Antarctica/Macquarie" " " \ +"Antarctica/Mawson" " " \ +"Antarctica/McMurdo" " " \ +"Antarctica/Palmer" " " \ +"Antarctica/Rothera" " " \ +"Antarctica/South_Pole" " " \ +"Antarctica/Syowa" " " \ +"Antarctica/Troll" " " \ +"Antarctica/Vostok" " " \ +"Arctic/Longyearbyen" " " \ +"Asia/Aden" " " \ +"Asia/Almaty" " " \ +"Asia/Amman" " " \ +"Asia/Anadyr" " " \ +"Asia/Aqtau" " " \ +"Asia/Aqtobe" " " \ +"Asia/Ashgabat" " " \ +"Asia/Ashkhabad" " " \ +"Asia/Baghdad" " " \ +"Asia/Bahrain" " " \ +"Asia/Baku" " " \ +"Asia/Bangkok" " " \ +"Asia/Beirut" " " \ +"Asia/Bishkek" " " \ +"Asia/Brunei" " " \ +"Asia/Calcutta" " " \ +"Asia/Chita" " " \ +"Asia/Choibalsan" " " \ +"Asia/Chongqing" " " \ +"Asia/Chungking" " " \ +"Asia/Colombo" " " \ +"Asia/Dacca" " " \ +"Asia/Damascus" " " \ +"Asia/Dhaka" " " \ +"Asia/Dili" " " \ +"Asia/Dubai" " " \ +"Asia/Dushanbe" " " \ +"Asia/Gaza" " " \ +"Asia/Harbin" " " \ +"Asia/Hebron" " " \ +"Asia/Ho_Chi_Minh" " " \ +"Asia/Hong_Kong" " " \ +"Asia/Hovd" " " \ +"Asia/Irkutsk" " " \ +"Asia/Istanbul" " " \ +"Asia/Jakarta" " " \ +"Asia/Jayapura" " " \ +"Asia/Jerusalem" " " \ +"Asia/Kabul" " " \ +"Asia/Kamchatka" " " \ +"Asia/Karachi" " " \ +"Asia/Kashgar" " " \ +"Asia/Kathmandu" " " \ +"Asia/Katmandu" " " \ +"Asia/Khandyga" " " \ +"Asia/Kolkata" " " \ +"Asia/Krasnoyarsk" " " \ +"Asia/Kuala_Lumpur" " " \ +"Asia/Kuching" " " \ +"Asia/Kuwait" " " \ +"Asia/Macao" " " \ +"Asia/Macau" " " \ +"Asia/Magadan" " " \ +"Asia/Makassar" " " \ +"Asia/Manila" " " \ +"Asia/Muscat" " " \ +"Asia/Nicosia" " " \ +"Asia/Novokuznetsk" " " \ +"Asia/Novosibirsk" " " \ +"Asia/Omsk" " " \ +"Asia/Oral" " " \ +"Asia/Phnom_Penh" " " \ +"Asia/Pontianak" " " \ +"Asia/Pyongyang" " " \ +"Asia/Qatar" " " \ +"Asia/Qyzylorda" " " \ +"Asia/Rangoon" " " \ +"Asia/Riyadh" " " \ +"Asia/Saigon" " " \ +"Asia/Sakhalin" " " \ +"Asia/Samarkand" " " \ +"Asia/Seoul" " " \ +"Asia/Shanghai" " " \ +"Asia/Singapore" " " \ +"Asia/Srednekolymsk" " " \ +"Asia/Taipei" " " \ +"Asia/Tashkent" " " \ +"Asia/Tbilisi" " " \ +"Asia/Tehran" " " \ +"Asia/Tel_Aviv" " " \ +"Asia/Thimbu" " " \ +"Asia/Thimphu" " " \ +"Asia/Tokyo" " " \ +"Asia/Ujung_Pandang" " " \ +"Asia/Ulaanbaatar" " " \ +"Asia/Ulan_Bator" " " \ +"Asia/Urumqi" " " \ +"Asia/Ust-Nera" " " \ +"Asia/Vientiane" " " \ +"Asia/Vladivostok" " " \ +"Asia/Yakutsk" " " \ +"Asia/Yekaterinburg" " " \ +"Asia/Yerevan" " " \ +"Atlantic/Azores" " " \ +"Atlantic/Bermuda" " " \ +"Atlantic/Canary" " " \ +"Atlantic/Cape_Verde" " " \ +"Atlantic/Faeroe" " " \ +"Atlantic/Faroe" " " \ +"Atlantic/Jan_Mayen" " " \ +"Atlantic/Madeira" " " \ +"Atlantic/Reykjavik" " " \ +"Atlantic/South_Georgia" " " \ +"Atlantic/St_Helena" " " \ +"Atlantic/Stanley" " " \ +"Australia/ACT" " " \ +"Australia/Adelaide" " " \ +"Australia/Brisbane" " " \ +"Australia/Broken_Hill" " " \ +"Australia/Canberra" " " \ +"Australia/Currie" " " \ +"Australia/Darwin" " " \ +"Australia/Eucla" " " \ +"Australia/Hobart" " " \ +"Australia/LHI" " " \ +"Australia/Lindeman" " " \ +"Australia/Lord_Howe" " " \ +"Australia/Melbourne" " " \ +"Australia/NSW" " " \ +"Australia/North" " " \ +"Australia/Perth" " " \ +"Australia/Queensland" " " \ +"Australia/South" " " \ +"Australia/Sydney" " " \ +"Australia/Tasmania" " " \ +"Australia/Victoria" " " \ +"Australia/West" " " \ +"Australia/Yancowinna" " " \ +"Brazil/Acre" " " \ +"Brazil/DeNoronha" " " \ +"Brazil/East" " " \ +"Brazil/West" " " \ +"CET" " " \ +"CST6CDT" " " \ +"Canada/Atlantic" " " \ +"Canada/Central" " " \ +"Canada/East-Saskatchewan" " " \ +"Canada/Eastern" " " \ +"Canada/Mountain" " " \ +"Canada/Newfoundland" " " \ +"Canada/Pacific" " " \ +"Canada/Saskatchewan" " " \ +"Canada/Yukon" " " \ +"Chile/Continental" " " \ +"Chile/EasterIsland" " " \ +"Cuba" " " \ +"EET" " " \ +"EST" " " \ +"EST5EDT" " " \ +"Egypt" " " \ +"Eire" " " \ +"Etc/GMT" " " \ +"Etc/GMT+0" " " \ +"Etc/GMT+1" " " \ +"Etc/GMT+10" " " \ +"Etc/GMT+11" " " \ +"Etc/GMT+12" " " \ +"Etc/GMT+2" " " \ +"Etc/GMT+3" " " \ +"Etc/GMT+4" " " \ +"Etc/GMT+5" " " \ +"Etc/GMT+6" " " \ +"Etc/GMT+7" " " \ +"Etc/GMT+8" " " \ +"Etc/GMT+9" " " \ +"Etc/GMT-0" " " \ +"Etc/GMT-1" " " \ +"Etc/GMT-10" " " \ +"Etc/GMT-11" " " \ +"Etc/GMT-12" " " \ +"Etc/GMT-13" " " \ +"Etc/GMT-14" " " \ +"Etc/GMT-2" " " \ +"Etc/GMT-3" " " \ +"Etc/GMT-4" " " \ +"Etc/GMT-5" " " \ +"Etc/GMT-6" " " \ +"Etc/GMT-7" " " \ +"Etc/GMT-8" " " \ +"Etc/GMT-9" " " \ +"Etc/GMT0" " " \ +"Etc/Greenwich" " " \ +"Etc/UCT" " " \ +"Etc/UTC" " " \ +"Etc/Universal" " " \ +"Etc/Zulu" " " \ +"Europe/Amsterdam" " " \ +"Europe/Andorra" " " \ +"Europe/Athens" " " \ +"Europe/Belfast" " " \ +"Europe/Belgrade" " " \ +"Europe/Berlin" " " \ +"Europe/Bratislava" " " \ +"Europe/Brussels" " " \ +"Europe/Bucharest" " " \ +"Europe/Budapest" " " \ +"Europe/Busingen" " " \ +"Europe/Chisinau" " " \ +"Europe/Copenhagen" " " \ +"Europe/Dublin" " " \ +"Europe/Gibraltar" " " \ +"Europe/Guernsey" " " \ +"Europe/Helsinki" " " \ +"Europe/Isle_of_Man" " " \ +"Europe/Istanbul" " " \ +"Europe/Jersey" " " \ +"Europe/Kaliningrad" " " \ +"Europe/Kiev" " " \ +"Europe/Lisbon" " " \ +"Europe/Ljubljana" " " \ +"Europe/London" " " \ +"Europe/Luxembourg" " " \ +"Europe/Madrid" " " \ +"Europe/Malta" " " \ +"Europe/Mariehamn" " " \ +"Europe/Minsk" " " \ +"Europe/Monaco" " " \ +"Europe/Moscow" " " \ +"Europe/Nicosia" " " \ +"Europe/Oslo" " " \ +"Europe/Paris" " " \ +"Europe/Podgorica" " " \ +"Europe/Prague" " " \ +"Europe/Riga" " " \ +"Europe/Rome" " " \ +"Europe/Samara" " " \ +"Europe/San_Marino" " " \ +"Europe/Sarajevo" " " \ +"Europe/Simferopol" " " \ +"Europe/Skopje" " " \ +"Europe/Sofia" " " \ +"Europe/Stockholm" " " \ +"Europe/Tallinn" " " \ +"Europe/Tirane" " " \ +"Europe/Tiraspol" " " \ +"Europe/Uzhgorod" " " \ +"Europe/Vaduz" " " \ +"Europe/Vatican" " " \ +"Europe/Vienna" " " \ +"Europe/Vilnius" " " \ +"Europe/Volgograd" " " \ +"Europe/Warsaw" " " \ +"Europe/Zagreb" " " \ +"Europe/Zaporozhye" " " \ +"Europe/Zurich" " " \ +"Factory" " " \ +"GB" " " \ +"GB-Eire" " " \ +"GMT" " " \ +"GMT+0" " " \ +"GMT-0" " " \ +"GMT0" " " \ +"Greenwich" " " \ +"HST" " " \ +"Hongkong" " " \ +"Iceland" " " \ +"Indian/Antananarivo" " " \ +"Indian/Chagos" " " \ +"Indian/Christmas" " " \ +"Indian/Cocos" " " \ +"Indian/Comoro" " " \ +"Indian/Kerguelen" " " \ +"Indian/Mahe" " " \ +"Indian/Maldives" " " \ +"Indian/Mauritius" " " \ +"Indian/Mayotte" " " \ +"Indian/Reunion" " " \ +"Iran" " " \ +"Israel" " " \ +"Jamaica" " " \ +"Japan" " " \ +"Kwajalein" " " \ +"Libya" " " \ +"MET" " " \ +"MST" " " \ +"MST7MDT" " " \ +"Mexico/BajaNorte" " " \ +"Mexico/BajaSur" " " \ +"Mexico/General" " " \ +"NZ" " " \ +"NZ-CHAT" " " \ +"Navajo" " " \ +"PRC" " " \ +"PST8PDT" " " \ +"Pacific/Apia" " " \ +"Pacific/Auckland" " " \ +"Pacific/Bougainville" " " \ +"Pacific/Chatham" " " \ +"Pacific/Chuuk" " " \ +"Pacific/Easter" " " \ +"Pacific/Efate" " " \ +"Pacific/Enderbury" " " \ +"Pacific/Fakaofo" " " \ +"Pacific/Fiji" " " \ +"Pacific/Funafuti" " " \ +"Pacific/Galapagos" " " \ +"Pacific/Gambier" " " \ +"Pacific/Guadalcanal" " " \ +"Pacific/Guam" " " \ +"Pacific/Honolulu" " " \ +"Pacific/Johnston" " " \ +"Pacific/Kiritimati" " " \ +"Pacific/Kosrae" " " \ +"Pacific/Kwajalein" " " \ +"Pacific/Majuro" " " \ +"Pacific/Marquesas" " " \ +"Pacific/Midway" " " \ +"Pacific/Nauru" " " \ +"Pacific/Niue" " " \ +"Pacific/Norfolk" " " \ +"Pacific/Noumea" " " \ +"Pacific/Pago_Pago" " " \ +"Pacific/Palau" " " \ +"Pacific/Pitcairn" " " \ +"Pacific/Pohnpei" " " \ +"Pacific/Ponape" " " \ +"Pacific/Port_Moresby" " " \ +"Pacific/Rarotonga" " " \ +"Pacific/Saipan" " " \ +"Pacific/Samoa" " " \ +"Pacific/Tahiti" " " \ +"Pacific/Tarawa" " " \ +"Pacific/Tongatapu" " " \ +"Pacific/Truk" " " \ +"Pacific/Wake" " " \ +"Pacific/Wallis" " " \ +"Pacific/Yap" " " \ +"Poland" " " \ +"Portugal" " " \ +"ROC" " " \ +"ROK" " " \ +"Singapore" " " \ +"Turkey" " " \ +"UCT" " " \ +"UTC" " " \ +"Universal" " " \ +"W-SU" " " \ +"WET" " " \ +"Zulu" " " \ +"posix/Africa/Abidjan" " " \ +"posix/Africa/Accra" " " \ +"posix/Africa/Addis_Ababa" " " \ +"posix/Africa/Algiers" " " \ +"posix/Africa/Asmara" " " \ +"posix/Africa/Asmera" " " \ +"posix/Africa/Bamako" " " \ +"posix/Africa/Bangui" " " \ +"posix/Africa/Banjul" " " \ +"posix/Africa/Bissau" " " \ +"posix/Africa/Blantyre" " " \ +"posix/Africa/Brazzaville" " " \ +"posix/Africa/Bujumbura" " " \ +"posix/Africa/Cairo" " " \ +"posix/Africa/Casablanca" " " \ +"posix/Africa/Ceuta" " " \ +"posix/Africa/Conakry" " " \ +"posix/Africa/Dakar" " " \ +"posix/Africa/Dar_es_Salaam" " " \ +"posix/Africa/Djibouti" " " \ +"posix/Africa/Douala" " " \ +"posix/Africa/El_Aaiun" " " \ +"posix/Africa/Freetown" " " \ +"posix/Africa/Gaborone" " " \ +"posix/Africa/Harare" " " \ +"posix/Africa/Johannesburg" " " \ +"posix/Africa/Juba" " " \ +"posix/Africa/Kampala" " " \ +"posix/Africa/Khartoum" " " \ +"posix/Africa/Kigali" " " \ +"posix/Africa/Kinshasa" " " \ +"posix/Africa/Lagos" " " \ +"posix/Africa/Libreville" " " \ +"posix/Africa/Lome" " " \ +"posix/Africa/Luanda" " " \ +"posix/Africa/Lubumbashi" " " \ +"posix/Africa/Lusaka" " " \ +"posix/Africa/Malabo" " " \ +"posix/Africa/Maputo" " " \ +"posix/Africa/Maseru" " " \ +"posix/Africa/Mbabane" " " \ +"posix/Africa/Mogadishu" " " \ +"posix/Africa/Monrovia" " " \ +"posix/Africa/Nairobi" " " \ +"posix/Africa/Ndjamena" " " \ +"posix/Africa/Niamey" " " \ +"posix/Africa/Nouakchott" " " \ +"posix/Africa/Ouagadougou" " " \ +"posix/Africa/Porto-Novo" " " \ +"posix/Africa/Sao_Tome" " " \ +"posix/Africa/Timbuktu" " " \ +"posix/Africa/Tripoli" " " \ +"posix/Africa/Tunis" " " \ +"posix/Africa/Windhoek" " " \ +"posix/America/Adak" " " \ +"posix/America/Anchorage" " " \ +"posix/America/Anguilla" " " \ +"posix/America/Antigua" " " \ +"posix/America/Araguaina" " " \ +"posix/America/Argentina/Buenos_Aires" " " \ +"posix/America/Argentina/Catamarca" " " \ +"posix/America/Argentina/ComodRivadavia" " " \ +"posix/America/Argentina/Cordoba" " " \ +"posix/America/Argentina/Jujuy" " " \ +"posix/America/Argentina/La_Rioja" " " \ +"posix/America/Argentina/Mendoza" " " \ +"posix/America/Argentina/Rio_Gallegos" " " \ +"posix/America/Argentina/Salta" " " \ +"posix/America/Argentina/San_Juan" " " \ +"posix/America/Argentina/San_Luis" " " \ +"posix/America/Argentina/Tucuman" " " \ +"posix/America/Argentina/Ushuaia" " " \ +"posix/America/Aruba" " " \ +"posix/America/Asuncion" " " \ +"posix/America/Atikokan" " " \ +"posix/America/Atka" " " \ +"posix/America/Bahia" " " \ +"posix/America/Bahia_Banderas" " " \ +"posix/America/Barbados" " " \ +"posix/America/Belem" " " \ +"posix/America/Belize" " " \ +"posix/America/Blanc-Sablon" " " \ +"posix/America/Boa_Vista" " " \ +"posix/America/Bogota" " " \ +"posix/America/Boise" " " \ +"posix/America/Buenos_Aires" " " \ +"posix/America/Cambridge_Bay" " " \ +"posix/America/Campo_Grande" " " \ +"posix/America/Cancun" " " \ +"posix/America/Caracas" " " \ +"posix/America/Catamarca" " " \ +"posix/America/Cayenne" " " \ +"posix/America/Cayman" " " \ +"posix/America/Chicago" " " \ +"posix/America/Chihuahua" " " \ +"posix/America/Coral_Harbour" " " \ +"posix/America/Cordoba" " " \ +"posix/America/Costa_Rica" " " \ +"posix/America/Creston" " " \ +"posix/America/Cuiaba" " " \ +"posix/America/Curacao" " " \ +"posix/America/Danmarkshavn" " " \ +"posix/America/Dawson" " " \ +"posix/America/Dawson_Creek" " " \ +"posix/America/Denver" " " \ +"posix/America/Detroit" " " \ +"posix/America/Dominica" " " \ +"posix/America/Edmonton" " " \ +"posix/America/Eirunepe" " " \ +"posix/America/El_Salvador" " " \ +"posix/America/Ensenada" " " \ +"posix/America/Fort_Wayne" " " \ +"posix/America/Fortaleza" " " \ +"posix/America/Glace_Bay" " " \ +"posix/America/Godthab" " " \ +"posix/America/Goose_Bay" " " \ +"posix/America/Grand_Turk" " " \ +"posix/America/Grenada" " " \ +"posix/America/Guadeloupe" " " \ +"posix/America/Guatemala" " " \ +"posix/America/Guayaquil" " " \ +"posix/America/Guyana" " " \ +"posix/America/Halifax" " " \ +"posix/America/Havana" " " \ +"posix/America/Hermosillo" " " \ +"posix/America/Indiana/Indianapolis" " " \ +"posix/America/Indiana/Knox" " " \ +"posix/America/Indiana/Marengo" " " \ +"posix/America/Indiana/Petersburg" " " \ +"posix/America/Indiana/Tell_City" " " \ +"posix/America/Indiana/Vevay" " " \ +"posix/America/Indiana/Vincennes" " " \ +"posix/America/Indiana/Winamac" " " \ +"posix/America/Indianapolis" " " \ +"posix/America/Inuvik" " " \ +"posix/America/Iqaluit" " " \ +"posix/America/Jamaica" " " \ +"posix/America/Jujuy" " " \ +"posix/America/Juneau" " " \ +"posix/America/Kentucky/Louisville" " " \ +"posix/America/Kentucky/Monticello" " " \ +"posix/America/Knox_IN" " " \ +"posix/America/Kralendijk" " " \ +"posix/America/La_Paz" " " \ +"posix/America/Lima" " " \ +"posix/America/Los_Angeles" " " \ +"posix/America/Louisville" " " \ +"posix/America/Lower_Princes" " " \ +"posix/America/Maceio" " " \ +"posix/America/Managua" " " \ +"posix/America/Manaus" " " \ +"posix/America/Marigot" " " \ +"posix/America/Martinique" " " \ +"posix/America/Matamoros" " " \ +"posix/America/Mazatlan" " " \ +"posix/America/Mendoza" " " \ +"posix/America/Menominee" " " \ +"posix/America/Merida" " " \ +"posix/America/Metlakatla" " " \ +"posix/America/Mexico_City" " " \ +"posix/America/Miquelon" " " \ +"posix/America/Moncton" " " \ +"posix/America/Monterrey" " " \ +"posix/America/Montevideo" " " \ +"posix/America/Montreal" " " \ +"posix/America/Montserrat" " " \ +"posix/America/Nassau" " " \ +"posix/America/New_York" " " \ +"posix/America/Nipigon" " " \ +"posix/America/Nome" " " \ +"posix/America/Noronha" " " \ +"posix/America/North_Dakota/Beulah" " " \ +"posix/America/North_Dakota/Center" " " \ +"posix/America/North_Dakota/New_Salem" " " \ +"posix/America/Ojinaga" " " \ +"posix/America/Panama" " " \ +"posix/America/Pangnirtung" " " \ +"posix/America/Paramaribo" " " \ +"posix/America/Phoenix" " " \ +"posix/America/Port-au-Prince" " " \ +"posix/America/Port_of_Spain" " " \ +"posix/America/Porto_Acre" " " \ +"posix/America/Porto_Velho" " " \ +"posix/America/Puerto_Rico" " " \ +"posix/America/Rainy_River" " " \ +"posix/America/Rankin_Inlet" " " \ +"posix/America/Recife" " " \ +"posix/America/Regina" " " \ +"posix/America/Resolute" " " \ +"posix/America/Rio_Branco" " " \ +"posix/America/Rosario" " " \ +"posix/America/Santa_Isabel" " " \ +"posix/America/Santarem" " " \ +"posix/America/Santiago" " " \ +"posix/America/Santo_Domingo" " " \ +"posix/America/Sao_Paulo" " " \ +"posix/America/Scoresbysund" " " \ +"posix/America/Shiprock" " " \ +"posix/America/Sitka" " " \ +"posix/America/St_Barthelemy" " " \ +"posix/America/St_Johns" " " \ +"posix/America/St_Kitts" " " \ +"posix/America/St_Lucia" " " \ +"posix/America/St_Thomas" " " \ +"posix/America/St_Vincent" " " \ +"posix/America/Swift_Current" " " \ +"posix/America/Tegucigalpa" " " \ +"posix/America/Thule" " " \ +"posix/America/Thunder_Bay" " " \ +"posix/America/Tijuana" " " \ +"posix/America/Toronto" " " \ +"posix/America/Tortola" " " \ +"posix/America/Vancouver" " " \ +"posix/America/Virgin" " " \ +"posix/America/Whitehorse" " " \ +"posix/America/Winnipeg" " " \ +"posix/America/Yakutat" " " \ +"posix/America/Yellowknife" " " \ +"posix/Antarctica/Casey" " " \ +"posix/Antarctica/Davis" " " \ +"posix/Antarctica/DumontDUrville" " " \ +"posix/Antarctica/Macquarie" " " \ +"posix/Antarctica/Mawson" " " \ +"posix/Antarctica/McMurdo" " " \ +"posix/Antarctica/Palmer" " " \ +"posix/Antarctica/Rothera" " " \ +"posix/Antarctica/South_Pole" " " \ +"posix/Antarctica/Syowa" " " \ +"posix/Antarctica/Troll" " " \ +"posix/Antarctica/Vostok" " " \ +"posix/Arctic/Longyearbyen" " " \ +"posix/Asia/Aden" " " \ +"posix/Asia/Almaty" " " \ +"posix/Asia/Amman" " " \ +"posix/Asia/Anadyr" " " \ +"posix/Asia/Aqtau" " " \ +"posix/Asia/Aqtobe" " " \ +"posix/Asia/Ashgabat" " " \ +"posix/Asia/Ashkhabad" " " \ +"posix/Asia/Baghdad" " " \ +"posix/Asia/Bahrain" " " \ +"posix/Asia/Baku" " " \ +"posix/Asia/Bangkok" " " \ +"posix/Asia/Beirut" " " \ +"posix/Asia/Bishkek" " " \ +"posix/Asia/Brunei" " " \ +"posix/Asia/Calcutta" " " \ +"posix/Asia/Chita" " " \ +"posix/Asia/Choibalsan" " " \ +"posix/Asia/Chongqing" " " \ +"posix/Asia/Chungking" " " \ +"posix/Asia/Colombo" " " \ +"posix/Asia/Dacca" " " \ +"posix/Asia/Damascus" " " \ +"posix/Asia/Dhaka" " " \ +"posix/Asia/Dili" " " \ +"posix/Asia/Dubai" " " \ +"posix/Asia/Dushanbe" " " \ +"posix/Asia/Gaza" " " \ +"posix/Asia/Harbin" " " \ +"posix/Asia/Hebron" " " \ +"posix/Asia/Ho_Chi_Minh" " " \ +"posix/Asia/Hong_Kong" " " \ +"posix/Asia/Hovd" " " \ +"posix/Asia/Irkutsk" " " \ +"posix/Asia/Istanbul" " " \ +"posix/Asia/Jakarta" " " \ +"posix/Asia/Jayapura" " " \ +"posix/Asia/Jerusalem" " " \ +"posix/Asia/Kabul" " " \ +"posix/Asia/Kamchatka" " " \ +"posix/Asia/Karachi" " " \ +"posix/Asia/Kashgar" " " \ +"posix/Asia/Kathmandu" " " \ +"posix/Asia/Katmandu" " " \ +"posix/Asia/Khandyga" " " \ +"posix/Asia/Kolkata" " " \ +"posix/Asia/Krasnoyarsk" " " \ +"posix/Asia/Kuala_Lumpur" " " \ +"posix/Asia/Kuching" " " \ +"posix/Asia/Kuwait" " " \ +"posix/Asia/Macao" " " \ +"posix/Asia/Macau" " " \ +"posix/Asia/Magadan" " " \ +"posix/Asia/Makassar" " " \ +"posix/Asia/Manila" " " \ +"posix/Asia/Muscat" " " \ +"posix/Asia/Nicosia" " " \ +"posix/Asia/Novokuznetsk" " " \ +"posix/Asia/Novosibirsk" " " \ +"posix/Asia/Omsk" " " \ +"posix/Asia/Oral" " " \ +"posix/Asia/Phnom_Penh" " " \ +"posix/Asia/Pontianak" " " \ +"posix/Asia/Pyongyang" " " \ +"posix/Asia/Qatar" " " \ +"posix/Asia/Qyzylorda" " " \ +"posix/Asia/Rangoon" " " \ +"posix/Asia/Riyadh" " " \ +"posix/Asia/Saigon" " " \ +"posix/Asia/Sakhalin" " " \ +"posix/Asia/Samarkand" " " \ +"posix/Asia/Seoul" " " \ +"posix/Asia/Shanghai" " " \ +"posix/Asia/Singapore" " " \ +"posix/Asia/Srednekolymsk" " " \ +"posix/Asia/Taipei" " " \ +"posix/Asia/Tashkent" " " \ +"posix/Asia/Tbilisi" " " \ +"posix/Asia/Tehran" " " \ +"posix/Asia/Tel_Aviv" " " \ +"posix/Asia/Thimbu" " " \ +"posix/Asia/Thimphu" " " \ +"posix/Asia/Tokyo" " " \ +"posix/Asia/Ujung_Pandang" " " \ +"posix/Asia/Ulaanbaatar" " " \ +"posix/Asia/Ulan_Bator" " " \ +"posix/Asia/Urumqi" " " \ +"posix/Asia/Ust-Nera" " " \ +"posix/Asia/Vientiane" " " \ +"posix/Asia/Vladivostok" " " \ +"posix/Asia/Yakutsk" " " \ +"posix/Asia/Yekaterinburg" " " \ +"posix/Asia/Yerevan" " " \ +"posix/Atlantic/Azores" " " \ +"posix/Atlantic/Bermuda" " " \ +"posix/Atlantic/Canary" " " \ +"posix/Atlantic/Cape_Verde" " " \ +"posix/Atlantic/Faeroe" " " \ +"posix/Atlantic/Faroe" " " \ +"posix/Atlantic/Jan_Mayen" " " \ +"posix/Atlantic/Madeira" " " \ +"posix/Atlantic/Reykjavik" " " \ +"posix/Atlantic/South_Georgia" " " \ +"posix/Atlantic/St_Helena" " " \ +"posix/Atlantic/Stanley" " " \ +"posix/Australia/ACT" " " \ +"posix/Australia/Adelaide" " " \ +"posix/Australia/Brisbane" " " \ +"posix/Australia/Broken_Hill" " " \ +"posix/Australia/Canberra" " " \ +"posix/Australia/Currie" " " \ +"posix/Australia/Darwin" " " \ +"posix/Australia/Eucla" " " \ +"posix/Australia/Hobart" " " \ +"posix/Australia/LHI" " " \ +"posix/Australia/Lindeman" " " \ +"posix/Australia/Lord_Howe" " " \ +"posix/Australia/Melbourne" " " \ +"posix/Australia/NSW" " " \ +"posix/Australia/North" " " \ +"posix/Australia/Perth" " " \ +"posix/Australia/Queensland" " " \ +"posix/Australia/South" " " \ +"posix/Australia/Sydney" " " \ +"posix/Australia/Tasmania" " " \ +"posix/Australia/Victoria" " " \ +"posix/Australia/West" " " \ +"posix/Australia/Yancowinna" " " \ +"posix/Brazil/Acre" " " \ +"posix/Brazil/DeNoronha" " " \ +"posix/Brazil/East" " " \ +"posix/Brazil/West" " " \ +"posix/CET" " " \ +"posix/CST6CDT" " " \ +"posix/Canada/Atlantic" " " \ +"posix/Canada/Central" " " \ +"posix/Canada/East-Saskatchewan" " " \ +"posix/Canada/Eastern" " " \ +"posix/Canada/Mountain" " " \ +"posix/Canada/Newfoundland" " " \ +"posix/Canada/Pacific" " " \ +"posix/Canada/Saskatchewan" " " \ +"posix/Canada/Yukon" " " \ +"posix/Chile/Continental" " " \ +"posix/Chile/EasterIsland" " " \ +"posix/Cuba" " " \ +"posix/EET" " " \ +"posix/EST" " " \ +"posix/EST5EDT" " " \ +"posix/Egypt" " " \ +"posix/Eire" " " \ +"posix/Etc/GMT" " " \ +"posix/Etc/GMT+0" " " \ +"posix/Etc/GMT+1" " " \ +"posix/Etc/GMT+10" " " \ +"posix/Etc/GMT+11" " " \ +"posix/Etc/GMT+12" " " \ +"posix/Etc/GMT+2" " " \ +"posix/Etc/GMT+3" " " \ +"posix/Etc/GMT+4" " " \ +"posix/Etc/GMT+5" " " \ +"posix/Etc/GMT+6" " " \ +"posix/Etc/GMT+7" " " \ +"posix/Etc/GMT+8" " " \ +"posix/Etc/GMT+9" " " \ +"posix/Etc/GMT-0" " " \ +"posix/Etc/GMT-1" " " \ +"posix/Etc/GMT-10" " " \ +"posix/Etc/GMT-11" " " \ +"posix/Etc/GMT-12" " " \ +"posix/Etc/GMT-13" " " \ +"posix/Etc/GMT-14" " " \ +"posix/Etc/GMT-2" " " \ +"posix/Etc/GMT-3" " " \ +"posix/Etc/GMT-4" " " \ +"posix/Etc/GMT-5" " " \ +"posix/Etc/GMT-6" " " \ +"posix/Etc/GMT-7" " " \ +"posix/Etc/GMT-8" " " \ +"posix/Etc/GMT-9" " " \ +"posix/Etc/GMT0" " " \ +"posix/Etc/Greenwich" " " \ +"posix/Etc/UCT" " " \ +"posix/Etc/UTC" " " \ +"posix/Etc/Universal" " " \ +"posix/Etc/Zulu" " " \ +"posix/Europe/Amsterdam" " " \ +"posix/Europe/Andorra" " " \ +"posix/Europe/Athens" " " \ +"posix/Europe/Belfast" " " \ +"posix/Europe/Belgrade" " " \ +"posix/Europe/Berlin" " " \ +"posix/Europe/Bratislava" " " \ +"posix/Europe/Brussels" " " \ +"posix/Europe/Bucharest" " " \ +"posix/Europe/Budapest" " " \ +"posix/Europe/Busingen" " " \ +"posix/Europe/Chisinau" " " \ +"posix/Europe/Copenhagen" " " \ +"posix/Europe/Dublin" " " \ +"posix/Europe/Gibraltar" " " \ +"posix/Europe/Guernsey" " " \ +"posix/Europe/Helsinki" " " \ +"posix/Europe/Isle_of_Man" " " \ +"posix/Europe/Istanbul" " " \ +"posix/Europe/Jersey" " " \ +"posix/Europe/Kaliningrad" " " \ +"posix/Europe/Kiev" " " \ +"posix/Europe/Lisbon" " " \ +"posix/Europe/Ljubljana" " " \ +"posix/Europe/London" " " \ +"posix/Europe/Luxembourg" " " \ +"posix/Europe/Madrid" " " \ +"posix/Europe/Malta" " " \ +"posix/Europe/Mariehamn" " " \ +"posix/Europe/Minsk" " " \ +"posix/Europe/Monaco" " " \ +"posix/Europe/Moscow" " " \ +"posix/Europe/Nicosia" " " \ +"posix/Europe/Oslo" " " \ +"posix/Europe/Paris" " " \ +"posix/Europe/Podgorica" " " \ +"posix/Europe/Prague" " " \ +"posix/Europe/Riga" " " \ +"posix/Europe/Rome" " " \ +"posix/Europe/Samara" " " \ +"posix/Europe/San_Marino" " " \ +"posix/Europe/Sarajevo" " " \ +"posix/Europe/Simferopol" " " \ +"posix/Europe/Skopje" " " \ +"posix/Europe/Sofia" " " \ +"posix/Europe/Stockholm" " " \ +"posix/Europe/Tallinn" " " \ +"posix/Europe/Tirane" " " \ +"posix/Europe/Tiraspol" " " \ +"posix/Europe/Uzhgorod" " " \ +"posix/Europe/Vaduz" " " \ +"posix/Europe/Vatican" " " \ +"posix/Europe/Vienna" " " \ +"posix/Europe/Vilnius" " " \ +"posix/Europe/Volgograd" " " \ +"posix/Europe/Warsaw" " " \ +"posix/Europe/Zagreb" " " \ +"posix/Europe/Zaporozhye" " " \ +"posix/Europe/Zurich" " " \ +"posix/Factory" " " \ +"posix/GB" " " \ +"posix/GB-Eire" " " \ +"posix/GMT" " " \ +"posix/GMT+0" " " \ +"posix/GMT-0" " " \ +"posix/GMT0" " " \ +"posix/Greenwich" " " \ +"posix/HST" " " \ +"posix/Hongkong" " " \ +"posix/Iceland" " " \ +"posix/Indian/Antananarivo" " " \ +"posix/Indian/Chagos" " " \ +"posix/Indian/Christmas" " " \ +"posix/Indian/Cocos" " " \ +"posix/Indian/Comoro" " " \ +"posix/Indian/Kerguelen" " " \ +"posix/Indian/Mahe" " " \ +"posix/Indian/Maldives" " " \ +"posix/Indian/Mauritius" " " \ +"posix/Indian/Mayotte" " " \ +"posix/Indian/Reunion" " " \ +"posix/Iran" " " \ +"posix/Israel" " " \ +"posix/Jamaica" " " \ +"posix/Japan" " " \ +"posix/Kwajalein" " " \ +"posix/Libya" " " \ +"posix/MET" " " \ +"posix/MST" " " \ +"posix/MST7MDT" " " \ +"posix/Mexico/BajaNorte" " " \ +"posix/Mexico/BajaSur" " " \ +"posix/Mexico/General" " " \ +"posix/NZ" " " \ +"posix/NZ-CHAT" " " \ +"posix/Navajo" " " \ +"posix/PRC" " " \ +"posix/PST8PDT" " " \ +"posix/Pacific/Apia" " " \ +"posix/Pacific/Auckland" " " \ +"posix/Pacific/Bougainville" " " \ +"posix/Pacific/Chatham" " " \ +"posix/Pacific/Chuuk" " " \ +"posix/Pacific/Easter" " " \ +"posix/Pacific/Efate" " " \ +"posix/Pacific/Enderbury" " " \ +"posix/Pacific/Fakaofo" " " \ +"posix/Pacific/Fiji" " " \ +"posix/Pacific/Funafuti" " " \ +"posix/Pacific/Galapagos" " " \ +"posix/Pacific/Gambier" " " \ +"posix/Pacific/Guadalcanal" " " \ +"posix/Pacific/Guam" " " \ +"posix/Pacific/Honolulu" " " \ +"posix/Pacific/Johnston" " " \ +"posix/Pacific/Kiritimati" " " \ +"posix/Pacific/Kosrae" " " \ +"posix/Pacific/Kwajalein" " " \ +"posix/Pacific/Majuro" " " \ +"posix/Pacific/Marquesas" " " \ +"posix/Pacific/Midway" " " \ +"posix/Pacific/Nauru" " " \ +"posix/Pacific/Niue" " " \ +"posix/Pacific/Norfolk" " " \ +"posix/Pacific/Noumea" " " \ +"posix/Pacific/Pago_Pago" " " \ +"posix/Pacific/Palau" " " \ +"posix/Pacific/Pitcairn" " " \ +"posix/Pacific/Pohnpei" " " \ +"posix/Pacific/Ponape" " " \ +"posix/Pacific/Port_Moresby" " " \ +"posix/Pacific/Rarotonga" " " \ +"posix/Pacific/Saipan" " " \ +"posix/Pacific/Samoa" " " \ +"posix/Pacific/Tahiti" " " \ +"posix/Pacific/Tarawa" " " \ +"posix/Pacific/Tongatapu" " " \ +"posix/Pacific/Truk" " " \ +"posix/Pacific/Wake" " " \ +"posix/Pacific/Wallis" " " \ +"posix/Pacific/Yap" " " \ +"posix/Poland" " " \ +"posix/Portugal" " " \ +"posix/ROC" " " \ +"posix/ROK" " " \ +"posix/Singapore" " " \ +"posix/Turkey" " " \ +"posix/UCT" " " \ +"posix/US/Alaska" " " \ +"posix/US/Aleutian" " " \ +"posix/US/Arizona" " " \ +"posix/US/Central" " " \ +"posix/US/East-Indiana" " " \ +"posix/US/Eastern" " " \ +"posix/US/Hawaii" " " \ +"posix/US/Indiana-Starke" " " \ +"posix/US/Michigan" " " \ +"posix/US/Mountain" " " \ +"posix/US/Pacific" " " \ +"posix/US/Pacific-New" " " \ +"posix/US/Samoa" " " \ +"posix/UTC" " " \ +"posix/Universal" " " \ +"posix/W-SU" " " \ +"posix/WET" " " \ +"posix/Zulu" " " \ +"posix/localtime" " " \ +"posix/posixrules" " " \ +"posixrules" " " \ +"right/Africa/Abidjan" " " \ +"right/Africa/Accra" " " \ +"right/Africa/Addis_Ababa" " " \ +"right/Africa/Algiers" " " \ +"right/Africa/Asmara" " " \ +"right/Africa/Asmera" " " \ +"right/Africa/Bamako" " " \ +"right/Africa/Bangui" " " \ +"right/Africa/Banjul" " " \ +"right/Africa/Bissau" " " \ +"right/Africa/Blantyre" " " \ +"right/Africa/Brazzaville" " " \ +"right/Africa/Bujumbura" " " \ +"right/Africa/Cairo" " " \ +"right/Africa/Casablanca" " " \ +"right/Africa/Ceuta" " " \ +"right/Africa/Conakry" " " \ +"right/Africa/Dakar" " " \ +"right/Africa/Dar_es_Salaam" " " \ +"right/Africa/Djibouti" " " \ +"right/Africa/Douala" " " \ +"right/Africa/El_Aaiun" " " \ +"right/Africa/Freetown" " " \ +"right/Africa/Gaborone" " " \ +"right/Africa/Harare" " " \ +"right/Africa/Johannesburg" " " \ +"right/Africa/Juba" " " \ +"right/Africa/Kampala" " " \ +"right/Africa/Khartoum" " " \ +"right/Africa/Kigali" " " \ +"right/Africa/Kinshasa" " " \ +"right/Africa/Lagos" " " \ +"right/Africa/Libreville" " " \ +"right/Africa/Lome" " " \ +"right/Africa/Luanda" " " \ +"right/Africa/Lubumbashi" " " \ +"right/Africa/Lusaka" " " \ +"right/Africa/Malabo" " " \ +"right/Africa/Maputo" " " \ +"right/Africa/Maseru" " " \ +"right/Africa/Mbabane" " " \ +"right/Africa/Mogadishu" " " \ +"right/Africa/Monrovia" " " \ +"right/Africa/Nairobi" " " \ +"right/Africa/Ndjamena" " " \ +"right/Africa/Niamey" " " \ +"right/Africa/Nouakchott" " " \ +"right/Africa/Ouagadougou" " " \ +"right/Africa/Porto-Novo" " " \ +"right/Africa/Sao_Tome" " " \ +"right/Africa/Timbuktu" " " \ +"right/Africa/Tripoli" " " \ +"right/Africa/Tunis" " " \ +"right/Africa/Windhoek" " " \ +"right/America/Adak" " " \ +"right/America/Anchorage" " " \ +"right/America/Anguilla" " " \ +"right/America/Antigua" " " \ +"right/America/Araguaina" " " \ +"right/America/Argentina/Buenos_Aires" " " \ +"right/America/Argentina/Catamarca" " " \ +"right/America/Argentina/ComodRivadavia" " " \ +"right/America/Argentina/Cordoba" " " \ +"right/America/Argentina/Jujuy" " " \ +"right/America/Argentina/La_Rioja" " " \ +"right/America/Argentina/Mendoza" " " \ +"right/America/Argentina/Rio_Gallegos" " " \ +"right/America/Argentina/Salta" " " \ +"right/America/Argentina/San_Juan" " " \ +"right/America/Argentina/San_Luis" " " \ +"right/America/Argentina/Tucuman" " " \ +"right/America/Argentina/Ushuaia" " " \ +"right/America/Aruba" " " \ +"right/America/Asuncion" " " \ +"right/America/Atikokan" " " \ +"right/America/Atka" " " \ +"right/America/Bahia" " " \ +"right/America/Bahia_Banderas" " " \ +"right/America/Barbados" " " \ +"right/America/Belem" " " \ +"right/America/Belize" " " \ +"right/America/Blanc-Sablon" " " \ +"right/America/Boa_Vista" " " \ +"right/America/Bogota" " " \ +"right/America/Boise" " " \ +"right/America/Buenos_Aires" " " \ +"right/America/Cambridge_Bay" " " \ +"right/America/Campo_Grande" " " \ +"right/America/Cancun" " " \ +"right/America/Caracas" " " \ +"right/America/Catamarca" " " \ +"right/America/Cayenne" " " \ +"right/America/Cayman" " " \ +"right/America/Chicago" " " \ +"right/America/Chihuahua" " " \ +"right/America/Coral_Harbour" " " \ +"right/America/Cordoba" " " \ +"right/America/Costa_Rica" " " \ +"right/America/Creston" " " \ +"right/America/Cuiaba" " " \ +"right/America/Curacao" " " \ +"right/America/Danmarkshavn" " " \ +"right/America/Dawson" " " \ +"right/America/Dawson_Creek" " " \ +"right/America/Denver" " " \ +"right/America/Detroit" " " \ +"right/America/Dominica" " " \ +"right/America/Edmonton" " " \ +"right/America/Eirunepe" " " \ +"right/America/El_Salvador" " " \ +"right/America/Ensenada" " " \ +"right/America/Fort_Wayne" " " \ +"right/America/Fortaleza" " " \ +"right/America/Glace_Bay" " " \ +"right/America/Godthab" " " \ +"right/America/Goose_Bay" " " \ +"right/America/Grand_Turk" " " \ +"right/America/Grenada" " " \ +"right/America/Guadeloupe" " " \ +"right/America/Guatemala" " " \ +"right/America/Guayaquil" " " \ +"right/America/Guyana" " " \ +"right/America/Halifax" " " \ +"right/America/Havana" " " \ +"right/America/Hermosillo" " " \ +"right/America/Indiana/Indianapolis" " " \ +"right/America/Indiana/Knox" " " \ +"right/America/Indiana/Marengo" " " \ +"right/America/Indiana/Petersburg" " " \ +"right/America/Indiana/Tell_City" " " \ +"right/America/Indiana/Vevay" " " \ +"right/America/Indiana/Vincennes" " " \ +"right/America/Indiana/Winamac" " " \ +"right/America/Indianapolis" " " \ +"right/America/Inuvik" " " \ +"right/America/Iqaluit" " " \ +"right/America/Jamaica" " " \ +"right/America/Jujuy" " " \ +"right/America/Juneau" " " \ +"right/America/Kentucky/Louisville" " " \ +"right/America/Kentucky/Monticello" " " \ +"right/America/Knox_IN" " " \ +"right/America/Kralendijk" " " \ +"right/America/La_Paz" " " \ +"right/America/Lima" " " \ +"right/America/Los_Angeles" " " \ +"right/America/Louisville" " " \ +"right/America/Lower_Princes" " " \ +"right/America/Maceio" " " \ +"right/America/Managua" " " \ +"right/America/Manaus" " " \ +"right/America/Marigot" " " \ +"right/America/Martinique" " " \ +"right/America/Matamoros" " " \ +"right/America/Mazatlan" " " \ +"right/America/Mendoza" " " \ +"right/America/Menominee" " " \ +"right/America/Merida" " " \ +"right/America/Metlakatla" " " \ +"right/America/Mexico_City" " " \ +"right/America/Miquelon" " " \ +"right/America/Moncton" " " \ +"right/America/Monterrey" " " \ +"right/America/Montevideo" " " \ +"right/America/Montreal" " " \ +"right/America/Montserrat" " " \ +"right/America/Nassau" " " \ +"right/America/New_York" " " \ +"right/America/Nipigon" " " \ +"right/America/Nome" " " \ +"right/America/Noronha" " " \ +"right/America/North_Dakota/Beulah" " " \ +"right/America/North_Dakota/Center" " " \ +"right/America/North_Dakota/New_Salem" " " \ +"right/America/Ojinaga" " " \ +"right/America/Panama" " " \ +"right/America/Pangnirtung" " " \ +"right/America/Paramaribo" " " \ +"right/America/Phoenix" " " \ +"right/America/Port-au-Prince" " " \ +"right/America/Port_of_Spain" " " \ +"right/America/Porto_Acre" " " \ +"right/America/Porto_Velho" " " \ +"right/America/Puerto_Rico" " " \ +"right/America/Rainy_River" " " \ +"right/America/Rankin_Inlet" " " \ +"right/America/Recife" " " \ +"right/America/Regina" " " \ +"right/America/Resolute" " " \ +"right/America/Rio_Branco" " " \ +"right/America/Rosario" " " \ +"right/America/Santa_Isabel" " " \ +"right/America/Santarem" " " \ +"right/America/Santiago" " " \ +"right/America/Santo_Domingo" " " \ +"right/America/Sao_Paulo" " " \ +"right/America/Scoresbysund" " " \ +"right/America/Shiprock" " " \ +"right/America/Sitka" " " \ +"right/America/St_Barthelemy" " " \ +"right/America/St_Johns" " " \ +"right/America/St_Kitts" " " \ +"right/America/St_Lucia" " " \ +"right/America/St_Thomas" " " \ +"right/America/St_Vincent" " " \ +"right/America/Swift_Current" " " \ +"right/America/Tegucigalpa" " " \ +"right/America/Thule" " " \ +"right/America/Thunder_Bay" " " \ +"right/America/Tijuana" " " \ +"right/America/Toronto" " " \ +"right/America/Tortola" " " \ +"right/America/Vancouver" " " \ +"right/America/Virgin" " " \ +"right/America/Whitehorse" " " \ +"right/America/Winnipeg" " " \ +"right/America/Yakutat" " " \ +"right/America/Yellowknife" " " \ +"right/Antarctica/Casey" " " \ +"right/Antarctica/Davis" " " \ +"right/Antarctica/DumontDUrville" " " \ +"right/Antarctica/Macquarie" " " \ +"right/Antarctica/Mawson" " " \ +"right/Antarctica/McMurdo" " " \ +"right/Antarctica/Palmer" " " \ +"right/Antarctica/Rothera" " " \ +"right/Antarctica/South_Pole" " " \ +"right/Antarctica/Syowa" " " \ +"right/Antarctica/Troll" " " \ +"right/Antarctica/Vostok" " " \ +"right/Arctic/Longyearbyen" " " \ +"right/Asia/Aden" " " \ +"right/Asia/Almaty" " " \ +"right/Asia/Amman" " " \ +"right/Asia/Anadyr" " " \ +"right/Asia/Aqtau" " " \ +"right/Asia/Aqtobe" " " \ +"right/Asia/Ashgabat" " " \ +"right/Asia/Ashkhabad" " " \ +"right/Asia/Baghdad" " " \ +"right/Asia/Bahrain" " " \ +"right/Asia/Baku" " " \ +"right/Asia/Bangkok" " " \ +"right/Asia/Beirut" " " \ +"right/Asia/Bishkek" " " \ +"right/Asia/Brunei" " " \ +"right/Asia/Calcutta" " " \ +"right/Asia/Chita" " " \ +"right/Asia/Choibalsan" " " \ +"right/Asia/Chongqing" " " \ +"right/Asia/Chungking" " " \ +"right/Asia/Colombo" " " \ +"right/Asia/Dacca" " " \ +"right/Asia/Damascus" " " \ +"right/Asia/Dhaka" " " \ +"right/Asia/Dili" " " \ +"right/Asia/Dubai" " " \ +"right/Asia/Dushanbe" " " \ +"right/Asia/Gaza" " " \ +"right/Asia/Harbin" " " \ +"right/Asia/Hebron" " " \ +"right/Asia/Ho_Chi_Minh" " " \ +"right/Asia/Hong_Kong" " " \ +"right/Asia/Hovd" " " \ +"right/Asia/Irkutsk" " " \ +"right/Asia/Istanbul" " " \ +"right/Asia/Jakarta" " " \ +"right/Asia/Jayapura" " " \ +"right/Asia/Jerusalem" " " \ +"right/Asia/Kabul" " " \ +"right/Asia/Kamchatka" " " \ +"right/Asia/Karachi" " " \ +"right/Asia/Kashgar" " " \ +"right/Asia/Kathmandu" " " \ +"right/Asia/Katmandu" " " \ +"right/Asia/Khandyga" " " \ +"right/Asia/Kolkata" " " \ +"right/Asia/Krasnoyarsk" " " \ +"right/Asia/Kuala_Lumpur" " " \ +"right/Asia/Kuching" " " \ +"right/Asia/Kuwait" " " \ +"right/Asia/Macao" " " \ +"right/Asia/Macau" " " \ +"right/Asia/Magadan" " " \ +"right/Asia/Makassar" " " \ +"right/Asia/Manila" " " \ +"right/Asia/Muscat" " " \ +"right/Asia/Nicosia" " " \ +"right/Asia/Novokuznetsk" " " \ +"right/Asia/Novosibirsk" " " \ +"right/Asia/Omsk" " " \ +"right/Asia/Oral" " " \ +"right/Asia/Phnom_Penh" " " \ +"right/Asia/Pontianak" " " \ +"right/Asia/Pyongyang" " " \ +"right/Asia/Qatar" " " \ +"right/Asia/Qyzylorda" " " \ +"right/Asia/Rangoon" " " \ +"right/Asia/Riyadh" " " \ +"right/Asia/Saigon" " " \ +"right/Asia/Sakhalin" " " \ +"right/Asia/Samarkand" " " \ +"right/Asia/Seoul" " " \ +"right/Asia/Shanghai" " " \ +"right/Asia/Singapore" " " \ +"right/Asia/Srednekolymsk" " " \ +"right/Asia/Taipei" " " \ +"right/Asia/Tashkent" " " \ +"right/Asia/Tbilisi" " " \ +"right/Asia/Tehran" " " \ +"right/Asia/Tel_Aviv" " " \ +"right/Asia/Thimbu" " " \ +"right/Asia/Thimphu" " " \ +"right/Asia/Tokyo" " " \ +"right/Asia/Ujung_Pandang" " " \ +"right/Asia/Ulaanbaatar" " " \ +"right/Asia/Ulan_Bator" " " \ +"right/Asia/Urumqi" " " \ +"right/Asia/Ust-Nera" " " \ +"right/Asia/Vientiane" " " \ +"right/Asia/Vladivostok" " " \ +"right/Asia/Yakutsk" " " \ +"right/Asia/Yekaterinburg" " " \ +"right/Asia/Yerevan" " " \ +"right/Atlantic/Azores" " " \ +"right/Atlantic/Bermuda" " " \ +"right/Atlantic/Canary" " " \ +"right/Atlantic/Cape_Verde" " " \ +"right/Atlantic/Faeroe" " " \ +"right/Atlantic/Faroe" " " \ +"right/Atlantic/Jan_Mayen" " " \ +"right/Atlantic/Madeira" " " \ +"right/Atlantic/Reykjavik" " " \ +"right/Atlantic/South_Georgia" " " \ +"right/Atlantic/St_Helena" " " \ +"right/Atlantic/Stanley" " " \ +"right/Australia/ACT" " " \ +"right/Australia/Adelaide" " " \ +"right/Australia/Brisbane" " " \ +"right/Australia/Broken_Hill" " " \ +"right/Australia/Canberra" " " \ +"right/Australia/Currie" " " \ +"right/Australia/Darwin" " " \ +"right/Australia/Eucla" " " \ +"right/Australia/Hobart" " " \ +"right/Australia/LHI" " " \ +"right/Australia/Lindeman" " " \ +"right/Australia/Lord_Howe" " " \ +"right/Australia/Melbourne" " " \ +"right/Australia/NSW" " " \ +"right/Australia/North" " " \ +"right/Australia/Perth" " " \ +"right/Australia/Queensland" " " \ +"right/Australia/South" " " \ +"right/Australia/Sydney" " " \ +"right/Australia/Tasmania" " " \ +"right/Australia/Victoria" " " \ +"right/Australia/West" " " \ +"right/Australia/Yancowinna" " " \ +"right/Brazil/Acre" " " \ +"right/Brazil/DeNoronha" " " \ +"right/Brazil/East" " " \ +"right/Brazil/West" " " \ +"right/CET" " " \ +"right/CST6CDT" " " \ +"right/Canada/Atlantic" " " \ +"right/Canada/Central" " " \ +"right/Canada/East-Saskatchewan" " " \ +"right/Canada/Eastern" " " \ +"right/Canada/Mountain" " " \ +"right/Canada/Newfoundland" " " \ +"right/Canada/Pacific" " " \ +"right/Canada/Saskatchewan" " " \ +"right/Canada/Yukon" " " \ +"right/Chile/Continental" " " \ +"right/Chile/EasterIsland" " " \ +"right/Cuba" " " \ +"right/EET" " " \ +"right/EST" " " \ +"right/EST5EDT" " " \ +"right/Egypt" " " \ +"right/Eire" " " \ +"right/Etc/GMT" " " \ +"right/Etc/GMT+0" " " \ +"right/Etc/GMT+1" " " \ +"right/Etc/GMT+10" " " \ +"right/Etc/GMT+11" " " \ +"right/Etc/GMT+12" " " \ +"right/Etc/GMT+2" " " \ +"right/Etc/GMT+3" " " \ +"right/Etc/GMT+4" " " \ +"right/Etc/GMT+5" " " \ +"right/Etc/GMT+6" " " \ +"right/Etc/GMT+7" " " \ +"right/Etc/GMT+8" " " \ +"right/Etc/GMT+9" " " \ +"right/Etc/GMT-0" " " \ +"right/Etc/GMT-1" " " \ +"right/Etc/GMT-10" " " \ +"right/Etc/GMT-11" " " \ +"right/Etc/GMT-12" " " \ +"right/Etc/GMT-13" " " \ +"right/Etc/GMT-14" " " \ +"right/Etc/GMT-2" " " \ +"right/Etc/GMT-3" " " \ +"right/Etc/GMT-4" " " \ +"right/Etc/GMT-5" " " \ +"right/Etc/GMT-6" " " \ +"right/Etc/GMT-7" " " \ +"right/Etc/GMT-8" " " \ +"right/Etc/GMT-9" " " \ +"right/Etc/GMT0" " " \ +"right/Etc/Greenwich" " " \ +"right/Etc/UCT" " " \ +"right/Etc/UTC" " " \ +"right/Etc/Universal" " " \ +"right/Etc/Zulu" " " \ +"right/Europe/Amsterdam" " " \ +"right/Europe/Andorra" " " \ +"right/Europe/Athens" " " \ +"right/Europe/Belfast" " " \ +"right/Europe/Belgrade" " " \ +"right/Europe/Berlin" " " \ +"right/Europe/Bratislava" " " \ +"right/Europe/Brussels" " " \ +"right/Europe/Bucharest" " " \ +"right/Europe/Budapest" " " \ +"right/Europe/Busingen" " " \ +"right/Europe/Chisinau" " " \ +"right/Europe/Copenhagen" " " \ +"right/Europe/Dublin" " " \ +"right/Europe/Gibraltar" " " \ +"right/Europe/Guernsey" " " \ +"right/Europe/Helsinki" " " \ +"right/Europe/Isle_of_Man" " " \ +"right/Europe/Istanbul" " " \ +"right/Europe/Jersey" " " \ +"right/Europe/Kaliningrad" " " \ +"right/Europe/Kiev" " " \ +"right/Europe/Lisbon" " " \ +"right/Europe/Ljubljana" " " \ +"right/Europe/London" " " \ +"right/Europe/Luxembourg" " " \ +"right/Europe/Madrid" " " \ +"right/Europe/Malta" " " \ +"right/Europe/Mariehamn" " " \ +"right/Europe/Minsk" " " \ +"right/Europe/Monaco" " " \ +"right/Europe/Moscow" " " \ +"right/Europe/Nicosia" " " \ +"right/Europe/Oslo" " " \ +"right/Europe/Paris" " " \ +"right/Europe/Podgorica" " " \ +"right/Europe/Prague" " " \ +"right/Europe/Riga" " " \ +"right/Europe/Rome" " " \ +"right/Europe/Samara" " " \ +"right/Europe/San_Marino" " " \ +"right/Europe/Sarajevo" " " \ +"right/Europe/Simferopol" " " \ +"right/Europe/Skopje" " " \ +"right/Europe/Sofia" " " \ +"right/Europe/Stockholm" " " \ +"right/Europe/Tallinn" " " \ +"right/Europe/Tirane" " " \ +"right/Europe/Tiraspol" " " \ +"right/Europe/Uzhgorod" " " \ +"right/Europe/Vaduz" " " \ +"right/Europe/Vatican" " " \ +"right/Europe/Vienna" " " \ +"right/Europe/Vilnius" " " \ +"right/Europe/Volgograd" " " \ +"right/Europe/Warsaw" " " \ +"right/Europe/Zagreb" " " \ +"right/Europe/Zaporozhye" " " \ +"right/Europe/Zurich" " " \ +"right/Factory" " " \ +"right/GB" " " \ +"right/GB-Eire" " " \ +"right/GMT" " " \ +"right/GMT+0" " " \ +"right/GMT-0" " " \ +"right/GMT0" " " \ +"right/Greenwich" " " \ +"right/HST" " " \ +"right/Hongkong" " " \ +"right/Iceland" " " \ +"right/Indian/Antananarivo" " " \ +"right/Indian/Chagos" " " \ +"right/Indian/Christmas" " " \ +"right/Indian/Cocos" " " \ +"right/Indian/Comoro" " " \ +"right/Indian/Kerguelen" " " \ +"right/Indian/Mahe" " " \ +"right/Indian/Maldives" " " \ +"right/Indian/Mauritius" " " \ +"right/Indian/Mayotte" " " \ +"right/Indian/Reunion" " " \ +"right/Iran" " " \ +"right/Israel" " " \ +"right/Jamaica" " " \ +"right/Japan" " " \ +"right/Kwajalein" " " \ +"right/Libya" " " \ +"right/MET" " " \ +"right/MST" " " \ +"right/MST7MDT" " " \ +"right/Mexico/BajaNorte" " " \ +"right/Mexico/BajaSur" " " \ +"right/Mexico/General" " " \ +"right/NZ" " " \ +"right/NZ-CHAT" " " \ +"right/Navajo" " " \ +"right/PRC" " " \ +"right/PST8PDT" " " \ +"right/Pacific/Apia" " " \ +"right/Pacific/Auckland" " " \ +"right/Pacific/Bougainville" " " \ +"right/Pacific/Chatham" " " \ +"right/Pacific/Chuuk" " " \ +"right/Pacific/Easter" " " \ +"right/Pacific/Efate" " " \ +"right/Pacific/Enderbury" " " \ +"right/Pacific/Fakaofo" " " \ +"right/Pacific/Fiji" " " \ +"right/Pacific/Funafuti" " " \ +"right/Pacific/Galapagos" " " \ +"right/Pacific/Gambier" " " \ +"right/Pacific/Guadalcanal" " " \ +"right/Pacific/Guam" " " \ +"right/Pacific/Honolulu" " " \ +"right/Pacific/Johnston" " " \ +"right/Pacific/Kiritimati" " " \ +"right/Pacific/Kosrae" " " \ +"right/Pacific/Kwajalein" " " \ +"right/Pacific/Majuro" " " \ +"right/Pacific/Marquesas" " " \ +"right/Pacific/Midway" " " \ +"right/Pacific/Nauru" " " \ +"right/Pacific/Niue" " " \ +"right/Pacific/Norfolk" " " \ +"right/Pacific/Noumea" " " \ +"right/Pacific/Pago_Pago" " " \ +"right/Pacific/Palau" " " \ +"right/Pacific/Pitcairn" " " \ +"right/Pacific/Pohnpei" " " \ +"right/Pacific/Ponape" " " \ +"right/Pacific/Port_Moresby" " " \ +"right/Pacific/Rarotonga" " " \ +"right/Pacific/Saipan" " " \ +"right/Pacific/Samoa" " " \ +"right/Pacific/Tahiti" " " \ +"right/Pacific/Tarawa" " " \ +"right/Pacific/Tongatapu" " " \ +"right/Pacific/Truk" " " \ +"right/Pacific/Wake" " " \ +"right/Pacific/Wallis" " " \ +"right/Pacific/Yap" " " \ +"right/Poland" " " \ +"right/Portugal" " " \ +"right/ROC" " " \ +"right/ROK" " " \ +"right/Singapore" " " \ +"right/Turkey" " " \ +"right/UCT" " " \ +"right/US/Alaska" " " \ +"right/US/Aleutian" " " \ +"right/US/Arizona" " " \ +"right/US/Central" " " \ +"right/US/East-Indiana" " " \ +"right/US/Eastern" " " \ +"right/US/Hawaii" " " \ +"right/US/Indiana-Starke" " " \ +"right/US/Michigan" " " \ +"right/US/Mountain" " " \ +"right/US/Pacific" " " \ +"right/US/Pacific-New" " " \ +"right/US/Samoa" " " \ +"right/UTC" " " \ +"right/Universal" " " \ +"right/W-SU" " " \ +"right/WET" " " \ +"right/Zulu" " " \ + 2> $TMP/tz + + if [ $? = 1 -o $? = 255 ]; then + rm -f $TMP/tz + exit + fi + + TIMEZONE="`cat $TMP/tz`" + rm -f $TMP/tz + + setzone $TIMEZONE + exit +else + ### + ### use text prompts + ### + while [ 0 ]; do + echo -n "Would you like to configure your timezone ([y]es, [n]o)? " + read TIMECONF; + echo + + if [ "$TIMECONF" = "n" ]; then + break + fi + + cat << EOF +Select one of these timezones: + +US/Alaska +US/Aleutian +US/Arizona +US/Central +US/East-Indiana +US/Eastern +US/Hawaii +US/Indiana-Starke +US/Michigan +US/Mountain +US/Pacific +US/Pacific-New +US/Samoa +Africa/Abidjan +Africa/Accra +Africa/Addis_Ababa +Africa/Algiers +Africa/Asmara +Africa/Asmera +Africa/Bamako +Africa/Bangui +Africa/Banjul +Africa/Bissau +Africa/Blantyre +Africa/Brazzaville +Africa/Bujumbura +Africa/Cairo +Africa/Casablanca +Africa/Ceuta +Africa/Conakry +Africa/Dakar +Africa/Dar_es_Salaam +Africa/Djibouti +Africa/Douala +Africa/El_Aaiun +Africa/Freetown +Africa/Gaborone +Africa/Harare +Africa/Johannesburg +Africa/Juba +Africa/Kampala +Africa/Khartoum +Africa/Kigali +Africa/Kinshasa +Africa/Lagos +Africa/Libreville +Africa/Lome +Africa/Luanda +Africa/Lubumbashi +Africa/Lusaka +Africa/Malabo +Africa/Maputo +Africa/Maseru +Africa/Mbabane +Africa/Mogadishu +Africa/Monrovia +Africa/Nairobi +Africa/Ndjamena +Africa/Niamey +Africa/Nouakchott +Africa/Ouagadougou +Africa/Porto-Novo +Africa/Sao_Tome +Africa/Timbuktu +Africa/Tripoli +Africa/Tunis +Africa/Windhoek +America/Adak +America/Anchorage +America/Anguilla +America/Antigua +America/Araguaina +America/Argentina/Buenos_Aires +America/Argentina/Catamarca +America/Argentina/ComodRivadavia +America/Argentina/Cordoba +America/Argentina/Jujuy +America/Argentina/La_Rioja +America/Argentina/Mendoza +America/Argentina/Rio_Gallegos +America/Argentina/Salta +America/Argentina/San_Juan +America/Argentina/San_Luis +America/Argentina/Tucuman +America/Argentina/Ushuaia +America/Aruba +America/Asuncion +America/Atikokan +America/Atka +America/Bahia +America/Bahia_Banderas +America/Barbados +America/Belem +America/Belize +America/Blanc-Sablon +America/Boa_Vista +America/Bogota +America/Boise +America/Buenos_Aires +America/Cambridge_Bay +America/Campo_Grande +America/Cancun +America/Caracas +America/Catamarca +America/Cayenne +America/Cayman +America/Chicago +America/Chihuahua +America/Coral_Harbour +America/Cordoba +America/Costa_Rica +America/Creston +America/Cuiaba +America/Curacao +America/Danmarkshavn +America/Dawson +America/Dawson_Creek +America/Denver +America/Detroit +America/Dominica +America/Edmonton +America/Eirunepe +America/El_Salvador +America/Ensenada +America/Fort_Wayne +America/Fortaleza +America/Glace_Bay +America/Godthab +America/Goose_Bay +America/Grand_Turk +America/Grenada +America/Guadeloupe +America/Guatemala +America/Guayaquil +America/Guyana +America/Halifax +America/Havana +America/Hermosillo +America/Indiana/Indianapolis +America/Indiana/Knox +America/Indiana/Marengo +America/Indiana/Petersburg +America/Indiana/Tell_City +America/Indiana/Vevay +America/Indiana/Vincennes +America/Indiana/Winamac +America/Indianapolis +America/Inuvik +America/Iqaluit +America/Jamaica +America/Jujuy +America/Juneau +America/Kentucky/Louisville +America/Kentucky/Monticello +America/Knox_IN +America/Kralendijk +America/La_Paz +America/Lima +America/Los_Angeles +America/Louisville +America/Lower_Princes +America/Maceio +America/Managua +America/Manaus +America/Marigot +America/Martinique +America/Matamoros +America/Mazatlan +America/Mendoza +America/Menominee +America/Merida +America/Metlakatla +America/Mexico_City +America/Miquelon +America/Moncton +America/Monterrey +America/Montevideo +America/Montreal +America/Montserrat +America/Nassau +America/New_York +America/Nipigon +America/Nome +America/Noronha +America/North_Dakota/Beulah +America/North_Dakota/Center +America/North_Dakota/New_Salem +America/Ojinaga +America/Panama +America/Pangnirtung +America/Paramaribo +America/Phoenix +America/Port-au-Prince +America/Port_of_Spain +America/Porto_Acre +America/Porto_Velho +America/Puerto_Rico +America/Rainy_River +America/Rankin_Inlet +America/Recife +America/Regina +America/Resolute +America/Rio_Branco +America/Rosario +America/Santa_Isabel +America/Santarem +America/Santiago +America/Santo_Domingo +America/Sao_Paulo +America/Scoresbysund +America/Shiprock +America/Sitka +America/St_Barthelemy +America/St_Johns +America/St_Kitts +America/St_Lucia +America/St_Thomas +America/St_Vincent +America/Swift_Current +America/Tegucigalpa +America/Thule +America/Thunder_Bay +America/Tijuana +America/Toronto +America/Tortola +America/Vancouver +America/Virgin +America/Whitehorse +America/Winnipeg +America/Yakutat +America/Yellowknife +Antarctica/Casey +Antarctica/Davis +Antarctica/DumontDUrville +Antarctica/Macquarie +Antarctica/Mawson +Antarctica/McMurdo +Antarctica/Palmer +Antarctica/Rothera +Antarctica/South_Pole +Antarctica/Syowa +Antarctica/Troll +Antarctica/Vostok +Arctic/Longyearbyen +Asia/Aden +Asia/Almaty +Asia/Amman +Asia/Anadyr +Asia/Aqtau +Asia/Aqtobe +Asia/Ashgabat +Asia/Ashkhabad +Asia/Baghdad +Asia/Bahrain +Asia/Baku +Asia/Bangkok +Asia/Beirut +Asia/Bishkek +Asia/Brunei +Asia/Calcutta +Asia/Chita +Asia/Choibalsan +Asia/Chongqing +Asia/Chungking +Asia/Colombo +Asia/Dacca +Asia/Damascus +Asia/Dhaka +Asia/Dili +Asia/Dubai +Asia/Dushanbe +Asia/Gaza +Asia/Harbin +Asia/Hebron +Asia/Ho_Chi_Minh +Asia/Hong_Kong +Asia/Hovd +Asia/Irkutsk +Asia/Istanbul +Asia/Jakarta +Asia/Jayapura +Asia/Jerusalem +Asia/Kabul +Asia/Kamchatka +Asia/Karachi +Asia/Kashgar +Asia/Kathmandu +Asia/Katmandu +Asia/Khandyga +Asia/Kolkata +Asia/Krasnoyarsk +Asia/Kuala_Lumpur +Asia/Kuching +Asia/Kuwait +Asia/Macao +Asia/Macau +Asia/Magadan +Asia/Makassar +Asia/Manila +Asia/Muscat +Asia/Nicosia +Asia/Novokuznetsk +Asia/Novosibirsk +Asia/Omsk +Asia/Oral +Asia/Phnom_Penh +Asia/Pontianak +Asia/Pyongyang +Asia/Qatar +Asia/Qyzylorda +Asia/Rangoon +Asia/Riyadh +Asia/Saigon +Asia/Sakhalin +Asia/Samarkand +Asia/Seoul +Asia/Shanghai +Asia/Singapore +Asia/Srednekolymsk +Asia/Taipei +Asia/Tashkent +Asia/Tbilisi +Asia/Tehran +Asia/Tel_Aviv +Asia/Thimbu +Asia/Thimphu +Asia/Tokyo +Asia/Ujung_Pandang +Asia/Ulaanbaatar +Asia/Ulan_Bator +Asia/Urumqi +Asia/Ust-Nera +Asia/Vientiane +Asia/Vladivostok +Asia/Yakutsk +Asia/Yekaterinburg +Asia/Yerevan +Atlantic/Azores +Atlantic/Bermuda +Atlantic/Canary +Atlantic/Cape_Verde +Atlantic/Faeroe +Atlantic/Faroe +Atlantic/Jan_Mayen +Atlantic/Madeira +Atlantic/Reykjavik +Atlantic/South_Georgia +Atlantic/St_Helena +Atlantic/Stanley +Australia/ACT +Australia/Adelaide +Australia/Brisbane +Australia/Broken_Hill +Australia/Canberra +Australia/Currie +Australia/Darwin +Australia/Eucla +Australia/Hobart +Australia/LHI +Australia/Lindeman +Australia/Lord_Howe +Australia/Melbourne +Australia/NSW +Australia/North +Australia/Perth +Australia/Queensland +Australia/South +Australia/Sydney +Australia/Tasmania +Australia/Victoria +Australia/West +Australia/Yancowinna +Brazil/Acre +Brazil/DeNoronha +Brazil/East +Brazil/West +CET +CST6CDT +Canada/Atlantic +Canada/Central +Canada/East-Saskatchewan +Canada/Eastern +Canada/Mountain +Canada/Newfoundland +Canada/Pacific +Canada/Saskatchewan +Canada/Yukon +Chile/Continental +Chile/EasterIsland +Cuba +EET +EST +EST5EDT +Egypt +Eire +Etc/GMT +Etc/GMT+0 +Etc/GMT+1 +Etc/GMT+10 +Etc/GMT+11 +Etc/GMT+12 +Etc/GMT+2 +Etc/GMT+3 +Etc/GMT+4 +Etc/GMT+5 +Etc/GMT+6 +Etc/GMT+7 +Etc/GMT+8 +Etc/GMT+9 +Etc/GMT-0 +Etc/GMT-1 +Etc/GMT-10 +Etc/GMT-11 +Etc/GMT-12 +Etc/GMT-13 +Etc/GMT-14 +Etc/GMT-2 +Etc/GMT-3 +Etc/GMT-4 +Etc/GMT-5 +Etc/GMT-6 +Etc/GMT-7 +Etc/GMT-8 +Etc/GMT-9 +Etc/GMT0 +Etc/Greenwich +Etc/UCT +Etc/UTC +Etc/Universal +Etc/Zulu +Europe/Amsterdam +Europe/Andorra +Europe/Athens +Europe/Belfast +Europe/Belgrade +Europe/Berlin +Europe/Bratislava +Europe/Brussels +Europe/Bucharest +Europe/Budapest +Europe/Busingen +Europe/Chisinau +Europe/Copenhagen +Europe/Dublin +Europe/Gibraltar +Europe/Guernsey +Europe/Helsinki +Europe/Isle_of_Man +Europe/Istanbul +Europe/Jersey +Europe/Kaliningrad +Europe/Kiev +Europe/Lisbon +Europe/Ljubljana +Europe/London +Europe/Luxembourg +Europe/Madrid +Europe/Malta +Europe/Mariehamn +Europe/Minsk +Europe/Monaco +Europe/Moscow +Europe/Nicosia +Europe/Oslo +Europe/Paris +Europe/Podgorica +Europe/Prague +Europe/Riga +Europe/Rome +Europe/Samara +Europe/San_Marino +Europe/Sarajevo +Europe/Simferopol +Europe/Skopje +Europe/Sofia +Europe/Stockholm +Europe/Tallinn +Europe/Tirane +Europe/Tiraspol +Europe/Uzhgorod +Europe/Vaduz +Europe/Vatican +Europe/Vienna +Europe/Vilnius +Europe/Volgograd +Europe/Warsaw +Europe/Zagreb +Europe/Zaporozhye +Europe/Zurich +Factory +GB +GB-Eire +GMT +GMT+0 +GMT-0 +GMT0 +Greenwich +HST +Hongkong +Iceland +Indian/Antananarivo +Indian/Chagos +Indian/Christmas +Indian/Cocos +Indian/Comoro +Indian/Kerguelen +Indian/Mahe +Indian/Maldives +Indian/Mauritius +Indian/Mayotte +Indian/Reunion +Iran +Israel +Jamaica +Japan +Kwajalein +Libya +MET +MST +MST7MDT +Mexico/BajaNorte +Mexico/BajaSur +Mexico/General +NZ +NZ-CHAT +Navajo +PRC +PST8PDT +Pacific/Apia +Pacific/Auckland +Pacific/Bougainville +Pacific/Chatham +Pacific/Chuuk +Pacific/Easter +Pacific/Efate +Pacific/Enderbury +Pacific/Fakaofo +Pacific/Fiji +Pacific/Funafuti +Pacific/Galapagos +Pacific/Gambier +Pacific/Guadalcanal +Pacific/Guam +Pacific/Honolulu +Pacific/Johnston +Pacific/Kiritimati +Pacific/Kosrae +Pacific/Kwajalein +Pacific/Majuro +Pacific/Marquesas +Pacific/Midway +Pacific/Nauru +Pacific/Niue +Pacific/Norfolk +Pacific/Noumea +Pacific/Pago_Pago +Pacific/Palau +Pacific/Pitcairn +Pacific/Pohnpei +Pacific/Ponape +Pacific/Port_Moresby +Pacific/Rarotonga +Pacific/Saipan +Pacific/Samoa +Pacific/Tahiti +Pacific/Tarawa +Pacific/Tongatapu +Pacific/Truk +Pacific/Wake +Pacific/Wallis +Pacific/Yap +Poland +Portugal +ROC +ROK +Singapore +Turkey +UCT +UTC +Universal +W-SU +WET +Zulu +posix/Africa/Abidjan +posix/Africa/Accra +posix/Africa/Addis_Ababa +posix/Africa/Algiers +posix/Africa/Asmara +posix/Africa/Asmera +posix/Africa/Bamako +posix/Africa/Bangui +posix/Africa/Banjul +posix/Africa/Bissau +posix/Africa/Blantyre +posix/Africa/Brazzaville +posix/Africa/Bujumbura +posix/Africa/Cairo +posix/Africa/Casablanca +posix/Africa/Ceuta +posix/Africa/Conakry +posix/Africa/Dakar +posix/Africa/Dar_es_Salaam +posix/Africa/Djibouti +posix/Africa/Douala +posix/Africa/El_Aaiun +posix/Africa/Freetown +posix/Africa/Gaborone +posix/Africa/Harare +posix/Africa/Johannesburg +posix/Africa/Juba +posix/Africa/Kampala +posix/Africa/Khartoum +posix/Africa/Kigali +posix/Africa/Kinshasa +posix/Africa/Lagos +posix/Africa/Libreville +posix/Africa/Lome +posix/Africa/Luanda +posix/Africa/Lubumbashi +posix/Africa/Lusaka +posix/Africa/Malabo +posix/Africa/Maputo +posix/Africa/Maseru +posix/Africa/Mbabane +posix/Africa/Mogadishu +posix/Africa/Monrovia +posix/Africa/Nairobi +posix/Africa/Ndjamena +posix/Africa/Niamey +posix/Africa/Nouakchott +posix/Africa/Ouagadougou +posix/Africa/Porto-Novo +posix/Africa/Sao_Tome +posix/Africa/Timbuktu +posix/Africa/Tripoli +posix/Africa/Tunis +posix/Africa/Windhoek +posix/America/Adak +posix/America/Anchorage +posix/America/Anguilla +posix/America/Antigua +posix/America/Araguaina +posix/America/Argentina/Buenos_Aires +posix/America/Argentina/Catamarca +posix/America/Argentina/ComodRivadavia +posix/America/Argentina/Cordoba +posix/America/Argentina/Jujuy +posix/America/Argentina/La_Rioja +posix/America/Argentina/Mendoza +posix/America/Argentina/Rio_Gallegos +posix/America/Argentina/Salta +posix/America/Argentina/San_Juan +posix/America/Argentina/San_Luis +posix/America/Argentina/Tucuman +posix/America/Argentina/Ushuaia +posix/America/Aruba +posix/America/Asuncion +posix/America/Atikokan +posix/America/Atka +posix/America/Bahia +posix/America/Bahia_Banderas +posix/America/Barbados +posix/America/Belem +posix/America/Belize +posix/America/Blanc-Sablon +posix/America/Boa_Vista +posix/America/Bogota +posix/America/Boise +posix/America/Buenos_Aires +posix/America/Cambridge_Bay +posix/America/Campo_Grande +posix/America/Cancun +posix/America/Caracas +posix/America/Catamarca +posix/America/Cayenne +posix/America/Cayman +posix/America/Chicago +posix/America/Chihuahua +posix/America/Coral_Harbour +posix/America/Cordoba +posix/America/Costa_Rica +posix/America/Creston +posix/America/Cuiaba +posix/America/Curacao +posix/America/Danmarkshavn +posix/America/Dawson +posix/America/Dawson_Creek +posix/America/Denver +posix/America/Detroit +posix/America/Dominica +posix/America/Edmonton +posix/America/Eirunepe +posix/America/El_Salvador +posix/America/Ensenada +posix/America/Fort_Wayne +posix/America/Fortaleza +posix/America/Glace_Bay +posix/America/Godthab +posix/America/Goose_Bay +posix/America/Grand_Turk +posix/America/Grenada +posix/America/Guadeloupe +posix/America/Guatemala +posix/America/Guayaquil +posix/America/Guyana +posix/America/Halifax +posix/America/Havana +posix/America/Hermosillo +posix/America/Indiana/Indianapolis +posix/America/Indiana/Knox +posix/America/Indiana/Marengo +posix/America/Indiana/Petersburg +posix/America/Indiana/Tell_City +posix/America/Indiana/Vevay +posix/America/Indiana/Vincennes +posix/America/Indiana/Winamac +posix/America/Indianapolis +posix/America/Inuvik +posix/America/Iqaluit +posix/America/Jamaica +posix/America/Jujuy +posix/America/Juneau +posix/America/Kentucky/Louisville +posix/America/Kentucky/Monticello +posix/America/Knox_IN +posix/America/Kralendijk +posix/America/La_Paz +posix/America/Lima +posix/America/Los_Angeles +posix/America/Louisville +posix/America/Lower_Princes +posix/America/Maceio +posix/America/Managua +posix/America/Manaus +posix/America/Marigot +posix/America/Martinique +posix/America/Matamoros +posix/America/Mazatlan +posix/America/Mendoza +posix/America/Menominee +posix/America/Merida +posix/America/Metlakatla +posix/America/Mexico_City +posix/America/Miquelon +posix/America/Moncton +posix/America/Monterrey +posix/America/Montevideo +posix/America/Montreal +posix/America/Montserrat +posix/America/Nassau +posix/America/New_York +posix/America/Nipigon +posix/America/Nome +posix/America/Noronha +posix/America/North_Dakota/Beulah +posix/America/North_Dakota/Center +posix/America/North_Dakota/New_Salem +posix/America/Ojinaga +posix/America/Panama +posix/America/Pangnirtung +posix/America/Paramaribo +posix/America/Phoenix +posix/America/Port-au-Prince +posix/America/Port_of_Spain +posix/America/Porto_Acre +posix/America/Porto_Velho +posix/America/Puerto_Rico +posix/America/Rainy_River +posix/America/Rankin_Inlet +posix/America/Recife +posix/America/Regina +posix/America/Resolute +posix/America/Rio_Branco +posix/America/Rosario +posix/America/Santa_Isabel +posix/America/Santarem +posix/America/Santiago +posix/America/Santo_Domingo +posix/America/Sao_Paulo +posix/America/Scoresbysund +posix/America/Shiprock +posix/America/Sitka +posix/America/St_Barthelemy +posix/America/St_Johns +posix/America/St_Kitts +posix/America/St_Lucia +posix/America/St_Thomas +posix/America/St_Vincent +posix/America/Swift_Current +posix/America/Tegucigalpa +posix/America/Thule +posix/America/Thunder_Bay +posix/America/Tijuana +posix/America/Toronto +posix/America/Tortola +posix/America/Vancouver +posix/America/Virgin +posix/America/Whitehorse +posix/America/Winnipeg +posix/America/Yakutat +posix/America/Yellowknife +posix/Antarctica/Casey +posix/Antarctica/Davis +posix/Antarctica/DumontDUrville +posix/Antarctica/Macquarie +posix/Antarctica/Mawson +posix/Antarctica/McMurdo +posix/Antarctica/Palmer +posix/Antarctica/Rothera +posix/Antarctica/South_Pole +posix/Antarctica/Syowa +posix/Antarctica/Troll +posix/Antarctica/Vostok +posix/Arctic/Longyearbyen +posix/Asia/Aden +posix/Asia/Almaty +posix/Asia/Amman +posix/Asia/Anadyr +posix/Asia/Aqtau +posix/Asia/Aqtobe +posix/Asia/Ashgabat +posix/Asia/Ashkhabad +posix/Asia/Baghdad +posix/Asia/Bahrain +posix/Asia/Baku +posix/Asia/Bangkok +posix/Asia/Beirut +posix/Asia/Bishkek +posix/Asia/Brunei +posix/Asia/Calcutta +posix/Asia/Chita +posix/Asia/Choibalsan +posix/Asia/Chongqing +posix/Asia/Chungking +posix/Asia/Colombo +posix/Asia/Dacca +posix/Asia/Damascus +posix/Asia/Dhaka +posix/Asia/Dili +posix/Asia/Dubai +posix/Asia/Dushanbe +posix/Asia/Gaza +posix/Asia/Harbin +posix/Asia/Hebron +posix/Asia/Ho_Chi_Minh +posix/Asia/Hong_Kong +posix/Asia/Hovd +posix/Asia/Irkutsk +posix/Asia/Istanbul +posix/Asia/Jakarta +posix/Asia/Jayapura +posix/Asia/Jerusalem +posix/Asia/Kabul +posix/Asia/Kamchatka +posix/Asia/Karachi +posix/Asia/Kashgar +posix/Asia/Kathmandu +posix/Asia/Katmandu +posix/Asia/Khandyga +posix/Asia/Kolkata +posix/Asia/Krasnoyarsk +posix/Asia/Kuala_Lumpur +posix/Asia/Kuching +posix/Asia/Kuwait +posix/Asia/Macao +posix/Asia/Macau +posix/Asia/Magadan +posix/Asia/Makassar +posix/Asia/Manila +posix/Asia/Muscat +posix/Asia/Nicosia +posix/Asia/Novokuznetsk +posix/Asia/Novosibirsk +posix/Asia/Omsk +posix/Asia/Oral +posix/Asia/Phnom_Penh +posix/Asia/Pontianak +posix/Asia/Pyongyang +posix/Asia/Qatar +posix/Asia/Qyzylorda +posix/Asia/Rangoon +posix/Asia/Riyadh +posix/Asia/Saigon +posix/Asia/Sakhalin +posix/Asia/Samarkand +posix/Asia/Seoul +posix/Asia/Shanghai +posix/Asia/Singapore +posix/Asia/Srednekolymsk +posix/Asia/Taipei +posix/Asia/Tashkent +posix/Asia/Tbilisi +posix/Asia/Tehran +posix/Asia/Tel_Aviv +posix/Asia/Thimbu +posix/Asia/Thimphu +posix/Asia/Tokyo +posix/Asia/Ujung_Pandang +posix/Asia/Ulaanbaatar +posix/Asia/Ulan_Bator +posix/Asia/Urumqi +posix/Asia/Ust-Nera +posix/Asia/Vientiane +posix/Asia/Vladivostok +posix/Asia/Yakutsk +posix/Asia/Yekaterinburg +posix/Asia/Yerevan +posix/Atlantic/Azores +posix/Atlantic/Bermuda +posix/Atlantic/Canary +posix/Atlantic/Cape_Verde +posix/Atlantic/Faeroe +posix/Atlantic/Faroe +posix/Atlantic/Jan_Mayen +posix/Atlantic/Madeira +posix/Atlantic/Reykjavik +posix/Atlantic/South_Georgia +posix/Atlantic/St_Helena +posix/Atlantic/Stanley +posix/Australia/ACT +posix/Australia/Adelaide +posix/Australia/Brisbane +posix/Australia/Broken_Hill +posix/Australia/Canberra +posix/Australia/Currie +posix/Australia/Darwin +posix/Australia/Eucla +posix/Australia/Hobart +posix/Australia/LHI +posix/Australia/Lindeman +posix/Australia/Lord_Howe +posix/Australia/Melbourne +posix/Australia/NSW +posix/Australia/North +posix/Australia/Perth +posix/Australia/Queensland +posix/Australia/South +posix/Australia/Sydney +posix/Australia/Tasmania +posix/Australia/Victoria +posix/Australia/West +posix/Australia/Yancowinna +posix/Brazil/Acre +posix/Brazil/DeNoronha +posix/Brazil/East +posix/Brazil/West +posix/CET +posix/CST6CDT +posix/Canada/Atlantic +posix/Canada/Central +posix/Canada/East-Saskatchewan +posix/Canada/Eastern +posix/Canada/Mountain +posix/Canada/Newfoundland +posix/Canada/Pacific +posix/Canada/Saskatchewan +posix/Canada/Yukon +posix/Chile/Continental +posix/Chile/EasterIsland +posix/Cuba +posix/EET +posix/EST +posix/EST5EDT +posix/Egypt +posix/Eire +posix/Etc/GMT +posix/Etc/GMT+0 +posix/Etc/GMT+1 +posix/Etc/GMT+10 +posix/Etc/GMT+11 +posix/Etc/GMT+12 +posix/Etc/GMT+2 +posix/Etc/GMT+3 +posix/Etc/GMT+4 +posix/Etc/GMT+5 +posix/Etc/GMT+6 +posix/Etc/GMT+7 +posix/Etc/GMT+8 +posix/Etc/GMT+9 +posix/Etc/GMT-0 +posix/Etc/GMT-1 +posix/Etc/GMT-10 +posix/Etc/GMT-11 +posix/Etc/GMT-12 +posix/Etc/GMT-13 +posix/Etc/GMT-14 +posix/Etc/GMT-2 +posix/Etc/GMT-3 +posix/Etc/GMT-4 +posix/Etc/GMT-5 +posix/Etc/GMT-6 +posix/Etc/GMT-7 +posix/Etc/GMT-8 +posix/Etc/GMT-9 +posix/Etc/GMT0 +posix/Etc/Greenwich +posix/Etc/UCT +posix/Etc/UTC +posix/Etc/Universal +posix/Etc/Zulu +posix/Europe/Amsterdam +posix/Europe/Andorra +posix/Europe/Athens +posix/Europe/Belfast +posix/Europe/Belgrade +posix/Europe/Berlin +posix/Europe/Bratislava +posix/Europe/Brussels +posix/Europe/Bucharest +posix/Europe/Budapest +posix/Europe/Busingen +posix/Europe/Chisinau +posix/Europe/Copenhagen +posix/Europe/Dublin +posix/Europe/Gibraltar +posix/Europe/Guernsey +posix/Europe/Helsinki +posix/Europe/Isle_of_Man +posix/Europe/Istanbul +posix/Europe/Jersey +posix/Europe/Kaliningrad +posix/Europe/Kiev +posix/Europe/Lisbon +posix/Europe/Ljubljana +posix/Europe/London +posix/Europe/Luxembourg +posix/Europe/Madrid +posix/Europe/Malta +posix/Europe/Mariehamn +posix/Europe/Minsk +posix/Europe/Monaco +posix/Europe/Moscow +posix/Europe/Nicosia +posix/Europe/Oslo +posix/Europe/Paris +posix/Europe/Podgorica +posix/Europe/Prague +posix/Europe/Riga +posix/Europe/Rome +posix/Europe/Samara +posix/Europe/San_Marino +posix/Europe/Sarajevo +posix/Europe/Simferopol +posix/Europe/Skopje +posix/Europe/Sofia +posix/Europe/Stockholm +posix/Europe/Tallinn +posix/Europe/Tirane +posix/Europe/Tiraspol +posix/Europe/Uzhgorod +posix/Europe/Vaduz +posix/Europe/Vatican +posix/Europe/Vienna +posix/Europe/Vilnius +posix/Europe/Volgograd +posix/Europe/Warsaw +posix/Europe/Zagreb +posix/Europe/Zaporozhye +posix/Europe/Zurich +posix/Factory +posix/GB +posix/GB-Eire +posix/GMT +posix/GMT+0 +posix/GMT-0 +posix/GMT0 +posix/Greenwich +posix/HST +posix/Hongkong +posix/Iceland +posix/Indian/Antananarivo +posix/Indian/Chagos +posix/Indian/Christmas +posix/Indian/Cocos +posix/Indian/Comoro +posix/Indian/Kerguelen +posix/Indian/Mahe +posix/Indian/Maldives +posix/Indian/Mauritius +posix/Indian/Mayotte +posix/Indian/Reunion +posix/Iran +posix/Israel +posix/Jamaica +posix/Japan +posix/Kwajalein +posix/Libya +posix/MET +posix/MST +posix/MST7MDT +posix/Mexico/BajaNorte +posix/Mexico/BajaSur +posix/Mexico/General +posix/NZ +posix/NZ-CHAT +posix/Navajo +posix/PRC +posix/PST8PDT +posix/Pacific/Apia +posix/Pacific/Auckland +posix/Pacific/Bougainville +posix/Pacific/Chatham +posix/Pacific/Chuuk +posix/Pacific/Easter +posix/Pacific/Efate +posix/Pacific/Enderbury +posix/Pacific/Fakaofo +posix/Pacific/Fiji +posix/Pacific/Funafuti +posix/Pacific/Galapagos +posix/Pacific/Gambier +posix/Pacific/Guadalcanal +posix/Pacific/Guam +posix/Pacific/Honolulu +posix/Pacific/Johnston +posix/Pacific/Kiritimati +posix/Pacific/Kosrae +posix/Pacific/Kwajalein +posix/Pacific/Majuro +posix/Pacific/Marquesas +posix/Pacific/Midway +posix/Pacific/Nauru +posix/Pacific/Niue +posix/Pacific/Norfolk +posix/Pacific/Noumea +posix/Pacific/Pago_Pago +posix/Pacific/Palau +posix/Pacific/Pitcairn +posix/Pacific/Pohnpei +posix/Pacific/Ponape +posix/Pacific/Port_Moresby +posix/Pacific/Rarotonga +posix/Pacific/Saipan +posix/Pacific/Samoa +posix/Pacific/Tahiti +posix/Pacific/Tarawa +posix/Pacific/Tongatapu +posix/Pacific/Truk +posix/Pacific/Wake +posix/Pacific/Wallis +posix/Pacific/Yap +posix/Poland +posix/Portugal +posix/ROC +posix/ROK +posix/Singapore +posix/Turkey +posix/UCT +posix/US/Alaska +posix/US/Aleutian +posix/US/Arizona +posix/US/Central +posix/US/East-Indiana +posix/US/Eastern +posix/US/Hawaii +posix/US/Indiana-Starke +posix/US/Michigan +posix/US/Mountain +posix/US/Pacific +posix/US/Pacific-New +posix/US/Samoa +posix/UTC +posix/Universal +posix/W-SU +posix/WET +posix/Zulu +posix/localtime +posix/posixrules +posixrules +right/Africa/Abidjan +right/Africa/Accra +right/Africa/Addis_Ababa +right/Africa/Algiers +right/Africa/Asmara +right/Africa/Asmera +right/Africa/Bamako +right/Africa/Bangui +right/Africa/Banjul +right/Africa/Bissau +right/Africa/Blantyre +right/Africa/Brazzaville +right/Africa/Bujumbura +right/Africa/Cairo +right/Africa/Casablanca +right/Africa/Ceuta +right/Africa/Conakry +right/Africa/Dakar +right/Africa/Dar_es_Salaam +right/Africa/Djibouti +right/Africa/Douala +right/Africa/El_Aaiun +right/Africa/Freetown +right/Africa/Gaborone +right/Africa/Harare +right/Africa/Johannesburg +right/Africa/Juba +right/Africa/Kampala +right/Africa/Khartoum +right/Africa/Kigali +right/Africa/Kinshasa +right/Africa/Lagos +right/Africa/Libreville +right/Africa/Lome +right/Africa/Luanda +right/Africa/Lubumbashi +right/Africa/Lusaka +right/Africa/Malabo +right/Africa/Maputo +right/Africa/Maseru +right/Africa/Mbabane +right/Africa/Mogadishu +right/Africa/Monrovia +right/Africa/Nairobi +right/Africa/Ndjamena +right/Africa/Niamey +right/Africa/Nouakchott +right/Africa/Ouagadougou +right/Africa/Porto-Novo +right/Africa/Sao_Tome +right/Africa/Timbuktu +right/Africa/Tripoli +right/Africa/Tunis +right/Africa/Windhoek +right/America/Adak +right/America/Anchorage +right/America/Anguilla +right/America/Antigua +right/America/Araguaina +right/America/Argentina/Buenos_Aires +right/America/Argentina/Catamarca +right/America/Argentina/ComodRivadavia +right/America/Argentina/Cordoba +right/America/Argentina/Jujuy +right/America/Argentina/La_Rioja +right/America/Argentina/Mendoza +right/America/Argentina/Rio_Gallegos +right/America/Argentina/Salta +right/America/Argentina/San_Juan +right/America/Argentina/San_Luis +right/America/Argentina/Tucuman +right/America/Argentina/Ushuaia +right/America/Aruba +right/America/Asuncion +right/America/Atikokan +right/America/Atka +right/America/Bahia +right/America/Bahia_Banderas +right/America/Barbados +right/America/Belem +right/America/Belize +right/America/Blanc-Sablon +right/America/Boa_Vista +right/America/Bogota +right/America/Boise +right/America/Buenos_Aires +right/America/Cambridge_Bay +right/America/Campo_Grande +right/America/Cancun +right/America/Caracas +right/America/Catamarca +right/America/Cayenne +right/America/Cayman +right/America/Chicago +right/America/Chihuahua +right/America/Coral_Harbour +right/America/Cordoba +right/America/Costa_Rica +right/America/Creston +right/America/Cuiaba +right/America/Curacao +right/America/Danmarkshavn +right/America/Dawson +right/America/Dawson_Creek +right/America/Denver +right/America/Detroit +right/America/Dominica +right/America/Edmonton +right/America/Eirunepe +right/America/El_Salvador +right/America/Ensenada +right/America/Fort_Wayne +right/America/Fortaleza +right/America/Glace_Bay +right/America/Godthab +right/America/Goose_Bay +right/America/Grand_Turk +right/America/Grenada +right/America/Guadeloupe +right/America/Guatemala +right/America/Guayaquil +right/America/Guyana +right/America/Halifax +right/America/Havana +right/America/Hermosillo +right/America/Indiana/Indianapolis +right/America/Indiana/Knox +right/America/Indiana/Marengo +right/America/Indiana/Petersburg +right/America/Indiana/Tell_City +right/America/Indiana/Vevay +right/America/Indiana/Vincennes +right/America/Indiana/Winamac +right/America/Indianapolis +right/America/Inuvik +right/America/Iqaluit +right/America/Jamaica +right/America/Jujuy +right/America/Juneau +right/America/Kentucky/Louisville +right/America/Kentucky/Monticello +right/America/Knox_IN +right/America/Kralendijk +right/America/La_Paz +right/America/Lima +right/America/Los_Angeles +right/America/Louisville +right/America/Lower_Princes +right/America/Maceio +right/America/Managua +right/America/Manaus +right/America/Marigot +right/America/Martinique +right/America/Matamoros +right/America/Mazatlan +right/America/Mendoza +right/America/Menominee +right/America/Merida +right/America/Metlakatla +right/America/Mexico_City +right/America/Miquelon +right/America/Moncton +right/America/Monterrey +right/America/Montevideo +right/America/Montreal +right/America/Montserrat +right/America/Nassau +right/America/New_York +right/America/Nipigon +right/America/Nome +right/America/Noronha +right/America/North_Dakota/Beulah +right/America/North_Dakota/Center +right/America/North_Dakota/New_Salem +right/America/Ojinaga +right/America/Panama +right/America/Pangnirtung +right/America/Paramaribo +right/America/Phoenix +right/America/Port-au-Prince +right/America/Port_of_Spain +right/America/Porto_Acre +right/America/Porto_Velho +right/America/Puerto_Rico +right/America/Rainy_River +right/America/Rankin_Inlet +right/America/Recife +right/America/Regina +right/America/Resolute +right/America/Rio_Branco +right/America/Rosario +right/America/Santa_Isabel +right/America/Santarem +right/America/Santiago +right/America/Santo_Domingo +right/America/Sao_Paulo +right/America/Scoresbysund +right/America/Shiprock +right/America/Sitka +right/America/St_Barthelemy +right/America/St_Johns +right/America/St_Kitts +right/America/St_Lucia +right/America/St_Thomas +right/America/St_Vincent +right/America/Swift_Current +right/America/Tegucigalpa +right/America/Thule +right/America/Thunder_Bay +right/America/Tijuana +right/America/Toronto +right/America/Tortola +right/America/Vancouver +right/America/Virgin +right/America/Whitehorse +right/America/Winnipeg +right/America/Yakutat +right/America/Yellowknife +right/Antarctica/Casey +right/Antarctica/Davis +right/Antarctica/DumontDUrville +right/Antarctica/Macquarie +right/Antarctica/Mawson +right/Antarctica/McMurdo +right/Antarctica/Palmer +right/Antarctica/Rothera +right/Antarctica/South_Pole +right/Antarctica/Syowa +right/Antarctica/Troll +right/Antarctica/Vostok +right/Arctic/Longyearbyen +right/Asia/Aden +right/Asia/Almaty +right/Asia/Amman +right/Asia/Anadyr +right/Asia/Aqtau +right/Asia/Aqtobe +right/Asia/Ashgabat +right/Asia/Ashkhabad +right/Asia/Baghdad +right/Asia/Bahrain +right/Asia/Baku +right/Asia/Bangkok +right/Asia/Beirut +right/Asia/Bishkek +right/Asia/Brunei +right/Asia/Calcutta +right/Asia/Chita +right/Asia/Choibalsan +right/Asia/Chongqing +right/Asia/Chungking +right/Asia/Colombo +right/Asia/Dacca +right/Asia/Damascus +right/Asia/Dhaka +right/Asia/Dili +right/Asia/Dubai +right/Asia/Dushanbe +right/Asia/Gaza +right/Asia/Harbin +right/Asia/Hebron +right/Asia/Ho_Chi_Minh +right/Asia/Hong_Kong +right/Asia/Hovd +right/Asia/Irkutsk +right/Asia/Istanbul +right/Asia/Jakarta +right/Asia/Jayapura +right/Asia/Jerusalem +right/Asia/Kabul +right/Asia/Kamchatka +right/Asia/Karachi +right/Asia/Kashgar +right/Asia/Kathmandu +right/Asia/Katmandu +right/Asia/Khandyga +right/Asia/Kolkata +right/Asia/Krasnoyarsk +right/Asia/Kuala_Lumpur +right/Asia/Kuching +right/Asia/Kuwait +right/Asia/Macao +right/Asia/Macau +right/Asia/Magadan +right/Asia/Makassar +right/Asia/Manila +right/Asia/Muscat +right/Asia/Nicosia +right/Asia/Novokuznetsk +right/Asia/Novosibirsk +right/Asia/Omsk +right/Asia/Oral +right/Asia/Phnom_Penh +right/Asia/Pontianak +right/Asia/Pyongyang +right/Asia/Qatar +right/Asia/Qyzylorda +right/Asia/Rangoon +right/Asia/Riyadh +right/Asia/Saigon +right/Asia/Sakhalin +right/Asia/Samarkand +right/Asia/Seoul +right/Asia/Shanghai +right/Asia/Singapore +right/Asia/Srednekolymsk +right/Asia/Taipei +right/Asia/Tashkent +right/Asia/Tbilisi +right/Asia/Tehran +right/Asia/Tel_Aviv +right/Asia/Thimbu +right/Asia/Thimphu +right/Asia/Tokyo +right/Asia/Ujung_Pandang +right/Asia/Ulaanbaatar +right/Asia/Ulan_Bator +right/Asia/Urumqi +right/Asia/Ust-Nera +right/Asia/Vientiane +right/Asia/Vladivostok +right/Asia/Yakutsk +right/Asia/Yekaterinburg +right/Asia/Yerevan +right/Atlantic/Azores +right/Atlantic/Bermuda +right/Atlantic/Canary +right/Atlantic/Cape_Verde +right/Atlantic/Faeroe +right/Atlantic/Faroe +right/Atlantic/Jan_Mayen +right/Atlantic/Madeira +right/Atlantic/Reykjavik +right/Atlantic/South_Georgia +right/Atlantic/St_Helena +right/Atlantic/Stanley +right/Australia/ACT +right/Australia/Adelaide +right/Australia/Brisbane +right/Australia/Broken_Hill +right/Australia/Canberra +right/Australia/Currie +right/Australia/Darwin +right/Australia/Eucla +right/Australia/Hobart +right/Australia/LHI +right/Australia/Lindeman +right/Australia/Lord_Howe +right/Australia/Melbourne +right/Australia/NSW +right/Australia/North +right/Australia/Perth +right/Australia/Queensland +right/Australia/South +right/Australia/Sydney +right/Australia/Tasmania +right/Australia/Victoria +right/Australia/West +right/Australia/Yancowinna +right/Brazil/Acre +right/Brazil/DeNoronha +right/Brazil/East +right/Brazil/West +right/CET +right/CST6CDT +right/Canada/Atlantic +right/Canada/Central +right/Canada/East-Saskatchewan +right/Canada/Eastern +right/Canada/Mountain +right/Canada/Newfoundland +right/Canada/Pacific +right/Canada/Saskatchewan +right/Canada/Yukon +right/Chile/Continental +right/Chile/EasterIsland +right/Cuba +right/EET +right/EST +right/EST5EDT +right/Egypt +right/Eire +right/Etc/GMT +right/Etc/GMT+0 +right/Etc/GMT+1 +right/Etc/GMT+10 +right/Etc/GMT+11 +right/Etc/GMT+12 +right/Etc/GMT+2 +right/Etc/GMT+3 +right/Etc/GMT+4 +right/Etc/GMT+5 +right/Etc/GMT+6 +right/Etc/GMT+7 +right/Etc/GMT+8 +right/Etc/GMT+9 +right/Etc/GMT-0 +right/Etc/GMT-1 +right/Etc/GMT-10 +right/Etc/GMT-11 +right/Etc/GMT-12 +right/Etc/GMT-13 +right/Etc/GMT-14 +right/Etc/GMT-2 +right/Etc/GMT-3 +right/Etc/GMT-4 +right/Etc/GMT-5 +right/Etc/GMT-6 +right/Etc/GMT-7 +right/Etc/GMT-8 +right/Etc/GMT-9 +right/Etc/GMT0 +right/Etc/Greenwich +right/Etc/UCT +right/Etc/UTC +right/Etc/Universal +right/Etc/Zulu +right/Europe/Amsterdam +right/Europe/Andorra +right/Europe/Athens +right/Europe/Belfast +right/Europe/Belgrade +right/Europe/Berlin +right/Europe/Bratislava +right/Europe/Brussels +right/Europe/Bucharest +right/Europe/Budapest +right/Europe/Busingen +right/Europe/Chisinau +right/Europe/Copenhagen +right/Europe/Dublin +right/Europe/Gibraltar +right/Europe/Guernsey +right/Europe/Helsinki +right/Europe/Isle_of_Man +right/Europe/Istanbul +right/Europe/Jersey +right/Europe/Kaliningrad +right/Europe/Kiev +right/Europe/Lisbon +right/Europe/Ljubljana +right/Europe/London +right/Europe/Luxembourg +right/Europe/Madrid +right/Europe/Malta +right/Europe/Mariehamn +right/Europe/Minsk +right/Europe/Monaco +right/Europe/Moscow +right/Europe/Nicosia +right/Europe/Oslo +right/Europe/Paris +right/Europe/Podgorica +right/Europe/Prague +right/Europe/Riga +right/Europe/Rome +right/Europe/Samara +right/Europe/San_Marino +right/Europe/Sarajevo +right/Europe/Simferopol +right/Europe/Skopje +right/Europe/Sofia +right/Europe/Stockholm +right/Europe/Tallinn +right/Europe/Tirane +right/Europe/Tiraspol +right/Europe/Uzhgorod +right/Europe/Vaduz +right/Europe/Vatican +right/Europe/Vienna +right/Europe/Vilnius +right/Europe/Volgograd +right/Europe/Warsaw +right/Europe/Zagreb +right/Europe/Zaporozhye +right/Europe/Zurich +right/Factory +right/GB +right/GB-Eire +right/GMT +right/GMT+0 +right/GMT-0 +right/GMT0 +right/Greenwich +right/HST +right/Hongkong +right/Iceland +right/Indian/Antananarivo +right/Indian/Chagos +right/Indian/Christmas +right/Indian/Cocos +right/Indian/Comoro +right/Indian/Kerguelen +right/Indian/Mahe +right/Indian/Maldives +right/Indian/Mauritius +right/Indian/Mayotte +right/Indian/Reunion +right/Iran +right/Israel +right/Jamaica +right/Japan +right/Kwajalein +right/Libya +right/MET +right/MST +right/MST7MDT +right/Mexico/BajaNorte +right/Mexico/BajaSur +right/Mexico/General +right/NZ +right/NZ-CHAT +right/Navajo +right/PRC +right/PST8PDT +right/Pacific/Apia +right/Pacific/Auckland +right/Pacific/Bougainville +right/Pacific/Chatham +right/Pacific/Chuuk +right/Pacific/Easter +right/Pacific/Efate +right/Pacific/Enderbury +right/Pacific/Fakaofo +right/Pacific/Fiji +right/Pacific/Funafuti +right/Pacific/Galapagos +right/Pacific/Gambier +right/Pacific/Guadalcanal +right/Pacific/Guam +right/Pacific/Honolulu +right/Pacific/Johnston +right/Pacific/Kiritimati +right/Pacific/Kosrae +right/Pacific/Kwajalein +right/Pacific/Majuro +right/Pacific/Marquesas +right/Pacific/Midway +right/Pacific/Nauru +right/Pacific/Niue +right/Pacific/Norfolk +right/Pacific/Noumea +right/Pacific/Pago_Pago +right/Pacific/Palau +right/Pacific/Pitcairn +right/Pacific/Pohnpei +right/Pacific/Ponape +right/Pacific/Port_Moresby +right/Pacific/Rarotonga +right/Pacific/Saipan +right/Pacific/Samoa +right/Pacific/Tahiti +right/Pacific/Tarawa +right/Pacific/Tongatapu +right/Pacific/Truk +right/Pacific/Wake +right/Pacific/Wallis +right/Pacific/Yap +right/Poland +right/Portugal +right/ROC +right/ROK +right/Singapore +right/Turkey +right/UCT +right/US/Alaska +right/US/Aleutian +right/US/Arizona +right/US/Central +right/US/East-Indiana +right/US/Eastern +right/US/Hawaii +right/US/Indiana-Starke +right/US/Michigan +right/US/Mountain +right/US/Pacific +right/US/Pacific-New +right/US/Samoa +right/UTC +right/Universal +right/W-SU +right/WET +right/Zulu + +Type it at the prompt below exactly as it appears above. (NOTE: If you don't +see your timezone, use "timeconfig" again after booting for the verbose list) + +EOF + echo -n "Timezone? " + read TIMEZONE; + echo + + if [ -r $T_PX/usr/share/zoneinfo/$TIMEZONE -o \ + -r /var/log/mount/usr/share/zoneinfo/$TIMEZONE -o \ + -L $T_PX/usr/share/zoneinfo/$TIMEZONE -o \ + -L /var/log/mount/usr/share/zoneinfo/$TIMEZONE ]; then + echo "Creating link from $TIMEZONE to localtime in /etc..." + echo + setzone $TIMEZONE + exit + else + cat << EOF + +Timezone $TIMEZONE could not be found. You may try again if you wish. +Make sure you type the name exactly as it appears - this configuration script +is case sensitive. + +Press [enter] to continue. + +EOF + read JUNK; + fi + done +fi + -- cgit v1.2.3