diff --git a/core/glibc/PKGBUILD b/core/glibc/PKGBUILD
index 8b54c070c..c5d3515f9 100644
--- a/core/glibc/PKGBUILD
+++ b/core/glibc/PKGBUILD
@@ -15,7 +15,7 @@ noautobuild=1
 
 pkgname=glibc
 pkgver=2.15
-pkgrel=7
+pkgrel=10
 _glibcdate=20111227
 pkgdesc="GNU C Library"
 arch=('i686' 'x86_64')
@@ -31,7 +31,8 @@ options=('!strip' '!distcc')
 install=glibc.install
 source=(ftp://ftp.archlinux.org/other/glibc/${pkgname}-${pkgver}_${_glibcdate}.tar.xz
         http://archlinuxarm.org/builder/src/glibc-ports-2.15.tar.bz2
-        glibc-2.10-dont-build-timezone.patch
+        glibc-2.15-do-not-install-timezone-files.patch
+        glibc-2.15-do-not-install-timezone-files-2.patch
         glibc-__i686.patch
         glibc-2.12.2-ignore-origin-of-privileged-program.patch
         glibc-2.14-libdl-crash.patch
@@ -58,12 +59,14 @@ source=(ftp://ftp.archlinux.org/other/glibc/${pkgname}-${pkgver}_${_glibcdate}.t
         glibc-2.15-non-signalling-comparisons.patch
         glibc-2.15-rintf-rounding.patch
         glibc-2.15-nearbyintf-rounding.patch
+        glibc-2.15-confstr-local-buffer-extent.patch
         nscd
         locale.gen.txt
         locale-gen)
 md5sums=('6ffdf5832192b92f98bdd125317c0dfc'
          '216bfdcce3689e037d38d8d724720187'
-         '4dadb9203b69a3210d53514bb46f41c3'
+         '349227bcedb19cea008fbcb2c7e1a582'
+         '880439de2c608177ed1d749722d26820'
          '40cd342e21f71f5e49e32622b25acc52'
          'e60e33591c9ec1447e4cddadcbb9cf3a'
          '6970bcfeb3bf88913436d5112d16f588'
@@ -84,12 +87,13 @@ md5sums=('6ffdf5832192b92f98bdd125317c0dfc'
          '7a2998a04ebfcf8bf820540f490ce714'
          '0d77d20fa7fe2f87ad945cb9edb4d91d'
          'bfdefac3d705f41fbf84b1de1dc945af'
-         'dded423e264cdd178500f3e8ad62fe66'
+         'de9399a35a9c14f793c66f1230674d67'
          '340deaa582a95ddde86edb624c3bfea0'
          '6bbac50e6ff82187654e6a0a7bd849e7'
          'c483504cf404ed0b44480af627813a97'
          '1419d61fd1dbc6cdc48bb59da86fa66f'
          '7ff501435078b1a2622124fbeaafc921'
+         '4ed0bb09c3851cd9cb5e39c946a8a334'
          'b587ee3a70c9b3713099295609afde49'
          '07ac979b6ab5eeb778d55f041529d623'
          '476e9113489f93b348b21e144b6a8fcf')
@@ -110,11 +114,13 @@ build() {
   ln -s ${srcdir}/${pkgname}-ports-${pkgver} ./ports
 
   # timezone data is in separate package (tzdata)
-  patch -p1 -i ${srcdir}/glibc-2.10-dont-build-timezone.patch
+  # http://sourceware.org/git/?p=glibc.git;a=commit;h=482ff4da
+  patch -p1 -i ${srcdir}/glibc-2.15-do-not-install-timezone-files.patch
+  # http://sourceware.org/git/?p=glibc.git;a=commit;h=a458e7fe
+  patch -p1 -i ${srcdir}/glibc-2.15-do-not-install-timezone-files-2.patch
 
-  # undefine __i686 for gcc <= 4.6
-  # http://sourceware.org/ml/libc-alpha/2009-07/msg00072.html
-  # fix in http://sourceware.org/git/?p=glibc.git;a=commit;h=d4a54ac6 requires additional backporting...
+  # undefine __i686
+  # http://sourceware.org/glibc/wiki/Release/2.15#Build_Failures
   patch -p1 -i ${srcdir}/glibc-__i686.patch
 
   # http://www.exploit-db.com/exploits/15274/
@@ -127,9 +133,9 @@ build() {
 
   # re-export RPC interface until libtirpc is ready as a replacement
   # http://sourceware.org/git/?p=glibc.git;a=commitdiff;h=acee4873  (fedora branch)
-  patch -Np1 -i ${srcdir}/glibc-2.14-reexport-rpc-interface.patch
+  patch -p1 -i ${srcdir}/glibc-2.14-reexport-rpc-interface.patch
   # http://sourceware.org/git/?p=glibc.git;a=commitdiff;h=bdd816a3  (fedora branch)
-  patch -Np1 -i ${srcdir}/glibc-2.14-reinstall-nis-rpc-headers.patch
+  patch -p1 -i ${srcdir}/glibc-2.14-reinstall-nis-rpc-headers.patch
 
   # fix res_query assertion
   # http://sourceware.org/bugzilla/show_bug.cgi?id=13013
@@ -137,25 +143,25 @@ build() {
 
   # fix up regcomp/regexec
   # http://sourceware.org/git/?p=glibc.git;a=commit;h=2ba92745
-  patch -Np1 -i ${srcdir}/glibc-2.15-regex.patch
+  patch -p1 -i ${srcdir}/glibc-2.15-regex.patch
 
   # propriety nvidia crash - https://bugzilla.redhat.com/show_bug.cgi?id=737223
   # http://sourceware.org/git/?p=glibc.git;a=commitdiff;h=0c95ab64  (fedora branch)
-  patch -Np1 -i ${srcdir}/glibc-2.15-lddebug-scopes.patch
+  patch -p1 -i ${srcdir}/glibc-2.15-lddebug-scopes.patch
 
   # revert commit c5a0802a - causes various hangs
   # https://bugzilla.redhat.com/show_bug.cgi?id=769421
   # Note: fedora may have actual fix (not submitted upstream yet...)
   # http://pkgs.fedoraproject.org/gitweb/?p=glibc.git;a=blob_plain;f=glibc-rh552960-2.patch
-  patch -Np1 -i ${srcdir}/glibc-2.15-revert-c5a0802a.patch
+  patch -p1 -i ${srcdir}/glibc-2.15-revert-c5a0802a.patch
 
   # fix realloc usage in vfscanf
   # http://sourceware.org/git/?p=glibc.git;a=commit;h=20b38e03
-  patch -Np1 -i ${srcdir}/glibc-2.15-scanf.patch
+  patch -p1 -i ${srcdir}/glibc-2.15-scanf.patch
 
   # fix ifunc relocations
   # http://sourceware.org/git/?p=glibc.git;a=commit;h=6ee65ed6
-  patch -Np1 -i ${srcdir}/glibc-2.15-ifunc.patch
+  patch -p1 -i ${srcdir}/glibc-2.15-ifunc.patch
 
   # fix AVX detection
   # http://sourceware.org/git/?p=glibc.git;a=commit;h=afc5ed09
@@ -196,8 +202,7 @@ build() {
   patch -p1 -i ${srcdir}/glibc-2.15-feraiseexcept-plt.patch
 
   # vfprintf nargs overflow - CVE-2012-0864
-  # http://sourceware.org/bugzilla/show_bug.cgi?id=13656
-  # http://sourceware.org/ml/libc-alpha/2012-02/msg00328.html
+  # http://sourceware.org/git/?p=glibc.git;a=commit;h=7c1f4834
   patch -p1 -i ${srcdir}/glibc-2.15-vfprintf-nargs.patch
 
   # avoid out ouf bounds read in __libc_res_nquerydomain
@@ -220,6 +225,11 @@ build() {
   # http://sourceware.org/git/?p=glibc.git;a=commit;h=6cbeae47
   patch -p1 -i ${srcdir}/glibc-2.15-nearbyintf-rounding.patch
 
+  # fix varaible scope issue in confstr
+  # http://sourceware.org/git/?p=glibc.git;a=commit;h=ac4c54f0
+  # http://sourceware.org/git/?p=glibc.git;a=commit;h=d6a403f9
+  patch -p1 -i ${srcdir}/glibc-2.15-confstr-local-buffer-extent.patch
+
   install -dm755 ${pkgdir}/etc
   touch ${pkgdir}/etc/ld.so.conf
 
diff --git a/core/glibc/glibc-2.10-dont-build-timezone.patch b/core/glibc/glibc-2.10-dont-build-timezone.patch
deleted file mode 100644
index d3abeff17..000000000
--- a/core/glibc/glibc-2.10-dont-build-timezone.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-timezone data has been split into the package sys-libs/timezone-data
-
---- glibc-2.4/Makeconfig
-+++ glibc-2.4/Makeconfig
-@@ -931,7 +931,7 @@
- 	      stdlib stdio-common libio malloc string wcsmbs time dirent    \
- 	      grp pwd posix io termios resource misc socket sysvipc gmon    \
- 	      gnulib iconv iconvdata wctype manual shadow gshadow po argp   \
--	      crypt nss localedata timezone rt conform debug		    \
-+	      crypt nss localedata rt conform debug		    \
- 	      $(add-on-subdirs) $(dlfcn) $(binfmt-subdir)
- 
- ifndef avoid-generated
diff --git a/core/glibc/glibc-2.15-confstr-local-buffer-extent.patch b/core/glibc/glibc-2.15-confstr-local-buffer-extent.patch
new file mode 100644
index 000000000..614880dd4
--- /dev/null
+++ b/core/glibc/glibc-2.15-confstr-local-buffer-extent.patch
@@ -0,0 +1,297 @@
+diff --git a/posix/confstr.c b/posix/confstr.c
+index 3c9566d..cad6561 100644
+--- a/posix/confstr.c
++++ b/posix/confstr.c
+@@ -35,6 +34,10 @@ confstr (name, buf, len)
+   const char *string = "";
+   size_t string_len = 1;
+
++  /* Note that this buffer must be large enough for the longest strings
++     used below.  */
++  char restenvs[4 * sizeof "POSIX_V7_LPBIG_OFFBIG"];
++
+   switch (name)
+     {
+     case _CS_PATH:
+@@ -53,59 +56,55 @@ confstr (name, buf, len)
+	 wint_t types are no greater than the width of type long.
+
+	 Currently this means all environment which the system allows.  */
+-      {
+-	char restenvs[4 * sizeof "POSIX_V7_LPBIG_OFFBIG"];
+-
+-	string_len = 0;
++      string_len = 0;
+ #ifndef _POSIX_V7_ILP32_OFF32
+-	if (__sysconf (_SC_V7_ILP32_OFF32) > 0)
++      if (__sysconf (_SC_V7_ILP32_OFF32) > 0)
+ #endif
+ #if !defined _POSIX_V7_ILP32_OFF32 || _POSIX_V7_ILP32_OFF32 > 0
+-	  {
+-	    memcpy (restenvs + string_len, "POSIX_V7_ILP32_OFF32",
+-		    sizeof "POSIX_V7_ILP32_OFF32" - 1);
+-	    string_len += sizeof "POSIX_V7_ILP32_OFF32" - 1;
+-	  }
++	{
++	  memcpy (restenvs + string_len, "POSIX_V7_ILP32_OFF32",
++		  sizeof "POSIX_V7_ILP32_OFF32" - 1);
++	  string_len += sizeof "POSIX_V7_ILP32_OFF32" - 1;
++	}
+ #endif
+ #ifndef _POSIX_V7_ILP32_OFFBIG
+-	if (__sysconf (_SC_V7_ILP32_OFFBIG) > 0)
++      if (__sysconf (_SC_V7_ILP32_OFFBIG) > 0)
+ #endif
+ #if !defined _POSIX_V7_ILP32_OFFBIG || _POSIX_V7_ILP32_OFFBIG > 0
+-	  {
+-	    if (string_len)
+-	      restenvs[string_len++] = '\n';
+-	    memcpy (restenvs + string_len, "POSIX_V7_ILP32_OFFBIG",
+-		    sizeof "POSIX_V7_ILP32_OFFBIG" - 1);
+-	    string_len += sizeof "POSIX_V7_ILP32_OFFBIG" - 1;
+-	  }
++	{
++	  if (string_len)
++	    restenvs[string_len++] = '\n';
++	  memcpy (restenvs + string_len, "POSIX_V7_ILP32_OFFBIG",
++		  sizeof "POSIX_V7_ILP32_OFFBIG" - 1);
++	  string_len += sizeof "POSIX_V7_ILP32_OFFBIG" - 1;
++	}
+ #endif
+ #ifndef _POSIX_V7_LP64_OFF64
+-	if (__sysconf (_SC_V7_LP64_OFF64) > 0)
++      if (__sysconf (_SC_V7_LP64_OFF64) > 0)
+ #endif
+ #if !defined _POSIX_V7_LP64_OFF64 || _POSIX_V7_LP64_OFF64 > 0
+-	  {
+-	    if (string_len)
+-	      restenvs[string_len++] = '\n';
+-	    memcpy (restenvs + string_len, "POSIX_V7_LP64_OFF64",
+-		    sizeof "POSIX_V7_LP64_OFF64" - 1);
+-	    string_len += sizeof "POSIX_V7_LP64_OFF64" - 1;
+-	  }
++	{
++	  if (string_len)
++	    restenvs[string_len++] = '\n';
++	  memcpy (restenvs + string_len, "POSIX_V7_LP64_OFF64",
++		  sizeof "POSIX_V7_LP64_OFF64" - 1);
++	  string_len += sizeof "POSIX_V7_LP64_OFF64" - 1;
++	}
+ #endif
+ #ifndef _POSIX_V7_LPBIG_OFFBIG
+-	if (__sysconf (_SC_V7_LPBIG_OFFBIG) > 0)
++      if (__sysconf (_SC_V7_LPBIG_OFFBIG) > 0)
+ #endif
+ #if !defined _POSIX_V7_LPBIG_OFFBIG || _POSIX_V7_LPBIG_OFFBIG > 0
+-	  {
+-	    if (string_len)
+-	      restenvs[string_len++] = '\n';
+-	    memcpy (restenvs + string_len, "POSIX_V7_LPBIG_OFFBIG",
+-		    sizeof "POSIX_V7_LPBIG_OFFBIG" - 1);
+-	    string_len += sizeof "POSIX_V7_LPBIG_OFFBIG" - 1;
+-	  }
+-#endif
+-	restenvs[string_len++] = '\0';
+-	string = restenvs;
+-      }
++	{
++	  if (string_len)
++	    restenvs[string_len++] = '\n';
++	  memcpy (restenvs + string_len, "POSIX_V7_LPBIG_OFFBIG",
++		  sizeof "POSIX_V7_LPBIG_OFFBIG" - 1);
++	  string_len += sizeof "POSIX_V7_LPBIG_OFFBIG" - 1;
++	}
++#endif
++      restenvs[string_len++] = '\0';
++      string = restenvs;
+       break;
+
+     case _CS_V6_WIDTH_RESTRICTED_ENVS:
+@@ -116,59 +115,55 @@ confstr (name, buf, len)
+	 wint_t types are no greater than the width of type long.
+
+	 Currently this means all environment which the system allows.  */
+-      {
+-	char restenvs[4 * sizeof "POSIX_V6_LPBIG_OFFBIG"];
+-
+-	string_len = 0;
++      string_len = 0;
+ #ifndef _POSIX_V6_ILP32_OFF32
+-	if (__sysconf (_SC_V6_ILP32_OFF32) > 0)
++      if (__sysconf (_SC_V6_ILP32_OFF32) > 0)
+ #endif
+ #if !defined _POSIX_V6_ILP32_OFF32 || _POSIX_V6_ILP32_OFF32 > 0
+-	  {
+-	    memcpy (restenvs + string_len, "POSIX_V6_ILP32_OFF32",
+-		    sizeof "POSIX_V6_ILP32_OFF32" - 1);
+-	    string_len += sizeof "POSIX_V6_ILP32_OFF32" - 1;
+-	  }
++	{
++	  memcpy (restenvs + string_len, "POSIX_V6_ILP32_OFF32",
++		  sizeof "POSIX_V6_ILP32_OFF32" - 1);
++	  string_len += sizeof "POSIX_V6_ILP32_OFF32" - 1;
++	}
+ #endif
+ #ifndef _POSIX_V6_ILP32_OFFBIG
+-	if (__sysconf (_SC_V6_ILP32_OFFBIG) > 0)
++      if (__sysconf (_SC_V6_ILP32_OFFBIG) > 0)
+ #endif
+ #if !defined _POSIX_V6_ILP32_OFFBIG || _POSIX_V6_ILP32_OFFBIG > 0
+-	  {
+-	    if (string_len)
+-	      restenvs[string_len++] = '\n';
+-	    memcpy (restenvs + string_len, "POSIX_V6_ILP32_OFFBIG",
+-		    sizeof "POSIX_V6_ILP32_OFFBIG" - 1);
+-	    string_len += sizeof "POSIX_V6_ILP32_OFFBIG" - 1;
+-	  }
++	{
++	  if (string_len)
++	    restenvs[string_len++] = '\n';
++	  memcpy (restenvs + string_len, "POSIX_V6_ILP32_OFFBIG",
++		  sizeof "POSIX_V6_ILP32_OFFBIG" - 1);
++	  string_len += sizeof "POSIX_V6_ILP32_OFFBIG" - 1;
++	}
+ #endif
+ #ifndef _POSIX_V6_LP64_OFF64
+-	if (__sysconf (_SC_V6_LP64_OFF64) > 0)
++      if (__sysconf (_SC_V6_LP64_OFF64) > 0)
+ #endif
+ #if !defined _POSIX_V6_LP64_OFF64 || _POSIX_V6_LP64_OFF64 > 0
+-	  {
+-	    if (string_len)
+-	      restenvs[string_len++] = '\n';
+-	    memcpy (restenvs + string_len, "POSIX_V6_LP64_OFF64",
+-		    sizeof "POSIX_V6_LP64_OFF64" - 1);
+-	    string_len += sizeof "POSIX_V6_LP64_OFF64" - 1;
+-	  }
++	{
++	  if (string_len)
++	    restenvs[string_len++] = '\n';
++	  memcpy (restenvs + string_len, "POSIX_V6_LP64_OFF64",
++		  sizeof "POSIX_V6_LP64_OFF64" - 1);
++	  string_len += sizeof "POSIX_V6_LP64_OFF64" - 1;
++	}
+ #endif
+ #ifndef _POSIX_V6_LPBIG_OFFBIG
+-	if (__sysconf (_SC_V6_LPBIG_OFFBIG) > 0)
++      if (__sysconf (_SC_V6_LPBIG_OFFBIG) > 0)
+ #endif
+ #if !defined _POSIX_V6_LPBIG_OFFBIG || _POSIX_V6_LPBIG_OFFBIG > 0
+-	  {
+-	    if (string_len)
+-	      restenvs[string_len++] = '\n';
+-	    memcpy (restenvs + string_len, "POSIX_V6_LPBIG_OFFBIG",
+-		    sizeof "POSIX_V6_LPBIG_OFFBIG" - 1);
+-	    string_len += sizeof "POSIX_V6_LPBIG_OFFBIG" - 1;
+-	  }
+-#endif
+-	restenvs[string_len++] = '\0';
+-	string = restenvs;
+-      }
++	{
++	  if (string_len)
++	    restenvs[string_len++] = '\n';
++	  memcpy (restenvs + string_len, "POSIX_V6_LPBIG_OFFBIG",
++		  sizeof "POSIX_V6_LPBIG_OFFBIG" - 1);
++	  string_len += sizeof "POSIX_V6_LPBIG_OFFBIG" - 1;
++	}
++#endif
++      restenvs[string_len++] = '\0';
++      string = restenvs;
+       break;
+
+     case _CS_V5_WIDTH_RESTRICTED_ENVS:
+@@ -179,59 +174,55 @@ confstr (name, buf, len)
+	 wint_t types are no greater than the width of type long.
+
+	 Currently this means all environment which the system allows.  */
+-      {
+-	char restenvs[4 * sizeof "XBS5_LPBIG_OFFBIG"];
+-
+-	string_len = 0;
++      string_len = 0;
+ #ifndef _XBS5_ILP32_OFF32
+-	if (__sysconf (_SC_XBS5_ILP32_OFF32) > 0)
++      if (__sysconf (_SC_XBS5_ILP32_OFF32) > 0)
+ #endif
+ #if !defined _XBS5_ILP32_OFF32 || _XBS5_ILP32_OFF32 > 0
+-	  {
+-	    memcpy (restenvs + string_len, "XBS5_ILP32_OFF32",
+-		    sizeof "XBS5_ILP32_OFF32" - 1);
+-	    string_len += sizeof "XBS5_ILP32_OFF32" - 1;
+-	  }
++	{
++	  memcpy (restenvs + string_len, "XBS5_ILP32_OFF32",
++		  sizeof "XBS5_ILP32_OFF32" - 1);
++	  string_len += sizeof "XBS5_ILP32_OFF32" - 1;
++	}
+ #endif
+ #ifndef _XBS5_ILP32_OFFBIG
+-	if (__sysconf (_SC_XBS5_ILP32_OFFBIG) > 0)
++      if (__sysconf (_SC_XBS5_ILP32_OFFBIG) > 0)
+ #endif
+ #if !defined _XBS5_ILP32_OFFBIG || _XBS5_ILP32_OFFBIG > 0
+-	  {
+-	    if (string_len)
+-	      restenvs[string_len++] = '\n';
+-	    memcpy (restenvs + string_len, "XBS5_ILP32_OFFBIG",
+-		    sizeof "XBS5_ILP32_OFFBIG" - 1);
+-	    string_len += sizeof "XBS5_ILP32_OFFBIG" - 1;
+-	  }
++	{
++	  if (string_len)
++	    restenvs[string_len++] = '\n';
++	  memcpy (restenvs + string_len, "XBS5_ILP32_OFFBIG",
++		  sizeof "XBS5_ILP32_OFFBIG" - 1);
++	  string_len += sizeof "XBS5_ILP32_OFFBIG" - 1;
++	}
+ #endif
+ #ifndef _XBS5_LP64_OFF64
+-	if (__sysconf (_SC_XBS5_LP64_OFF64) > 0)
++      if (__sysconf (_SC_XBS5_LP64_OFF64) > 0)
+ #endif
+ #if !defined _XBS5_LP64_OFF64 || _XBS5_LP64_OFF64 > 0
+-	  {
+-	    if (string_len)
+-	      restenvs[string_len++] = '\n';
+-	    memcpy (restenvs + string_len, "XBS5_LP64_OFF64",
+-		    sizeof "XBS5_LP64_OFF64" - 1);
+-	    string_len += sizeof "XBS5_LP64_OFF64" - 1;
+-	  }
++	{
++	  if (string_len)
++	    restenvs[string_len++] = '\n';
++	  memcpy (restenvs + string_len, "XBS5_LP64_OFF64",
++		  sizeof "XBS5_LP64_OFF64" - 1);
++	  string_len += sizeof "XBS5_LP64_OFF64" - 1;
++	}
+ #endif
+ #ifndef _XBS5_LPBIG_OFFBIG
+-	if (__sysconf (_SC_XBS5_LPBIG_OFFBIG) > 0)
++      if (__sysconf (_SC_XBS5_LPBIG_OFFBIG) > 0)
+ #endif
+ #if !defined _XBS5_LPBIG_OFFBIG || _XBS5_LPBIG_OFFBIG > 0
+-	  {
+-	    if (string_len)
+-	      restenvs[string_len++] = '\n';
+-	    memcpy (restenvs + string_len, "XBS5_LPBIG_OFFBIG",
+-		    sizeof "XBS5_LPBIG_OFFBIG" - 1);
+-	    string_len += sizeof "XBS5_LPBIG_OFFBIG" - 1;
+-	  }
+-#endif
+-	restenvs[string_len++] = '\0';
+-	string = restenvs;
+-      }
++	{
++	  if (string_len)
++	    restenvs[string_len++] = '\n';
++	  memcpy (restenvs + string_len, "XBS5_LPBIG_OFFBIG",
++		  sizeof "XBS5_LPBIG_OFFBIG" - 1);
++	  string_len += sizeof "XBS5_LPBIG_OFFBIG" - 1;
++	}
++#endif
++      restenvs[string_len++] = '\0';
++      string = restenvs;
+       break;
+
+     case _CS_XBS5_ILP32_OFF32_CFLAGS:
diff --git a/core/glibc/glibc-2.15-do-not-install-timezone-files-2.patch b/core/glibc/glibc-2.15-do-not-install-timezone-files-2.patch
new file mode 100644
index 000000000..13b6ddc5b
--- /dev/null
+++ b/core/glibc/glibc-2.15-do-not-install-timezone-files-2.patch
@@ -0,0 +1,20 @@
+diff --git a/timezone/Makefile b/timezone/Makefile
+index 00bfba6..9e55a6a 100644
+--- a/timezone/Makefile
++++ b/timezone/Makefile
+@@ -45,7 +45,6 @@ include ../Makeconfig	# Get objpfx defined so we can use it below.
+ CPPFLAGS-zic = -DNOT_IN_libc
+
+ ifeq ($(have-ksh),yes)
+-install-others += $(inst_zonedir)/iso3166.tab $(inst_zonedir)/zone.tab
+ install-bin-script = tzselect
+ generated += tzselect
+ endif
+@@ -111,7 +110,3 @@ $(objpfx)tzselect: tzselect.ksh $(common-objpfx)config.make
+	    -e 's%@TZDIR@%$(zonedir)%g' < $< > $@.new
+	chmod 555 $@.new
+	mv -f $@.new $@
+-
+-$(addprefix $(inst_zonedir)/,iso3166.tab zone.tab): \
+-    $(inst_zonedir)/%: % $(+force)
+-	$(do-install)
diff --git a/core/glibc/glibc-2.15-do-not-install-timezone-files.patch b/core/glibc/glibc-2.15-do-not-install-timezone-files.patch
new file mode 100644
index 000000000..61b822608
--- /dev/null
+++ b/core/glibc/glibc-2.15-do-not-install-timezone-files.patch
@@ -0,0 +1,124 @@
+diff --git a/timezone/Makefile b/timezone/Makefile
+index e8fb716..d5ea538 100644
+--- a/timezone/Makefile
++++ b/timezone/Makefile
+@@ -1,4 +1,4 @@
+-# Copyright (C) 1998,1999,2000,2002,2005,2007 Free Software Foundation, Inc.
++# Copyright (C) 1998-2000,2002,2005,2007,2012 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
+@@ -49,33 +49,6 @@ include ../Makeconfig	# Get objpfx defined so we can use it below.
+
+ CPPFLAGS-zic = -DNOT_IN_libc
+
+-# z.* use this variable.
+-define nl
+-
+-
+-endef
+-ifndef avoid-generated
+-ifndef inhibit_timezone_rules
+--include $(addprefix $(objpfx)z.,$(tzfiles))
+-endif
+-endif
+-
+-# Make these absolute file names.
+-installed-localtime-file := $(firstword $(filter /%,$(inst_localtime-file)) \
+-					$(addprefix $(inst_zonedir)/, \
+-						    $(localtime-file)))
+-installed-posixrules-file := $(firstword $(filter /%,$(posixrules-file)) \
+-					 $(addprefix $(inst_zonedir)/, \
+-						     $(posixrules-file)))
+-
+-ifeq ($(cross-compiling),no)
+-# Don't try to install the zoneinfo files since we can't run zic.
+-install-others = $(addprefix $(inst_zonedir)/,$(zonenames) \
+-					      $(zonenames:%=posix/%) \
+-					      $(zonenames:%=right/%)) \
+-		 $(installed-localtime-file) $(installed-posixrules-file)
+-endif
+-
+ ifeq ($(have-ksh),yes)
+ install-others += $(inst_zonedir)/iso3166.tab $(inst_zonedir)/zone.tab
+ install-bin-script = tzselect
+@@ -85,79 +58,6 @@ endif
+ include ../Rules
+
+
+-$(tzfiles:%=$(objpfx)z.%): $(objpfx)z.%: % Makefile
+-# Kludge alert: we use an implicit rule (in what we are generating here)
+-# because that is the only way to tell Make that the one command builds all
+-# the files.
+-# The extra kludge for the $(tzlinks) files is necessary since running zic
+-# this file requires all other files to exist.  Blech!
+-	$(make-target-directory)
+-	(echo 'define $*-zones'						    ;\
+-	 $(AWK) '$$1 == "Zone" { print $$2 } $$1 == "Link" { print $$3 }' $^ ;\
+-	 echo 'endef'							    ;\
+-	 echo '$*-zones := $$(subst $$(nl), ,$$($*-zones))'		    ;\
+-	 echo 'ifdef $*-zones'						    ;\
+-	 if test x$(findstring $*, $(tzlinks)) != x; then		     \
+-	   echo '$$(addprefix $$(inst_zonedir)/right/,$$($*-zones)): \';\
+-	   echo '$$(foreach t,$$(tzbases),$$(addprefix $$(inst_zonedir)/right/,$$($$t-zones)))' ;\
+-	   echo '$$(addprefix $$(inst_zonedir)/posix/,$$($*-zones)): \';\
+-	   echo '$$(foreach t,$$(tzbases),$$(addprefix $$(inst_zonedir)/posix/,$$($$t-zones)))' ;\
+-	   echo '$$(addprefix $$(inst_zonedir)/,$$($*-zones)): \'	    ;\
+-	   echo '$$(foreach t,$$(tzbases),$$(addprefix $$(inst_zonedir)/,$$($$t-zones)))' ;\
+-	 fi								    ;\
+-	 echo '$$(addprefix $$(dir $$(inst_zonedir))zone%/right/,$$($*-zones)): \' ;\
+-	 echo '$< $$(objpfx)zic leapseconds yearistype'			    ;\
+-	 echo '	$$(tzcompile)'						    ;\
+-	 echo '$$(addprefix $$(dir $$(inst_zonedir))zone%/posix/,$$($*-zones)): \' ;\
+-	 echo '$< $$(objpfx)zic /dev/null yearistype'			    ;\
+-	 echo '	$$(tzcompile)'						    ;\
+-	 echo '$$(addprefix $$(dir $$(inst_zonedir))zone%/,$$($*-zones)): \' ;\
+-	 echo '$< $$(objpfx)zic $$(leapseconds) yearistype'		    ;\
+-	 echo '	$$(tzcompile)'						    ;\
+-	 echo 'endif'							    ;\
+-	 echo 'zonenames := $$(zonenames) $$($*-zones)'			    ;\
+-	) > $@.new
+-	mv $@.new $@
+-
+-.PHONY: echo-zonenames
+-echo-zonenames:
+-	@echo 'Known zones: $(zonenames)'
+-
+-
+-# We have to use `-d $(inst_zonedir)' to explictly tell zic where to
+-# place the output files although $(zonedir) is compiled in.  But the
+-# user might have set $(install_root) on the command line of `make install'.
+-zic-cmd = $(built-program-cmd) -d $(inst_zonedir)
+-tzcompile = $(zic-cmd)$(target-zone-flavor) -L $(word 3,$^) \
+-	    -y $(dir $(word 4,$^))$(notdir $(word 4,$^)) $<
+-
+-# The source files specify the zone names relative to the -d directory,
+-# so for the posix/ and right/ flavors we need to pass -d $(inst_zonedir)/posix
+-# and the like.  This magic extracts /posix or /right if it's the first
+-# component after $(inst_zonedir) in the target name $@.
+-target-zone-flavor = $(filter /posix /right, \
+-			      /$(firstword $(subst /, , \
+-					  $(patsubst $(inst_zonedir)/%,%,$@))))
+-
+-ifdef localtime
+-$(installed-localtime-file): $(inst_zonedir)/$(localtime) $(objpfx)zic \
+-			     $(+force)
+-	$(make-target-directory)
+-	if test -r $@; then \
+-	  echo Site timezone NOT reset to Factory.; \
+-	else \
+-	  rm -f $@T; \
+-	  $(SHELL) $(..)scripts/rellns-sh $< $@T; \
+-	  mv -f $@T $@; \
+-	fi
+-endif
+-ifdef posixrules
+-$(installed-posixrules-file): $(inst_zonedir)/$(posixrules) $(objpfx)zic \
+-			      $(+force)
+-	$(zic-cmd) -p $(posixrules)
+-endif
+-
+-
+ $(objpfx)zic: $(objpfx)scheck.o $(objpfx)ialloc.o
+
+ tz-cflags = -DTZDIR='"$(zonedir)"' \
diff --git a/core/glibc/glibc-2.15-vfprintf-nargs.patch b/core/glibc/glibc-2.15-vfprintf-nargs.patch
index 6a37bde68..f682ad5fe 100644
--- a/core/glibc/glibc-2.15-vfprintf-nargs.patch
+++ b/core/glibc/glibc-2.15-vfprintf-nargs.patch
@@ -3,15 +3,15 @@ index a847b28..080badc 100644
 --- a/stdio-common/Makefile
 +++ b/stdio-common/Makefile
 @@ -59,7 +59,8 @@ tests := tstscanf test_rdwr test-popen tstgetln test-fseek \
- 	 tst-popen tst-unlockedio tst-fmemopen2 tst-put-error tst-fgets \
- 	 tst-fwrite bug16 bug17 tst-swscanf tst-sprintf2 bug18 bug18a \
- 	 bug19 bug19a tst-popen2 scanf13 scanf14 scanf15 bug20 bug21 bug22 \
+	 tst-popen tst-unlockedio tst-fmemopen2 tst-put-error tst-fgets \
+	 tst-fwrite bug16 bug17 tst-swscanf tst-sprintf2 bug18 bug18a \
+	 bug19 bug19a tst-popen2 scanf13 scanf14 scanf15 bug20 bug21 bug22 \
 -	 scanf16 scanf17 tst-setvbuf1 tst-grouping bug23 bug24
 +	 scanf16 scanf17 tst-setvbuf1 tst-grouping bug23 bug24 \
 +	 bug-vfprintf-nargs
- 
+
  test-srcs = tst-unbputc tst-printf
- 
+
 diff --git a/stdio-common/bug-vfprintf-nargs.c b/stdio-common/bug-vfprintf-nargs.c
 new file mode 100644
 index 0000000..13c66c0
@@ -97,13 +97,13 @@ index 0000000..13c66c0
 +#define TEST_FUNCTION do_test ()
 +#include "../test-skeleton.c"
 diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c
-index 863cd5d..022e72b 100644
+index 863cd5d..c802e46 100644
 --- a/stdio-common/vfprintf.c
 +++ b/stdio-common/vfprintf.c
 @@ -235,6 +235,9 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
       0 if unknown.  */
    int readonly_format = 0;
- 
+
 +  /* For the argument descriptions, which may be allocated on the heap.  */
 +  void *args_malloced = NULL;
 +
@@ -120,25 +120,29 @@ index 863cd5d..022e72b 100644
 +    union printf_arg *args_value;
      int *args_size;
 +    int *args_type;
- 
+
      /* Positional parameters refer to arguments directly.  This could
         also determine the maximum number of arguments.  Track the
-@@ -1698,13 +1702,33 @@ do_positional:
- 
+@@ -1698,13 +1702,38 @@ do_positional:
+
      /* Determine the number of arguments the format string consumes.  */
      nargs = MAX (nargs, max_ref_arg);
++    /* Calculate total size needed to represent a single argument across
++       all three argument-related arrays.  */
 +    bytes_per_arg = sizeof (*args_value) + sizeof (*args_size)
 +                    + sizeof (*args_type);
 +
 +    /* Check for potential integer overflow.  */
-+    if (nargs > SIZE_MAX / bytes_per_arg)
++    if (__builtin_expect (nargs > SIZE_MAX / bytes_per_arg, 0))
 +      {
++         __set_errno (ERANGE);
 +         done = -1;
 +         goto all_done;
 +      }
- 
-     /* Allocate memory for the argument descriptions.  */
+
+-    /* Allocate memory for the argument descriptions.  */
 -    args_type = alloca (nargs * sizeof (int));
++    /* Allocate memory for all three argument arrays.  */
 +    if (__libc_use_alloca (nargs * bytes_per_arg))
 +        args_value = alloca (nargs * bytes_per_arg);
 +    else
@@ -151,6 +155,8 @@ index 863cd5d..022e72b 100644
 +          }
 +      }
 +
++    /* Set up the remaining two arrays to each point past the end of the
++       prior array, since space for all three has been allocated now.  */
 +    args_size = &args_value[nargs].pa_int;
 +    args_type = &args_size[nargs];
      memset (args_type, s->_flags2 & _IO_FLAGS2_FORTIFY ? '\xff' : '\0',
@@ -158,12 +164,12 @@ index 863cd5d..022e72b 100644
 -    args_value = alloca (nargs * sizeof (union printf_arg));
 -    args_size = alloca (nargs * sizeof (int));
 +	    nargs * sizeof (*args_type));
- 
+
      /* XXX Could do sanity check here: If any element in ARGS_TYPE is
         still zero after this loop, format is invalid.  For now we
-@@ -1973,8 +1997,8 @@ do_positional:
+@@ -1973,8 +2002,8 @@ do_positional:
    }
- 
+
  all_done:
 -  if (__builtin_expect (workstart != NULL, 0))
 -    free (workstart);