diff options
author | Timo Teras <timo.teras@iki.fi> | 2010-05-07 11:53:48 +0300 |
---|---|---|
committer | Timo Teras <timo.teras@iki.fi> | 2010-05-07 11:54:29 +0300 |
commit | 215a090bd2a116758f7de6c7d088390aa94a329c (patch) | |
tree | 4170851769fa3dad78c04207349a0d7eaf79a671 | |
parent | 72dc3b5920c3cab4b8e562bb452fbccb3392e081 (diff) | |
download | aports-215a090bd2a116758f7de6c7d088390aa94a329c.tar.bz2 aports-215a090bd2a116758f7de6c7d088390aa94a329c.tar.xz |
main/libc0.9.32: more dns fixes, and static build fix
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"); |