aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimo Teras <timo.teras@iki.fi>2010-05-07 11:53:48 +0300
committerTimo Teras <timo.teras@iki.fi>2010-05-07 11:54:29 +0300
commit215a090bd2a116758f7de6c7d088390aa94a329c (patch)
tree4170851769fa3dad78c04207349a0d7eaf79a671
parent72dc3b5920c3cab4b8e562bb452fbccb3392e081 (diff)
downloadaports-215a090bd2a116758f7de6c7d088390aa94a329c.tar.bz2
aports-215a090bd2a116758f7de6c7d088390aa94a329c.tar.xz
main/libc0.9.32: more dns fixes, and static build fix
-rw-r--r--main/libc0.9.32/0001-static-build-fix-internal-locking-weaks-to-get-pulle.patch125
-rw-r--r--main/libc0.9.32/0002-resolv-various-memory-corruption-and-off-by-one-fixe.patch69
-rw-r--r--main/libc0.9.32/APKBUILD10
-rw-r--r--main/libc0.9.32/uclibc-resolv-fix.patch22
4 files changed, 200 insertions, 26 deletions
diff --git a/main/libc0.9.32/0001-static-build-fix-internal-locking-weaks-to-get-pulle.patch b/main/libc0.9.32/0001-static-build-fix-internal-locking-weaks-to-get-pulle.patch
new file mode 100644
index 0000000000..2898a0d02d
--- /dev/null
+++ b/main/libc0.9.32/0001-static-build-fix-internal-locking-weaks-to-get-pulle.patch
@@ -0,0 +1,125 @@
+From 67403d1d692c3b8022b0adca127a2c14ef8e3237 Mon Sep 17 00:00:00 2001
+From: Timo Teras <timo.teras@iki.fi>
+Date: Fri, 7 May 2010 11:28:27 +0300
+Subject: [PATCH 1/2] static build: fix internal locking weaks to get pulled in always
+
+Linker is smart and does not pull in weaks.os, ever. This happens
+because that compilation unit does not get strong references and
+ld eliminates dead code. We really need the weaks for static build
+in a compilation unit that is always there, otherwise it won't work.
+
+Signed-off-by: Timo Teras <timo.teras@iki.fi>
+---
+ libc/misc/internals/__uClibc_main.c | 35 ++++++++++++++++++++++++++++++
+ libc/misc/pthread/Makefile.in | 1 -
+ libc/misc/pthread/weaks.c | 40 -----------------------------------
+ 3 files changed, 35 insertions(+), 41 deletions(-)
+ delete mode 100644 libc/misc/pthread/weaks.c
+
+diff --git a/libc/misc/internals/__uClibc_main.c b/libc/misc/internals/__uClibc_main.c
+index f7e45c6..f9e1244 100644
+--- a/libc/misc/internals/__uClibc_main.c
++++ b/libc/misc/internals/__uClibc_main.c
+@@ -68,6 +68,41 @@ uintptr_t __guard attribute_relro;
+ */
+
+ void internal_function _dl_aux_init (ElfW(auxv_t) *av);
++
++/*
++ * uClibc internal locking requires that we have weak aliases
++ * for dummy functions in case libpthread.a is not linked in.
++ * This needs to be in compilation unit that is pulled always
++ * in or linker will disregard these weaks.
++ */
++
++static int __pthread_return_0 (pthread_mutex_t *unused) { return 0; }
++weak_alias (__pthread_return_0, __pthread_mutex_lock)
++weak_alias (__pthread_return_0, __pthread_mutex_trylock)
++weak_alias (__pthread_return_0, __pthread_mutex_unlock)
++
++int weak_function
++__pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)
++{
++ return 0;
++}
++
++void weak_function
++_pthread_cleanup_push_defer(struct _pthread_cleanup_buffer *__buffer,
++ void (*__routine) (void *), void *__arg)
++{
++ __buffer->__routine = __routine;
++ __buffer->__arg = __arg;
++}
++
++void weak_function
++_pthread_cleanup_pop_restore(struct _pthread_cleanup_buffer *__buffer,
++ int __execute)
++{
++ if (__execute)
++ __buffer->__routine(__buffer->__arg);
++}
++
+ #endif /* !SHARED */
+
+ /*
+diff --git a/libc/misc/pthread/Makefile.in b/libc/misc/pthread/Makefile.in
+index 69cdf10..2f436ac 100644
+--- a/libc/misc/pthread/Makefile.in
++++ b/libc/misc/pthread/Makefile.in
+@@ -11,7 +11,6 @@ MISC_PTHREAD_DIR := $(top_srcdir)libc/misc/pthread
+ MISC_PTHREAD_OUT := $(top_builddir)libc/misc/pthread
+
+ libc-shared-$(UCLIBC_HAS_TLS) += $(MISC_PTHREAD_OUT)/tsd.os
+-libc-static-$(UCLIBC_HAS_THREADS) += $(MISC_PTHREAD_OUT)/weaks.o
+
+ objclean-y += CLEAN_libc/misc/pthread
+
+diff --git a/libc/misc/pthread/weaks.c b/libc/misc/pthread/weaks.c
+deleted file mode 100644
+index fb1d85f..0000000
+--- a/libc/misc/pthread/weaks.c
++++ /dev/null
+@@ -1,40 +0,0 @@
+-/* The weak pthread functions for Linux.
+- Copyright (C) 1996, 1997, 1998 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 Library General Public License as
+- published by the Free Software Foundation; either version 2 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
+- Library General Public License for more details.
+-
+- You should have received a copy of the GNU Library General Public
+- License along with the GNU C Library; see the file COPYING.LIB. If not,
+- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+- Boston, MA 02111-1307, USA. */
+-
+-#include <libc-internal.h>
+-
+-/* Weaks for internal library use only.
+- *
+- * We need to define weaks here to cover all the pthread functions that
+- * libc itself will use so that we aren't forced to link libc against
+- * libpthread. This file is only used in libc.a and since we have
+- * weaks here, they will be automatically overridden by libpthread.a
+- * if it gets linked in.
+- */
+-
+-static int __pthread_return_0 (void) { return 0; }
+-static void __pthread_return_void (void) { return; }
+-
+-weak_alias (__pthread_return_0, __pthread_mutex_init)
+-weak_alias (__pthread_return_0, __pthread_mutex_lock)
+-weak_alias (__pthread_return_0, __pthread_mutex_trylock)
+-weak_alias (__pthread_return_0, __pthread_mutex_unlock)
+-weak_alias (__pthread_return_void, _pthread_cleanup_push_defer)
+-weak_alias (__pthread_return_void, _pthread_cleanup_pop_restore)
+-
+--
+1.6.3.3
+
diff --git a/main/libc0.9.32/0002-resolv-various-memory-corruption-and-off-by-one-fixe.patch b/main/libc0.9.32/0002-resolv-various-memory-corruption-and-off-by-one-fixe.patch
new file mode 100644
index 0000000000..562d648a6a
--- /dev/null
+++ b/main/libc0.9.32/0002-resolv-various-memory-corruption-and-off-by-one-fixe.patch
@@ -0,0 +1,69 @@
+From bfe9a589a402d4b6265e32b1b5ca0942efdcff3b Mon Sep 17 00:00:00 2001
+From: Timo Teras <timo.teras@iki.fi>
+Date: Fri, 7 May 2010 11:30:04 +0300
+Subject: [PATCH 2/2] resolv: various memory corruption and off by one fixes
+
+Fixes resolution of names with AAAA entries and gethostbyaddr issues.
+
+Signed-off-by: Timo Teras <timo.teras@iki.fi>
+---
+ libc/inet/resolv.c | 12 ++++++++----
+ 1 files changed, 8 insertions(+), 4 deletions(-)
+
+diff --git a/libc/inet/resolv.c b/libc/inet/resolv.c
+index 84289a6..320aec4 100644
+--- a/libc/inet/resolv.c
++++ b/libc/inet/resolv.c
+@@ -689,7 +689,7 @@ int attribute_hidden __decode_dotted(const unsigned char *packet,
+
+ if (used + b + 1 >= dest_len)
+ return -1;
+- if (offset + b + 1 >= packet_len)
++ if (offset + b >= packet_len)
+ return -1;
+ memcpy(dest + used, packet + offset, b);
+ offset += b;
+@@ -2417,7 +2417,7 @@ int gethostbyaddr_r(const void *addr, socklen_t addrlen,
+ /* Layout in buf:
+ * char *alias[ALIAS_DIM];
+ * struct in[6]_addr* addr_list[2];
+- * struct in[6]_addr* in;
++ * struct in[6]_addr in;
+ * char scratch_buffer[256+];
+ */
+ #define in6 ((struct in6_addr *)in)
+@@ -2431,9 +2431,13 @@ int gethostbyaddr_r(const void *addr, socklen_t addrlen,
+ #ifndef __UCLIBC_HAS_IPV6__
+ buf += sizeof(*in);
+ buflen -= sizeof(*in);
++ if (addrlen > sizeof(*in))
++ return ERANGE;
+ #else
+ buf += sizeof(*in6);
+ buflen -= sizeof(*in6);
++ if (addrlen > sizeof(*in6))
++ return ERANGE;
+ #endif
+ if ((ssize_t)buflen < 256)
+ return ERANGE;
+@@ -2441,7 +2445,7 @@ int gethostbyaddr_r(const void *addr, socklen_t addrlen,
+ alias[1] = NULL;
+ addr_list[0] = in;
+ addr_list[1] = NULL;
+- memcpy(&in, addr, addrlen);
++ memcpy(in, addr, addrlen);
+
+ if (0) /* nothing */;
+ #ifdef __UCLIBC_HAS_IPV4__
+@@ -2456,7 +2460,7 @@ int gethostbyaddr_r(const void *addr, socklen_t addrlen,
+ char *dst = buf;
+ unsigned char *tp = (unsigned char *)addr + addrlen - 1;
+ do {
+- dst += sprintf(dst, "%x.%x.", tp[i] & 0xf, tp[i] >> 4);
++ dst += sprintf(dst, "%x.%x.", tp[0] & 0xf, tp[0] >> 4);
+ tp--;
+ } while (tp >= (unsigned char *)addr);
+ strcpy(dst, "ip6.arpa");
+--
+1.6.3.3
+
diff --git a/main/libc0.9.32/APKBUILD b/main/libc0.9.32/APKBUILD
index 355df1189d..da3421449a 100644
--- a/main/libc0.9.32/APKBUILD
+++ b/main/libc0.9.32/APKBUILD
@@ -3,7 +3,7 @@ _abiver=0.9.32
pkgname=libc$_abiver
_gitver=100427
pkgver=${_abiver}_alpha0_git$_gitver
-pkgrel=4
+pkgrel=5
pkgdesc="C library for developing embedded Linux systems"
url=http://uclibc.org
license="LGPL-2"
@@ -16,7 +16,8 @@ replaces=uclibc
source="
http://git.uclibc.org/uClibc/snapshot/master.tar.bz2
compat-stack-guard.patch
- uclibc-resolv-fix.patch
+ 0001-static-build-fix-internal-locking-weaks-to-get-pulle.patch
+ 0002-resolv-various-memory-corruption-and-off-by-one-fixe.patch
uclibcconfig.x86
uclibcconfig.i486
"
@@ -87,8 +88,9 @@ utils() {
mv "$pkgdir"/usr/bin/* "$subpkgdir"/usr/bin/
}
-md5sums="1189f8f739b1977a86b7afa8637e6827 master.tar.bz2
+md5sums="46e98672dc2a4309d9a7c65b4e626845 master.tar.bz2
4d408f72142ce55a0754948cc9cfe447 compat-stack-guard.patch
-14d0d155887319f32f164da0bea48c9e uclibc-resolv-fix.patch
+826666b365f2d63a71d67eb76c94f7bc 0001-static-build-fix-internal-locking-weaks-to-get-pulle.patch
+0800a489a738c7b1d8c3643cb9806926 0002-resolv-various-memory-corruption-and-off-by-one-fixe.patch
791e2fc050cab523ce1c907ca39a2486 uclibcconfig.x86
791e2fc050cab523ce1c907ca39a2486 uclibcconfig.i486"
diff --git a/main/libc0.9.32/uclibc-resolv-fix.patch b/main/libc0.9.32/uclibc-resolv-fix.patch
deleted file mode 100644
index afde80df3d..0000000000
--- a/main/libc0.9.32/uclibc-resolv-fix.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-diff --git a/libc/inet/resolv.c b/libc/inet/resolv.c
-index 84289a6..84a6b41 100644
---- a/libc/inet/resolv.c
-+++ b/libc/inet/resolv.c
-@@ -689,7 +689,7 @@ int attribute_hidden __decode_dotted(const unsigned char *packet,
-
- if (used + b + 1 >= dest_len)
- return -1;
-- if (offset + b + 1 >= packet_len)
-+ if (offset + b >= packet_len)
- return -1;
- memcpy(dest + used, packet + offset, b);
- offset += b;
-@@ -2456,7 +2456,7 @@ int gethostbyaddr_r(const void *addr, socklen_t addrlen,
- char *dst = buf;
- unsigned char *tp = (unsigned char *)addr + addrlen - 1;
- do {
-- dst += sprintf(dst, "%x.%x.", tp[i] & 0xf, tp[i] >> 4);
-+ dst += sprintf(dst, "%x.%x.", tp[0] & 0xf, tp[0] >> 4);
- tp--;
- } while (tp >= (unsigned char *)addr);
- strcpy(dst, "ip6.arpa");