diff --git a/trunk/libc/uClibc-1.0.3X/Rules.mak b/trunk/libc/uClibc-1.0.3X/Rules.mak index 948369c0e..9ad753d7c 100644 --- a/trunk/libc/uClibc-1.0.3X/Rules.mak +++ b/trunk/libc/uClibc-1.0.3X/Rules.mak @@ -128,7 +128,7 @@ export RUNTIME_PREFIX DEVEL_PREFIX KERNEL_HEADERS MULTILIB_DIR # Now config hard core MAJOR_VERSION := 1 MINOR_VERSION := 0 -SUBLEVEL := 36 +SUBLEVEL := 37 EXTRAVERSION := VERSION := $(MAJOR_VERSION).$(MINOR_VERSION).$(SUBLEVEL) ABI_VERSION := $(MAJOR_VERSION) diff --git a/trunk/libc/uClibc-1.0.3X/extra/Configs/Config.in b/trunk/libc/uClibc-1.0.3X/extra/Configs/Config.in index 7dca9e305..a06a17864 100644 --- a/trunk/libc/uClibc-1.0.3X/extra/Configs/Config.in +++ b/trunk/libc/uClibc-1.0.3X/extra/Configs/Config.in @@ -505,7 +505,7 @@ config UCLIBC_CTOR_DTOR config LDSO_GNU_HASH_SUPPORT bool "Enable GNU hash style support" - depends on HAVE_SHARED + depends on HAVE_SHARED && !TARGET_mips help Newest binutils support a new hash style named GNU-hash. The dynamic linker will use the new GNU-hash section (.gnu.hash) for symbol lookup diff --git a/trunk/libc/uClibc-1.0.3X/libc/inet/resolv.c b/trunk/libc/uClibc-1.0.3X/libc/inet/resolv.c index addeadd2a..ed2e0d2fa 100644 --- a/trunk/libc/uClibc-1.0.3X/libc/inet/resolv.c +++ b/trunk/libc/uClibc-1.0.3X/libc/inet/resolv.c @@ -1178,8 +1178,8 @@ int __dns_lookup(const char *name, struct resolv_answer *a) { /* Protected by __resolv_lock: */ -// static int last_ns_num = 0; -// static uint16_t last_id = 1; + static int last_ns_num = 0; + static uint16_t last_id = 1; int i, j, fd, rc; int packet_len; @@ -1258,12 +1258,12 @@ int __dns_lookup(const char *name, } /* first time? pick starting server etc */ if (local_ns_num < 0) { - local_id = 1; + local_id = last_id; /*TODO: implement /etc/resolv.conf's "options rotate" (a.k.a. RES_ROTATE bit in _res.options) local_ns_num = 0; if (_res.options & RES_ROTATE) */ - local_ns_num = 0; + local_ns_num = last_ns_num; retries_left = __nameservers * __resolv_attempts; } if (local_ns_num >= __nameservers) @@ -1271,8 +1271,8 @@ int __dns_lookup(const char *name, local_id++; local_id &= 0xffff; /* write new values back while still under lock */ -// last_id = local_id; -// last_ns_num = local_ns_num; + last_id = local_id; + last_ns_num = local_ns_num; /* struct copy */ /* can't just take a pointer, __nameserver[x] * is not safe to use outside of locks */ diff --git a/trunk/libc/uClibc-1.0.3X/libc/stdlib/malloc-simple/alloc.c b/trunk/libc/uClibc-1.0.3X/libc/stdlib/malloc-simple/alloc.c index 3baf75fdd..757a05ecf 100644 --- a/trunk/libc/uClibc-1.0.3X/libc/stdlib/malloc-simple/alloc.c +++ b/trunk/libc/uClibc-1.0.3X/libc/stdlib/malloc-simple/alloc.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -28,6 +29,15 @@ void *malloc(size_t size) size++; } + /* prevent Undefined Behaviour for pointer arithmetic (substract) of too big pointers + * see: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63303 + * No need to check for size + sizeof(size_t) integer overflow since we already check for PTRDIFF_MAX + */ + if (unlikely(size > PTRDIFF_MAX)) { + __set_errno(ENOMEM); + return 0; + } + #ifdef __ARCH_USE_MMU__ # define MMAP_FLAGS MAP_PRIVATE | MAP_ANONYMOUS #else @@ -148,6 +158,16 @@ void * memalign (size_t alignment, size_t size) void * result; unsigned long int adj; + if (unlikely(size > PTRDIFF_MAX)) { + __set_errno(ENOMEM); + return NULL; + } + + if (unlikely((size + alignment - 1 < size) && (alignment != 0))) { + __set_errno(ENOMEM); + return NULL; + } + result = malloc (size + alignment - 1); if (result == NULL) return NULL; diff --git a/trunk/libc/uClibc-1.0.3X/libcrypt/crypt.c b/trunk/libc/uClibc-1.0.3X/libcrypt/crypt.c index 8399205ca..cfcd11f91 100644 --- a/trunk/libc/uClibc-1.0.3X/libcrypt/crypt.c +++ b/trunk/libc/uClibc-1.0.3X/libcrypt/crypt.c @@ -6,6 +6,7 @@ #include #include +#include #include "libcrypt.h" char *crypt(const char *key, const char *salt) @@ -26,7 +27,7 @@ char *crypt(const char *key, const char *salt) return __sha512_crypt(ukey, usalt); #endif } - /* __set_errno(EINVAL);*/ /* ENOSYS might be misleading */ + __set_errno(EINVAL); return NULL; } return __des_crypt(ukey, usalt);