From 293f29e8c45ca0fcb064107e275a477ad1913106 Mon Sep 17 00:00:00 2001 From: Natanael Copa Date: Fri, 23 Dec 2011 16:30:18 +0100 Subject: main/libc0.9.32: reorganize patches We keep track of our patches in git now: http://git.alpinelinux.org/cgit/uClibc-alpine This is so its easier to keep track of upstream and make sure that our patches are upstreamed. we also bump pkgrel so we make sure we get the patches tested properly --- ...stack-protector-for-non-Thread-Local-stor.patch | 72 + ...o-allow-numeric-service-without-any-hints.patch | 37 - ...-ldso-limited-support-for-ORIGIN-in-rpath.patch | 198 --- ...x-stack-unwinding-and-backtrace-informati.patch | 250 --- ...imentary-locking-for-dlopen-dlsym-dlclose.patch | 152 -- ...libm-x86_64-implement-some-fenv-functions.patch | 283 ---- .../0001-malloc-standard-synchronize-on-fork.patch | 54 - ...x-resolver-to-return-TRY_AGAIN-on-timeout.patch | 265 --- ...rsing-of-tzdata-files-where-off_t-is-64-b.patch | 32 - .../0002-resolv-res_query-for-CNAMEs.patch | 41 + ...b-fix-arc4random-return-type-to-u_int32_t.patch | 61 - .../libc0.9.32/0003-ldso-support-RTLD_NOLOAD.patch | 234 --- main/libc0.9.32/0003-resolv-fix-memory-leak.patch | 38 + ...x-resolver-to-return-TRY_AGAIN-on-timeout.patch | 266 +++ ...libm-x86_64-implement-some-fenv-functions.patch | 288 ++++ ...-ldso-limited-support-for-ORIGIN-in-rpath.patch | 202 +++ ...b-fix-arc4random-return-type-to-u_int32_t.patch | 62 + .../libc0.9.32/0008-ldso-support-RTLD_NOLOAD.patch | 235 +++ ...imentary-locking-for-dlopen-dlsym-dlclose.patch | 154 ++ .../0010-malloc-standard-synchronize-on-fork.patch | 55 + ...rsing-of-tzdata-files-where-off_t-is-64-b.patch | 32 + ...o-allow-numeric-service-without-any-hints.patch | 41 + ...x-stack-unwinding-and-backtrace-informati.patch | 251 +++ .../0014-libm-add-cabsf-and-cabsl-functions.patch | 39 + ...bm-implement-generic-cexp-cexpf-and-cexpl.patch | 103 ++ .../0016-libubacktrace-use-.so.-ABI_VERSION.patch | 29 + ...__libc_epoll_pwait-compile-failure-on-x86.patch | 44 + ...bcrypt-do-not-cast-away-const-of-key-salt.patch | 34 + ...9-libcrypt-make-crypt-itself-more-modular.patch | 64 + ...d-support-for-SHA512-CRYPT-password-hashi.patch | 834 +++++++++ ...d-support-for-SHA256-CRYPT-password-hashi.patch | 789 +++++++++ main/libc0.9.32/0022-Add-eventfd-support.patch | 118 ++ ...-crypt-build-fix.-define-ARRAY_SIZE-macro.patch | 26 + main/libc0.9.32/APKBUILD | 92 +- main/libc0.9.32/compat-stack-guard.patch | 55 - main/libc0.9.32/libm-cabsf.patch | 37 - main/libc0.9.32/libm-cexp.patch | 101 -- main/libc0.9.32/sha512-crypt.patch | 1777 -------------------- main/libc0.9.32/uclibc-epoll_pwait-hack.patch | 20 - main/libc0.9.32/uclibc-eventfd.patch | 141 -- main/libc0.9.32/uclibc-resolv-cname-fix.diff | 19 - .../libc0.9.32/uclibc-resolv-fix-memory-leak.patch | 33 - .../uclibc-ubacktrace-asneeded-fix.patch | 22 - 43 files changed, 3870 insertions(+), 3810 deletions(-) create mode 100644 main/libc0.9.32/0001-Compatible-stack-protector-for-non-Thread-Local-stor.patch delete mode 100644 main/libc0.9.32/0001-getaddrinfo-allow-numeric-service-without-any-hints.patch delete mode 100644 main/libc0.9.32/0001-ldso-limited-support-for-ORIGIN-in-rpath.patch delete mode 100644 main/libc0.9.32/0001-libc-x86-fix-stack-unwinding-and-backtrace-informati.patch delete mode 100644 main/libc0.9.32/0001-libdl-rudimentary-locking-for-dlopen-dlsym-dlclose.patch delete mode 100644 main/libc0.9.32/0001-libm-x86_64-implement-some-fenv-functions.patch delete mode 100644 main/libc0.9.32/0001-malloc-standard-synchronize-on-fork.patch delete mode 100644 main/libc0.9.32/0001-resolv-fix-resolver-to-return-TRY_AGAIN-on-timeout.patch delete mode 100644 main/libc0.9.32/0001-time-fix-parsing-of-tzdata-files-where-off_t-is-64-b.patch create mode 100644 main/libc0.9.32/0002-resolv-res_query-for-CNAMEs.patch delete mode 100644 main/libc0.9.32/0002-stdlib-fix-arc4random-return-type-to-u_int32_t.patch delete mode 100644 main/libc0.9.32/0003-ldso-support-RTLD_NOLOAD.patch create mode 100644 main/libc0.9.32/0003-resolv-fix-memory-leak.patch create mode 100644 main/libc0.9.32/0004-resolv-fix-resolver-to-return-TRY_AGAIN-on-timeout.patch create mode 100644 main/libc0.9.32/0005-libm-x86_64-implement-some-fenv-functions.patch create mode 100644 main/libc0.9.32/0006-ldso-limited-support-for-ORIGIN-in-rpath.patch create mode 100644 main/libc0.9.32/0007-stdlib-fix-arc4random-return-type-to-u_int32_t.patch create mode 100644 main/libc0.9.32/0008-ldso-support-RTLD_NOLOAD.patch create mode 100644 main/libc0.9.32/0009-libdl-rudimentary-locking-for-dlopen-dlsym-dlclose.patch create mode 100644 main/libc0.9.32/0010-malloc-standard-synchronize-on-fork.patch create mode 100644 main/libc0.9.32/0011-time-fix-parsing-of-tzdata-files-where-off_t-is-64-b.patch create mode 100644 main/libc0.9.32/0012-getaddrinfo-allow-numeric-service-without-any-hints.patch create mode 100644 main/libc0.9.32/0013-libc-x86-fix-stack-unwinding-and-backtrace-informati.patch create mode 100644 main/libc0.9.32/0014-libm-add-cabsf-and-cabsl-functions.patch create mode 100644 main/libc0.9.32/0015-libm-implement-generic-cexp-cexpf-and-cexpl.patch create mode 100644 main/libc0.9.32/0016-libubacktrace-use-.so.-ABI_VERSION.patch create mode 100644 main/libc0.9.32/0017-Fix-__libc_epoll_pwait-compile-failure-on-x86.patch create mode 100644 main/libc0.9.32/0018-libcrypt-do-not-cast-away-const-of-key-salt.patch create mode 100644 main/libc0.9.32/0019-libcrypt-make-crypt-itself-more-modular.patch create mode 100644 main/libc0.9.32/0020-libcrypt-add-support-for-SHA512-CRYPT-password-hashi.patch create mode 100644 main/libc0.9.32/0021-libcrypt-add-support-for-SHA256-CRYPT-password-hashi.patch create mode 100644 main/libc0.9.32/0022-Add-eventfd-support.patch create mode 100644 main/libc0.9.32/0023-crypt-build-fix.-define-ARRAY_SIZE-macro.patch delete mode 100644 main/libc0.9.32/compat-stack-guard.patch delete mode 100644 main/libc0.9.32/libm-cabsf.patch delete mode 100644 main/libc0.9.32/libm-cexp.patch delete mode 100644 main/libc0.9.32/sha512-crypt.patch delete mode 100644 main/libc0.9.32/uclibc-epoll_pwait-hack.patch delete mode 100644 main/libc0.9.32/uclibc-eventfd.patch delete mode 100644 main/libc0.9.32/uclibc-resolv-cname-fix.diff delete mode 100644 main/libc0.9.32/uclibc-resolv-fix-memory-leak.patch delete mode 100644 main/libc0.9.32/uclibc-ubacktrace-asneeded-fix.patch (limited to 'main/libc0.9.32') diff --git a/main/libc0.9.32/0001-Compatible-stack-protector-for-non-Thread-Local-stor.patch b/main/libc0.9.32/0001-Compatible-stack-protector-for-non-Thread-Local-stor.patch new file mode 100644 index 0000000000..b60dd446e7 --- /dev/null +++ b/main/libc0.9.32/0001-Compatible-stack-protector-for-non-Thread-Local-stor.patch @@ -0,0 +1,72 @@ +From 3fb4bfcafbcaff3522e7bab48ff03460fec99023 Mon Sep 17 00:00:00 2001 +From: Natanael Copa +Date: Fri, 23 Dec 2011 14:06:09 +0100 +Subject: [PATCH] Compatible stack protector for non Thread Local storage + +Before we had thread local storage the __stack_chk_guard was a global +variable that was referenced to by the older binaries. + +We since then have changed ABI so this patch can probably go away. +--- + ldso/ldso/ldso.c | 7 +------ + libc/misc/internals/__uClibc_main.c | 8 +------- + 2 files changed, 2 insertions(+), 13 deletions(-) + +diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c +index 7ee9257..3585cb7 100644 +--- a/ldso/ldso/ldso.c ++++ b/ldso/ldso/ldso.c +@@ -103,11 +103,7 @@ extern void _start(void); + #ifdef __UCLIBC_HAS_SSP__ + # include + static uintptr_t stack_chk_guard; +-# ifndef THREAD_SET_STACK_GUARD +-/* Only exported for architectures that don't store the stack guard canary +- * in local thread area. */ + uintptr_t __stack_chk_guard attribute_relro; +-# endif + # ifdef __UCLIBC_HAS_SSP_COMPAT__ + uintptr_t __guard attribute_relro; + # endif +@@ -951,9 +947,8 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, + stack_chk_guard = _dl_setup_stack_chk_guard (); + # ifdef THREAD_SET_STACK_GUARD + THREAD_SET_STACK_GUARD (stack_chk_guard); +-# else +- __stack_chk_guard = stack_chk_guard; + # endif ++ __stack_chk_guard = stack_chk_guard; + # ifdef __UCLIBC_HAS_SSP_COMPAT__ + __guard = stack_chk_guard; + # endif +diff --git a/libc/misc/internals/__uClibc_main.c b/libc/misc/internals/__uClibc_main.c +index 315365a..78cd058 100644 +--- a/libc/misc/internals/__uClibc_main.c ++++ b/libc/misc/internals/__uClibc_main.c +@@ -46,12 +46,7 @@ void *__libc_stack_end = NULL; + # ifdef __UCLIBC_HAS_SSP__ + # include + static uintptr_t stack_chk_guard; +-# ifndef THREAD_SET_STACK_GUARD +-/* Only exported for architectures that don't store the stack guard canary +- * in thread local area. */ +-/* for gcc-4.1 non-TLS */ + uintptr_t __stack_chk_guard attribute_relro; +-# endif + /* for gcc-3.x + Etoh ssp */ + # ifdef __UCLIBC_HAS_SSP_COMPAT__ + uintptr_t __guard attribute_relro; +@@ -247,9 +242,8 @@ void __uClibc_init(void) + stack_chk_guard = _dl_setup_stack_chk_guard(); + # ifdef THREAD_SET_STACK_GUARD + THREAD_SET_STACK_GUARD (stack_chk_guard); +-# else +- __stack_chk_guard = stack_chk_guard; + # endif ++ __stack_chk_guard = stack_chk_guard; + # ifdef __UCLIBC_HAS_SSP_COMPAT__ + __guard = stack_chk_guard; + # endif +-- +1.7.8 + diff --git a/main/libc0.9.32/0001-getaddrinfo-allow-numeric-service-without-any-hints.patch b/main/libc0.9.32/0001-getaddrinfo-allow-numeric-service-without-any-hints.patch deleted file mode 100644 index bdd3ce4892..0000000000 --- a/main/libc0.9.32/0001-getaddrinfo-allow-numeric-service-without-any-hints.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 66cdddf50492b9b645200ef580ae957c388694ab Mon Sep 17 00:00:00 2001 -From: Natanael Copa -Date: Wed, 8 Jun 2011 09:12:16 +0000 -Subject: [PATCH] getaddrinfo: allow numeric service without any hints - -This appears to correspond to what glibc does and this fixes an -issue with iptables-1.4.11 with udp and raw port numbers. - -(see http://bugzilla.netfilter.org/show_bug.cgi?id=721) - -This fixes #3841 -https://bugs.busybox.net/show_bug.cgi?id=3841 ---- - libc/inet/getaddrinfo.c | 7 ------- - 1 files changed, 0 insertions(+), 7 deletions(-) - -diff --git a/libc/inet/getaddrinfo.c b/libc/inet/getaddrinfo.c -index 1a77c51..e7511f6 100644 ---- a/libc/inet/getaddrinfo.c -+++ b/libc/inet/getaddrinfo.c -@@ -820,13 +820,6 @@ getaddrinfo(const char *name, const char *service, - if (hints->ai_flags & AI_NUMERICSERV) - return EAI_NONAME; - gaih_service.num = -1; -- } else { -- /* -- * Can't specify a numerical socket unless a protocol -- * family was given. -- */ -- if (hints->ai_socktype == 0 && hints->ai_protocol == 0) -- return EAI_SERVICE; - } - pservice = &gaih_service; - } else --- -1.7.5.4 - diff --git a/main/libc0.9.32/0001-ldso-limited-support-for-ORIGIN-in-rpath.patch b/main/libc0.9.32/0001-ldso-limited-support-for-ORIGIN-in-rpath.patch deleted file mode 100644 index 73e0fab2bf..0000000000 --- a/main/libc0.9.32/0001-ldso-limited-support-for-ORIGIN-in-rpath.patch +++ /dev/null @@ -1,198 +0,0 @@ -From 0ba7ee452f26088f6b738c37e05c16c7c9eb1caf Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Timo=20Ter=C3=A4s?= -Date: Fri, 18 Mar 2011 10:53:56 +0200 -Subject: [PATCH 1/3] ldso: limited support for $ORIGIN in rpath -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Handle it if it's in the beginning of the rpath entry as it -should be. - -Signed-off-by: Timo Teräs ---- - ldso/ldso/dl-elf.c | 80 ++++++++++++++++++++++++++++----------------------- - ldso/ldso/ldso.c | 18 ++++++++++-- - 2 files changed, 59 insertions(+), 39 deletions(-) - -diff --git a/ldso/ldso/dl-elf.c b/ldso/ldso/dl-elf.c -index 505247e..2b2d429 100644 ---- a/ldso/ldso/dl-elf.c -+++ b/ldso/ldso/dl-elf.c -@@ -133,53 +133,60 @@ _dl_protect_relro (struct elf_resolve *l) - * in uClibc/ldso/util/ldd.c */ - static struct elf_resolve * - search_for_named_library(const char *name, int secure, const char *path_list, -- struct dyn_elf **rpnt) -+ struct dyn_elf **rpnt, const char *origin) - { -- char *path, *path_n, *mylibname; -+ char *mylibname; -+ const char *p, *pn; - struct elf_resolve *tpnt; -- int done; -+ int plen; - - if (path_list==NULL) - return NULL; - -- /* We need a writable copy of this string, but we don't -- * need this allocated permanently since we don't want -- * to leak memory, so use alloca to put path on the stack */ -- done = _dl_strlen(path_list); -- path = alloca(done + 1); -- - /* another bit of local storage */ - mylibname = alloca(2050); - -- _dl_memcpy(path, path_list, done+1); -- - /* Unlike ldd.c, don't bother to eliminate double //s */ - - /* Replace colons with zeros in path_list */ - /* : at the beginning or end of path maps to CWD */ - /* :: anywhere maps CWD */ - /* "" maps to CWD */ -- done = 0; -- path_n = path; -- do { -- if (*path == 0) { -- *path = ':'; -- done = 1; -- } -- if (*path == ':') { -- *path = 0; -- if (*path_n) -- _dl_strcpy(mylibname, path_n); -- else -- _dl_strcpy(mylibname, "."); /* Assume current dir if empty path */ -- _dl_strcat(mylibname, "/"); -- _dl_strcat(mylibname, name); -- if ((tpnt = _dl_load_elf_shared_library(secure, rpnt, mylibname)) != NULL) -- return tpnt; -- path_n = path+1; -+ for (p = path_list; p != NULL; p = pn) { -+ pn = _dl_strchr(p + 1, ':'); -+ if (pn != NULL) { -+ plen = pn - p; -+ pn++; -+ } else -+ plen = _dl_strlen(p); -+ -+ if (plen >= 7 && _dl_memcmp(p, "$ORIGIN", 7) == 0) { -+ int olen; -+ if (secure && plen != 7) -+ continue; -+ if (origin == NULL) -+ continue; -+ for (olen = _dl_strlen(origin) - 1; olen >= 0 && origin[olen] != '/'; olen--) -+ ; -+ if (olen <= 0) -+ continue; -+ _dl_memcpy(&mylibname[0], origin, olen); -+ _dl_memcpy(&mylibname[olen], p + 7, plen - 7); -+ mylibname[olen + plen - 7] = 0; -+ } else if (plen != 0) { -+ _dl_memcpy(mylibname, p, plen); -+ mylibname[plen] = 0; -+ } else { -+ _dl_strcpy(mylibname, "."); - } -- path++; -- } while (!done); -+ _dl_strcat(mylibname, "/"); -+ _dl_strcat(mylibname, name); -+ -+ tpnt = _dl_load_elf_shared_library(secure, rpnt, mylibname); -+ if (tpnt != NULL) -+ return tpnt; -+ } -+ - return NULL; - } - -@@ -231,7 +238,8 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, - if (pnt) { - pnt += (unsigned long) tpnt->dynamic_info[DT_STRTAB]; - _dl_if_debug_dprint("\tsearching RPATH='%s'\n", pnt); -- if ((tpnt1 = search_for_named_library(libname, secure, pnt, rpnt)) != NULL) -+ if ((tpnt1 = search_for_named_library(libname, secure, pnt, rpnt, -+ tpnt->libname)) != NULL) - return tpnt1; - } - #endif -@@ -239,7 +247,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, - /* Check in LD_{ELF_}LIBRARY_PATH, if specified and allowed */ - if (_dl_library_path) { - _dl_if_debug_dprint("\tsearching LD_LIBRARY_PATH='%s'\n", _dl_library_path); -- if ((tpnt1 = search_for_named_library(libname, secure, _dl_library_path, rpnt)) != NULL) -+ if ((tpnt1 = search_for_named_library(libname, secure, _dl_library_path, rpnt, NULL)) != NULL) - { - return tpnt1; - } -@@ -253,7 +261,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, - if (pnt) { - pnt += (unsigned long) tpnt->dynamic_info[DT_STRTAB]; - _dl_if_debug_dprint("\tsearching RUNPATH='%s'\n", pnt); -- if ((tpnt1 = search_for_named_library(libname, secure, pnt, rpnt)) != NULL) -+ if ((tpnt1 = search_for_named_library(libname, secure, pnt, rpnt, NULL)) != NULL) - return tpnt1; - } - #endif -@@ -287,7 +295,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, - /* Look for libraries wherever the shared library loader - * was installed */ - _dl_if_debug_dprint("\tsearching ldso dir='%s'\n", _dl_ldsopath); -- tpnt1 = search_for_named_library(libname, secure, _dl_ldsopath, rpnt); -+ tpnt1 = search_for_named_library(libname, secure, _dl_ldsopath, rpnt, NULL); - if (tpnt1 != NULL) - return tpnt1; - -@@ -300,7 +308,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, - #ifndef __LDSO_CACHE_SUPPORT__ - ":" UCLIBC_RUNTIME_PREFIX "usr/X11R6/lib" - #endif -- , rpnt); -+ , rpnt, NULL); - if (tpnt1 != NULL) - return tpnt1; - -diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c -index 7ee9257..9423670 100644 ---- a/ldso/ldso/ldso.c -+++ b/ldso/ldso/ldso.c -@@ -272,6 +272,20 @@ static void __attribute__ ((destructor)) __attribute_used__ _dl_fini(void) - } - } - -+static void _dl_setup_progname(const char *argv0) -+{ -+ char image[PATH_MAX]; -+ ssize_t s; -+ -+ s = _dl_readlink("/proc/self/exe", image, sizeof(image)); -+ if (s > 0 && image[0] == '/') { -+ image[s] = 0; -+ _dl_progname = _dl_strdup(image); -+ } else if (argv0) { -+ _dl_progname = argv0; -+ } -+} -+ - void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, - ElfW(auxv_t) auxvt[AT_EGID + 1], char **envp, - char **argv -@@ -321,9 +335,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, - * been fixed up by now. Still no function calls outside of this - * library, since the dynamic resolver is not yet ready. - */ -- if (argv[0]) { -- _dl_progname = argv[0]; -- } -+ _dl_setup_progname(argv[0]); - - if (_start == (void *) auxvt[AT_ENTRY].a_un.a_val) { - _dl_dprintf(_dl_debug_file, "Standalone execution is not supported yet\n"); --- -1.7.1 - diff --git a/main/libc0.9.32/0001-libc-x86-fix-stack-unwinding-and-backtrace-informati.patch b/main/libc0.9.32/0001-libc-x86-fix-stack-unwinding-and-backtrace-informati.patch deleted file mode 100644 index 62c1456949..0000000000 --- a/main/libc0.9.32/0001-libc-x86-fix-stack-unwinding-and-backtrace-informati.patch +++ /dev/null @@ -1,250 +0,0 @@ -From 5f72f80e7ea0e3429c28ff5de7ca88cdd95e8904 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Timo=20Ter=C3=A4s?= -Date: Thu, 10 Nov 2011 09:36:44 +0200 -Subject: [PATCHv2] libc/x86: fix stack unwinding and backtrace information -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -When compiled without framepointer, the DWARF-2 CFI data is required -for proper stack unwinding. - -This patch adds the CFI information to: - * syscalls (so we get proper backtrace even for release builds) - the ebx hack was removed as it would complicate the CFI generation - * new thread stub function (so the backtrace is clean for user - created threads) - -Also pads the signal return trampolines separate from other functions. -If CFI info was found for signal return code (which seems to happen if -it's located right next a valid function), it will not be recognized -as signal trampoline (gcc unwinder and gdb check first CFI info, and -only if it does not exists it compares the exact opcode sequence to -see if we are at signal return code block). This fixes a real crash -if thread is cancelled and the cancellation handler fails to detect the -signal return frame. - -Signed-off-by: Timo Teräs ---- - libc/sysdeps/linux/i386/bits/syscalls.h | 82 +++---------------------------- - libc/sysdeps/linux/i386/clone.S | 17 ++++++ - libc/sysdeps/linux/i386/sigaction.c | 4 ++ - 3 files changed, 28 insertions(+), 75 deletions(-) - -diff --git a/libc/sysdeps/linux/i386/bits/syscalls.h b/libc/sysdeps/linux/i386/bits/syscalls.h -index eeafb3a..1f60a44 100644 ---- a/libc/sysdeps/linux/i386/bits/syscalls.h -+++ b/libc/sysdeps/linux/i386/bits/syscalls.h -@@ -13,6 +13,7 @@ - #ifndef __ASSEMBLER__ - - #include -+#include - - #define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \ - ({ \ -@@ -31,90 +32,21 @@ - - #if 1 /* defined __PIC__ || defined __pic__ */ - --/* This code avoids pushing/popping ebx as much as possible. -- * I think the main reason was that older GCCs had problems -- * with proper saving/restoring of ebx if "b" constraint was used, -- * which was breaking -fPIC code really badly. -- * At least gcc 4.2.x seems to not need these tricks anymore, -- * but this code is still useful because it often avoids -- * using stack for saving ebx. -- * Keeping it unconditionally enabled for now. -- */ -- --/* We need some help from the assembler to generate optimal code. -- * We define some macros here which later will be used. */ --/* gcc>=4.6 with LTO need the same guards as IMA (a.k.a --combine) did. -- * See gcc.gnu.org/PR47577 */ --/* FIXME: drop these b* macros! */ -- --__asm__ ( --#if defined __DOMULTI__ || __GNUC_PREREQ (4, 6) -- /* Protect against asm macro redefinition (happens in __DOMULTI__ mode). -- * Unfortunately, it ends up visible in .o files. */ -- ".ifndef _BITS_SYSCALLS_ASM\n\t" -- ".set _BITS_SYSCALLS_ASM,1\n\t" --#endif -- ".L__X'%ebx = 1\n\t" -- ".L__X'%ecx = 2\n\t" -- ".L__X'%edx = 2\n\t" -- ".L__X'%eax = 3\n\t" -- ".L__X'%esi = 3\n\t" -- ".L__X'%edi = 3\n\t" -- ".L__X'%ebp = 3\n\t" -- ".L__X'%esp = 3\n\t" -- -- /* Loading param #1 (ebx) is done by loading it into -- * another register, and then performing bpushl+bmovl, -- * since we must preserve ebx */ -- -- ".macro bpushl name reg\n\t" -- ".if 1 - \\name\n\t" /* if reg!=ebx... */ -- ".if 2 - \\name\n\t" /* if reg can't be clobbered... */ -- "pushl %ebx\n\t" /* save ebx on stack */ -- ".else\n\t" -- "xchgl \\reg, %ebx\n\t" /* else save ebx in reg, and load reg to ebx */ -- ".endif\n\t" -- ".endif\n\t" -- ".endm\n\t" -- -- ".macro bmovl name reg\n\t" -- ".if 1 - \\name\n\t" -- ".if 2 - \\name\n\t" /* if reg can't be clobbered... */ -- "movl \\reg, %ebx\n\t" /* load reg to ebx */ -- ".endif\n\t" -- ".endif\n\t" -- ".endm\n\t" -- -- ".macro bpopl name reg\n\t" -- ".if 1 - \\name\n\t" -- ".if 2 - \\name\n\t" /* if reg can't be clobbered... */ -- "popl %ebx\n\t" /* restore ebx from stack */ -- ".else\n\t" -- "xchgl \\reg, %ebx\n\t" /* else restore ebx from reg */ -- ".endif\n\t" -- ".endif\n\t" -- ".endm\n\t" -- --#if defined __DOMULTI__ || __GNUC_PREREQ (4, 6) -- ".endif\n\t" /* _BITS_SYSCALLS_ASM */ --#endif --); -- - #define LOADARGS_0 --#define LOADARGS_1 "bpushl .L__X'%k2, %k2\n\t" "bmovl .L__X'%k2, %k2\n\t" -+#define LOADARGS_1 "push %%ebx\n\t" CFI_ADJUST_CFA_OFFSET(4) "\n\t" CFI_REL_OFFSET(ebx, 0) "\n\t" "movl %k2, %%ebx\n\t" - #define LOADARGS_2 LOADARGS_1 - #define LOADARGS_3 LOADARGS_1 - #define LOADARGS_4 LOADARGS_1 - #define LOADARGS_5 LOADARGS_1 --#define LOADARGS_6 LOADARGS_1 "push %%ebp\n\t" "movl %7, %%ebp\n\t" -+#define LOADARGS_6 LOADARGS_1 "push %%ebp\n\t" CFI_ADJUST_CFA_OFFSET(4) "\n\t" CFI_REL_OFFSET(ebp, 0) "\n\t" "movl %7, %%ebp\n\t" - - #define RESTOREARGS_0 --#define RESTOREARGS_1 "bpopl .L__X'%k2, %k2\n\t" -+#define RESTOREARGS_1 "pop %%ebx\n\t" CFI_ADJUST_CFA_OFFSET(-4) "\n\t" CFI_RESTORE(ebx) "\n\t" RESTOREARGS_0 - #define RESTOREARGS_2 RESTOREARGS_1 - #define RESTOREARGS_3 RESTOREARGS_1 - #define RESTOREARGS_4 RESTOREARGS_1 - #define RESTOREARGS_5 RESTOREARGS_1 --#define RESTOREARGS_6 "pop %%ebp\n\t" RESTOREARGS_1 -+#define RESTOREARGS_6 "pop %%ebp\n\t" CFI_ADJUST_CFA_OFFSET(-4) "\n\t" CFI_RESTORE(ebp) "\n\t" RESTOREARGS_1 - - #define ASMFMT_0() - /* "acdSD" constraint would work too, but "SD" would use esi/edi and cause -@@ -162,7 +94,7 @@ __asm__ ( - #define LOADARGS_3 - #define LOADARGS_4 - #define LOADARGS_5 --#define LOADARGS_6 "push %%ebp\n\t" "movl %7, %%ebp\n\t" -+#define LOADARGS_6 "push %%ebp\n\t" CFI_ADJUST_CFA_OFFSET(4) "\n\t" CFI_REL_OFFSET(ebp, 0) "\n\t" "movl %7, %%ebp\n\t" - - #define RESTOREARGS_0 - #define RESTOREARGS_1 -@@ -170,7 +102,7 @@ __asm__ ( - #define RESTOREARGS_3 - #define RESTOREARGS_4 - #define RESTOREARGS_5 --#define RESTOREARGS_6 "pop %%ebp\n\t" -+#define RESTOREARGS_6 "pop %%ebp\n\t" CFI_ADJUST_CFA_OFFSET(-4) "\n\t" CFI_RESTORE(ebp) "\n\t" - - #define ASMFMT_0() - #define ASMFMT_1(arg1) \ -diff --git a/libc/sysdeps/linux/i386/clone.S b/libc/sysdeps/linux/i386/clone.S -index a7de3fe..cf6cd35 100644 ---- a/libc/sysdeps/linux/i386/clone.S -+++ b/libc/sysdeps/linux/i386/clone.S -@@ -25,6 +25,7 @@ - - #define _ERRNO_H 1 - #include -+#include - #include - - /* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg, -@@ -45,6 +46,7 @@ - .global clone - .type clone,%function - clone: -+ cfi_startproc; - /* Sanity check arguments. */ - movl $-EINVAL,%eax - -@@ -86,17 +88,28 @@ clone: - - /* Do the system call */ - pushl %ebx -+ cfi_adjust_cfa_offset (4) - pushl %esi -+ cfi_adjust_cfa_offset (4) - pushl %edi -+ cfi_adjust_cfa_offset (4) -+ - movl TLS+12(%esp),%esi -+ cfi_rel_offset (esi, 4) - movl PTID+12(%esp),%edx - movl FLAGS+12(%esp),%ebx -+ cfi_rel_offset (ebx, 8) - movl CTID+12(%esp),%edi -+ cfi_rel_offset (edi, 0) - movl $__NR_clone,%eax - #ifdef RESET_PID - /* Remember the flag value. */ - movl %ebx, (%ecx) - #endif -+ /* End FDE now, because in the child the unwind info will be -+ wrong. */ -+ cfi_endproc -+ - int $0x80 - popl %edi - popl %esi -@@ -108,6 +121,9 @@ clone: - ret - - .Lthread_start: -+ cfi_startproc; -+ /* Clearing frame pointer is insufficient, use CFI. */ -+ cfi_undefined (eip); - /* Note: %esi is zero. */ - movl %esi,%ebp /* terminate the stack frame */ - call *%ebx -@@ -120,6 +136,7 @@ clone: - movl %eax, %ebx - movl $__NR_exit, %eax - int $0x80 -+ cfi_endproc; - - /* Need to indirect jump to syscall error - * or we end up with TEXTREL's -diff --git a/libc/sysdeps/linux/i386/sigaction.c b/libc/sysdeps/linux/i386/sigaction.c -index de0c75d..f9af3f7 100644 ---- a/libc/sysdeps/linux/i386/sigaction.c -+++ b/libc/sysdeps/linux/i386/sigaction.c -@@ -112,6 +112,9 @@ libc_hidden_weak(sigaction) - #define RESTORE2(name, syscall) \ - __asm__ ( \ - ".text\n" \ -+ ".align 8\n" \ -+ " nop\n" \ -+ ".align 16\n" \ - "__" #name ":\n" \ - " movl $" #syscall ", %eax\n" \ - " int $0x80\n" \ -@@ -128,6 +131,7 @@ RESTORE(restore_rt, __NR_rt_sigreturn) - # define RESTORE2(name, syscall) \ - __asm__ ( \ - ".text\n" \ -+ ".align 8\n" \ - "__" #name ":\n" \ - " popl %eax\n" \ - " movl $" #syscall ", %eax\n" \ --- -1.7.7 - diff --git a/main/libc0.9.32/0001-libdl-rudimentary-locking-for-dlopen-dlsym-dlclose.patch b/main/libc0.9.32/0001-libdl-rudimentary-locking-for-dlopen-dlsym-dlclose.patch deleted file mode 100644 index d406f030d6..0000000000 --- a/main/libc0.9.32/0001-libdl-rudimentary-locking-for-dlopen-dlsym-dlclose.patch +++ /dev/null @@ -1,152 +0,0 @@ -From 521807eb4d18c5e693f91ad53cb277c76aab8686 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Timo=20Ter=C3=A4s?= -Date: Thu, 24 Mar 2011 13:24:32 +0200 -Subject: [PATCH] libdl: rudimentary locking for dlopen/dlsym/dlclose -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This implements big-dlfcn lock to allow multithreaded usage of -dlopen/dlsym/dlclose. We should really clean up the dl code so -we can use more fine grained locking or even RCU where appropriate. -But at least we won't crash now. - -Signed-off-by: Timo Teräs ---- - TODO | 1 + - ldso/libdl/libdl.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++---- - 2 files changed, 50 insertions(+), 5 deletions(-) - -diff --git a/TODO b/TODO -index ae305a5..95cabd5 100644 ---- a/TODO -+++ b/TODO -@@ -101,6 +101,7 @@ TODO list for AFTER the uClibc 1.0.0 release: - *) run 'nm -D --size-sort -t d libuClibc-0.9.26.so' and work on the - biggest things (i.e. stuff at the end of the list) to make - them smaller. -+ *) Fix dlopen/dlsym/dlclose locking to more fine grained or use RCU - - - -diff --git a/ldso/libdl/libdl.c b/ldso/libdl/libdl.c -index 68cd579..e007f54 100644 ---- a/ldso/libdl/libdl.c -+++ b/ldso/libdl/libdl.c -@@ -34,6 +34,7 @@ - #include - #include /* Needed for 'strstr' prototype' */ - #include -+#include - - #ifdef __UCLIBC_HAS_TLS__ - #include -@@ -44,6 +45,10 @@ - extern void _dl_add_to_slotinfo(struct link_map *l); - #endif - -+/* TODO: get rid of global lock and use more finegrained locking, or -+ * perhaps RCU for the global structures */ -+__UCLIBC_MUTEX_STATIC(_dl_mutex, PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP); -+ - #ifdef SHARED - # if defined(USE_TLS) && USE_TLS - # include -@@ -271,7 +276,7 @@ void dl_cleanup(void) - } - } - --void *dlopen(const char *libname, int flag) -+static void *do_dlopen(const char *libname, int flag) - { - struct elf_resolve *tpnt, *tfrom; - struct dyn_elf *dyn_chain, *rpnt = NULL, *dyn_ptr, *relro_ptr, *handle; -@@ -605,7 +610,18 @@ oops: - return NULL; - } - --void *dlsym(void *vhandle, const char *name) -+void *dlopen(const char *libname, int flag) -+{ -+ void *ret; -+ -+ __UCLIBC_MUTEX_CONDITIONAL_LOCK(_dl_mutex, 1); -+ ret = do_dlopen(libname, flag); -+ __UCLIBC_MUTEX_CONDITIONAL_UNLOCK(_dl_mutex, 1); -+ -+ return ret; -+} -+ -+static void *do_dlsym(void *vhandle, const char *name, void *caller_address) - { - struct elf_resolve *tpnt, *tfrom; - struct dyn_elf *handle; -@@ -653,7 +669,7 @@ void *dlsym(void *vhandle, const char *name) - * dynamic loader itself, as it doesn't know - * how to properly treat it. - */ -- from = (ElfW(Addr)) __builtin_return_address(0); -+ from = (ElfW(Addr)) caller_address; - - tfrom = NULL; - for (rpnt = _dl_symbol_tables; rpnt; rpnt = rpnt->next) { -@@ -690,6 +706,17 @@ out: - return ret; - } - -+void *dlsym(void *vhandle, const char *name) -+{ -+ void *ret; -+ -+ __UCLIBC_MUTEX_CONDITIONAL_LOCK(_dl_mutex, 1); -+ ret = do_dlsym(vhandle, name, __builtin_return_address(0)); -+ __UCLIBC_MUTEX_CONDITIONAL_UNLOCK(_dl_mutex, 1); -+ -+ return ret; -+} -+ - #if 0 - void *dlvsym(void *vhandle, const char *name, const char *version) - { -@@ -957,7 +984,13 @@ static int do_dlclose(void *vhandle, int need_fini) - - int dlclose(void *vhandle) - { -- return do_dlclose(vhandle, 1); -+ int ret; -+ -+ __UCLIBC_MUTEX_CONDITIONAL_LOCK(_dl_mutex, 1); -+ ret = do_dlclose(vhandle, 1); -+ __UCLIBC_MUTEX_CONDITIONAL_UNLOCK(_dl_mutex, 1); -+ -+ return ret; - } - - char *dlerror(void) -@@ -1004,7 +1037,7 @@ int dlinfo(void) - return 0; - } - --int dladdr(const void *__address, Dl_info * __info) -+static int do_dladdr(const void *__address, Dl_info * __info) - { - struct elf_resolve *pelf; - struct elf_resolve *rpnt; -@@ -1108,3 +1141,14 @@ int dladdr(const void *__address, Dl_info * __info) - } - } - #endif -+ -+int dladdr(const void *__address, Dl_info * __info) -+{ -+ int ret; -+ -+ __UCLIBC_MUTEX_CONDITIONAL_LOCK(_dl_mutex, 1); -+ ret = do_dladdr(__address, __info); -+ __UCLIBC_MUTEX_CONDITIONAL_UNLOCK(_dl_mutex, 1); -+ -+ return ret; -+} --- -1.7.1 - diff --git a/main/libc0.9.32/0001-libm-x86_64-implement-some-fenv-functions.patch b/main/libc0.9.32/0001-libm-x86_64-implement-some-fenv-functions.patch deleted file mode 100644 index 5d42413722..0000000000 --- a/main/libc0.9.32/0001-libm-x86_64-implement-some-fenv-functions.patch +++ /dev/null @@ -1,283 +0,0 @@ -From 5db70d560df0ab36751045dcb364c3f9eebdc2d1 Mon Sep 17 00:00:00 2001 -From: Natanael Copa -Date: Sun, 28 Nov 2010 12:43:33 +0000 -Subject: [PATCH] libm/x86_64: implement some fenv functions - -from glibc ---- - libm/x86_64/Makefile.arch | 24 ++++++++++++++++++++ - libm/x86_64/fclrexcpt.c | 52 ++++++++++++++++++++++++++++++++++++++++++++ - libm/x86_64/fegetexcept.c | 32 +++++++++++++++++++++++++++ - libm/x86_64/fesetround.c | 46 ++++++++++++++++++++++++++++++++++++++ - libm/x86_64/fgetexcptflg.c | 36 ++++++++++++++++++++++++++++++ - libm/x86_64/ftestexcept.c | 33 +++++++++++++++++++++++++++ - 6 files changed, 223 insertions(+), 0 deletions(-) - create mode 100644 libm/x86_64/Makefile.arch - create mode 100644 libm/x86_64/fclrexcpt.c - create mode 100644 libm/x86_64/fegetexcept.c - create mode 100644 libm/x86_64/fesetround.c - create mode 100644 libm/x86_64/fgetexcptflg.c - create mode 100644 libm/x86_64/ftestexcept.c - -diff --git a/libm/x86_64/Makefile.arch b/libm/x86_64/Makefile.arch -new file mode 100644 -index 0000000..e1be961 ---- /dev/null -+++ b/libm/x86_64/Makefile.arch -@@ -0,0 +1,24 @@ -+# Makefile for uClibc -+# -+# Copyright (C) 2000-2008 Erik Andersen -+# -+# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. -+# -+# The routines included in this math library are derived from -+# glibc's libm. -+# -+ -+ifeq ($(UCLIBC_HAS_FENV),y) -+libm_ARCH_SRC:=$(wildcard $(libm_ARCH_DIR)/*.c) -+libm_ARCH_OBJ:=$(patsubst $(libm_ARCH_DIR)/%.c,$(libm_ARCH_OUT)/%.o,$(libm_ARCH_SRC)) -+endif -+ -+libm_ARCH_OBJS:=$(libm_ARCH_OBJ) -+ -+ifeq ($(DOPIC),y) -+libm-a-y+=$(libm_ARCH_OBJS:.o=.os) -+else -+libm-a-y+=$(libm_ARCH_OBJS) -+endif -+libm-so-y+=$(libm_ARCH_OBJS:.o=.os) -+ -diff --git a/libm/x86_64/fclrexcpt.c b/libm/x86_64/fclrexcpt.c -new file mode 100644 -index 0000000..4fc3bfb ---- /dev/null -+++ b/libm/x86_64/fclrexcpt.c -@@ -0,0 +1,52 @@ -+/* Clear given exceptions in current floating-point environment. -+ Copyright (C) 2001 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, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. */ -+ -+#include -+ -+int -+feclearexcept (int excepts) -+{ -+ fenv_t temp; -+ unsigned int mxcsr; -+ -+ /* Mask out unsupported bits/exceptions. */ -+ excepts &= FE_ALL_EXCEPT; -+ -+ /* Bah, we have to clear selected exceptions. Since there is no -+ `fldsw' instruction we have to do it the hard way. */ -+ __asm__ ("fnstenv %0" : "=m" (*&temp)); -+ -+ /* Clear the relevant bits. */ -+ temp.__status_word &= excepts ^ FE_ALL_EXCEPT; -+ -+ /* Put the new data in effect. */ -+ __asm__ ("fldenv %0" : : "m" (*&temp)); -+ -+ /* And the same procedure for SSE. */ -+ __asm__ ("stmxcsr %0" : "=m" (*&mxcsr)); -+ -+ /* Clear the relevant bits. */ -+ mxcsr &= ~excepts; -+ -+ /* And put them into effect. */ -+ __asm__ ("ldmxcsr %0" : : "m" (*&mxcsr)); -+ -+ /* Success. */ -+ return 0; -+} -diff --git a/libm/x86_64/fegetexcept.c b/libm/x86_64/fegetexcept.c -new file mode 100644 -index 0000000..04df4b6 ---- /dev/null -+++ b/libm/x86_64/fegetexcept.c -@@ -0,0 +1,32 @@ -+/* Get enabled floating-point exceptions. -+ Copyright (C) 2001 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ Contributed by Andreas Jaeger , 2001. -+ -+ 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, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. */ -+ -+#include -+ -+int -+fegetexcept (void) -+{ -+ unsigned short int exc; -+ -+ /* Get the current control word. */ -+ __asm__ ("fstcw %0" : "=m" (*&exc)); -+ -+ return (~exc) & FE_ALL_EXCEPT; -+} -diff --git a/libm/x86_64/fesetround.c b/libm/x86_64/fesetround.c -new file mode 100644 -index 0000000..3d2ef4c ---- /dev/null -+++ b/libm/x86_64/fesetround.c -@@ -0,0 +1,46 @@ -+/* Set current rounding direction. -+ Copyright (C) 2001, 2005 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, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. */ -+ -+#include -+ -+int -+fesetround (int round) -+{ -+ unsigned short int cw; -+ int mxcsr; -+ -+ if ((round & ~0xc00) != 0) -+ /* ROUND is no valid rounding mode. */ -+ return 1; -+ -+ /* First set the x87 FPU. */ -+ __asm__ ("fnstcw %0" : "=m" (*&cw)); -+ cw &= ~0xc00; -+ cw |= round; -+ __asm__ ("fldcw %0" : : "m" (*&cw)); -+ -+ /* And now the MSCSR register for SSE, the precision is at different bit -+ positions in the different units, we need to shift it 3 bits. */ -+ __asm__ ("stmxcsr %0" : "=m" (*&mxcsr)); -+ mxcsr &= ~ 0x6000; -+ mxcsr |= round << 3; -+ __asm__ ("ldmxcsr %0" : : "m" (*&mxcsr)); -+ -+ return 0; -+} -diff --git a/libm/x86_64/fgetexcptflg.c b/libm/x86_64/fgetexcptflg.c -new file mode 100644 -index 0000000..f0681dc ---- /dev/null -+++ b/libm/x86_64/fgetexcptflg.c -@@ -0,0 +1,36 @@ -+/* Store current representation for exceptions. -+ Copyright (C) 2001 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, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. */ -+ -+#include -+ -+int -+fegetexceptflag (fexcept_t *flagp, int excepts) -+{ -+ fexcept_t temp; -+ unsigned int mxscr; -+ -+ /* Get the current exceptions for the x87 FPU and SSE unit. */ -+ __asm__ ("fnstsw %0\n" -+ "stmxcsr %1" : "=m" (*&temp), "=m" (*&mxscr)); -+ -+ *flagp = (temp | mxscr) & FE_ALL_EXCEPT & excepts; -+ -+ /* Success. */ -+ return 0; -+} -diff --git a/libm/x86_64/ftestexcept.c b/libm/x86_64/ftestexcept.c -new file mode 100644 -index 0000000..091c251 ---- /dev/null -+++ b/libm/x86_64/ftestexcept.c -@@ -0,0 +1,33 @@ -+/* Test exception in current environment. -+ Copyright (C) 2001 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, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. */ -+ -+#include -+ -+int -+fetestexcept (int excepts) -+{ -+ int temp; -+ unsigned int mxscr; -+ -+ /* Get current exceptions. */ -+ __asm__ ("fnstsw %0\n" -+ "stmxcsr %1" : "=m" (*&temp), "=m" (*&mxscr)); -+ -+ return (temp | mxscr) & excepts & FE_ALL_EXCEPT; -+} --- -1.7.7 - diff --git a/main/libc0.9.32/0001-malloc-standard-synchronize-on-fork.patch b/main/libc0.9.32/0001-malloc-standard-synchronize-on-fork.patch deleted file mode 100644 index eb3bfbe04f..0000000000 --- a/main/libc0.9.32/0001-malloc-standard-synchronize-on-fork.patch +++ /dev/null @@ -1,54 +0,0 @@ -From 168215f9c3ec4ec9a2fad9387038ced8b386ebaa Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Timo=20Ter=C3=A4s?= -Date: Sat, 26 Mar 2011 20:23:09 +0200 -Subject: [PATCH] malloc-standard: synchronize on fork -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Otherwise other threads can leave malloc state locked, and the child -will hang indefinitely if it tries to malloc something. - -Signed-off-by: Timo Teräs ---- - libc/stdlib/malloc-standard/free.c | 17 +++++++++++++++++ - 1 files changed, 17 insertions(+), 0 deletions(-) - -diff --git a/libc/stdlib/malloc-standard/free.c b/libc/stdlib/malloc-standard/free.c -index 39e54d6..df512cc 100644 ---- a/libc/stdlib/malloc-standard/free.c -+++ b/libc/stdlib/malloc-standard/free.c -@@ -118,6 +118,21 @@ int malloc_trim(size_t pad) - to inline it at all call points, which turns out not to be an - optimization at all. (Inlining it in __malloc_consolidate is fine though.) - */ -+static void _malloc_lock(void) -+{ -+ __UCLIBC_MUTEX_LOCK_CANCEL_UNSAFE(__malloc_lock); -+} -+ -+static void _malloc_unlock(void) -+{ -+ __UCLIBC_MUTEX_UNLOCK_CANCEL_UNSAFE(__malloc_lock); -+} -+ -+static void _malloc_reset(void) -+{ -+ __UCLIBC_MUTEX_INIT_VAR(__malloc_lock); -+} -+ - static void malloc_init_state(mstate av) - { - int i; -@@ -145,6 +160,8 @@ static void malloc_init_state(mstate av) - - av->top = initial_top(av); - av->pagesize = malloc_getpagesize; -+ -+ __libc_atfork(_malloc_lock, _malloc_unlock, _malloc_reset); - } - - --- -1.7.1 - diff --git a/main/libc0.9.32/0001-resolv-fix-resolver-to-return-TRY_AGAIN-on-timeout.patch b/main/libc0.9.32/0001-resolv-fix-resolver-to-return-TRY_AGAIN-on-timeout.patch deleted file mode 100644 index 8d6af3deb5..0000000000 --- a/main/libc0.9.32/0001-resolv-fix-resolver-to-return-TRY_AGAIN-on-timeout.patch +++ /dev/null @@ -1,265 +0,0 @@ -From f32b4d27b352724f28c7409490338929fc7ba58f Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Timo=20Ter=C3=A4s?= -Date: Thu, 7 Jul 2011 18:47:26 +0300 -Subject: [PATCH] resolv: fix resolver to return TRY_AGAIN on timeout -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This fixes the internal __dns_lookup to get a h_errno pointer so -it works nicely with the _r variants. Additionally the function is -modified to permanent error if the static buffer lengths are not -enough. And finally it fixed to return TRY_AGAIN if the nameservers -timeout. - -res_search is fixed to continue searching if we receive TRY_AGAIN. -It could be a problem with the specific search domain's server -and not necessarily a problem in the recursive resolver we are -querying. For same reason, it does not make sense to differentiate -timeout or SERVFAIL error reply. - -The biggest issue this fixes is that we now properly set h_errno -to TRY_AGAIN if upstream nameserver(s) timed out. Previously we -would have returned NETDB_INTERNAL. - -Signed-off-by: Timo Teräs ---- - libc/inet/resolv.c | 95 +++++++++++++++++++++++++++------------------------- - 1 files changed, 49 insertions(+), 46 deletions(-) - -diff --git a/libc/inet/resolv.c b/libc/inet/resolv.c -index dc8a752..90ba31c 100644 ---- a/libc/inet/resolv.c -+++ b/libc/inet/resolv.c -@@ -456,7 +456,8 @@ extern int __read_etc_hosts_r(parser_t *parser, - extern int __dns_lookup(const char *name, - int type, - unsigned char **outpacket, -- struct resolv_answer *a) attribute_hidden; -+ struct resolv_answer *a, -+ int *h_errnop) attribute_hidden; - extern int __encode_dotted(const char *dotted, - unsigned char *dest, - int maxlen) attribute_hidden; -@@ -1233,7 +1234,8 @@ static int __decode_answer(const unsigned char *message, /* packet */ - int attribute_hidden __dns_lookup(const char *name, - int type, - unsigned char **outpacket, -- struct resolv_answer *a) -+ struct resolv_answer *a, -+ int *h_errnop) - { - /* Protected by __resolv_lock: */ - static int last_ns_num = 0; -@@ -1265,11 +1267,15 @@ int attribute_hidden __dns_lookup(const char *name, - fd = -1; - lookup = NULL; - name_len = strlen(name); -- if ((unsigned)name_len >= MAXDNAME - MAXLEN_searchdomain - 2) -- goto fail; /* paranoia */ -+ if ((unsigned)name_len >= MAXDNAME - MAXLEN_searchdomain - 2) { -+ *h_errnop = NO_RECOVERY; -+ goto fail1; /* paranoia */ -+ } - lookup = malloc(name_len + 1/*for '.'*/ + MAXLEN_searchdomain + 1); -- if (!packet || !lookup || !name[0]) -- goto fail; -+ if (!packet || !lookup || !name[0]) { -+ *h_errnop = NO_RECOVERY; -+ goto fail1; -+ } - ends_with_dot = (name[name_len - 1] == '.'); - /* no strcpy! paranoia, user might change name[] under us */ - memcpy(lookup, name, name_len); -@@ -1337,8 +1343,10 @@ int attribute_hidden __dns_lookup(const char *name, - h.rd = 1; - DPRINTF("encoding header\n", h.rd); - i = __encode_header(&h, packet, PACKETSZ); -- if (i < 0) -- goto fail; -+ if (i < 0) { -+ *h_errnop = NO_RECOVERY; -+ goto fail1; -+ } - - /* encode question */ - DPRINTF("lookup name: %s\n", lookup); -@@ -1346,8 +1354,10 @@ int attribute_hidden __dns_lookup(const char *name, - q.qtype = type; - q.qclass = C_IN; /* CLASS_IN */ - j = __encode_question(&q, packet+i, PACKETSZ-i); -- if (j < 0) -- goto fail; -+ if (j < 0) { -+ *h_errnop = NO_RECOVERY; -+ goto fail1; -+ } - packet_len = i + j; - - /* send packet */ -@@ -1473,7 +1483,7 @@ int attribute_hidden __dns_lookup(const char *name, - /* no more search domains to try */ - } - /* dont loop, this is "no such host" situation */ -- h_errno = HOST_NOT_FOUND; -+ *h_errnop = HOST_NOT_FOUND; - goto fail1; - } - /* Insert other non-fatal errors here, which do not warrant -@@ -1485,7 +1495,7 @@ int attribute_hidden __dns_lookup(const char *name, - - /* Code below won't work correctly with h.ancount == 0, so... */ - if (h.ancount <= 0) { -- h_errno = NO_DATA; /* [is this correct code to check for?] */ -+ *h_errnop = NO_DATA; /* [is this correct code to check for?] */ - goto fail1; - } - pos = HFIXEDSZ; -@@ -1562,8 +1572,7 @@ int attribute_hidden __dns_lookup(const char *name, - variant = -1; - } while (retries_left > 0); - -- fail: -- h_errno = NETDB_INTERNAL; -+ *h_errnop = TRY_AGAIN; - fail1: - if (fd != -1) - close(fd); -@@ -2104,9 +2113,8 @@ int gethostbyname_r(const char *name, - * we'll need space of one in_addr + two addr_list[] elems */ - a.buflen = buflen - ((sizeof(addr_list[0]) * 2 + sizeof(struct in_addr))); - a.add_count = 0; -- packet_len = __dns_lookup(name, T_A, &packet, &a); -+ packet_len = __dns_lookup(name, T_A, &packet, &a, h_errnop); - if (packet_len < 0) { -- *h_errnop = HOST_NOT_FOUND; - DPRINTF("__dns_lookup returned < 0\n"); - return TRY_AGAIN; - } -@@ -2290,9 +2298,8 @@ int gethostbyname2_r(const char *name, - int packet_len; - - /* Hmm why we memset(a) to zeros only once? */ -- packet_len = __dns_lookup(buf, T_AAAA, &packet, &a); -+ packet_len = __dns_lookup(buf, T_AAAA, &packet, &a, h_errnop); - if (packet_len < 0) { -- *h_errnop = HOST_NOT_FOUND; - return TRY_AGAIN; - } - strncpy(buf, a.dotted, buflen); -@@ -2448,9 +2455,8 @@ int gethostbyaddr_r(const void *addr, socklen_t addrlen, - memset(&a, '\0', sizeof(a)); - for (;;) { - /* Hmm why we memset(a) to zeros only once? */ -- packet_len = __dns_lookup(buf, T_PTR, &packet, &a); -+ packet_len = __dns_lookup(buf, T_PTR, &packet, &a, h_errnop); - if (packet_len < 0) { -- *h_errnop = HOST_NOT_FOUND; - return TRY_AGAIN; - } - -@@ -3089,7 +3095,7 @@ int res_query(const char *dname, int class, int type, - } - - memset(&a, '\0', sizeof(a)); -- i = __dns_lookup(dname, type, &packet, &a); -+ i = __dns_lookup(dname, type, &packet, &a, &h_errno); - - if (i < 0) { - if (!h_errno) /* TODO: can this ever happen? */ -@@ -3117,14 +3123,13 @@ libc_hidden_def(res_query) - */ - #define __TRAILING_DOT (1<<0) - #define __GOT_NODATA (1<<1) --#define __GOT_SERVFAIL (1<<2) -+#define __GOT_TRYAGAIN (1<<2) - #define __TRIED_AS_IS (1<<3) - int res_search(const char *name, int class, int type, u_char *answer, - int anslen) - { - const char *cp; - char **domain; -- HEADER *hp = (HEADER *)(void *)answer; - unsigned dots; - unsigned state; - int ret, saved_herrno; -@@ -3189,19 +3194,9 @@ int res_search(const char *name, int class, int type, u_char *answer, - if (ret > 0) - return ret; - -- /* -- * If no server present, give up. -- * If name isn't found in this domain, -- * keep trying higher domains in the search list -- * (if that's enabled). -- * On a NO_DATA error, keep trying, otherwise -- * a wildcard entry of another type could keep us -- * from finding this entry higher in the domain. -- * If we get some other error (negative answer or -- * server failure), then stop searching up, -- * but try the input name below in case it's -- * fully-qualified. -- */ -+ /* our resolver refused to talk to us - -+ * no sense to retry, as the retry would likely -+ * fail too */ - if (errno == ECONNREFUSED) { - h_errno = TRY_AGAIN; - return -1; -@@ -3209,21 +3204,29 @@ int res_search(const char *name, int class, int type, u_char *answer, - - switch (h_errno) { - case NO_DATA: -+ /* Keep trying, otherwise a -+ * wildcard entry of another type -+ * could keep us from finding this -+ * entry from higher in the domain -+ * search. */ - state |= __GOT_NODATA; -- /* FALLTHROUGH */ -+ break; - case HOST_NOT_FOUND: -- /* keep trying */ -+ /* Not found - keep trying higher -+ * domains in the search list. */ - break; - case TRY_AGAIN: -- if (hp->rcode == SERVFAIL) { -- /* try next search element, if any */ -- state |= __GOT_SERVFAIL; -- break; -- } -- /* FALLTHROUGH */ -+ /* Server error or timeout. Could -+ * be caused by a problem in servers -+ * our resolver queried. Keep trying -+ * search, but remember that there -+ * was a temporary problem. */ -+ state |= __GOT_TRYAGAIN; -+ break; - default: - /* anything else implies that we're done */ - done = 1; -+ break; - } - /* - * if we got here for some reason other than DNSRCH, -@@ -3257,13 +3260,13 @@ int res_search(const char *name, int class, int type, u_char *answer, - h_errno = saved_herrno; - else if (state & __GOT_NODATA) - h_errno = NO_DATA; -- else if (state & __GOT_SERVFAIL) -+ else if (state & __GOT_TRYAGAIN) - h_errno = TRY_AGAIN; - return -1; - } - #undef __TRAILING_DOT - #undef __GOT_NODATA --#undef __GOT_SERVFAIL -+#undef __GOT_TRYAGAIN - #undef __TRIED_AS_IS - /* - * Perform a call on res_query on the concatenation of name and domain, --- -1.7.1 - diff --git a/main/libc0.9.32/0001-time-fix-parsing-of-tzdata-files-where-off_t-is-64-b.patch b/main/libc0.9.32/0001-time-fix-parsing-of-tzdata-files-where-off_t-is-64-b.patch deleted file mode 100644 index e47d89620c..0000000000 --- a/main/libc0.9.32/0001-time-fix-parsing-of-tzdata-files-where-off_t-is-64-b.patch +++ /dev/null @@ -1,32 +0,0 @@ -From ef44545eb332eac26577ea2672e89b01b3aa5706 Mon Sep 17 00:00:00 2001 -From: William Pitcock -To: uclibc@uclibc.org -Date: Thu, 28 Apr 2011 03:09:20 -0500 -Subject: [PATCH] time: fix parsing of tzdata files where off_t is 64-bit - -lseek takes off_t as the offset type, but gcc will normally pass a -32-bit value unless the number is wider than 16 bits. so we force -gcc to pass the constant as off_t type always by casting the constant -to off_t. - -Signed-off-by: William Pitcock ---- - libc/misc/time/time.c | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -diff --git a/libc/misc/time/time.c b/libc/misc/time/time.c -index 19d68e1..1b21f9e 100644 ---- a/libc/misc/time/time.c -+++ b/libc/misc/time/time.c -@@ -1856,7 +1856,7 @@ ERROR: - if (r != TZ_BUFLEN - || strncmp(buf, "TZif", 4) != 0 - || (unsigned char)buf[4] < 2 -- || lseek(fd, -TZ_BUFLEN, SEEK_END) < 0 -+ || lseek(fd, (off_t) -TZ_BUFLEN, SEEK_END) < 0 - ) { - goto ERROR; - } --- -1.7.4.5 - diff --git a/main/libc0.9.32/0002-resolv-res_query-for-CNAMEs.patch b/main/libc0.9.32/0002-resolv-res_query-for-CNAMEs.patch new file mode 100644 index 0000000000..74cd37c505 --- /dev/null +++ b/main/libc0.9.32/0002-resolv-res_query-for-CNAMEs.patch @@ -0,0 +1,41 @@ +From 811e804c7a403783b0c4cc5eb75f24da809081d8 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Timo=20Ter=C3=A4s?= +Date: Fri, 23 Dec 2011 14:15:16 +0100 +Subject: [PATCH] resolv: res_query for CNAMEs + +From: http://lists.busybox.net/pipermail/uclibc/2009-June/042583.html + +I had postfix failing for domains with MX->CNAME->A chain. In glibc it works. +I tracked it to be a problem in uclibc res_query. It returns bogus data +for CNAME entries, apparently intentionally, which is wrong. + +glibc return CNAME entries even for CNAME queries and most applications rely +on this. So we should do the same in uclibc. + +Signed-off-by: Natanael Copa +--- + libc/inet/resolv.c | 8 +++----- + 1 files changed, 3 insertions(+), 5 deletions(-) + +diff --git a/libc/inet/resolv.c b/libc/inet/resolv.c +index 021d5bf..2371fb9 100644 +--- a/libc/inet/resolv.c ++++ b/libc/inet/resolv.c +@@ -3099,11 +3099,9 @@ int res_query(const char *dname, int class, int type, + + free(a.dotted); + +- if (a.atype == type) { /* CNAME */ +- if (i > anslen) +- i = anslen; +- memcpy(answer, packet, i); +- } ++ i = MIN(anslen, i); ++ memcpy(answer, packet, i); ++ + free(packet); + return i; + } +-- +1.7.8 + diff --git a/main/libc0.9.32/0002-stdlib-fix-arc4random-return-type-to-u_int32_t.patch b/main/libc0.9.32/0002-stdlib-fix-arc4random-return-type-to-u_int32_t.patch deleted file mode 100644 index 9d924655df..0000000000 --- a/main/libc0.9.32/0002-stdlib-fix-arc4random-return-type-to-u_int32_t.patch +++ /dev/null @@ -1,61 +0,0 @@ -From 70debeff167858502d99e92a221fe14f5428a9b6 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Timo=20Ter=C3=A4s?= -Date: Fri, 18 Mar 2011 10:57:31 +0200 -Subject: [PATCH 2/3] stdlib: fix arc4random return type to u_int32_t -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -It's documented to be u_int32_t and not uint32_t: - http://www.manpagez.com/man/3/arc4random/ - -This also fixes a major bug that stdlib.h includes stdint.h. Things -might go very wrong because stdint.h has conditional defines and -if stdlib.h is included before #define's for stdint.h we end up -missing things and breaking builds (e.g. openjdk). - -Signed-off-by: Timo Teräs ---- - include/stdlib.h | 4 ++-- - libc/stdlib/arc4random.c | 3 ++- - 2 files changed, 4 insertions(+), 3 deletions(-) - -diff --git a/include/stdlib.h b/include/stdlib.h -index e9a8b84..7b35840 100644 ---- a/include/stdlib.h -+++ b/include/stdlib.h -@@ -902,8 +902,8 @@ extern int getloadavg (double __loadavg[], int __nelem) - #endif - - #ifdef __UCLIBC_HAS_ARC4RANDOM__ --#include --extern uint32_t arc4random(void); -+# include -+extern u_int32_t arc4random(void); - extern void arc4random_stir(void); - extern void arc4random_addrandom(unsigned char *, int); - #endif -diff --git a/libc/stdlib/arc4random.c b/libc/stdlib/arc4random.c -index c7aed66..7b9b12d 100644 ---- a/libc/stdlib/arc4random.c -+++ b/libc/stdlib/arc4random.c -@@ -30,6 +30,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -175,7 +176,7 @@ arc4random_addrandom(u_char *dat, int datlen) - arc4_addrandom(&rs, dat, datlen); - } - --uint32_t -+u_int32_t - arc4random(void) - { - if (!rs_initialized) --- -1.7.1 - diff --git a/main/libc0.9.32/0003-ldso-support-RTLD_NOLOAD.patch b/main/libc0.9.32/0003-ldso-support-RTLD_NOLOAD.patch deleted file mode 100644 index f10d6f002d..0000000000 --- a/main/libc0.9.32/0003-ldso-support-RTLD_NOLOAD.patch +++ /dev/null @@ -1,234 +0,0 @@ -From 4bb377585b95cb67c90ff4ffc21a6870a4e78a37 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Timo=20Ter=C3=A4s?= -Date: Fri, 18 Mar 2011 11:40:04 +0200 -Subject: [PATCH 3/3] ldso: support RTLD_NOLOAD -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -So application query if specified modile is loaded or not with -dlopen. - -Signed-off-by: Timo Teräs ---- - ldso/include/dl-elf.h | 6 ++++-- - ldso/ldso/dl-elf.c | 30 +++++++++++++++++------------- - ldso/ldso/ldso.c | 4 +++- - ldso/libdl/libdl.c | 5 +++-- - libc/sysdeps/linux/common/bits/dlfcn.h | 4 ++-- - 5 files changed, 29 insertions(+), 20 deletions(-) - -diff --git a/ldso/include/dl-elf.h b/ldso/include/dl-elf.h -index 7fbb373..7102351 100644 ---- a/ldso/include/dl-elf.h -+++ b/ldso/include/dl-elf.h -@@ -25,16 +25,18 @@ static __inline__ void _dl_map_cache(void) { } - static __inline__ void _dl_unmap_cache(void) { } - #endif - -+#define DL_RESOLVE_SECURE 0x0001 -+#define DL_RESOLVE_NOLOAD 0x0002 - - /* Function prototypes for non-static stuff in readelflib1.c */ - extern void _dl_parse_lazy_relocation_information(struct dyn_elf *rpnt, - unsigned long rel_addr, unsigned long rel_size); - extern int _dl_parse_relocation_information(struct dyn_elf *rpnt, - unsigned long rel_addr, unsigned long rel_size); --extern struct elf_resolve * _dl_load_shared_library(int secure, -+extern struct elf_resolve * _dl_load_shared_library(int resolve_flags, - struct dyn_elf **rpnt, struct elf_resolve *tpnt, char *full_libname, - int trace_loaded_objects); --extern struct elf_resolve * _dl_load_elf_shared_library(int secure, -+extern struct elf_resolve * _dl_load_elf_shared_library(int resolve_flags, - struct dyn_elf **rpnt, char *libname); - extern struct elf_resolve *_dl_check_if_named_library_is_loaded(const char *full_libname, - int trace_loaded_objects); -diff --git a/ldso/ldso/dl-elf.c b/ldso/ldso/dl-elf.c -index 2b2d429..6d35bf2 100644 ---- a/ldso/ldso/dl-elf.c -+++ b/ldso/ldso/dl-elf.c -@@ -132,7 +132,7 @@ _dl_protect_relro (struct elf_resolve *l) - /* This function's behavior must exactly match that - * in uClibc/ldso/util/ldd.c */ - static struct elf_resolve * --search_for_named_library(const char *name, int secure, const char *path_list, -+search_for_named_library(const char *name, int resolve_flags, const char *path_list, - struct dyn_elf **rpnt, const char *origin) - { - char *mylibname; -@@ -162,7 +162,7 @@ search_for_named_library(const char *name, int secure, const char *path_list, - - if (plen >= 7 && _dl_memcmp(p, "$ORIGIN", 7) == 0) { - int olen; -- if (secure && plen != 7) -+ if ((resolve_flags & DL_RESOLVE_SECURE) && plen != 7) - continue; - if (origin == NULL) - continue; -@@ -182,7 +182,7 @@ search_for_named_library(const char *name, int secure, const char *path_list, - _dl_strcat(mylibname, "/"); - _dl_strcat(mylibname, name); - -- tpnt = _dl_load_elf_shared_library(secure, rpnt, mylibname); -+ tpnt = _dl_load_elf_shared_library(resolve_flags, rpnt, mylibname); - if (tpnt != NULL) - return tpnt; - } -@@ -194,7 +194,7 @@ search_for_named_library(const char *name, int secure, const char *path_list, - unsigned long _dl_error_number; - unsigned long _dl_internal_error_number; - --struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, -+struct elf_resolve *_dl_load_shared_library(int resolve_flags, struct dyn_elf **rpnt, - struct elf_resolve *tpnt, char *full_libname, int attribute_unused trace_loaded_objects) - { - char *pnt; -@@ -223,7 +223,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, - - if (libname != full_libname) { - _dl_if_debug_dprint("\ttrying file='%s'\n", full_libname); -- tpnt1 = _dl_load_elf_shared_library(secure, rpnt, full_libname); -+ tpnt1 = _dl_load_elf_shared_library(resolve_flags, rpnt, full_libname); - if (tpnt1) { - return tpnt1; - } -@@ -238,7 +238,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, - if (pnt) { - pnt += (unsigned long) tpnt->dynamic_info[DT_STRTAB]; - _dl_if_debug_dprint("\tsearching RPATH='%s'\n", pnt); -- if ((tpnt1 = search_for_named_library(libname, secure, pnt, rpnt, -+ if ((tpnt1 = search_for_named_library(libname, resolve_flags, pnt, rpnt, - tpnt->libname)) != NULL) - return tpnt1; - } -@@ -247,7 +247,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, - /* Check in LD_{ELF_}LIBRARY_PATH, if specified and allowed */ - if (_dl_library_path) { - _dl_if_debug_dprint("\tsearching LD_LIBRARY_PATH='%s'\n", _dl_library_path); -- if ((tpnt1 = search_for_named_library(libname, secure, _dl_library_path, rpnt, NULL)) != NULL) -+ if ((tpnt1 = search_for_named_library(libname, resolve_flags, _dl_library_path, rpnt, NULL)) != NULL) - { - return tpnt1; - } -@@ -261,7 +261,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, - if (pnt) { - pnt += (unsigned long) tpnt->dynamic_info[DT_STRTAB]; - _dl_if_debug_dprint("\tsearching RUNPATH='%s'\n", pnt); -- if ((tpnt1 = search_for_named_library(libname, secure, pnt, rpnt, NULL)) != NULL) -+ if ((tpnt1 = search_for_named_library(libname, resolve_flags, pnt, rpnt, NULL)) != NULL) - return tpnt1; - } - #endif -@@ -284,7 +284,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, - || libent[i].flags == LIB_ELF_LIBC0 - || libent[i].flags == LIB_ELF_LIBC5) - && _dl_strcmp(libname, strs + libent[i].sooffset) == 0 -- && (tpnt1 = _dl_load_elf_shared_library(secure, rpnt, strs + libent[i].liboffset)) -+ && (tpnt1 = _dl_load_elf_shared_library(resolve_flags, rpnt, strs + libent[i].liboffset)) - ) { - return tpnt1; - } -@@ -295,14 +295,14 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, - /* Look for libraries wherever the shared library loader - * was installed */ - _dl_if_debug_dprint("\tsearching ldso dir='%s'\n", _dl_ldsopath); -- tpnt1 = search_for_named_library(libname, secure, _dl_ldsopath, rpnt, NULL); -+ tpnt1 = search_for_named_library(libname, resolve_flags, _dl_ldsopath, rpnt, NULL); - if (tpnt1 != NULL) - return tpnt1; - - /* Lastly, search the standard list of paths for the library. - This list must exactly match the list in uClibc/ldso/util/ldd.c */ - _dl_if_debug_dprint("\tsearching full lib path list\n"); -- tpnt1 = search_for_named_library(libname, secure, -+ tpnt1 = search_for_named_library(libname, resolve_flags, - UCLIBC_RUNTIME_PREFIX "lib:" - UCLIBC_RUNTIME_PREFIX "usr/lib" - #ifndef __LDSO_CACHE_SUPPORT__ -@@ -329,7 +329,7 @@ goof: - * are required. - */ - --struct elf_resolve *_dl_load_elf_shared_library(int secure, -+struct elf_resolve *_dl_load_elf_shared_library(int resolve_flags, - struct dyn_elf **rpnt, char *libname) - { - ElfW(Ehdr) *epnt; -@@ -368,7 +368,7 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure, - } - /* If we are in secure mode (i.e. a setu/gid binary using LD_PRELOAD), - we don't load the library if it isn't setuid. */ -- if (secure) { -+ if (resolve_flags & DL_RESOLVE_SECURE) { - if (!(st.st_mode & S_ISUID)) { - _dl_close(infile); - return NULL; -@@ -384,6 +384,10 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure, - return tpnt; - } - } -+ if (resolve_flags & DL_RESOLVE_NOLOAD) { -+ _dl_close(infile); -+ return NULL; -+ } - header = _dl_mmap((void *) 0, _dl_pagesize, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS | MAP_UNINITIALIZE, -1, 0); - if (_dl_mmap_check_error(header)) { -diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c -index 9423670..b71af34 100644 ---- a/ldso/ldso/ldso.c -+++ b/ldso/ldso/ldso.c -@@ -646,7 +646,9 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, - if (!_dl_secure || _dl_strchr(str, '/') == NULL) { - _dl_if_debug_dprint("\tfile='%s'; needed by '%s'\n", str, _dl_progname); - -- tpnt1 = _dl_load_shared_library(_dl_secure, &rpnt, NULL, str, trace_loaded_objects); -+ tpnt1 = _dl_load_shared_library( -+ _dl_secure ? DL_RESOLVE_SECURE : 0, -+ &rpnt, NULL, str, trace_loaded_objects); - if (!tpnt1) { - #ifdef __LDSO_LDD_SUPPORT__ - if (trace_loaded_objects) -diff --git a/ldso/libdl/libdl.c b/ldso/libdl/libdl.c -index 68cd579..edf38d2 100644 ---- a/ldso/libdl/libdl.c -+++ b/ldso/libdl/libdl.c -@@ -288,7 +288,7 @@ void *dlopen(const char *libname, int flag) - #endif - - /* A bit of sanity checking... */ -- if (!(flag & (RTLD_LAZY|RTLD_NOW))) { -+ if (!(flag & (RTLD_LAZY|RTLD_NOW|RTLD_NOLOAD))) { - _dl_error_number = LD_BAD_HANDLE; - return NULL; - } -@@ -358,8 +358,9 @@ void *dlopen(const char *libname, int flag) - /* Try to load the specified library */ - _dl_if_debug_print("Trying to dlopen '%s', RTLD_GLOBAL:%d RTLD_NOW:%d\n", - (char*)libname, (flag & RTLD_GLOBAL ? 1:0), (now_flag & RTLD_NOW ? 1:0)); -- tpnt = _dl_load_shared_library(0, &rpnt, tfrom, (char*)libname, 0); - -+ tpnt = _dl_load_shared_library((flag & RTLD_NOLOAD) ? DL_RESOLVE_NOLOAD : 0, -+ &rpnt, tfrom, (char*)libname, 0); - if (tpnt == NULL) { - _dl_unmap_cache(); - return NULL; -diff --git a/libc/sysdeps/linux/common/bits/dlfcn.h b/libc/sysdeps/linux/common/bits/dlfcn.h -index 4bfbbff..47b42ad 100644 ---- a/libc/sysdeps/linux/common/bits/dlfcn.h -+++ b/libc/sysdeps/linux/common/bits/dlfcn.h -@@ -24,9 +24,9 @@ - /* The MODE argument to `dlopen' contains one of the following: */ - #define RTLD_LAZY 0x00001 /* Lazy function call binding. */ - #define RTLD_NOW 0x00002 /* Immediate function call binding. */ --#if 0 /* uClibc doesnt support these */ --#define RTLD_BINDING_MASK 0x3 /* Mask of binding time value. */ -+#define RTLD_BINDING_MASK 0x3 /* Mask of binding time value. */ - #define RTLD_NOLOAD 0x00004 /* Do not load the object. */ -+#if 0 /* uClibc doesnt support these */ - #define RTLD_DEEPBIND 0x00008 /* Use deep binding. */ - #endif - --- -1.7.1 - diff --git a/main/libc0.9.32/0003-resolv-fix-memory-leak.patch b/main/libc0.9.32/0003-resolv-fix-memory-leak.patch new file mode 100644 index 0000000000..88178e4e0e --- /dev/null +++ b/main/libc0.9.32/0003-resolv-fix-memory-leak.patch @@ -0,0 +1,38 @@ +From 41e8b28fc02fd966dd089a79dc509a5eff725319 Mon Sep 17 00:00:00 2001 +From: Bernhard Reutner-Fischer +Date: Fri, 14 Oct 2011 17:47:42 +0200 +Subject: [PATCH] resolv: fix memory leak + +Timothy Holdener writes: +small memory leak in __dns_lookup() when the A record +in the DNS answer is preceded by one or more CNAME records. + +Signed-off-by: Bernhard Reutner-Fischer +(cherry picked from commit bb8d500a75a3050fe3198773ce7b07f669fe8f13) +--- + libc/inet/resolv.c | 2 ++ + 1 files changed, 2 insertions(+), 0 deletions(-) + +diff --git a/libc/inet/resolv.c b/libc/inet/resolv.c +index 2371fb9..8781196 100644 +--- a/libc/inet/resolv.c ++++ b/libc/inet/resolv.c +@@ -1503,6 +1503,7 @@ int attribute_hidden __dns_lookup(const char *name, + DPRINTF("Decoding answer at pos %d\n", pos); + + first_answer = 1; ++ a->dotted = NULL; + for (j = 0; j < h.ancount; j++) { + i = __decode_answer(packet, pos, packet_len, &ma); + if (i < 0) { +@@ -1519,6 +1520,7 @@ int attribute_hidden __dns_lookup(const char *name, + ma.buf = a->buf; + ma.buflen = a->buflen; + ma.add_count = a->add_count; ++ free(a->dotted); + memcpy(a, &ma, sizeof(ma)); + if (a->atype != T_SIG && (NULL == a->buf || (type != T_A && type != T_AAAA))) + break; +-- +1.7.8 + diff --git a/main/libc0.9.32/0004-resolv-fix-resolver-to-return-TRY_AGAIN-on-timeout.patch b/main/libc0.9.32/0004-resolv-fix-resolver-to-return-TRY_AGAIN-on-timeout.patch new file mode 100644 index 0000000000..2978ee806a --- /dev/null +++ b/main/libc0.9.32/0004-resolv-fix-resolver-to-return-TRY_AGAIN-on-timeout.patch @@ -0,0 +1,266 @@ +From d7d9bf8f32235bfa781d632a0a3ba6b544062ce1 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Timo=20Ter=C3=A4s?= +Date: Thu, 7 Jul 2011 18:47:26 +0300 +Subject: [PATCH] resolv: fix resolver to return TRY_AGAIN on timeout +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This fixes the internal __dns_lookup to get a h_errno pointer so +it works nicely with the _r variants. Additionally the function is +modified to permanent error if the static buffer lengths are not +enough. And finally it fixed to return TRY_AGAIN if the nameservers +timeout. + +res_search is fixed to continue searching if we receive TRY_AGAIN. +It could be a problem with the specific search domain's server +and not necessarily a problem in the recursive resolver we are +querying. For same reason, it does not make sense to differentiate +timeout or SERVFAIL error reply. + +The biggest issue this fixes is that we now properly set h_errno +to TRY_AGAIN if upstream nameserver(s) timed out. Previously we +would have returned NETDB_INTERNAL. + +Signed-off-by: Timo Teräs +Signed-off-by: Natanael Copa +--- + libc/inet/resolv.c | 95 +++++++++++++++++++++++++++------------------------- + 1 files changed, 49 insertions(+), 46 deletions(-) + +diff --git a/libc/inet/resolv.c b/libc/inet/resolv.c +index 8781196..07dff18 100644 +--- a/libc/inet/resolv.c ++++ b/libc/inet/resolv.c +@@ -456,7 +456,8 @@ extern int __read_etc_hosts_r(parser_t *parser, + extern int __dns_lookup(const char *name, + int type, + unsigned char **outpacket, +- struct resolv_answer *a) attribute_hidden; ++ struct resolv_answer *a, ++ int *h_errnop) attribute_hidden; + extern int __encode_dotted(const char *dotted, + unsigned char *dest, + int maxlen) attribute_hidden; +@@ -1233,7 +1234,8 @@ static int __decode_answer(const unsigned char *message, /* packet */ + int attribute_hidden __dns_lookup(const char *name, + int type, + unsigned char **outpacket, +- struct resolv_answer *a) ++ struct resolv_answer *a, ++ int *h_errnop) + { + /* Protected by __resolv_lock: */ + static int last_ns_num = 0; +@@ -1265,11 +1267,15 @@ int attribute_hidden __dns_lookup(const char *name, + fd = -1; + lookup = NULL; + name_len = strlen(name); +- if ((unsigned)name_len >= MAXDNAME - MAXLEN_searchdomain - 2) +- goto fail; /* paranoia */ ++ if ((unsigned)name_len >= MAXDNAME - MAXLEN_searchdomain - 2) { ++ *h_errnop = NO_RECOVERY; ++ goto fail1; /* paranoia */ ++ } + lookup = malloc(name_len + 1/*for '.'*/ + MAXLEN_searchdomain + 1); +- if (!packet || !lookup || !name[0]) +- goto fail; ++ if (!packet || !lookup || !name[0]) { ++ *h_errnop = NO_RECOVERY; ++ goto fail1; ++ } + ends_with_dot = (name[name_len - 1] == '.'); + /* no strcpy! paranoia, user might change name[] under us */ + memcpy(lookup, name, name_len); +@@ -1337,8 +1343,10 @@ int attribute_hidden __dns_lookup(const char *name, + h.rd = 1; + DPRINTF("encoding header\n", h.rd); + i = __encode_header(&h, packet, PACKETSZ); +- if (i < 0) +- goto fail; ++ if (i < 0) { ++ *h_errnop = NO_RECOVERY; ++ goto fail1; ++ } + + /* encode question */ + DPRINTF("lookup name: %s\n", lookup); +@@ -1346,8 +1354,10 @@ int attribute_hidden __dns_lookup(const char *name, + q.qtype = type; + q.qclass = C_IN; /* CLASS_IN */ + j = __encode_question(&q, packet+i, PACKETSZ-i); +- if (j < 0) +- goto fail; ++ if (j < 0) { ++ *h_errnop = NO_RECOVERY; ++ goto fail1; ++ } + packet_len = i + j; + + /* send packet */ +@@ -1473,7 +1483,7 @@ int attribute_hidden __dns_lookup(const char *name, + /* no more search domains to try */ + } + /* dont loop, this is "no such host" situation */ +- h_errno = HOST_NOT_FOUND; ++ *h_errnop = HOST_NOT_FOUND; + goto fail1; + } + /* Insert other non-fatal errors here, which do not warrant +@@ -1485,7 +1495,7 @@ int attribute_hidden __dns_lookup(const char *name, + + /* Code below won't work correctly with h.ancount == 0, so... */ + if (h.ancount <= 0) { +- h_errno = NO_DATA; /* [is this correct code to check for?] */ ++ *h_errnop = NO_DATA; /* [is this correct code to check for?] */ + goto fail1; + } + pos = HFIXEDSZ; +@@ -1564,8 +1574,7 @@ int attribute_hidden __dns_lookup(const char *name, + variant = -1; + } while (retries_left > 0); + +- fail: +- h_errno = NETDB_INTERNAL; ++ *h_errnop = TRY_AGAIN; + fail1: + if (fd != -1) + close(fd); +@@ -2106,9 +2115,8 @@ int gethostbyname_r(const char *name, + * we'll need space of one in_addr + two addr_list[] elems */ + a.buflen = buflen - ((sizeof(addr_list[0]) * 2 + sizeof(struct in_addr))); + a.add_count = 0; +- packet_len = __dns_lookup(name, T_A, &packet, &a); ++ packet_len = __dns_lookup(name, T_A, &packet, &a, h_errnop); + if (packet_len < 0) { +- *h_errnop = HOST_NOT_FOUND; + DPRINTF("__dns_lookup returned < 0\n"); + return TRY_AGAIN; + } +@@ -2292,9 +2300,8 @@ int gethostbyname2_r(const char *name, + int packet_len; + + /* Hmm why we memset(a) to zeros only once? */ +- packet_len = __dns_lookup(buf, T_AAAA, &packet, &a); ++ packet_len = __dns_lookup(buf, T_AAAA, &packet, &a, h_errnop); + if (packet_len < 0) { +- *h_errnop = HOST_NOT_FOUND; + return TRY_AGAIN; + } + strncpy(buf, a.dotted, buflen); +@@ -2450,9 +2457,8 @@ int gethostbyaddr_r(const void *addr, socklen_t addrlen, + memset(&a, '\0', sizeof(a)); + for (;;) { + /* Hmm why we memset(a) to zeros only once? */ +- packet_len = __dns_lookup(buf, T_PTR, &packet, &a); ++ packet_len = __dns_lookup(buf, T_PTR, &packet, &a, h_errnop); + if (packet_len < 0) { +- *h_errnop = HOST_NOT_FOUND; + return TRY_AGAIN; + } + +@@ -3091,7 +3097,7 @@ int res_query(const char *dname, int class, int type, + } + + memset(&a, '\0', sizeof(a)); +- i = __dns_lookup(dname, type, &packet, &a); ++ i = __dns_lookup(dname, type, &packet, &a, &h_errno); + + if (i < 0) { + if (!h_errno) /* TODO: can this ever happen? */ +@@ -3117,14 +3123,13 @@ libc_hidden_def(res_query) + */ + #define __TRAILING_DOT (1<<0) + #define __GOT_NODATA (1<<1) +-#define __GOT_SERVFAIL (1<<2) ++#define __GOT_TRYAGAIN (1<<2) + #define __TRIED_AS_IS (1<<3) + int res_search(const char *name, int class, int type, u_char *answer, + int anslen) + { + const char *cp; + char **domain; +- HEADER *hp = (HEADER *)(void *)answer; + unsigned dots; + unsigned state; + int ret, saved_herrno; +@@ -3189,19 +3194,9 @@ int res_search(const char *name, int class, int type, u_char *answer, + if (ret > 0) + return ret; + +- /* +- * If no server present, give up. +- * If name isn't found in this domain, +- * keep trying higher domains in the search list +- * (if that's enabled). +- * On a NO_DATA error, keep trying, otherwise +- * a wildcard entry of another type could keep us +- * from finding this entry higher in the domain. +- * If we get some other error (negative answer or +- * server failure), then stop searching up, +- * but try the input name below in case it's +- * fully-qualified. +- */ ++ /* our resolver refused to talk to us - ++ * no sense to retry, as the retry would likely ++ * fail too */ + if (errno == ECONNREFUSED) { + h_errno = TRY_AGAIN; + return -1; +@@ -3209,21 +3204,29 @@ int res_search(const char *name, int class, int type, u_char *answer, + + switch (h_errno) { + case NO_DATA: ++ /* Keep trying, otherwise a ++ * wildcard entry of another type ++ * could keep us from finding this ++ * entry from higher in the domain ++ * search. */ + state |= __GOT_NODATA; +- /* FALLTHROUGH */ ++ break; + case HOST_NOT_FOUND: +- /* keep trying */ ++ /* Not found - keep trying higher ++ * domains in the search list. */ + break; + case TRY_AGAIN: +- if (hp->rcode == SERVFAIL) { +- /* try next search element, if any */ +- state |= __GOT_SERVFAIL; +- break; +- } +- /* FALLTHROUGH */ ++ /* Server error or timeout. Could ++ * be caused by a problem in servers ++ * our resolver queried. Keep trying ++ * search, but remember that there ++ * was a temporary problem. */ ++ state |= __GOT_TRYAGAIN; ++ break; + default: + /* anything else implies that we're done */ + done = 1; ++ break; + } + /* + * if we got here for some reason other than DNSRCH, +@@ -3257,13 +3260,13 @@ int res_search(const char *name, int class, int type, u_char *answer, + h_errno = saved_herrno; + else if (state & __GOT_NODATA) + h_errno = NO_DATA; +- else if (state & __GOT_SERVFAIL) ++ else if (state & __GOT_TRYAGAIN) + h_errno = TRY_AGAIN; + return -1; + } + #undef __TRAILING_DOT + #undef __GOT_NODATA +-#undef __GOT_SERVFAIL ++#undef __GOT_TRYAGAIN + #undef __TRIED_AS_IS + /* + * Perform a call on res_query on the concatenation of name and domain, +-- +1.7.8 + diff --git a/main/libc0.9.32/0005-libm-x86_64-implement-some-fenv-functions.patch b/main/libc0.9.32/0005-libm-x86_64-implement-some-fenv-functions.patch new file mode 100644 index 0000000000..9a47267b8e --- /dev/null +++ b/main/libc0.9.32/0005-libm-x86_64-implement-some-fenv-functions.patch @@ -0,0 +1,288 @@ +From 6864dfeef979985f9f173b842034183476b95583 Mon Sep 17 00:00:00 2001 +From: Natanael Copa +Date: Sun, 28 Nov 2010 12:43:33 +0000 +Subject: [PATCH] libm/x86_64: implement some fenv functions + +from glibc + +Posted to uclibc: +http://lists.busybox.net/pipermail/uclibc/2010-December/044523.html + +Signed-off-by: Natanael Copa +--- + libm/x86_64/Makefile.arch | 24 ++++++++++++++++++++ + libm/x86_64/fclrexcpt.c | 52 ++++++++++++++++++++++++++++++++++++++++++++ + libm/x86_64/fegetexcept.c | 32 +++++++++++++++++++++++++++ + libm/x86_64/fesetround.c | 46 ++++++++++++++++++++++++++++++++++++++ + libm/x86_64/fgetexcptflg.c | 36 ++++++++++++++++++++++++++++++ + libm/x86_64/ftestexcept.c | 33 +++++++++++++++++++++++++++ + 6 files changed, 223 insertions(+), 0 deletions(-) + create mode 100644 libm/x86_64/Makefile.arch + create mode 100644 libm/x86_64/fclrexcpt.c + create mode 100644 libm/x86_64/fegetexcept.c + create mode 100644 libm/x86_64/fesetround.c + create mode 100644 libm/x86_64/fgetexcptflg.c + create mode 100644 libm/x86_64/ftestexcept.c + +diff --git a/libm/x86_64/Makefile.arch b/libm/x86_64/Makefile.arch +new file mode 100644 +index 0000000..e1be961 +--- /dev/null ++++ b/libm/x86_64/Makefile.arch +@@ -0,0 +1,24 @@ ++# Makefile for uClibc ++# ++# Copyright (C) 2000-2008 Erik Andersen ++# ++# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. ++# ++# The routines included in this math library are derived from ++# glibc's libm. ++# ++ ++ifeq ($(UCLIBC_HAS_FENV),y) ++libm_ARCH_SRC:=$(wildcard $(libm_ARCH_DIR)/*.c) ++libm_ARCH_OBJ:=$(patsubst $(libm_ARCH_DIR)/%.c,$(libm_ARCH_OUT)/%.o,$(libm_ARCH_SRC)) ++endif ++ ++libm_ARCH_OBJS:=$(libm_ARCH_OBJ) ++ ++ifeq ($(DOPIC),y) ++libm-a-y+=$(libm_ARCH_OBJS:.o=.os) ++else ++libm-a-y+=$(libm_ARCH_OBJS) ++endif ++libm-so-y+=$(libm_ARCH_OBJS:.o=.os) ++ +diff --git a/libm/x86_64/fclrexcpt.c b/libm/x86_64/fclrexcpt.c +new file mode 100644 +index 0000000..4fc3bfb +--- /dev/null ++++ b/libm/x86_64/fclrexcpt.c +@@ -0,0 +1,52 @@ ++/* Clear given exceptions in current floating-point environment. ++ Copyright (C) 2001 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, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include ++ ++int ++feclearexcept (int excepts) ++{ ++ fenv_t temp; ++ unsigned int mxcsr; ++ ++ /* Mask out unsupported bits/exceptions. */ ++ excepts &= FE_ALL_EXCEPT; ++ ++ /* Bah, we have to clear selected exceptions. Since there is no ++ `fldsw' instruction we have to do it the hard way. */ ++ __asm__ ("fnstenv %0" : "=m" (*&temp)); ++ ++ /* Clear the relevant bits. */ ++ temp.__status_word &= excepts ^ FE_ALL_EXCEPT; ++ ++ /* Put the new data in effect. */ ++ __asm__ ("fldenv %0" : : "m" (*&temp)); ++ ++ /* And the same procedure for SSE. */ ++ __asm__ ("stmxcsr %0" : "=m" (*&mxcsr)); ++ ++ /* Clear the relevant bits. */ ++ mxcsr &= ~excepts; ++ ++ /* And put them into effect. */ ++ __asm__ ("ldmxcsr %0" : : "m" (*&mxcsr)); ++ ++ /* Success. */ ++ return 0; ++} +diff --git a/libm/x86_64/fegetexcept.c b/libm/x86_64/fegetexcept.c +new file mode 100644 +index 0000000..04df4b6 +--- /dev/null ++++ b/libm/x86_64/fegetexcept.c +@@ -0,0 +1,32 @@ ++/* Get enabled floating-point exceptions. ++ Copyright (C) 2001 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Andreas Jaeger , 2001. ++ ++ 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, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include ++ ++int ++fegetexcept (void) ++{ ++ unsigned short int exc; ++ ++ /* Get the current control word. */ ++ __asm__ ("fstcw %0" : "=m" (*&exc)); ++ ++ return (~exc) & FE_ALL_EXCEPT; ++} +diff --git a/libm/x86_64/fesetround.c b/libm/x86_64/fesetround.c +new file mode 100644 +index 0000000..3d2ef4c +--- /dev/null ++++ b/libm/x86_64/fesetround.c +@@ -0,0 +1,46 @@ ++/* Set current rounding direction. ++ Copyright (C) 2001, 2005 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, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include ++ ++int ++fesetround (int round) ++{ ++ unsigned short int cw; ++ int mxcsr; ++ ++ if ((round & ~0xc00) != 0) ++ /* ROUND is no valid rounding mode. */ ++ return 1; ++ ++ /* First set the x87 FPU. */ ++ __asm__ ("fnstcw %0" : "=m" (*&cw)); ++ cw &= ~0xc00; ++ cw |= round; ++ __asm__ ("fldcw %0" : : "m" (*&cw)); ++ ++ /* And now the MSCSR register for SSE, the precision is at different bit ++ positions in the different units, we need to shift it 3 bits. */ ++ __asm__ ("stmxcsr %0" : "=m" (*&mxcsr)); ++ mxcsr &= ~ 0x6000; ++ mxcsr |= round << 3; ++ __asm__ ("ldmxcsr %0" : : "m" (*&mxcsr)); ++ ++ return 0; ++} +diff --git a/libm/x86_64/fgetexcptflg.c b/libm/x86_64/fgetexcptflg.c +new file mode 100644 +index 0000000..f0681dc +--- /dev/null ++++ b/libm/x86_64/fgetexcptflg.c +@@ -0,0 +1,36 @@ ++/* Store current representation for exceptions. ++ Copyright (C) 2001 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, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include ++ ++int ++fegetexceptflag (fexcept_t *flagp, int excepts) ++{ ++ fexcept_t temp; ++ unsigned int mxscr; ++ ++ /* Get the current exceptions for the x87 FPU and SSE unit. */ ++ __asm__ ("fnstsw %0\n" ++ "stmxcsr %1" : "=m" (*&temp), "=m" (*&mxscr)); ++ ++ *flagp = (temp | mxscr) & FE_ALL_EXCEPT & excepts; ++ ++ /* Success. */ ++ return 0; ++} +diff --git a/libm/x86_64/ftestexcept.c b/libm/x86_64/ftestexcept.c +new file mode 100644 +index 0000000..091c251 +--- /dev/null ++++ b/libm/x86_64/ftestexcept.c +@@ -0,0 +1,33 @@ ++/* Test exception in current environment. ++ Copyright (C) 2001 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, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include ++ ++int ++fetestexcept (int excepts) ++{ ++ int temp; ++ unsigned int mxscr; ++ ++ /* Get current exceptions. */ ++ __asm__ ("fnstsw %0\n" ++ "stmxcsr %1" : "=m" (*&temp), "=m" (*&mxscr)); ++ ++ return (temp | mxscr) & excepts & FE_ALL_EXCEPT; ++} +-- +1.7.8 + diff --git a/main/libc0.9.32/0006-ldso-limited-support-for-ORIGIN-in-rpath.patch b/main/libc0.9.32/0006-ldso-limited-support-for-ORIGIN-in-rpath.patch new file mode 100644 index 0000000000..633b7e4f58 --- /dev/null +++ b/main/libc0.9.32/0006-ldso-limited-support-for-ORIGIN-in-rpath.patch @@ -0,0 +1,202 @@ +From b1aea0b3872b246cf17f04d5442a94e39e45203e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Timo=20Ter=C3=A4s?= +Date: Fri, 18 Mar 2011 10:53:56 +0200 +Subject: [PATCH] ldso: limited support for $ORIGIN in rpath +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Handle it if it's in the beginning of the rpath entry as it +should be. + +Posted to uclibc ml: +http://old.nabble.com/-PATCH-1-3--ldso%3A-limited-support-for-$ORIGIN-in-rpath-td31181219.html + +Signed-off-by: Timo Teräs +Signed-off-by: Natanael Copa +--- + ldso/ldso/dl-elf.c | 80 ++++++++++++++++++++++++++++----------------------- + ldso/ldso/ldso.c | 18 ++++++++++-- + 2 files changed, 59 insertions(+), 39 deletions(-) + +diff --git a/ldso/ldso/dl-elf.c b/ldso/ldso/dl-elf.c +index 09b3aaf..558176a 100644 +--- a/ldso/ldso/dl-elf.c ++++ b/ldso/ldso/dl-elf.c +@@ -133,53 +133,60 @@ _dl_protect_relro (struct elf_resolve *l) + * in uClibc/ldso/util/ldd.c */ + static struct elf_resolve * + search_for_named_library(const char *name, int secure, const char *path_list, +- struct dyn_elf **rpnt) ++ struct dyn_elf **rpnt, const char *origin) + { +- char *path, *path_n, *mylibname; ++ char *mylibname; ++ const char *p, *pn; + struct elf_resolve *tpnt; +- int done; ++ int plen; + + if (path_list==NULL) + return NULL; + +- /* We need a writable copy of this string, but we don't +- * need this allocated permanently since we don't want +- * to leak memory, so use alloca to put path on the stack */ +- done = _dl_strlen(path_list); +- path = alloca(done + 1); +- + /* another bit of local storage */ + mylibname = alloca(2050); + +- _dl_memcpy(path, path_list, done+1); +- + /* Unlike ldd.c, don't bother to eliminate double //s */ + + /* Replace colons with zeros in path_list */ + /* : at the beginning or end of path maps to CWD */ + /* :: anywhere maps CWD */ + /* "" maps to CWD */ +- done = 0; +- path_n = path; +- do { +- if (*path == 0) { +- *path = ':'; +- done = 1; +- } +- if (*path == ':') { +- *path = 0; +- if (*path_n) +- _dl_strcpy(mylibname, path_n); +- else +- _dl_strcpy(mylibname, "."); /* Assume current dir if empty path */ +- _dl_strcat(mylibname, "/"); +- _dl_strcat(mylibname, name); +- if ((tpnt = _dl_load_elf_shared_library(secure, rpnt, mylibname)) != NULL) +- return tpnt; +- path_n = path+1; ++ for (p = path_list; p != NULL; p = pn) { ++ pn = _dl_strchr(p + 1, ':'); ++ if (pn != NULL) { ++ plen = pn - p; ++ pn++; ++ } else ++ plen = _dl_strlen(p); ++ ++ if (plen >= 7 && _dl_memcmp(p, "$ORIGIN", 7) == 0) { ++ int olen; ++ if (secure && plen != 7) ++ continue; ++ if (origin == NULL) ++ continue; ++ for (olen = _dl_strlen(origin) - 1; olen >= 0 && origin[olen] != '/'; olen--) ++ ; ++ if (olen <= 0) ++ continue; ++ _dl_memcpy(&mylibname[0], origin, olen); ++ _dl_memcpy(&mylibname[olen], p + 7, plen - 7); ++ mylibname[olen + plen - 7] = 0; ++ } else if (plen != 0) { ++ _dl_memcpy(mylibname, p, plen); ++ mylibname[plen] = 0; ++ } else { ++ _dl_strcpy(mylibname, "."); + } +- path++; +- } while (!done); ++ _dl_strcat(mylibname, "/"); ++ _dl_strcat(mylibname, name); ++ ++ tpnt = _dl_load_elf_shared_library(secure, rpnt, mylibname); ++ if (tpnt != NULL) ++ return tpnt; ++ } ++ + return NULL; + } + +@@ -231,7 +238,8 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, + if (pnt) { + pnt += (unsigned long) tpnt->dynamic_info[DT_STRTAB]; + _dl_if_debug_dprint("\tsearching RPATH='%s'\n", pnt); +- if ((tpnt1 = search_for_named_library(libname, secure, pnt, rpnt)) != NULL) ++ if ((tpnt1 = search_for_named_library(libname, secure, pnt, rpnt, ++ tpnt->libname)) != NULL) + return tpnt1; + } + #endif +@@ -239,7 +247,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, + /* Check in LD_{ELF_}LIBRARY_PATH, if specified and allowed */ + if (_dl_library_path) { + _dl_if_debug_dprint("\tsearching LD_LIBRARY_PATH='%s'\n", _dl_library_path); +- if ((tpnt1 = search_for_named_library(libname, secure, _dl_library_path, rpnt)) != NULL) ++ if ((tpnt1 = search_for_named_library(libname, secure, _dl_library_path, rpnt, NULL)) != NULL) + { + return tpnt1; + } +@@ -253,7 +261,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, + if (pnt) { + pnt += (unsigned long) tpnt->dynamic_info[DT_STRTAB]; + _dl_if_debug_dprint("\tsearching RUNPATH='%s'\n", pnt); +- if ((tpnt1 = search_for_named_library(libname, secure, pnt, rpnt)) != NULL) ++ if ((tpnt1 = search_for_named_library(libname, secure, pnt, rpnt, NULL)) != NULL) + return tpnt1; + } + #endif +@@ -287,7 +295,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, + /* Look for libraries wherever the shared library loader + * was installed */ + _dl_if_debug_dprint("\tsearching ldso dir='%s'\n", _dl_ldsopath); +- tpnt1 = search_for_named_library(libname, secure, _dl_ldsopath, rpnt); ++ tpnt1 = search_for_named_library(libname, secure, _dl_ldsopath, rpnt, NULL); + if (tpnt1 != NULL) + return tpnt1; + +@@ -300,7 +308,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, + #ifndef __LDSO_CACHE_SUPPORT__ + ":" UCLIBC_RUNTIME_PREFIX "usr/X11R6/lib" + #endif +- , rpnt); ++ , rpnt, NULL); + if (tpnt1 != NULL) + return tpnt1; + +diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c +index 3585cb7..df16b4f 100644 +--- a/ldso/ldso/ldso.c ++++ b/ldso/ldso/ldso.c +@@ -268,6 +268,20 @@ static void __attribute__ ((destructor)) __attribute_used__ _dl_fini(void) + } + } + ++static void _dl_setup_progname(const char *argv0) ++{ ++ char image[PATH_MAX]; ++ ssize_t s; ++ ++ s = _dl_readlink("/proc/self/exe", image, sizeof(image)); ++ if (s > 0 && image[0] == '/') { ++ image[s] = 0; ++ _dl_progname = _dl_strdup(image); ++ } else if (argv0) { ++ _dl_progname = argv0; ++ } ++} ++ + void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, + ElfW(auxv_t) auxvt[AT_EGID + 1], char **envp, + char **argv +@@ -317,9 +331,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, + * been fixed up by now. Still no function calls outside of this + * library, since the dynamic resolver is not yet ready. + */ +- if (argv[0]) { +- _dl_progname = argv[0]; +- } ++ _dl_setup_progname(argv[0]); + + if (_start == (void *) auxvt[AT_ENTRY].a_un.a_val) { + _dl_dprintf(_dl_debug_file, "Standalone execution is not supported yet\n"); +-- +1.7.8 + diff --git a/main/libc0.9.32/0007-stdlib-fix-arc4random-return-type-to-u_int32_t.patch b/main/libc0.9.32/0007-stdlib-fix-arc4random-return-type-to-u_int32_t.patch new file mode 100644 index 0000000000..40c938065c --- /dev/null +++ b/main/libc0.9.32/0007-stdlib-fix-arc4random-return-type-to-u_int32_t.patch @@ -0,0 +1,62 @@ +From 8f71a37896be4ce64c009b369117b252eb4de366 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Timo=20Ter=C3=A4s?= +Date: Fri, 18 Mar 2011 10:57:31 +0200 +Subject: [PATCH] stdlib: fix arc4random return type to u_int32_t +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +It's documented to be u_int32_t and not uint32_t: + http://www.manpagez.com/man/3/arc4random/ + +This also fixes a major bug that stdlib.h includes stdint.h. Things +might go very wrong because stdint.h has conditional defines and +if stdlib.h is included before #define's for stdint.h we end up +missing things and breaking builds (e.g. openjdk). + +Signed-off-by: Timo Teräs +Signed-off-by: Natanael Copa +--- + include/stdlib.h | 4 ++-- + libc/stdlib/arc4random.c | 3 ++- + 2 files changed, 4 insertions(+), 3 deletions(-) + +diff --git a/include/stdlib.h b/include/stdlib.h +index e9a8b84..7b35840 100644 +--- a/include/stdlib.h ++++ b/include/stdlib.h +@@ -902,8 +902,8 @@ extern int getloadavg (double __loadavg[], int __nelem) + #endif + + #ifdef __UCLIBC_HAS_ARC4RANDOM__ +-#include +-extern uint32_t arc4random(void); ++# include ++extern u_int32_t arc4random(void); + extern void arc4random_stir(void); + extern void arc4random_addrandom(unsigned char *, int); + #endif +diff --git a/libc/stdlib/arc4random.c b/libc/stdlib/arc4random.c +index c7aed66..7b9b12d 100644 +--- a/libc/stdlib/arc4random.c ++++ b/libc/stdlib/arc4random.c +@@ -30,6 +30,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -175,7 +176,7 @@ arc4random_addrandom(u_char *dat, int datlen) + arc4_addrandom(&rs, dat, datlen); + } + +-uint32_t ++u_int32_t + arc4random(void) + { + if (!rs_initialized) +-- +1.7.8 + diff --git a/main/libc0.9.32/0008-ldso-support-RTLD_NOLOAD.patch b/main/libc0.9.32/0008-ldso-support-RTLD_NOLOAD.patch new file mode 100644 index 0000000000..3902df31e7 --- /dev/null +++ b/main/libc0.9.32/0008-ldso-support-RTLD_NOLOAD.patch @@ -0,0 +1,235 @@ +From e6fa350aa23280795a912d0edd989d7c98c62710 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Timo=20Ter=C3=A4s?= +Date: Fri, 18 Mar 2011 11:40:04 +0200 +Subject: [PATCH] ldso: support RTLD_NOLOAD +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +So application query if specified modile is loaded or not with +dlopen. + +Signed-off-by: Timo Teräs +Signed-off-by: Natanael Copa +--- + ldso/include/dl-elf.h | 6 ++++-- + ldso/ldso/dl-elf.c | 30 +++++++++++++++++------------- + ldso/ldso/ldso.c | 4 +++- + ldso/libdl/libdl.c | 5 +++-- + libc/sysdeps/linux/common/bits/dlfcn.h | 4 ++-- + 5 files changed, 29 insertions(+), 20 deletions(-) + +diff --git a/ldso/include/dl-elf.h b/ldso/include/dl-elf.h +index e7203fd..753c346 100644 +--- a/ldso/include/dl-elf.h ++++ b/ldso/include/dl-elf.h +@@ -25,16 +25,18 @@ static __inline__ void _dl_map_cache(void) { } + static __inline__ void _dl_unmap_cache(void) { } + #endif + ++#define DL_RESOLVE_SECURE 0x0001 ++#define DL_RESOLVE_NOLOAD 0x0002 + + /* Function prototypes for non-static stuff in readelflib1.c */ + extern void _dl_parse_lazy_relocation_information(struct dyn_elf *rpnt, + unsigned long rel_addr, unsigned long rel_size); + extern int _dl_parse_relocation_information(struct dyn_elf *rpnt, + unsigned long rel_addr, unsigned long rel_size); +-extern struct elf_resolve * _dl_load_shared_library(int secure, ++extern struct elf_resolve * _dl_load_shared_library(int resolve_flags, + struct dyn_elf **rpnt, struct elf_resolve *tpnt, char *full_libname, + int trace_loaded_objects); +-extern struct elf_resolve * _dl_load_elf_shared_library(int secure, ++extern struct elf_resolve * _dl_load_elf_shared_library(int resolve_flags, + struct dyn_elf **rpnt, char *libname); + extern struct elf_resolve *_dl_check_if_named_library_is_loaded(const char *full_libname, + int trace_loaded_objects); +diff --git a/ldso/ldso/dl-elf.c b/ldso/ldso/dl-elf.c +index 558176a..e32591a 100644 +--- a/ldso/ldso/dl-elf.c ++++ b/ldso/ldso/dl-elf.c +@@ -132,7 +132,7 @@ _dl_protect_relro (struct elf_resolve *l) + /* This function's behavior must exactly match that + * in uClibc/ldso/util/ldd.c */ + static struct elf_resolve * +-search_for_named_library(const char *name, int secure, const char *path_list, ++search_for_named_library(const char *name, int resolve_flags, const char *path_list, + struct dyn_elf **rpnt, const char *origin) + { + char *mylibname; +@@ -162,7 +162,7 @@ search_for_named_library(const char *name, int secure, const char *path_list, + + if (plen >= 7 && _dl_memcmp(p, "$ORIGIN", 7) == 0) { + int olen; +- if (secure && plen != 7) ++ if ((resolve_flags & DL_RESOLVE_SECURE) && plen != 7) + continue; + if (origin == NULL) + continue; +@@ -182,7 +182,7 @@ search_for_named_library(const char *name, int secure, const char *path_list, + _dl_strcat(mylibname, "/"); + _dl_strcat(mylibname, name); + +- tpnt = _dl_load_elf_shared_library(secure, rpnt, mylibname); ++ tpnt = _dl_load_elf_shared_library(resolve_flags, rpnt, mylibname); + if (tpnt != NULL) + return tpnt; + } +@@ -194,7 +194,7 @@ search_for_named_library(const char *name, int secure, const char *path_list, + unsigned long _dl_error_number; + unsigned long _dl_internal_error_number; + +-struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, ++struct elf_resolve *_dl_load_shared_library(int resolve_flags, struct dyn_elf **rpnt, + struct elf_resolve *tpnt, char *full_libname, int attribute_unused trace_loaded_objects) + { + char *pnt; +@@ -223,7 +223,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, + + if (libname != full_libname) { + _dl_if_debug_dprint("\ttrying file='%s'\n", full_libname); +- tpnt1 = _dl_load_elf_shared_library(secure, rpnt, full_libname); ++ tpnt1 = _dl_load_elf_shared_library(resolve_flags, rpnt, full_libname); + if (tpnt1) { + return tpnt1; + } +@@ -238,7 +238,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, + if (pnt) { + pnt += (unsigned long) tpnt->dynamic_info[DT_STRTAB]; + _dl_if_debug_dprint("\tsearching RPATH='%s'\n", pnt); +- if ((tpnt1 = search_for_named_library(libname, secure, pnt, rpnt, ++ if ((tpnt1 = search_for_named_library(libname, resolve_flags, pnt, rpnt, + tpnt->libname)) != NULL) + return tpnt1; + } +@@ -247,7 +247,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, + /* Check in LD_{ELF_}LIBRARY_PATH, if specified and allowed */ + if (_dl_library_path) { + _dl_if_debug_dprint("\tsearching LD_LIBRARY_PATH='%s'\n", _dl_library_path); +- if ((tpnt1 = search_for_named_library(libname, secure, _dl_library_path, rpnt, NULL)) != NULL) ++ if ((tpnt1 = search_for_named_library(libname, resolve_flags, _dl_library_path, rpnt, NULL)) != NULL) + { + return tpnt1; + } +@@ -261,7 +261,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, + if (pnt) { + pnt += (unsigned long) tpnt->dynamic_info[DT_STRTAB]; + _dl_if_debug_dprint("\tsearching RUNPATH='%s'\n", pnt); +- if ((tpnt1 = search_for_named_library(libname, secure, pnt, rpnt, NULL)) != NULL) ++ if ((tpnt1 = search_for_named_library(libname, resolve_flags, pnt, rpnt, NULL)) != NULL) + return tpnt1; + } + #endif +@@ -284,7 +284,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, + || libent[i].flags == LIB_ELF_LIBC0 + || libent[i].flags == LIB_ELF_LIBC5) + && _dl_strcmp(libname, strs + libent[i].sooffset) == 0 +- && (tpnt1 = _dl_load_elf_shared_library(secure, rpnt, strs + libent[i].liboffset)) ++ && (tpnt1 = _dl_load_elf_shared_library(resolve_flags, rpnt, strs + libent[i].liboffset)) + ) { + return tpnt1; + } +@@ -295,14 +295,14 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt, + /* Look for libraries wherever the shared library loader + * was installed */ + _dl_if_debug_dprint("\tsearching ldso dir='%s'\n", _dl_ldsopath); +- tpnt1 = search_for_named_library(libname, secure, _dl_ldsopath, rpnt, NULL); ++ tpnt1 = search_for_named_library(libname, resolve_flags, _dl_ldsopath, rpnt, NULL); + if (tpnt1 != NULL) + return tpnt1; + + /* Lastly, search the standard list of paths for the library. + This list must exactly match the list in uClibc/ldso/util/ldd.c */ + _dl_if_debug_dprint("\tsearching full lib path list\n"); +- tpnt1 = search_for_named_library(libname, secure, ++ tpnt1 = search_for_named_library(libname, resolve_flags, + UCLIBC_RUNTIME_PREFIX "lib:" + UCLIBC_RUNTIME_PREFIX "usr/lib" + #ifndef __LDSO_CACHE_SUPPORT__ +@@ -444,7 +444,7 @@ map_writeable (int infile, ElfW(Phdr) *ppnt, int piclib, int flags, + * are required. + */ + +-struct elf_resolve *_dl_load_elf_shared_library(int secure, ++struct elf_resolve *_dl_load_elf_shared_library(int resolve_flags, + struct dyn_elf **rpnt, char *libname) + { + ElfW(Ehdr) *epnt; +@@ -483,7 +483,7 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure, + } + /* If we are in secure mode (i.e. a setu/gid binary using LD_PRELOAD), + we don't load the library if it isn't setuid. */ +- if (secure) { ++ if (resolve_flags & DL_RESOLVE_SECURE) { + if (!(st.st_mode & S_ISUID)) { + _dl_close(infile); + return NULL; +@@ -499,6 +499,10 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure, + return tpnt; + } + } ++ if (resolve_flags & DL_RESOLVE_NOLOAD) { ++ _dl_close(infile); ++ return NULL; ++ } + header = _dl_mmap((void *) 0, _dl_pagesize, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_UNINITIALIZE, -1, 0); + if (_dl_mmap_check_error(header)) { +diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c +index df16b4f..5cefc22 100644 +--- a/ldso/ldso/ldso.c ++++ b/ldso/ldso/ldso.c +@@ -642,7 +642,9 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, + if (!_dl_secure || _dl_strchr(str, '/') == NULL) { + _dl_if_debug_dprint("\tfile='%s'; needed by '%s'\n", str, _dl_progname); + +- tpnt1 = _dl_load_shared_library(_dl_secure, &rpnt, NULL, str, trace_loaded_objects); ++ tpnt1 = _dl_load_shared_library( ++ _dl_secure ? DL_RESOLVE_SECURE : 0, ++ &rpnt, NULL, str, trace_loaded_objects); + if (!tpnt1) { + #ifdef __LDSO_LDD_SUPPORT__ + if (trace_loaded_objects) +diff --git a/ldso/libdl/libdl.c b/ldso/libdl/libdl.c +index 52c77b0..49e90d0 100644 +--- a/ldso/libdl/libdl.c ++++ b/ldso/libdl/libdl.c +@@ -288,7 +288,7 @@ void *dlopen(const char *libname, int flag) + #endif + + /* A bit of sanity checking... */ +- if (!(flag & (RTLD_LAZY|RTLD_NOW))) { ++ if (!(flag & (RTLD_LAZY|RTLD_NOW|RTLD_NOLOAD))) { + _dl_error_number = LD_BAD_HANDLE; + return NULL; + } +@@ -358,8 +358,9 @@ void *dlopen(const char *libname, int flag) + /* Try to load the specified library */ + _dl_if_debug_print("Trying to dlopen '%s', RTLD_GLOBAL:%d RTLD_NOW:%d\n", + (char*)libname, (flag & RTLD_GLOBAL ? 1:0), (now_flag & RTLD_NOW ? 1:0)); +- tpnt = _dl_load_shared_library(0, &rpnt, tfrom, (char*)libname, 0); + ++ tpnt = _dl_load_shared_library((flag & RTLD_NOLOAD) ? DL_RESOLVE_NOLOAD : 0, ++ &rpnt, tfrom, (char*)libname, 0); + if (tpnt == NULL) { + _dl_unmap_cache(); + return NULL; +diff --git a/libc/sysdeps/linux/common/bits/dlfcn.h b/libc/sysdeps/linux/common/bits/dlfcn.h +index 4bfbbff..47b42ad 100644 +--- a/libc/sysdeps/linux/common/bits/dlfcn.h ++++ b/libc/sysdeps/linux/common/bits/dlfcn.h +@@ -24,9 +24,9 @@ + /* The MODE argument to `dlopen' contains one of the following: */ + #define RTLD_LAZY 0x00001 /* Lazy function call binding. */ + #define RTLD_NOW 0x00002 /* Immediate function call binding. */ +-#if 0 /* uClibc doesnt support these */ +-#define RTLD_BINDING_MASK 0x3 /* Mask of binding time value. */ ++#define RTLD_BINDING_MASK 0x3 /* Mask of binding time value. */ + #define RTLD_NOLOAD 0x00004 /* Do not load the object. */ ++#if 0 /* uClibc doesnt support these */ + #define RTLD_DEEPBIND 0x00008 /* Use deep binding. */ + #endif + +-- +1.7.8 + diff --git a/main/libc0.9.32/0009-libdl-rudimentary-locking-for-dlopen-dlsym-dlclose.patch b/main/libc0.9.32/0009-libdl-rudimentary-locking-for-dlopen-dlsym-dlclose.patch new file mode 100644 index 0000000000..367db170f2 --- /dev/null +++ b/main/libc0.9.32/0009-libdl-rudimentary-locking-for-dlopen-dlsym-dlclose.patch @@ -0,0 +1,154 @@ +From e3f3de389e28f2585d1a1e57989440ffea67e689 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Timo=20Ter=C3=A4s?= +Date: Thu, 24 Mar 2011 13:27:36 +0200 +Subject: [PATCH] libdl: rudimentary locking for dlopen/dlsym/dlclose +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This implements big-dlfcn lock to allow multithreaded usage of +dlopen/dlsym/dlclose. We should really clean up the dl code so +we can use more fine grained locking or even RCU where appropriate. +But at least we won't crash now. + +Signed-off-by: Timo Teräs +Signed-off-by: Bernhard Reutner-Fischer +(cherry picked from commit f69319d5a7d3a3ccb46b28ee2b0fd9053c6415ac) +--- + TODO | 1 + + ldso/libdl/libdl.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++---- + 2 files changed, 50 insertions(+), 5 deletions(-) + +diff --git a/TODO b/TODO +index ae305a5..95cabd5 100644 +--- a/TODO ++++ b/TODO +@@ -101,6 +101,7 @@ TODO list for AFTER the uClibc 1.0.0 release: + *) run 'nm -D --size-sort -t d libuClibc-0.9.26.so' and work on the + biggest things (i.e. stuff at the end of the list) to make + them smaller. ++ *) Fix dlopen/dlsym/dlclose locking to more fine grained or use RCU + + + +diff --git a/ldso/libdl/libdl.c b/ldso/libdl/libdl.c +index 49e90d0..8b243c6 100644 +--- a/ldso/libdl/libdl.c ++++ b/ldso/libdl/libdl.c +@@ -34,6 +34,7 @@ + #include + #include /* Needed for 'strstr' prototype' */ + #include ++#include + + #ifdef __UCLIBC_HAS_TLS__ + #include +@@ -44,6 +45,10 @@ + extern void _dl_add_to_slotinfo(struct link_map *l); + #endif + ++/* TODO: get rid of global lock and use more finegrained locking, or ++ * perhaps RCU for the global structures */ ++__UCLIBC_MUTEX_STATIC(_dl_mutex, PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP); ++ + #ifdef SHARED + # if defined(USE_TLS) && USE_TLS + # include +@@ -271,7 +276,7 @@ void dl_cleanup(void) + } + } + +-void *dlopen(const char *libname, int flag) ++static void *do_dlopen(const char *libname, int flag) + { + struct elf_resolve *tpnt, *tfrom; + struct dyn_elf *dyn_chain, *rpnt = NULL, *dyn_ptr, *relro_ptr, *handle; +@@ -606,7 +611,18 @@ oops: + return NULL; + } + +-void *dlsym(void *vhandle, const char *name) ++void *dlopen(const char *libname, int flag) ++{ ++ void *ret; ++ ++ __UCLIBC_MUTEX_CONDITIONAL_LOCK(_dl_mutex, 1); ++ ret = do_dlopen(libname, flag); ++ __UCLIBC_MUTEX_CONDITIONAL_UNLOCK(_dl_mutex, 1); ++ ++ return ret; ++} ++ ++static void *do_dlsym(void *vhandle, const char *name, void *caller_address) + { + struct elf_resolve *tpnt, *tfrom; + struct dyn_elf *handle; +@@ -654,7 +670,7 @@ void *dlsym(void *vhandle, const char *name) + * dynamic loader itself, as it doesn't know + * how to properly treat it. + */ +- from = (ElfW(Addr)) __builtin_return_address(0); ++ from = (ElfW(Addr)) caller_address; + + tfrom = NULL; + for (rpnt = _dl_symbol_tables; rpnt; rpnt = rpnt->next) { +@@ -691,6 +707,17 @@ out: + return ret; + } + ++void *dlsym(void *vhandle, const char *name) ++{ ++ void *ret; ++ ++ __UCLIBC_MUTEX_CONDITIONAL_LOCK(_dl_mutex, 1); ++ ret = do_dlsym(vhandle, name, __builtin_return_address(0)); ++ __UCLIBC_MUTEX_CONDITIONAL_UNLOCK(_dl_mutex, 1); ++ ++ return ret; ++} ++ + #if 0 + void *dlvsym(void *vhandle, const char *name, const char *version) + { +@@ -958,7 +985,13 @@ static int do_dlclose(void *vhandle, int need_fini) + + int dlclose(void *vhandle) + { +- return do_dlclose(vhandle, 1); ++ int ret; ++ ++ __UCLIBC_MUTEX_CONDITIONAL_LOCK(_dl_mutex, 1); ++ ret = do_dlclose(vhandle, 1); ++ __UCLIBC_MUTEX_CONDITIONAL_UNLOCK(_dl_mutex, 1); ++ ++ return ret; + } + + char *dlerror(void) +@@ -1005,7 +1038,7 @@ int dlinfo(void) + return 0; + } + +-int dladdr(const void *__address, Dl_info * __info) ++static int do_dladdr(const void *__address, Dl_info * __info) + { + struct elf_resolve *pelf; + struct elf_resolve *rpnt; +@@ -1117,3 +1150,14 @@ int dladdr(const void *__address, Dl_info * __info) + } + } + #endif ++ ++int dladdr(const void *__address, Dl_info * __info) ++{ ++ int ret; ++ ++ __UCLIBC_MUTEX_CONDITIONAL_LOCK(_dl_mutex, 1); ++ ret = do_dladdr(__address, __info); ++ __UCLIBC_MUTEX_CONDITIONAL_UNLOCK(_dl_mutex, 1); ++ ++ return ret; ++} +-- +1.7.8 + diff --git a/main/libc0.9.32/0010-malloc-standard-synchronize-on-fork.patch b/main/libc0.9.32/0010-malloc-standard-synchronize-on-fork.patch new file mode 100644 index 0000000000..688231f777 --- /dev/null +++ b/main/libc0.9.32/0010-malloc-standard-synchronize-on-fork.patch @@ -0,0 +1,55 @@ +From 1bdf3d74afad552ff99182af70536f23549a434f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Timo=20Ter=C3=A4s?= +Date: Sat, 26 Mar 2011 20:23:09 +0200 +Subject: [PATCH] malloc-standard: synchronize on fork +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Otherwise other threads can leave malloc state locked, and the child +will hang indefinitely if it tries to malloc something. + +Signed-off-by: Timo Teräs +Signed-off-by: Natanael Copa +--- + libc/stdlib/malloc-standard/free.c | 17 +++++++++++++++++ + 1 files changed, 17 insertions(+), 0 deletions(-) + +diff --git a/libc/stdlib/malloc-standard/free.c b/libc/stdlib/malloc-standard/free.c +index 39e54d6..df512cc 100644 +--- a/libc/stdlib/malloc-standard/free.c ++++ b/libc/stdlib/malloc-standard/free.c +@@ -118,6 +118,21 @@ int malloc_trim(size_t pad) + to inline it at all call points, which turns out not to be an + optimization at all. (Inlining it in __malloc_consolidate is fine though.) + */ ++static void _malloc_lock(void) ++{ ++ __UCLIBC_MUTEX_LOCK_CANCEL_UNSAFE(__malloc_lock); ++} ++ ++static void _malloc_unlock(void) ++{ ++ __UCLIBC_MUTEX_UNLOCK_CANCEL_UNSAFE(__malloc_lock); ++} ++ ++static void _malloc_reset(void) ++{ ++ __UCLIBC_MUTEX_INIT_VAR(__malloc_lock); ++} ++ + static void malloc_init_state(mstate av) + { + int i; +@@ -145,6 +160,8 @@ static void malloc_init_state(mstate av) + + av->top = initial_top(av); + av->pagesize = malloc_getpagesize; ++ ++ __libc_atfork(_malloc_lock, _malloc_unlock, _malloc_reset); + } + + +-- +1.7.8 + diff --git a/main/libc0.9.32/0011-time-fix-parsing-of-tzdata-files-where-off_t-is-64-b.patch b/main/libc0.9.32/0011-time-fix-parsing-of-tzdata-files-where-off_t-is-64-b.patch new file mode 100644 index 0000000000..63ee369af6 --- /dev/null +++ b/main/libc0.9.32/0011-time-fix-parsing-of-tzdata-files-where-off_t-is-64-b.patch @@ -0,0 +1,32 @@ +From 0be0174259a3a35313fe1a0413630b919f910f5b Mon Sep 17 00:00:00 2001 +From: William Pitcock +Date: Thu, 28 Apr 2011 03:09:20 -0500 +Subject: [PATCH] time: fix parsing of tzdata files where off_t is 64-bit + +lseek takes off_t as the offset type, but gcc will normally pass a +32-bit value unless the number is wider than 16 bits. so we force +gcc to pass the constant as off_t type always by casting the constant +to off_t. + +Signed-off-by: William Pitcock +Signed-off-by: Natanael Copa +--- + libc/misc/time/time.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/libc/misc/time/time.c b/libc/misc/time/time.c +index 19d68e1..1b21f9e 100644 +--- a/libc/misc/time/time.c ++++ b/libc/misc/time/time.c +@@ -1856,7 +1856,7 @@ ERROR: + if (r != TZ_BUFLEN + || strncmp(buf, "TZif", 4) != 0 + || (unsigned char)buf[4] < 2 +- || lseek(fd, -TZ_BUFLEN, SEEK_END) < 0 ++ || lseek(fd, (off_t) -TZ_BUFLEN, SEEK_END) < 0 + ) { + goto ERROR; + } +-- +1.7.8 + diff --git a/main/libc0.9.32/0012-getaddrinfo-allow-numeric-service-without-any-hints.patch b/main/libc0.9.32/0012-getaddrinfo-allow-numeric-service-without-any-hints.patch new file mode 100644 index 0000000000..2cb303a943 --- /dev/null +++ b/main/libc0.9.32/0012-getaddrinfo-allow-numeric-service-without-any-hints.patch @@ -0,0 +1,41 @@ +From eb5d129b641c644d82089c3ded3d36288c66123c Mon Sep 17 00:00:00 2001 +From: Natanael Copa +Date: Sun, 12 Jun 2011 12:09:04 +0000 +Subject: [PATCH] getaddrinfo: allow numeric service without any hints + +This appears to correspond to what glibc does and this fixes an +issue with iptables-1.4.11 with udp and raw port numbers. + +(see http://bugzilla.netfilter.org/show_bug.cgi?id=721) + +This fixes #3841 +https://bugs.busybox.net/show_bug.cgi?id=3841 + +Signed-off-by: Natanael Copa +Signed-off-by: Bernhard Reutner-Fischer +(cherry picked from commit bc3be18145e4d57e7268506f123c0f0f373a15e2) +--- + libc/inet/getaddrinfo.c | 7 ------- + 1 files changed, 0 insertions(+), 7 deletions(-) + +diff --git a/libc/inet/getaddrinfo.c b/libc/inet/getaddrinfo.c +index 1a77c51..e7511f6 100644 +--- a/libc/inet/getaddrinfo.c ++++ b/libc/inet/getaddrinfo.c +@@ -820,13 +820,6 @@ getaddrinfo(const char *name, const char *service, + if (hints->ai_flags & AI_NUMERICSERV) + return EAI_NONAME; + gaih_service.num = -1; +- } else { +- /* +- * Can't specify a numerical socket unless a protocol +- * family was given. +- */ +- if (hints->ai_socktype == 0 && hints->ai_protocol == 0) +- return EAI_SERVICE; + } + pservice = &gaih_service; + } else +-- +1.7.8 + diff --git a/main/libc0.9.32/0013-libc-x86-fix-stack-unwinding-and-backtrace-informati.patch b/main/libc0.9.32/0013-libc-x86-fix-stack-unwinding-and-backtrace-informati.patch new file mode 100644 index 0000000000..d8961b2bc2 --- /dev/null +++ b/main/libc0.9.32/0013-libc-x86-fix-stack-unwinding-and-backtrace-informati.patch @@ -0,0 +1,251 @@ +From 9d28002b230eb01a5db7aecab263d38bf0d6d6c7 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Timo=20Ter=C3=A4s?= +Date: Thu, 10 Nov 2011 09:36:44 +0200 +Subject: [PATCH] libc/x86: fix stack unwinding and backtrace information +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +When compiled without framepointer, the DWARF-2 CFI data is required +for proper stack unwinding. + +This patch adds the CFI information to: + * syscalls (so we get proper backtrace even for release builds) + the ebx hack was removed as it would complicate the CFI generation + * new thread stub function (so the backtrace is clean for user + created threads) + +Also pads the signal return trampolines separate from other functions. +If CFI info was found for signal return code (which seems to happen if +it's located right next a valid function), it will not be recognized +as signal trampoline (gcc unwinder and gdb check first CFI info, and +only if it does not exists it compares the exact opcode sequence to +see if we are at signal return code block). This fixes a real crash +if thread is cancelled and the cancellation handler fails to detect the +signal return frame. + +Signed-off-by: Timo Teräs +Signed-off-by: Natanael Copa +--- + libc/sysdeps/linux/i386/bits/syscalls.h | 82 +++---------------------------- + libc/sysdeps/linux/i386/clone.S | 17 ++++++ + libc/sysdeps/linux/i386/sigaction.c | 4 ++ + 3 files changed, 28 insertions(+), 75 deletions(-) + +diff --git a/libc/sysdeps/linux/i386/bits/syscalls.h b/libc/sysdeps/linux/i386/bits/syscalls.h +index eeafb3a..1f60a44 100644 +--- a/libc/sysdeps/linux/i386/bits/syscalls.h ++++ b/libc/sysdeps/linux/i386/bits/syscalls.h +@@ -13,6 +13,7 @@ + #ifndef __ASSEMBLER__ + + #include ++#include + + #define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \ + ({ \ +@@ -31,90 +32,21 @@ + + #if 1 /* defined __PIC__ || defined __pic__ */ + +-/* This code avoids pushing/popping ebx as much as possible. +- * I think the main reason was that older GCCs had problems +- * with proper saving/restoring of ebx if "b" constraint was used, +- * which was breaking -fPIC code really badly. +- * At least gcc 4.2.x seems to not need these tricks anymore, +- * but this code is still useful because it often avoids +- * using stack for saving ebx. +- * Keeping it unconditionally enabled for now. +- */ +- +-/* We need some help from the assembler to generate optimal code. +- * We define some macros here which later will be used. */ +-/* gcc>=4.6 with LTO need the same guards as IMA (a.k.a --combine) did. +- * See gcc.gnu.org/PR47577 */ +-/* FIXME: drop these b* macros! */ +- +-__asm__ ( +-#if defined __DOMULTI__ || __GNUC_PREREQ (4, 6) +- /* Protect against asm macro redefinition (happens in __DOMULTI__ mode). +- * Unfortunately, it ends up visible in .o files. */ +- ".ifndef _BITS_SYSCALLS_ASM\n\t" +- ".set _BITS_SYSCALLS_ASM,1\n\t" +-#endif +- ".L__X'%ebx = 1\n\t" +- ".L__X'%ecx = 2\n\t" +- ".L__X'%edx = 2\n\t" +- ".L__X'%eax = 3\n\t" +- ".L__X'%esi = 3\n\t" +- ".L__X'%edi = 3\n\t" +- ".L__X'%ebp = 3\n\t" +- ".L__X'%esp = 3\n\t" +- +- /* Loading param #1 (ebx) is done by loading it into +- * another register, and then performing bpushl+bmovl, +- * since we must preserve ebx */ +- +- ".macro bpushl name reg\n\t" +- ".if 1 - \\name\n\t" /* if reg!=ebx... */ +- ".if 2 - \\name\n\t" /* if reg can't be clobbered... */ +- "pushl %ebx\n\t" /* save ebx on stack */ +- ".else\n\t" +- "xchgl \\reg, %ebx\n\t" /* else save ebx in reg, and load reg to ebx */ +- ".endif\n\t" +- ".endif\n\t" +- ".endm\n\t" +- +- ".macro bmovl name reg\n\t" +- ".if 1 - \\name\n\t" +- ".if 2 - \\name\n\t" /* if reg can't be clobbered... */ +- "movl \\reg, %ebx\n\t" /* load reg to ebx */ +- ".endif\n\t" +- ".endif\n\t" +- ".endm\n\t" +- +- ".macro bpopl name reg\n\t" +- ".if 1 - \\name\n\t" +- ".if 2 - \\name\n\t" /* if reg can't be clobbered... */ +- "popl %ebx\n\t" /* restore ebx from stack */ +- ".else\n\t" +- "xchgl \\reg, %ebx\n\t" /* else restore ebx from reg */ +- ".endif\n\t" +- ".endif\n\t" +- ".endm\n\t" +- +-#if defined __DOMULTI__ || __GNUC_PREREQ (4, 6) +- ".endif\n\t" /* _BITS_SYSCALLS_ASM */ +-#endif +-); +- + #define LOADARGS_0 +-#define LOADARGS_1 "bpushl .L__X'%k2, %k2\n\t" "bmovl .L__X'%k2, %k2\n\t" ++#define LOADARGS_1 "push %%ebx\n\t" CFI_ADJUST_CFA_OFFSET(4) "\n\t" CFI_REL_OFFSET(ebx, 0) "\n\t" "movl %k2, %%ebx\n\t" + #define LOADARGS_2 LOADARGS_1 + #define LOADARGS_3 LOADARGS_1 + #define LOADARGS_4 LOADARGS_1 + #define LOADARGS_5 LOADARGS_1 +-#define LOADARGS_6 LOADARGS_1 "push %%ebp\n\t" "movl %7, %%ebp\n\t" ++#define LOADARGS_6 LOADARGS_1 "push %%ebp\n\t" CFI_ADJUST_CFA_OFFSET(4) "\n\t" CFI_REL_OFFSET(ebp, 0) "\n\t" "movl %7, %%ebp\n\t" + + #define RESTOREARGS_0 +-#define RESTOREARGS_1 "bpopl .L__X'%k2, %k2\n\t" ++#define RESTOREARGS_1 "pop %%ebx\n\t" CFI_ADJUST_CFA_OFFSET(-4) "\n\t" CFI_RESTORE(ebx) "\n\t" RESTOREARGS_0 + #define RESTOREARGS_2 RESTOREARGS_1 + #define RESTOREARGS_3 RESTOREARGS_1 + #define RESTOREARGS_4 RESTOREARGS_1 + #define RESTOREARGS_5 RESTOREARGS_1 +-#define RESTOREARGS_6 "pop %%ebp\n\t" RESTOREARGS_1 ++#define RESTOREARGS_6 "pop %%ebp\n\t" CFI_ADJUST_CFA_OFFSET(-4) "\n\t" CFI_RESTORE(ebp) "\n\t" RESTOREARGS_1 + + #define ASMFMT_0() + /* "acdSD" constraint would work too, but "SD" would use esi/edi and cause +@@ -162,7 +94,7 @@ __asm__ ( + #define LOADARGS_3 + #define LOADARGS_4 + #define LOADARGS_5 +-#define LOADARGS_6 "push %%ebp\n\t" "movl %7, %%ebp\n\t" ++#define LOADARGS_6 "push %%ebp\n\t" CFI_ADJUST_CFA_OFFSET(4) "\n\t" CFI_REL_OFFSET(ebp, 0) "\n\t" "movl %7, %%ebp\n\t" + + #define RESTOREARGS_0 + #define RESTOREARGS_1 +@@ -170,7 +102,7 @@ __asm__ ( + #define RESTOREARGS_3 + #define RESTOREARGS_4 + #define RESTOREARGS_5 +-#define RESTOREARGS_6 "pop %%ebp\n\t" ++#define RESTOREARGS_6 "pop %%ebp\n\t" CFI_ADJUST_CFA_OFFSET(-4) "\n\t" CFI_RESTORE(ebp) "\n\t" + + #define ASMFMT_0() + #define ASMFMT_1(arg1) \ +diff --git a/libc/sysdeps/linux/i386/clone.S b/libc/sysdeps/linux/i386/clone.S +index a7de3fe..cf6cd35 100644 +--- a/libc/sysdeps/linux/i386/clone.S ++++ b/libc/sysdeps/linux/i386/clone.S +@@ -25,6 +25,7 @@ + + #define _ERRNO_H 1 + #include ++#include + #include + + /* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg, +@@ -45,6 +46,7 @@ + .global clone + .type clone,%function + clone: ++ cfi_startproc; + /* Sanity check arguments. */ + movl $-EINVAL,%eax + +@@ -86,17 +88,28 @@ clone: + + /* Do the system call */ + pushl %ebx ++ cfi_adjust_cfa_offset (4) + pushl %esi ++ cfi_adjust_cfa_offset (4) + pushl %edi ++ cfi_adjust_cfa_offset (4) ++ + movl TLS+12(%esp),%esi ++ cfi_rel_offset (esi, 4) + movl PTID+12(%esp),%edx + movl FLAGS+12(%esp),%ebx ++ cfi_rel_offset (ebx, 8) + movl CTID+12(%esp),%edi ++ cfi_rel_offset (edi, 0) + movl $__NR_clone,%eax + #ifdef RESET_PID + /* Remember the flag value. */ + movl %ebx, (%ecx) + #endif ++ /* End FDE now, because in the child the unwind info will be ++ wrong. */ ++ cfi_endproc ++ + int $0x80 + popl %edi + popl %esi +@@ -108,6 +121,9 @@ clone: + ret + + .Lthread_start: ++ cfi_startproc; ++ /* Clearing frame pointer is insufficient, use CFI. */ ++ cfi_undefined (eip); + /* Note: %esi is zero. */ + movl %esi,%ebp /* terminate the stack frame */ + call *%ebx +@@ -120,6 +136,7 @@ clone: + movl %eax, %ebx + movl $__NR_exit, %eax + int $0x80 ++ cfi_endproc; + + /* Need to indirect jump to syscall error + * or we end up with TEXTREL's +diff --git a/libc/sysdeps/linux/i386/sigaction.c b/libc/sysdeps/linux/i386/sigaction.c +index de0c75d..f9af3f7 100644 +--- a/libc/sysdeps/linux/i386/sigaction.c ++++ b/libc/sysdeps/linux/i386/sigaction.c +@@ -112,6 +112,9 @@ libc_hidden_weak(sigaction) + #define RESTORE2(name, syscall) \ + __asm__ ( \ + ".text\n" \ ++ ".align 8\n" \ ++ " nop\n" \ ++ ".align 16\n" \ + "__" #name ":\n" \ + " movl $" #syscall ", %eax\n" \ + " int $0x80\n" \ +@@ -128,6 +131,7 @@ RESTORE(restore_rt, __NR_rt_sigreturn) + # define RESTORE2(name, syscall) \ + __asm__ ( \ + ".text\n" \ ++ ".align 8\n" \ + "__" #name ":\n" \ + " popl %eax\n" \ + " movl $" #syscall ", %eax\n" \ +-- +1.7.8 + diff --git a/main/libc0.9.32/0014-libm-add-cabsf-and-cabsl-functions.patch b/main/libc0.9.32/0014-libm-add-cabsf-and-cabsl-functions.patch new file mode 100644 index 0000000000..cb19a9f954 --- /dev/null +++ b/main/libc0.9.32/0014-libm-add-cabsf-and-cabsl-functions.patch @@ -0,0 +1,39 @@ +From aee19ef04c6abf52f4fd646269fcf8a8609164f9 Mon Sep 17 00:00:00 2001 +From: William Pitcock +Date: Tue, 1 Nov 2011 18:55:25 -0500 +Subject: [PATCH] libm: add cabsf() and cabsl() functions. + +Signed-off-by: William Pitcock +Signed-off-by: Bernhard Reutner-Fischer +(cherry picked from commit 2086015b9a223586c1a2b8d7f015ad3a38bdf8bc) +--- + libm/w_cabs.c | 16 ++++++++++++++++ + 1 files changed, 16 insertions(+), 0 deletions(-) + +diff --git a/libm/w_cabs.c b/libm/w_cabs.c +index 4044f4b..b259248 100644 +--- a/libm/w_cabs.c ++++ b/libm/w_cabs.c +@@ -13,3 +13,19 @@ double cabs(double _Complex z) + return hypot(__real__ z, __imag__ z); + } + libm_hidden_def(cabs) ++ ++libm_hidden_proto(cabsf) ++float cabsf(float _Complex z) ++{ ++ return (float) hypot(__real__ z, __imag__ z); ++} ++libm_hidden_def(cabsf) ++ ++#if defined __UCLIBC_HAS_LONG_DOUBLE_MATH__ && !defined __NO_LONG_DOUBLE_MATH ++libm_hidden_proto(cabsl) ++long double cabsl(long double _Complex z) ++{ ++ return hypotl(__real__ z, __imag__ z); ++} ++libm_hidden_def(cabsl) ++#endif +-- +1.7.8 + diff --git a/main/libc0.9.32/0015-libm-implement-generic-cexp-cexpf-and-cexpl.patch b/main/libc0.9.32/0015-libm-implement-generic-cexp-cexpf-and-cexpl.patch new file mode 100644 index 0000000000..1ac2316580 --- /dev/null +++ b/main/libc0.9.32/0015-libm-implement-generic-cexp-cexpf-and-cexpl.patch @@ -0,0 +1,103 @@ +From bf95401faf3ec57b5f45ada41dc219f6d04770ae Mon Sep 17 00:00:00 2001 +From: William Pitcock +Date: Tue, 1 Nov 2011 18:41:30 -0500 +Subject: [PATCH] libm: implement generic cexp(), cexpf() and cexpl(). + +The cexp*() family of functions is defined by the C99 math standard as +implementing exponential functions for complex types. + +Signed-off-by: William Pitcock +Signed-off-by: Bernhard Reutner-Fischer +(cherry picked from commit 6471fc450b66dcb1ba16fe6568cd52221ca64cd1) +--- + libm/Makefile.in | 3 +- + libm/cexp.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 65 insertions(+), 1 deletions(-) + create mode 100644 libm/cexp.c + +diff --git a/libm/Makefile.in b/libm/Makefile.in +index f0aaa2a..af949e8 100644 +--- a/libm/Makefile.in ++++ b/libm/Makefile.in +@@ -72,7 +72,8 @@ libm_CSRC := \ + s_fpclassify.c s_fpclassifyf.c s_signbit.c s_signbitf.c \ + s_isnan.c s_isnanf.c s_isinf.c s_isinff.c s_finitef.c \ + s_fdim.c s_fma.c s_fmax.c s_fmin.c \ +- s_remquo.c w_exp2.c ++ s_remquo.c w_exp2.c \ ++ cexp.c + + # Not implemented [yet?], see comment in float_wrappers.c: + # fdimf.o fmaf.o fmaxf.o fminf.o +diff --git a/libm/cexp.c b/libm/cexp.c +new file mode 100644 +index 0000000..87512b7 +--- /dev/null ++++ b/libm/cexp.c +@@ -0,0 +1,63 @@ ++/* ++ * Copyright (c) 2011 William Pitcock ++ * ++ * Permission to use, copy, modify, and/or distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ * ++ * 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. ++ */ ++ ++#include ++#include ++#include ++ ++__complex__ double cexp(__complex__ double z) ++{ ++ __complex__ double ret; ++ double r_exponent = exp(__real__ z); ++ ++ __real__ ret = r_exponent * cos(__imag__ z); ++ __imag__ ret = r_exponent * sin(__imag__ z); ++ ++ return ret; ++} ++libm_hidden_def(cexp) ++ ++libm_hidden_proto(cexpf) ++__complex__ float cexpf(__complex__ float z) ++{ ++ __complex__ float ret; ++ double r_exponent = exp(__real__ z); ++ ++ __real__ ret = r_exponent * cosf(__imag__ z); ++ __imag__ ret = r_exponent * sinf(__imag__ z); ++ ++ return ret; ++} ++libm_hidden_def(cexpf) ++ ++#if defined __UCLIBC_HAS_LONG_DOUBLE_MATH__ && !defined __NO_LONG_DOUBLE_MATH ++libm_hidden_proto(cexpl) ++__complex__ long double cexpl(__complex__ long double z) ++{ ++ __complex__ long double ret; ++ long double r_exponent = expl(__real__ z); ++ ++ __real__ ret = r_exponent * cosl(__imag__ z); ++ __imag__ ret = r_exponent * sinl(__imag__ z); ++ ++ return ret; ++} ++libm_hidden_def(cexpl) ++#endif +-- +1.7.8 + diff --git a/main/libc0.9.32/0016-libubacktrace-use-.so.-ABI_VERSION.patch b/main/libc0.9.32/0016-libubacktrace-use-.so.-ABI_VERSION.patch new file mode 100644 index 0000000000..bf43e927a9 --- /dev/null +++ b/main/libc0.9.32/0016-libubacktrace-use-.so.-ABI_VERSION.patch @@ -0,0 +1,29 @@ +From 5ca71ddc69ebb3696b63d260e15341653ddef4c0 Mon Sep 17 00:00:00 2001 +From: Bernhard Reutner-Fischer +Date: Fri, 18 Nov 2011 08:49:25 +0100 +Subject: [PATCH] libubacktrace: use .so.$(ABI_VERSION) + +Thanks to William Pitcock for noticing + +Signed-off-by: Bernhard Reutner-Fischer +(cherry picked from commit 69cba61dd27f2a9c4c34f596ed9d1b7cd0441f74) +--- + Rules.mak | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/Rules.mak b/Rules.mak +index fe06c24..96074e5 100644 +--- a/Rules.mak ++++ b/Rules.mak +@@ -118,7 +118,7 @@ export MAJOR_VERSION MINOR_VERSION SUBLEVEL VERSION ABI_VERSION LC_ALL + + LIBC := libc + SHARED_LIBNAME := $(LIBC).so.$(ABI_VERSION) +-UBACKTRACE_DSO := libubacktrace.so.$(MAJOR_VERSION) ++UBACKTRACE_DSO := libubacktrace.so.$(ABI_VERSION) + ifneq ($(findstring $(TARGET_ARCH) , hppa64 ia64 mips64 powerpc64 s390x sparc64 x86_64 ),) + UCLIBC_LDSO_NAME := ld64-uClibc + ARCH_NATIVE_BIT := 64 +-- +1.7.8 + diff --git a/main/libc0.9.32/0017-Fix-__libc_epoll_pwait-compile-failure-on-x86.patch b/main/libc0.9.32/0017-Fix-__libc_epoll_pwait-compile-failure-on-x86.patch new file mode 100644 index 0000000000..2377bccbd8 --- /dev/null +++ b/main/libc0.9.32/0017-Fix-__libc_epoll_pwait-compile-failure-on-x86.patch @@ -0,0 +1,44 @@ +From 08164f6a9e839918fa6bae05572916c2defabd94 Mon Sep 17 00:00:00 2001 +From: Phil Blundell +Date: Sat, 11 Jun 2011 01:10:46 -0400 +Subject: [PATCH] Fix __libc_epoll_pwait compile failure on x86 + +This prevents "memory input 7 is not directly addressable" errors. + +| libc/sysdeps/linux/common/epoll.c: In function '__libc_epoll_pwait': +| libc/sysdeps/linux/common/epoll.c:71:80: error: memory input 7 is not directly addressable +| libc/sysdeps/linux/common/epoll.c:75:86: error: memory input 7 is not directly addressable +| make: *** [libc/sysdeps/linux/common/epoll.o] Error 1 +| make: *** Waiting for unfinished jobs.... + +Signed-off-by: Phil Blundell +Signed-off-by: Jason Woodward +Signed-off-by: Khem Raj +(cherry picked from commit 8245f3b4638fdff2011c2657af1bb211def704bc) +--- + libc/sysdeps/linux/common/epoll.c | 5 +++-- + 1 files changed, 3 insertions(+), 2 deletions(-) + +diff --git a/libc/sysdeps/linux/common/epoll.c b/libc/sysdeps/linux/common/epoll.c +index 85b0cfd..ab3e73b 100644 +--- a/libc/sysdeps/linux/common/epoll.c ++++ b/libc/sysdeps/linux/common/epoll.c +@@ -67,12 +67,13 @@ extern __typeof(epoll_pwait) __libc_epoll_pwait; + int __libc_epoll_pwait(int epfd, struct epoll_event *events, int maxevents, + int timeout, const sigset_t *set) + { ++ int nsig = _NSIG / 8; + if (SINGLE_THREAD_P) +- return INLINE_SYSCALL(epoll_pwait, 6, epfd, events, maxevents, timeout, set, _NSIG / 8); ++ return INLINE_SYSCALL(epoll_pwait, 6, epfd, events, maxevents, timeout, set, nsig); + # ifdef __UCLIBC_HAS_THREADS_NATIVE__ + else { + int oldtype = LIBC_CANCEL_ASYNC (); +- int result = INLINE_SYSCALL(epoll_pwait, 6, epfd, events, maxevents, timeout, set, _NSIG / 8); ++ int result = INLINE_SYSCALL(epoll_pwait, 6, epfd, events, maxevents, timeout, set, nsig); + LIBC_CANCEL_RESET (oldtype); + return result; + } +-- +1.7.8 + diff --git a/main/libc0.9.32/0018-libcrypt-do-not-cast-away-const-of-key-salt.patch b/main/libc0.9.32/0018-libcrypt-do-not-cast-away-const-of-key-salt.patch new file mode 100644 index 0000000000..d79671739b --- /dev/null +++ b/main/libc0.9.32/0018-libcrypt-do-not-cast-away-const-of-key-salt.patch @@ -0,0 +1,34 @@ +From c6363f33f5af361fea483dd6a7e0f42278f913bf Mon Sep 17 00:00:00 2001 +From: Mike Frysinger +Date: Sun, 20 Nov 2011 02:34:49 -0500 +Subject: [PATCH] libcrypt: do not cast away const of key/salt + +Signed-off-by: Mike Frysinger +(cherry picked from commit 4a2b0641a3818ad14b886907368b6f6735615f6d) +--- + libcrypt/crypt.c | 7 +++++-- + 1 files changed, 5 insertions(+), 2 deletions(-) + +diff --git a/libcrypt/crypt.c b/libcrypt/crypt.c +index 8b361d3..89a2614 100644 +--- a/libcrypt/crypt.c ++++ b/libcrypt/crypt.c +@@ -12,10 +12,13 @@ + + char *crypt(const char *key, const char *salt) + { ++ const unsigned char *ukey = (const unsigned char *)key; ++ const unsigned char *usalt = (const unsigned char *)salt; ++ + /* First, check if we are supposed to be using the MD5 replacement + * instead of DES... */ + if (salt[0]=='$' && salt[1]=='1' && salt[2]=='$') +- return __md5_crypt((unsigned char*)key, (unsigned char*)salt); ++ return __md5_crypt(ukey, usalt); + else +- return __des_crypt((unsigned char*)key, (unsigned char*)salt); ++ return __des_crypt(ukey, usalt); + } +-- +1.7.8 + diff --git a/main/libc0.9.32/0019-libcrypt-make-crypt-itself-more-modular.patch b/main/libc0.9.32/0019-libcrypt-make-crypt-itself-more-modular.patch new file mode 100644 index 0000000000..9e8636f95a --- /dev/null +++ b/main/libc0.9.32/0019-libcrypt-make-crypt-itself-more-modular.patch @@ -0,0 +1,64 @@ +From 78f25c8abfc3358a46061772944d30027ceb8288 Mon Sep 17 00:00:00 2001 +From: William Pitcock +Date: Mon, 19 Dec 2011 01:21:33 -0600 +Subject: [PATCH] libcrypt: make crypt() itself more modular + +By using a function table, we can more cleanly support new crypt +implementations, such as SHA256 ($5$) and SHA512 ($6$). + +Signed-off-by: William Pitcock +Signed-off-by: Bernhard Reutner-Fischer +(cherry picked from commit 40c426ae8f032d794d15f4a7fca8dc17cdc9899d) +--- + libcrypt/crypt.c | 30 ++++++++++++++++++++++++------ + 1 files changed, 24 insertions(+), 6 deletions(-) + +diff --git a/libcrypt/crypt.c b/libcrypt/crypt.c +index 89a2614..33f98b6 100644 +--- a/libcrypt/crypt.c ++++ b/libcrypt/crypt.c +@@ -8,17 +8,35 @@ + #define __FORCE_GLIBC + #include + #include ++#include ++#include + #include "libcrypt.h" + ++typedef char *(*crypt_impl_f)(const unsigned char *pw, const unsigned char *salt); ++ ++static const struct { ++ const char *salt_pfx; ++ const crypt_impl_f crypt_impl; ++} crypt_impl_tab[] = { ++ { "$1$", __md5_crypt }, ++ { NULL, __des_crypt }, ++}; ++ + char *crypt(const char *key, const char *salt) + { + const unsigned char *ukey = (const unsigned char *)key; + const unsigned char *usalt = (const unsigned char *)salt; ++ size_t i; ++ ++ for (i = 0; i < ARRAY_SIZE(crypt_impl_tab); i++) { ++ if (crypt_impl_tab[i].salt_pfx != NULL && ++ strncmp(crypt_impl_tab[i].salt_pfx, salt, strlen(crypt_impl_tab[i].salt_pfx))) ++ continue; ++ ++ return crypt_impl_tab[i].crypt_impl(ukey, usalt); ++ } + +- /* First, check if we are supposed to be using the MD5 replacement +- * instead of DES... */ +- if (salt[0]=='$' && salt[1]=='1' && salt[2]=='$') +- return __md5_crypt(ukey, usalt); +- else +- return __des_crypt(ukey, usalt); ++ /* no crypt implementation was found, set errno to ENOSYS and return NULL */ ++ __set_errno(ENOSYS); ++ return NULL; + } +-- +1.7.8 + diff --git a/main/libc0.9.32/0020-libcrypt-add-support-for-SHA512-CRYPT-password-hashi.patch b/main/libc0.9.32/0020-libcrypt-add-support-for-SHA512-CRYPT-password-hashi.patch new file mode 100644 index 0000000000..cd67869775 --- /dev/null +++ b/main/libc0.9.32/0020-libcrypt-add-support-for-SHA512-CRYPT-password-hashi.patch @@ -0,0 +1,834 @@ +From 0b68c872deb676b0cb104bfb30a1f356072b5edf Mon Sep 17 00:00:00 2001 +From: William Pitcock +Date: Mon, 19 Dec 2011 01:24:16 -0600 +Subject: [PATCH] libcrypt: add support for SHA512-CRYPT password hashing + +This is based on Ulrich Drepper's implementation in GLIBC, but hacked up to work +in uClibc. The differences from the GLIBC version are as follows: + +- b64_from_24bit() has been converted into a macro +- Usage of GLIBC-isms (such as libc_freeres_ptr) have been removed + +It is enabled by the UCLIBC_HAS_SHA512_CRYPT_IMPL configuration symbol. You must +have UCLIBC_HAS_CRYPT_IMPL enabled as well. + +Signed-off-by: William Pitcock +Signed-off-by: Bernhard Reutner-Fischer +(cherry picked from commit 4c24dabb9cea4c8148d7a7efc7a1df694424c483) +--- + extra/Configs/Config.in | 7 + + libcrypt/Makefile.in | 1 + + libcrypt/crypt.c | 3 + + libcrypt/libcrypt.h | 3 + + libcrypt/sha512-crypt.c | 339 +++++++++++++++++++++++++++++++++++++++++++++++ + libcrypt/sha512.c | 326 +++++++++++++++++++++++++++++++++++++++++++++ + libcrypt/sha512.h | 58 ++++++++ + 7 files changed, 737 insertions(+), 0 deletions(-) + create mode 100644 libcrypt/sha512-crypt.c + create mode 100644 libcrypt/sha512.c + create mode 100644 libcrypt/sha512.h + +diff --git a/extra/Configs/Config.in b/extra/Configs/Config.in +index e41adc4..eec3ee9 100644 +--- a/extra/Configs/Config.in ++++ b/extra/Configs/Config.in +@@ -1137,6 +1137,13 @@ config UCLIBC_HAS_CRYPT_IMPL + help + libcrypt contains crypt(), setkey() and encrypt() + ++config UCLIBC_HAS_SHA512_CRYPT_IMPL ++ bool "libcrypt SHA512 support" ++ depends on UCLIBC_HAS_CRYPT_IMPL ++ help ++ This adds support for SHA512 password hashing via the crypt() function. ++ Say N here if you do not need SHA512 crypt support. ++ + config UCLIBC_HAS_CRYPT_STUB + bool "libcrypt stubs" + default y +diff --git a/libcrypt/Makefile.in b/libcrypt/Makefile.in +index 1d1fb55..2fceaed 100644 +--- a/libcrypt/Makefile.in ++++ b/libcrypt/Makefile.in +@@ -21,6 +21,7 @@ libcrypt_OUT := $(top_builddir)libcrypt + + libcrypt_SRC-y := + libcrypt_SRC-$(UCLIBC_HAS_CRYPT_IMPL) += crypt.c des.c md5.c ++libcrypt_SRC-$(UCLIBC_HAS_SHA512_CRYPT_IMPL) += sha512.c sha512-crypt.c + libcrypt_SRC-$(UCLIBC_HAS_CRYPT_STUB) += crypt_stub.c + + libcrypt_SRC := $(addprefix $(libcrypt_DIR)/,$(libcrypt_SRC-y)) +diff --git a/libcrypt/crypt.c b/libcrypt/crypt.c +index 33f98b6..b5bf9ee 100644 +--- a/libcrypt/crypt.c ++++ b/libcrypt/crypt.c +@@ -19,6 +19,9 @@ static const struct { + const crypt_impl_f crypt_impl; + } crypt_impl_tab[] = { + { "$1$", __md5_crypt }, ++#ifdef __UCLIBC_HAS_SHA512_CRYPT_IMPL__ ++ { "$6$", __sha512_crypt }, ++#endif + { NULL, __des_crypt }, + }; + +diff --git a/libcrypt/libcrypt.h b/libcrypt/libcrypt.h +index 1186620..fcad6ae 100644 +--- a/libcrypt/libcrypt.h ++++ b/libcrypt/libcrypt.h +@@ -9,8 +9,11 @@ + #define __LIBCRYPT_H__ + + extern char *__md5_crypt(const unsigned char *pw, const unsigned char *salt) attribute_hidden; ++extern char *__sha512_crypt(const unsigned char *pw, const unsigned char *salt) attribute_hidden; + extern char *__des_crypt(const unsigned char *pw, const unsigned char *salt) attribute_hidden; + ++extern char *__sha512_crypt_r (const char *key, const char *salt, char *buffer, int buflen) attribute_hidden; ++ + /* shut up gcc-4.x signed warnings */ + #define strcpy(dst,src) strcpy((char*)dst,(char*)src) + #define strlen(s) strlen((char*)s) +diff --git a/libcrypt/sha512-crypt.c b/libcrypt/sha512-crypt.c +new file mode 100644 +index 0000000..0321be0 +--- /dev/null ++++ b/libcrypt/sha512-crypt.c +@@ -0,0 +1,339 @@ ++/* One way encryption based on SHA512 sum. ++ Copyright (C) 2007, 2009 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper , 2007. ++ ++ 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, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "sha512.h" ++#include "libcrypt.h" ++ ++/* Define our magic string to mark salt for SHA512 "encryption" ++ replacement. */ ++static const char sha512_salt_prefix[] = "$6$"; ++ ++/* Prefix for optional rounds specification. */ ++static const char sha512_rounds_prefix[] = "rounds="; ++ ++/* Maximum salt string length. */ ++#define SALT_LEN_MAX 16 ++/* Default number of rounds if not explicitly specified. */ ++#define ROUNDS_DEFAULT 5000 ++/* Minimum number of rounds. */ ++#define ROUNDS_MIN 1000 ++/* Maximum number of rounds. */ ++#define ROUNDS_MAX 999999999 ++ ++/* Table with characters for base64 transformation. */ ++static const char b64t[64] = ++"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; ++ ++#define B64_FROM_24BIT(b2, b1, b0, steps) \ ++ { \ ++ int n = (steps); \ ++ unsigned int w = ((b2) << 16) | ((b1) << 8) | (b0); \ ++ while (n-- > 0 && buflen > 0) \ ++ { \ ++ *cp++ = b64t[w & 0x3f]; \ ++ --buflen; \ ++ w >>= 6; \ ++ } \ ++ } ++ ++char * ++__sha512_crypt_r (const char *key, ++ const char *salt, ++ char *buffer, ++ int buflen) ++{ ++ unsigned char alt_result[64] ++ __attribute__ ((__aligned__ (__alignof__ (uint64_t)))); ++ unsigned char temp_result[64] ++ __attribute__ ((__aligned__ (__alignof__ (uint64_t)))); ++ size_t salt_len; ++ size_t key_len; ++ size_t cnt; ++ char *cp; ++ char *copied_key = NULL; ++ char *copied_salt = NULL; ++ char *p_bytes; ++ char *s_bytes; ++ /* Default number of rounds. */ ++ size_t rounds = ROUNDS_DEFAULT; ++ bool rounds_custom = false; ++ ++ /* Find beginning of salt string. The prefix should normally always ++ be present. Just in case it is not. */ ++ if (strncmp (sha512_salt_prefix, salt, sizeof (sha512_salt_prefix) - 1) == 0) ++ /* Skip salt prefix. */ ++ salt += sizeof (sha512_salt_prefix) - 1; ++ ++ if (strncmp (salt, sha512_rounds_prefix, sizeof (sha512_rounds_prefix) - 1) ++ == 0) ++ { ++ const char *num = salt + sizeof (sha512_rounds_prefix) - 1; ++ char *endp; ++ unsigned long int srounds = strtoul (num, &endp, 10); ++ if (*endp == '$') ++ { ++ salt = endp + 1; ++ rounds = MAX (ROUNDS_MIN, MIN (srounds, ROUNDS_MAX)); ++ rounds_custom = true; ++ } ++ } ++ ++ salt_len = MIN (strcspn (salt, "$"), SALT_LEN_MAX); ++ key_len = strlen (key); ++ ++ if ((key - (char *) 0) % __alignof__ (uint64_t) != 0) ++ { ++ char *tmp = (char *) alloca (key_len + __alignof__ (uint64_t)); ++ key = copied_key = ++ memcpy (tmp + __alignof__ (uint64_t) ++ - (tmp - (char *) 0) % __alignof__ (uint64_t), ++ key, key_len); ++ assert ((key - (char *) 0) % __alignof__ (uint64_t) == 0); ++ } ++ ++ if ((salt - (char *) 0) % __alignof__ (uint64_t) != 0) ++ { ++ char *tmp = (char *) alloca (salt_len + __alignof__ (uint64_t)); ++ salt = copied_salt = ++ memcpy (tmp + __alignof__ (uint64_t) ++ - (tmp - (char *) 0) % __alignof__ (uint64_t), ++ salt, salt_len); ++ assert ((salt - (char *) 0) % __alignof__ (uint64_t) == 0); ++ } ++ ++ struct sha512_ctx ctx; ++ struct sha512_ctx alt_ctx; ++ ++ /* Prepare for the real work. */ ++ __sha512_init_ctx (&ctx); ++ ++ /* Add the key string. */ ++ __sha512_process_bytes (key, key_len, &ctx); ++ ++ /* The last part is the salt string. This must be at most 16 ++ characters and it ends at the first `$' character. */ ++ __sha512_process_bytes (salt, salt_len, &ctx); ++ ++ ++ /* Compute alternate SHA512 sum with input KEY, SALT, and KEY. The ++ final result will be added to the first context. */ ++ __sha512_init_ctx (&alt_ctx); ++ ++ /* Add key. */ ++ __sha512_process_bytes (key, key_len, &alt_ctx); ++ ++ /* Add salt. */ ++ __sha512_process_bytes (salt, salt_len, &alt_ctx); ++ ++ /* Add key again. */ ++ __sha512_process_bytes (key, key_len, &alt_ctx); ++ ++ /* Now get result of this (64 bytes) and add it to the other ++ context. */ ++ __sha512_finish_ctx (&alt_ctx, alt_result); ++ ++ /* Add for any character in the key one byte of the alternate sum. */ ++ for (cnt = key_len; cnt > 64; cnt -= 64) ++ __sha512_process_bytes (alt_result, 64, &ctx); ++ ++ __sha512_process_bytes (alt_result, cnt, &ctx); ++ ++ /* Take the binary representation of the length of the key and for every ++ 1 add the alternate sum, for every 0 the key. */ ++ for (cnt = key_len; cnt > 0; cnt >>= 1) ++ if ((cnt & 1) != 0) ++ __sha512_process_bytes (alt_result, 64, &ctx); ++ else ++ __sha512_process_bytes (key, key_len, &ctx); ++ ++ /* Create intermediate result. */ ++ __sha512_finish_ctx (&ctx, alt_result); ++ ++ /* Start computation of P byte sequence. */ ++ __sha512_init_ctx (&alt_ctx); ++ ++ /* For every character in the password add the entire password. */ ++ for (cnt = 0; cnt < key_len; ++cnt) ++ __sha512_process_bytes (key, key_len, &alt_ctx); ++ ++ /* Finish the digest. */ ++ __sha512_finish_ctx (&alt_ctx, temp_result); ++ ++ /* Create byte sequence P. */ ++ cp = p_bytes = alloca (key_len); ++ for (cnt = key_len; cnt >= 64; cnt -= 64) ++ cp = mempcpy (cp, temp_result, 64); ++ memcpy (cp, temp_result, cnt); ++ ++ /* Start computation of S byte sequence. */ ++ __sha512_init_ctx (&alt_ctx); ++ ++ /* For every character in the password add the entire password. */ ++ for (cnt = 0; cnt < 16 + alt_result[0]; ++cnt) ++ __sha512_process_bytes (salt, salt_len, &alt_ctx); ++ ++ /* Finish the digest. */ ++ __sha512_finish_ctx (&alt_ctx, temp_result); ++ ++ /* Create byte sequence S. */ ++ cp = s_bytes = alloca (salt_len); ++ for (cnt = salt_len; cnt >= 64; cnt -= 64) ++ cp = mempcpy (cp, temp_result, 64); ++ memcpy (cp, temp_result, cnt); ++ ++ /* Repeatedly run the collected hash value through SHA512 to burn ++ CPU cycles. */ ++ for (cnt = 0; cnt < rounds; ++cnt) ++ { ++ /* New context. */ ++ __sha512_init_ctx (&ctx); ++ ++ /* Add key or last result. */ ++ if ((cnt & 1) != 0) ++ __sha512_process_bytes (p_bytes, key_len, &ctx); ++ else ++ __sha512_process_bytes (alt_result, 64, &ctx); ++ ++ /* Add salt for numbers not divisible by 3. */ ++ if (cnt % 3 != 0) ++ __sha512_process_bytes (s_bytes, salt_len, &ctx); ++ ++ /* Add key for numbers not divisible by 7. */ ++ if (cnt % 7 != 0) ++ __sha512_process_bytes (p_bytes, key_len, &ctx); ++ ++ /* Add key or last result. */ ++ if ((cnt & 1) != 0) ++ __sha512_process_bytes (alt_result, 64, &ctx); ++ else ++ __sha512_process_bytes (p_bytes, key_len, &ctx); ++ ++ /* Create intermediate result. */ ++ __sha512_finish_ctx (&ctx, alt_result); ++ } ++ ++ /* Now we can construct the result string. It consists of three ++ parts. */ ++ cp = stpncpy (buffer, sha512_salt_prefix, MAX (0, buflen)); ++ buflen -= sizeof (sha512_salt_prefix) - 1; ++ ++ if (rounds_custom) ++ { ++ int n = snprintf (cp, MAX (0, buflen), "%s%zu$", ++ sha512_rounds_prefix, rounds); ++ cp += n; ++ buflen -= n; ++ } ++ ++ cp = stpncpy (cp, salt, MIN ((size_t) MAX (0, buflen), salt_len)); ++ buflen -= MIN ((size_t) MAX (0, buflen), salt_len); ++ ++ if (buflen > 0) ++ { ++ *cp++ = '$'; ++ --buflen; ++ } ++ ++ B64_FROM_24BIT (alt_result[0], alt_result[21], alt_result[42], 4); ++ B64_FROM_24BIT (alt_result[22], alt_result[43], alt_result[1], 4); ++ B64_FROM_24BIT (alt_result[44], alt_result[2], alt_result[23], 4); ++ B64_FROM_24BIT (alt_result[3], alt_result[24], alt_result[45], 4); ++ B64_FROM_24BIT (alt_result[25], alt_result[46], alt_result[4], 4); ++ B64_FROM_24BIT (alt_result[47], alt_result[5], alt_result[26], 4); ++ B64_FROM_24BIT (alt_result[6], alt_result[27], alt_result[48], 4); ++ B64_FROM_24BIT (alt_result[28], alt_result[49], alt_result[7], 4); ++ B64_FROM_24BIT (alt_result[50], alt_result[8], alt_result[29], 4); ++ B64_FROM_24BIT (alt_result[9], alt_result[30], alt_result[51], 4); ++ B64_FROM_24BIT (alt_result[31], alt_result[52], alt_result[10], 4); ++ B64_FROM_24BIT (alt_result[53], alt_result[11], alt_result[32], 4); ++ B64_FROM_24BIT (alt_result[12], alt_result[33], alt_result[54], 4); ++ B64_FROM_24BIT (alt_result[34], alt_result[55], alt_result[13], 4); ++ B64_FROM_24BIT (alt_result[56], alt_result[14], alt_result[35], 4); ++ B64_FROM_24BIT (alt_result[15], alt_result[36], alt_result[57], 4); ++ B64_FROM_24BIT (alt_result[37], alt_result[58], alt_result[16], 4); ++ B64_FROM_24BIT (alt_result[59], alt_result[17], alt_result[38], 4); ++ B64_FROM_24BIT (alt_result[18], alt_result[39], alt_result[60], 4); ++ B64_FROM_24BIT (alt_result[40], alt_result[61], alt_result[19], 4); ++ B64_FROM_24BIT (alt_result[62], alt_result[20], alt_result[41], 4); ++ B64_FROM_24BIT (0, 0, alt_result[63], 2); ++ ++ if (buflen <= 0) ++ { ++ __set_errno (ERANGE); ++ buffer = NULL; ++ } ++ else ++ *cp = '\0'; /* Terminate the string. */ ++ ++ /* Clear the buffer for the intermediate result so that people ++ attaching to processes or reading core dumps cannot get any ++ information. We do it in this way to clear correct_words[] ++ inside the SHA512 implementation as well. */ ++ __sha512_init_ctx (&ctx); ++ __sha512_finish_ctx (&ctx, alt_result); ++ memset (&ctx, '\0', sizeof (ctx)); ++ memset (&alt_ctx, '\0', sizeof (alt_ctx)); ++ ++ memset (temp_result, '\0', sizeof (temp_result)); ++ memset (p_bytes, '\0', key_len); ++ memset (s_bytes, '\0', salt_len); ++ if (copied_key != NULL) ++ memset (copied_key, '\0', key_len); ++ if (copied_salt != NULL) ++ memset (copied_salt, '\0', salt_len); ++ ++ return buffer; ++} ++ ++static char *buffer; ++ ++/* This entry point is equivalent to the `crypt' function in Unix ++ libcs. */ ++char * ++__sha512_crypt (const unsigned char *key, const unsigned char *salt) ++{ ++ /* We don't want to have an arbitrary limit in the size of the ++ password. We can compute an upper bound for the size of the ++ result in advance and so we can prepare the buffer we pass to ++ `sha512_crypt_r'. */ ++ static int buflen; ++ int needed = (sizeof (sha512_salt_prefix) - 1 ++ + sizeof (sha512_rounds_prefix) + 9 + 1 ++ + strlen (salt) + 1 + 86 + 1); ++ ++ if (buflen < needed) ++ { ++ char *new_buffer = (char *) realloc (buffer, needed); ++ if (new_buffer == NULL) ++ return NULL; ++ ++ buffer = new_buffer; ++ buflen = needed; ++ } ++ ++ return __sha512_crypt_r ((const char *) key, (const char *) salt, buffer, buflen); ++} +diff --git a/libcrypt/sha512.c b/libcrypt/sha512.c +new file mode 100644 +index 0000000..04e0a06 +--- /dev/null ++++ b/libcrypt/sha512.c +@@ -0,0 +1,326 @@ ++/* Functions to compute SHA512 message digest of files or memory blocks. ++ according to the definition of SHA512 in FIPS 180-2. ++ Copyright (C) 2007 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, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++/* Written by Ulrich Drepper , 2007. */ ++ ++#ifdef HAVE_CONFIG_H ++# include ++#endif ++ ++#include ++#include ++#include ++#include ++ ++#include "sha512.h" ++ ++#if __BYTE_ORDER == __LITTLE_ENDIAN ++# ifdef _LIBC ++# include ++# define SWAP(n) bswap_64 (n) ++# else ++# define SWAP(n) \ ++ (((n) << 56) \ ++ | (((n) & 0xff00) << 40) \ ++ | (((n) & 0xff0000) << 24) \ ++ | (((n) & 0xff000000) << 8) \ ++ | (((n) >> 8) & 0xff000000) \ ++ | (((n) >> 24) & 0xff0000) \ ++ | (((n) >> 40) & 0xff00) \ ++ | ((n) >> 56)) ++# endif ++#else ++# define SWAP(n) (n) ++#endif ++ ++ ++/* This array contains the bytes used to pad the buffer to the next ++ 64-byte boundary. (FIPS 180-2:5.1.2) */ ++static const unsigned char fillbuf[128] = { 0x80, 0 /* , 0, 0, ... */ }; ++ ++ ++/* Constants for SHA512 from FIPS 180-2:4.2.3. */ ++static const uint64_t K[80] = ++ { ++ UINT64_C (0x428a2f98d728ae22), UINT64_C (0x7137449123ef65cd), ++ UINT64_C (0xb5c0fbcfec4d3b2f), UINT64_C (0xe9b5dba58189dbbc), ++ UINT64_C (0x3956c25bf348b538), UINT64_C (0x59f111f1b605d019), ++ UINT64_C (0x923f82a4af194f9b), UINT64_C (0xab1c5ed5da6d8118), ++ UINT64_C (0xd807aa98a3030242), UINT64_C (0x12835b0145706fbe), ++ UINT64_C (0x243185be4ee4b28c), UINT64_C (0x550c7dc3d5ffb4e2), ++ UINT64_C (0x72be5d74f27b896f), UINT64_C (0x80deb1fe3b1696b1), ++ UINT64_C (0x9bdc06a725c71235), UINT64_C (0xc19bf174cf692694), ++ UINT64_C (0xe49b69c19ef14ad2), UINT64_C (0xefbe4786384f25e3), ++ UINT64_C (0x0fc19dc68b8cd5b5), UINT64_C (0x240ca1cc77ac9c65), ++ UINT64_C (0x2de92c6f592b0275), UINT64_C (0x4a7484aa6ea6e483), ++ UINT64_C (0x5cb0a9dcbd41fbd4), UINT64_C (0x76f988da831153b5), ++ UINT64_C (0x983e5152ee66dfab), UINT64_C (0xa831c66d2db43210), ++ UINT64_C (0xb00327c898fb213f), UINT64_C (0xbf597fc7beef0ee4), ++ UINT64_C (0xc6e00bf33da88fc2), UINT64_C (0xd5a79147930aa725), ++ UINT64_C (0x06ca6351e003826f), UINT64_C (0x142929670a0e6e70), ++ UINT64_C (0x27b70a8546d22ffc), UINT64_C (0x2e1b21385c26c926), ++ UINT64_C (0x4d2c6dfc5ac42aed), UINT64_C (0x53380d139d95b3df), ++ UINT64_C (0x650a73548baf63de), UINT64_C (0x766a0abb3c77b2a8), ++ UINT64_C (0x81c2c92e47edaee6), UINT64_C (0x92722c851482353b), ++ UINT64_C (0xa2bfe8a14cf10364), UINT64_C (0xa81a664bbc423001), ++ UINT64_C (0xc24b8b70d0f89791), UINT64_C (0xc76c51a30654be30), ++ UINT64_C (0xd192e819d6ef5218), UINT64_C (0xd69906245565a910), ++ UINT64_C (0xf40e35855771202a), UINT64_C (0x106aa07032bbd1b8), ++ UINT64_C (0x19a4c116b8d2d0c8), UINT64_C (0x1e376c085141ab53), ++ UINT64_C (0x2748774cdf8eeb99), UINT64_C (0x34b0bcb5e19b48a8), ++ UINT64_C (0x391c0cb3c5c95a63), UINT64_C (0x4ed8aa4ae3418acb), ++ UINT64_C (0x5b9cca4f7763e373), UINT64_C (0x682e6ff3d6b2b8a3), ++ UINT64_C (0x748f82ee5defb2fc), UINT64_C (0x78a5636f43172f60), ++ UINT64_C (0x84c87814a1f0ab72), UINT64_C (0x8cc702081a6439ec), ++ UINT64_C (0x90befffa23631e28), UINT64_C (0xa4506cebde82bde9), ++ UINT64_C (0xbef9a3f7b2c67915), UINT64_C (0xc67178f2e372532b), ++ UINT64_C (0xca273eceea26619c), UINT64_C (0xd186b8c721c0c207), ++ UINT64_C (0xeada7dd6cde0eb1e), UINT64_C (0xf57d4f7fee6ed178), ++ UINT64_C (0x06f067aa72176fba), UINT64_C (0x0a637dc5a2c898a6), ++ UINT64_C (0x113f9804bef90dae), UINT64_C (0x1b710b35131c471b), ++ UINT64_C (0x28db77f523047d84), UINT64_C (0x32caab7b40c72493), ++ UINT64_C (0x3c9ebe0a15c9bebc), UINT64_C (0x431d67c49c100d4c), ++ UINT64_C (0x4cc5d4becb3e42b6), UINT64_C (0x597f299cfc657e2a), ++ UINT64_C (0x5fcb6fab3ad6faec), UINT64_C (0x6c44198c4a475817) ++ }; ++ ++ ++/* Process LEN bytes of BUFFER, accumulating context into CTX. ++ It is assumed that LEN % 128 == 0. */ ++static void ++sha512_process_block (const void *buffer, size_t len, struct sha512_ctx *ctx) ++{ ++ const uint64_t *words = buffer; ++ size_t nwords = len / sizeof (uint64_t); ++ uint64_t a = ctx->H[0]; ++ uint64_t b = ctx->H[1]; ++ uint64_t c = ctx->H[2]; ++ uint64_t d = ctx->H[3]; ++ uint64_t e = ctx->H[4]; ++ uint64_t f = ctx->H[5]; ++ uint64_t g = ctx->H[6]; ++ uint64_t h = ctx->H[7]; ++ ++ /* First increment the byte count. FIPS 180-2 specifies the possible ++ length of the file up to 2^128 bits. Here we only compute the ++ number of bytes. Do a double word increment. */ ++ ctx->total[0] += len; ++ if (ctx->total[0] < len) ++ ++ctx->total[1]; ++ ++ /* Process all bytes in the buffer with 128 bytes in each round of ++ the loop. */ ++ while (nwords > 0) ++ { ++ uint64_t W[80]; ++ uint64_t a_save = a; ++ uint64_t b_save = b; ++ uint64_t c_save = c; ++ uint64_t d_save = d; ++ uint64_t e_save = e; ++ uint64_t f_save = f; ++ uint64_t g_save = g; ++ uint64_t h_save = h; ++ ++ /* Operators defined in FIPS 180-2:4.1.2. */ ++#define Ch(x, y, z) ((x & y) ^ (~x & z)) ++#define Maj(x, y, z) ((x & y) ^ (x & z) ^ (y & z)) ++#define S0(x) (CYCLIC (x, 28) ^ CYCLIC (x, 34) ^ CYCLIC (x, 39)) ++#define S1(x) (CYCLIC (x, 14) ^ CYCLIC (x, 18) ^ CYCLIC (x, 41)) ++#define R0(x) (CYCLIC (x, 1) ^ CYCLIC (x, 8) ^ (x >> 7)) ++#define R1(x) (CYCLIC (x, 19) ^ CYCLIC (x, 61) ^ (x >> 6)) ++ ++ /* It is unfortunate that C does not provide an operator for ++ cyclic rotation. Hope the C compiler is smart enough. */ ++#define CYCLIC(w, s) ((w >> s) | (w << (64 - s))) ++ ++ /* Compute the message schedule according to FIPS 180-2:6.3.2 step 2. */ ++ for (unsigned int t = 0; t < 16; ++t) ++ { ++ W[t] = SWAP (*words); ++ ++words; ++ } ++ for (unsigned int t = 16; t < 80; ++t) ++ W[t] = R1 (W[t - 2]) + W[t - 7] + R0 (W[t - 15]) + W[t - 16]; ++ ++ /* The actual computation according to FIPS 180-2:6.3.2 step 3. */ ++ for (unsigned int t = 0; t < 80; ++t) ++ { ++ uint64_t T1 = h + S1 (e) + Ch (e, f, g) + K[t] + W[t]; ++ uint64_t T2 = S0 (a) + Maj (a, b, c); ++ h = g; ++ g = f; ++ f = e; ++ e = d + T1; ++ d = c; ++ c = b; ++ b = a; ++ a = T1 + T2; ++ } ++ ++ /* Add the starting values of the context according to FIPS 180-2:6.3.2 ++ step 4. */ ++ a += a_save; ++ b += b_save; ++ c += c_save; ++ d += d_save; ++ e += e_save; ++ f += f_save; ++ g += g_save; ++ h += h_save; ++ ++ /* Prepare for the next round. */ ++ nwords -= 16; ++ } ++ ++ /* Put checksum in context given as argument. */ ++ ctx->H[0] = a; ++ ctx->H[1] = b; ++ ctx->H[2] = c; ++ ctx->H[3] = d; ++ ctx->H[4] = e; ++ ctx->H[5] = f; ++ ctx->H[6] = g; ++ ctx->H[7] = h; ++} ++ ++ ++/* Initialize structure containing state of computation. ++ (FIPS 180-2:5.3.3) */ ++void ++__sha512_init_ctx (struct sha512_ctx *ctx) ++{ ++ ctx->H[0] = UINT64_C (0x6a09e667f3bcc908); ++ ctx->H[1] = UINT64_C (0xbb67ae8584caa73b); ++ ctx->H[2] = UINT64_C (0x3c6ef372fe94f82b); ++ ctx->H[3] = UINT64_C (0xa54ff53a5f1d36f1); ++ ctx->H[4] = UINT64_C (0x510e527fade682d1); ++ ctx->H[5] = UINT64_C (0x9b05688c2b3e6c1f); ++ ctx->H[6] = UINT64_C (0x1f83d9abfb41bd6b); ++ ctx->H[7] = UINT64_C (0x5be0cd19137e2179); ++ ++ ctx->total[0] = ctx->total[1] = 0; ++ ctx->buflen = 0; ++} ++ ++ ++/* Process the remaining bytes in the internal buffer and the usual ++ prolog according to the standard and write the result to RESBUF. ++ ++ IMPORTANT: On some systems it is required that RESBUF is correctly ++ aligned for a 32 bits value. */ ++void * ++__sha512_finish_ctx (struct sha512_ctx *ctx, void *resbuf) ++{ ++ /* Take yet unprocessed bytes into account. */ ++ uint64_t bytes = ctx->buflen; ++ size_t pad; ++ ++ /* Now count remaining bytes. */ ++ ctx->total[0] += bytes; ++ if (ctx->total[0] < bytes) ++ ++ctx->total[1]; ++ ++ pad = bytes >= 112 ? 128 + 112 - bytes : 112 - bytes; ++ memcpy (&ctx->buffer[bytes], fillbuf, pad); ++ ++ /* Put the 128-bit file length in *bits* at the end of the buffer. */ ++ *(uint64_t *) &ctx->buffer[bytes + pad + 8] = SWAP (ctx->total[0] << 3); ++ *(uint64_t *) &ctx->buffer[bytes + pad] = SWAP ((ctx->total[1] << 3) | ++ (ctx->total[0] >> 61)); ++ ++ /* Process last bytes. */ ++ sha512_process_block (ctx->buffer, bytes + pad + 16, ctx); ++ ++ /* Put result from CTX in first 64 bytes following RESBUF. */ ++ for (unsigned int i = 0; i < 8; ++i) ++ ((uint64_t *) resbuf)[i] = SWAP (ctx->H[i]); ++ ++ return resbuf; ++} ++ ++ ++void ++__sha512_process_bytes (const void *buffer, size_t len, struct sha512_ctx *ctx) ++{ ++ /* When we already have some bits in our internal buffer concatenate ++ both inputs first. */ ++ if (ctx->buflen != 0) ++ { ++ size_t left_over = ctx->buflen; ++ size_t add = 256 - left_over > len ? len : 256 - left_over; ++ ++ memcpy (&ctx->buffer[left_over], buffer, add); ++ ctx->buflen += add; ++ ++ if (ctx->buflen > 128) ++ { ++ sha512_process_block (ctx->buffer, ctx->buflen & ~127, ctx); ++ ++ ctx->buflen &= 127; ++ /* The regions in the following copy operation cannot overlap. */ ++ memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~127], ++ ctx->buflen); ++ } ++ ++ buffer = (const char *) buffer + add; ++ len -= add; ++ } ++ ++ /* Process available complete blocks. */ ++ if (len >= 128) ++ { ++#if __GNUC__ >= 2 ++# define UNALIGNED_P(p) (((uintptr_t) p) % __alignof__ (uint64_t) != 0) ++#else ++# define UNALIGNED_P(p) (((uintptr_t) p) % sizeof (uint64_t) != 0) ++#endif ++ if (UNALIGNED_P (buffer)) ++ while (len > 128) ++ { ++ sha512_process_block (memcpy (ctx->buffer, buffer, 128), 128, ++ ctx); ++ buffer = (const char *) buffer + 128; ++ len -= 128; ++ } ++ else ++ { ++ sha512_process_block (buffer, len & ~127, ctx); ++ buffer = (const char *) buffer + (len & ~127); ++ len &= 127; ++ } ++ } ++ ++ /* Move remaining bytes into internal buffer. */ ++ if (len > 0) ++ { ++ size_t left_over = ctx->buflen; ++ ++ memcpy (&ctx->buffer[left_over], buffer, len); ++ left_over += len; ++ if (left_over >= 128) ++ { ++ sha512_process_block (ctx->buffer, 128, ctx); ++ left_over -= 128; ++ memcpy (ctx->buffer, &ctx->buffer[128], left_over); ++ } ++ ctx->buflen = left_over; ++ } ++} +diff --git a/libcrypt/sha512.h b/libcrypt/sha512.h +new file mode 100644 +index 0000000..5777827 +--- /dev/null ++++ b/libcrypt/sha512.h +@@ -0,0 +1,58 @@ ++/* Declaration of functions and data types used for SHA512 sum computing ++ library functions. ++ Copyright (C) 2007 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, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#ifndef _SHA512_H ++#define _SHA512_H 1 ++ ++#include ++#include ++#include ++ ++ ++/* Structure to save state of computation between the single steps. */ ++struct sha512_ctx ++{ ++ uint64_t H[8]; ++ ++ uint64_t total[2]; ++ uint64_t buflen; ++ char buffer[256] __attribute__ ((__aligned__ (__alignof__ (uint64_t)))); ++}; ++ ++/* Initialize structure containing state of computation. ++ (FIPS 180-2: 5.3.3) */ ++extern void __sha512_init_ctx (struct sha512_ctx *ctx) attribute_hidden; ++ ++/* Starting with the result of former calls of this function (or the ++ initialization function update the context for the next LEN bytes ++ starting at BUFFER. ++ It is NOT required that LEN is a multiple of 128. */ ++extern void __sha512_process_bytes (const void *buffer, size_t len, ++ struct sha512_ctx *ctx) attribute_hidden; ++ ++/* Process the remaining bytes in the buffer and put result from CTX ++ in first 64 bytes following RESBUF. ++ ++ IMPORTANT: On some systems it is required that RESBUF is correctly ++ aligned for a 64 bits value. */ ++extern void *__sha512_finish_ctx (struct sha512_ctx *ctx, void *resbuf) ++ attribute_hidden; ++ ++#endif /* sha512.h */ +-- +1.7.8 + diff --git a/main/libc0.9.32/0021-libcrypt-add-support-for-SHA256-CRYPT-password-hashi.patch b/main/libc0.9.32/0021-libcrypt-add-support-for-SHA256-CRYPT-password-hashi.patch new file mode 100644 index 0000000000..b49e6da810 --- /dev/null +++ b/main/libc0.9.32/0021-libcrypt-add-support-for-SHA256-CRYPT-password-hashi.patch @@ -0,0 +1,789 @@ +From 243a437f9345fd7182bb4b2f60d892cc86794e8d Mon Sep 17 00:00:00 2001 +From: William Pitcock +Date: Mon, 19 Dec 2011 01:25:09 -0600 +Subject: [PATCH] libcrypt: add support for SHA256-CRYPT password hashing + +This is based on Ulrich Drepper's implementation in GLIBC, but hacked up to work +in uClibc. The differences from the GLIBC version are as follows: + +- b64_from_24bit() has been converted into a macro +- Usage of GLIBC-isms (such as libc_freeres_ptr) have been removed + +It is enabled by the UCLIBC_HAS_SHA256_CRYPT_IMPL configuration symbol. You must +have UCLIBC_HAS_CRYPT_IMPL enabled as well. + +Signed-off-by: William Pitcock +Signed-off-by: Bernhard Reutner-Fischer +(cherry picked from commit 3ac5fd7ecaeb6721d812c2b93e446bf9a31acdde) +--- + extra/Configs/Config.in | 7 + + libcrypt/Makefile.in | 1 + + libcrypt/crypt.c | 3 + + libcrypt/libcrypt.h | 2 + + libcrypt/sha256-crypt.c | 326 +++++++++++++++++++++++++++++++++++++++++++++++ + libcrypt/sha256.c | 294 ++++++++++++++++++++++++++++++++++++++++++ + libcrypt/sha256.h | 58 +++++++++ + 7 files changed, 691 insertions(+), 0 deletions(-) + create mode 100644 libcrypt/sha256-crypt.c + create mode 100644 libcrypt/sha256.c + create mode 100644 libcrypt/sha256.h + +diff --git a/extra/Configs/Config.in b/extra/Configs/Config.in +index eec3ee9..66e4efb 100644 +--- a/extra/Configs/Config.in ++++ b/extra/Configs/Config.in +@@ -1137,6 +1137,13 @@ config UCLIBC_HAS_CRYPT_IMPL + help + libcrypt contains crypt(), setkey() and encrypt() + ++config UCLIBC_HAS_SHA256_CRYPT_IMPL ++ bool "libcrypt SHA256 support" ++ depends on UCLIBC_HAS_CRYPT_IMPL ++ help ++ This adds support for SHA256 password hashing via the crypt() function. ++ Say N here if you do not need SHA256 crypt support. ++ + config UCLIBC_HAS_SHA512_CRYPT_IMPL + bool "libcrypt SHA512 support" + depends on UCLIBC_HAS_CRYPT_IMPL +diff --git a/libcrypt/Makefile.in b/libcrypt/Makefile.in +index 2fceaed..94753f4 100644 +--- a/libcrypt/Makefile.in ++++ b/libcrypt/Makefile.in +@@ -21,6 +21,7 @@ libcrypt_OUT := $(top_builddir)libcrypt + + libcrypt_SRC-y := + libcrypt_SRC-$(UCLIBC_HAS_CRYPT_IMPL) += crypt.c des.c md5.c ++libcrypt_SRC-$(UCLIBC_HAS_SHA256_CRYPT_IMPL) += sha256.c sha256-crypt.c + libcrypt_SRC-$(UCLIBC_HAS_SHA512_CRYPT_IMPL) += sha512.c sha512-crypt.c + libcrypt_SRC-$(UCLIBC_HAS_CRYPT_STUB) += crypt_stub.c + +diff --git a/libcrypt/crypt.c b/libcrypt/crypt.c +index b5bf9ee..188a6a0 100644 +--- a/libcrypt/crypt.c ++++ b/libcrypt/crypt.c +@@ -19,6 +19,9 @@ static const struct { + const crypt_impl_f crypt_impl; + } crypt_impl_tab[] = { + { "$1$", __md5_crypt }, ++#ifdef __UCLIBC_HAS_SHA256_CRYPT_IMPL__ ++ { "$5$", __sha256_crypt }, ++#endif + #ifdef __UCLIBC_HAS_SHA512_CRYPT_IMPL__ + { "$6$", __sha512_crypt }, + #endif +diff --git a/libcrypt/libcrypt.h b/libcrypt/libcrypt.h +index fcad6ae..67733d1 100644 +--- a/libcrypt/libcrypt.h ++++ b/libcrypt/libcrypt.h +@@ -9,9 +9,11 @@ + #define __LIBCRYPT_H__ + + extern char *__md5_crypt(const unsigned char *pw, const unsigned char *salt) attribute_hidden; ++extern char *__sha256_crypt(const unsigned char *pw, const unsigned char *salt) attribute_hidden; + extern char *__sha512_crypt(const unsigned char *pw, const unsigned char *salt) attribute_hidden; + extern char *__des_crypt(const unsigned char *pw, const unsigned char *salt) attribute_hidden; + ++extern char *__sha256_crypt_r (const char *key, const char *salt, char *buffer, int buflen) attribute_hidden; + extern char *__sha512_crypt_r (const char *key, const char *salt, char *buffer, int buflen) attribute_hidden; + + /* shut up gcc-4.x signed warnings */ +diff --git a/libcrypt/sha256-crypt.c b/libcrypt/sha256-crypt.c +new file mode 100644 +index 0000000..4422148 +--- /dev/null ++++ b/libcrypt/sha256-crypt.c +@@ -0,0 +1,326 @@ ++/* One way encryption based on SHA256 sum. ++ Copyright (C) 2007, 2009 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper , 2007. ++ ++ 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, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "sha256.h" ++#include "libcrypt.h" ++ ++/* Define our magic string to mark salt for SHA256 "encryption" ++ replacement. */ ++static const char sha256_salt_prefix[] = "$5$"; ++ ++/* Prefix for optional rounds specification. */ ++static const char sha256_rounds_prefix[] = "rounds="; ++ ++/* Maximum salt string length. */ ++#define SALT_LEN_MAX 16 ++/* Default number of rounds if not explicitly specified. */ ++#define ROUNDS_DEFAULT 5000 ++/* Minimum number of rounds. */ ++#define ROUNDS_MIN 1000 ++/* Maximum number of rounds. */ ++#define ROUNDS_MAX 999999999 ++ ++/* Table with characters for base64 transformation. */ ++static const char b64t[64] = ++"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; ++ ++#define B64_FROM_24BIT(b2, b1, b0, steps) \ ++ { \ ++ int n = (steps); \ ++ unsigned int w = ((b2) << 16) | ((b1) << 8) | (b0); \ ++ while (n-- > 0 && buflen > 0) \ ++ { \ ++ *cp++ = b64t[w & 0x3f]; \ ++ --buflen; \ ++ w >>= 6; \ ++ } \ ++ } ++ ++char * ++__sha256_crypt_r (const char *key, ++ const char *salt, ++ char *buffer, ++ int buflen) ++{ ++ unsigned char alt_result[32] ++ __attribute__ ((__aligned__ (__alignof__ (uint32_t)))); ++ unsigned char temp_result[32] ++ __attribute__ ((__aligned__ (__alignof__ (uint32_t)))); ++ size_t salt_len; ++ size_t key_len; ++ size_t cnt; ++ char *cp; ++ char *copied_key = NULL; ++ char *copied_salt = NULL; ++ char *p_bytes; ++ char *s_bytes; ++ /* Default number of rounds. */ ++ size_t rounds = ROUNDS_DEFAULT; ++ bool rounds_custom = false; ++ ++ /* Find beginning of salt string. The prefix should normally always ++ be present. Just in case it is not. */ ++ if (strncmp (sha256_salt_prefix, salt, sizeof (sha256_salt_prefix) - 1) == 0) ++ /* Skip salt prefix. */ ++ salt += sizeof (sha256_salt_prefix) - 1; ++ ++ if (strncmp (salt, sha256_rounds_prefix, sizeof (sha256_rounds_prefix) - 1) ++ == 0) ++ { ++ const char *num = salt + sizeof (sha256_rounds_prefix) - 1; ++ char *endp; ++ unsigned long int srounds = strtoul (num, &endp, 10); ++ if (*endp == '$') ++ { ++ salt = endp + 1; ++ rounds = MAX (ROUNDS_MIN, MIN (srounds, ROUNDS_MAX)); ++ rounds_custom = true; ++ } ++ } ++ ++ salt_len = MIN (strcspn (salt, "$"), SALT_LEN_MAX); ++ key_len = strlen (key); ++ ++ if ((key - (char *) 0) % __alignof__ (uint32_t) != 0) ++ { ++ char *tmp = (char *) alloca (key_len + __alignof__ (uint32_t)); ++ key = copied_key = ++ memcpy (tmp + __alignof__ (uint32_t) ++ - (tmp - (char *) 0) % __alignof__ (uint32_t), ++ key, key_len); ++ assert ((key - (char *) 0) % __alignof__ (uint32_t) == 0); ++ } ++ ++ if ((salt - (char *) 0) % __alignof__ (uint32_t) != 0) ++ { ++ char *tmp = (char *) alloca (salt_len + __alignof__ (uint32_t)); ++ salt = copied_salt = ++ memcpy (tmp + __alignof__ (uint32_t) ++ - (tmp - (char *) 0) % __alignof__ (uint32_t), ++ salt, salt_len); ++ assert ((salt - (char *) 0) % __alignof__ (uint32_t) == 0); ++ } ++ ++ struct sha256_ctx ctx; ++ struct sha256_ctx alt_ctx; ++ ++ /* Prepare for the real work. */ ++ __sha256_init_ctx (&ctx); ++ ++ /* Add the key string. */ ++ __sha256_process_bytes (key, key_len, &ctx); ++ ++ /* The last part is the salt string. This must be at most 16 ++ characters and it ends at the first `$' character. */ ++ __sha256_process_bytes (salt, salt_len, &ctx); ++ ++ ++ /* Compute alternate SHA256 sum with input KEY, SALT, and KEY. The ++ final result will be added to the first context. */ ++ __sha256_init_ctx (&alt_ctx); ++ ++ /* Add key. */ ++ __sha256_process_bytes (key, key_len, &alt_ctx); ++ ++ /* Add salt. */ ++ __sha256_process_bytes (salt, salt_len, &alt_ctx); ++ ++ /* Add key again. */ ++ __sha256_process_bytes (key, key_len, &alt_ctx); ++ ++ /* Now get result of this (32 bytes) and add it to the other ++ context. */ ++ __sha256_finish_ctx (&alt_ctx, alt_result); ++ ++ /* Add for any character in the key one byte of the alternate sum. */ ++ for (cnt = key_len; cnt > 32; cnt -= 32) ++ __sha256_process_bytes (alt_result, 32, &ctx); ++ __sha256_process_bytes (alt_result, cnt, &ctx); ++ ++ /* Take the binary representation of the length of the key and for every ++ 1 add the alternate sum, for every 0 the key. */ ++ for (cnt = key_len; cnt > 0; cnt >>= 1) ++ if ((cnt & 1) != 0) ++ __sha256_process_bytes (alt_result, 32, &ctx); ++ else ++ __sha256_process_bytes (key, key_len, &ctx); ++ ++ /* Create intermediate result. */ ++ __sha256_finish_ctx (&ctx, alt_result); ++ ++ /* Start computation of P byte sequence. */ ++ __sha256_init_ctx (&alt_ctx); ++ ++ /* For every character in the password add the entire password. */ ++ for (cnt = 0; cnt < key_len; ++cnt) ++ __sha256_process_bytes (key, key_len, &alt_ctx); ++ ++ /* Finish the digest. */ ++ __sha256_finish_ctx (&alt_ctx, temp_result); ++ ++ /* Create byte sequence P. */ ++ cp = p_bytes = alloca (key_len); ++ for (cnt = key_len; cnt >= 32; cnt -= 32) ++ cp = mempcpy (cp, temp_result, 32); ++ memcpy (cp, temp_result, cnt); ++ ++ /* Start computation of S byte sequence. */ ++ __sha256_init_ctx (&alt_ctx); ++ ++ /* For every character in the password add the entire password. */ ++ for (cnt = 0; cnt < 16 + alt_result[0]; ++cnt) ++ __sha256_process_bytes (salt, salt_len, &alt_ctx); ++ ++ /* Finish the digest. */ ++ __sha256_finish_ctx (&alt_ctx, temp_result); ++ ++ /* Create byte sequence S. */ ++ cp = s_bytes = alloca (salt_len); ++ for (cnt = salt_len; cnt >= 32; cnt -= 32) ++ cp = mempcpy (cp, temp_result, 32); ++ memcpy (cp, temp_result, cnt); ++ ++ /* Repeatedly run the collected hash value through SHA256 to burn ++ CPU cycles. */ ++ for (cnt = 0; cnt < rounds; ++cnt) ++ { ++ /* New context. */ ++ __sha256_init_ctx (&ctx); ++ ++ /* Add key or last result. */ ++ if ((cnt & 1) != 0) ++ __sha256_process_bytes (p_bytes, key_len, &ctx); ++ else ++ __sha256_process_bytes (alt_result, 32, &ctx); ++ ++ /* Add salt for numbers not divisible by 3. */ ++ if (cnt % 3 != 0) ++ __sha256_process_bytes (s_bytes, salt_len, &ctx); ++ ++ /* Add key for numbers not divisible by 7. */ ++ if (cnt % 7 != 0) ++ __sha256_process_bytes (p_bytes, key_len, &ctx); ++ ++ /* Add key or last result. */ ++ if ((cnt & 1) != 0) ++ __sha256_process_bytes (alt_result, 32, &ctx); ++ else ++ __sha256_process_bytes (p_bytes, key_len, &ctx); ++ ++ /* Create intermediate result. */ ++ __sha256_finish_ctx (&ctx, alt_result); ++ } ++ ++ /* Now we can construct the result string. It consists of three ++ parts. */ ++ cp = stpncpy (buffer, sha256_salt_prefix, MAX (0, buflen)); ++ buflen -= sizeof (sha256_salt_prefix) - 1; ++ ++ if (rounds_custom) ++ { ++ int n = snprintf (cp, MAX (0, buflen), "%s%zu$", ++ sha256_rounds_prefix, rounds); ++ cp += n; ++ buflen -= n; ++ } ++ ++ cp = stpncpy (cp, salt, MIN ((size_t) MAX (0, buflen), salt_len)); ++ buflen -= MIN ((size_t) MAX (0, buflen), salt_len); ++ ++ if (buflen > 0) ++ { ++ *cp++ = '$'; ++ --buflen; ++ } ++ ++ B64_FROM_24BIT (alt_result[0], alt_result[10], alt_result[20], 4); ++ B64_FROM_24BIT (alt_result[21], alt_result[1], alt_result[11], 4); ++ B64_FROM_24BIT (alt_result[12], alt_result[22], alt_result[2], 4); ++ B64_FROM_24BIT (alt_result[3], alt_result[13], alt_result[23], 4); ++ B64_FROM_24BIT (alt_result[24], alt_result[4], alt_result[14], 4); ++ B64_FROM_24BIT (alt_result[15], alt_result[25], alt_result[5], 4); ++ B64_FROM_24BIT (alt_result[6], alt_result[16], alt_result[26], 4); ++ B64_FROM_24BIT (alt_result[27], alt_result[7], alt_result[17], 4); ++ B64_FROM_24BIT (alt_result[18], alt_result[28], alt_result[8], 4); ++ B64_FROM_24BIT (alt_result[9], alt_result[19], alt_result[29], 4); ++ B64_FROM_24BIT (0, alt_result[31], alt_result[30], 3); ++ if (buflen <= 0) ++ { ++ __set_errno (ERANGE); ++ buffer = NULL; ++ } ++ else ++ *cp = '\0'; /* Terminate the string. */ ++ ++ /* Clear the buffer for the intermediate result so that people ++ attaching to processes or reading core dumps cannot get any ++ information. We do it in this way to clear correct_words[] ++ inside the SHA256 implementation as well. */ ++ __sha256_init_ctx (&ctx); ++ __sha256_finish_ctx (&ctx, alt_result); ++ memset (&ctx, '\0', sizeof (ctx)); ++ memset (&alt_ctx, '\0', sizeof (alt_ctx)); ++ ++ memset (temp_result, '\0', sizeof (temp_result)); ++ memset (p_bytes, '\0', key_len); ++ memset (s_bytes, '\0', salt_len); ++ if (copied_key != NULL) ++ memset (copied_key, '\0', key_len); ++ if (copied_salt != NULL) ++ memset (copied_salt, '\0', salt_len); ++ ++ return buffer; ++} ++ ++static char *buffer; ++ ++/* This entry point is equivalent to the `crypt' function in Unix ++ libcs. */ ++char * ++__sha256_crypt (const unsigned char *key, const unsigned char *salt) ++{ ++ /* We don't want to have an arbitrary limit in the size of the ++ password. We can compute an upper bound for the size of the ++ result in advance and so we can prepare the buffer we pass to ++ `sha256_crypt_r'. */ ++ static int buflen; ++ int needed = (sizeof (sha256_salt_prefix) - 1 ++ + sizeof (sha256_rounds_prefix) + 9 + 1 ++ + strlen (salt) + 1 + 43 + 1); ++ ++ if (buflen < needed) ++ { ++ char *new_buffer = (char *) realloc (buffer, needed); ++ if (new_buffer == NULL) ++ return NULL; ++ ++ buffer = new_buffer; ++ buflen = needed; ++ } ++ ++ return __sha256_crypt_r ((const char *) key, (const char *) salt, buffer, buflen); ++} +diff --git a/libcrypt/sha256.c b/libcrypt/sha256.c +new file mode 100644 +index 0000000..e652a67 +--- /dev/null ++++ b/libcrypt/sha256.c +@@ -0,0 +1,294 @@ ++/* Functions to compute SHA256 message digest of files or memory blocks. ++ according to the definition of SHA256 in FIPS 180-2. ++ Copyright (C) 2007 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, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++/* Written by Ulrich Drepper , 2007. */ ++ ++#ifdef HAVE_CONFIG_H ++# include ++#endif ++ ++#include ++#include ++#include ++#include ++ ++#include "sha256.h" ++ ++#if __BYTE_ORDER == __LITTLE_ENDIAN ++# ifdef _LIBC ++# include ++# define SWAP(n) bswap_32 (n) ++# else ++# define SWAP(n) \ ++ (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) ++# endif ++#else ++# define SWAP(n) (n) ++#endif ++ ++ ++/* This array contains the bytes used to pad the buffer to the next ++ 64-byte boundary. (FIPS 180-2:5.1.1) */ ++static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ }; ++ ++ ++/* Constants for SHA256 from FIPS 180-2:4.2.2. */ ++static const uint32_t K[64] = ++ { ++ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, ++ 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, ++ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, ++ 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, ++ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, ++ 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, ++ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, ++ 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, ++ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, ++ 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, ++ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, ++ 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, ++ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, ++ 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, ++ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, ++ 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 ++ }; ++ ++ ++/* Process LEN bytes of BUFFER, accumulating context into CTX. ++ It is assumed that LEN % 64 == 0. */ ++static void ++sha256_process_block (const void *buffer, size_t len, struct sha256_ctx *ctx) ++{ ++ const uint32_t *words = buffer; ++ size_t nwords = len / sizeof (uint32_t); ++ uint32_t a = ctx->H[0]; ++ uint32_t b = ctx->H[1]; ++ uint32_t c = ctx->H[2]; ++ uint32_t d = ctx->H[3]; ++ uint32_t e = ctx->H[4]; ++ uint32_t f = ctx->H[5]; ++ uint32_t g = ctx->H[6]; ++ uint32_t h = ctx->H[7]; ++ ++ /* First increment the byte count. FIPS 180-2 specifies the possible ++ length of the file up to 2^64 bits. Here we only compute the ++ number of bytes. Do a double word increment. */ ++ ctx->total[0] += len; ++ if (ctx->total[0] < len) ++ ++ctx->total[1]; ++ ++ /* Process all bytes in the buffer with 64 bytes in each round of ++ the loop. */ ++ while (nwords > 0) ++ { ++ uint32_t W[64]; ++ uint32_t a_save = a; ++ uint32_t b_save = b; ++ uint32_t c_save = c; ++ uint32_t d_save = d; ++ uint32_t e_save = e; ++ uint32_t f_save = f; ++ uint32_t g_save = g; ++ uint32_t h_save = h; ++ ++ /* Operators defined in FIPS 180-2:4.1.2. */ ++#define Ch(x, y, z) ((x & y) ^ (~x & z)) ++#define Maj(x, y, z) ((x & y) ^ (x & z) ^ (y & z)) ++#define S0(x) (CYCLIC (x, 2) ^ CYCLIC (x, 13) ^ CYCLIC (x, 22)) ++#define S1(x) (CYCLIC (x, 6) ^ CYCLIC (x, 11) ^ CYCLIC (x, 25)) ++#define R0(x) (CYCLIC (x, 7) ^ CYCLIC (x, 18) ^ (x >> 3)) ++#define R1(x) (CYCLIC (x, 17) ^ CYCLIC (x, 19) ^ (x >> 10)) ++ ++ /* It is unfortunate that C does not provide an operator for ++ cyclic rotation. Hope the C compiler is smart enough. */ ++#define CYCLIC(w, s) ((w >> s) | (w << (32 - s))) ++ ++ /* Compute the message schedule according to FIPS 180-2:6.2.2 step 2. */ ++ for (unsigned int t = 0; t < 16; ++t) ++ { ++ W[t] = SWAP (*words); ++ ++words; ++ } ++ for (unsigned int t = 16; t < 64; ++t) ++ W[t] = R1 (W[t - 2]) + W[t - 7] + R0 (W[t - 15]) + W[t - 16]; ++ ++ /* The actual computation according to FIPS 180-2:6.2.2 step 3. */ ++ for (unsigned int t = 0; t < 64; ++t) ++ { ++ uint32_t T1 = h + S1 (e) + Ch (e, f, g) + K[t] + W[t]; ++ uint32_t T2 = S0 (a) + Maj (a, b, c); ++ h = g; ++ g = f; ++ f = e; ++ e = d + T1; ++ d = c; ++ c = b; ++ b = a; ++ a = T1 + T2; ++ } ++ ++ /* Add the starting values of the context according to FIPS 180-2:6.2.2 ++ step 4. */ ++ a += a_save; ++ b += b_save; ++ c += c_save; ++ d += d_save; ++ e += e_save; ++ f += f_save; ++ g += g_save; ++ h += h_save; ++ ++ /* Prepare for the next round. */ ++ nwords -= 16; ++ } ++ ++ /* Put checksum in context given as argument. */ ++ ctx->H[0] = a; ++ ctx->H[1] = b; ++ ctx->H[2] = c; ++ ctx->H[3] = d; ++ ctx->H[4] = e; ++ ctx->H[5] = f; ++ ctx->H[6] = g; ++ ctx->H[7] = h; ++} ++ ++ ++/* Initialize structure containing state of computation. ++ (FIPS 180-2:5.3.2) */ ++void ++__sha256_init_ctx (struct sha256_ctx *ctx) ++{ ++ ctx->H[0] = 0x6a09e667; ++ ctx->H[1] = 0xbb67ae85; ++ ctx->H[2] = 0x3c6ef372; ++ ctx->H[3] = 0xa54ff53a; ++ ctx->H[4] = 0x510e527f; ++ ctx->H[5] = 0x9b05688c; ++ ctx->H[6] = 0x1f83d9ab; ++ ctx->H[7] = 0x5be0cd19; ++ ++ ctx->total[0] = ctx->total[1] = 0; ++ ctx->buflen = 0; ++} ++ ++ ++/* Process the remaining bytes in the internal buffer and the usual ++ prolog according to the standard and write the result to RESBUF. ++ ++ IMPORTANT: On some systems it is required that RESBUF is correctly ++ aligned for a 32 bits value. */ ++void * ++__sha256_finish_ctx (struct sha256_ctx *ctx, void *resbuf) ++{ ++ /* Take yet unprocessed bytes into account. */ ++ uint32_t bytes = ctx->buflen; ++ size_t pad; ++ ++ /* Now count remaining bytes. */ ++ ctx->total[0] += bytes; ++ if (ctx->total[0] < bytes) ++ ++ctx->total[1]; ++ ++ pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes; ++ memcpy (&ctx->buffer[bytes], fillbuf, pad); ++ ++ /* Put the 64-bit file length in *bits* at the end of the buffer. */ ++ *(uint32_t *) &ctx->buffer[bytes + pad + 4] = SWAP (ctx->total[0] << 3); ++ *(uint32_t *) &ctx->buffer[bytes + pad] = SWAP ((ctx->total[1] << 3) | ++ (ctx->total[0] >> 29)); ++ ++ /* Process last bytes. */ ++ sha256_process_block (ctx->buffer, bytes + pad + 8, ctx); ++ ++ /* Put result from CTX in first 32 bytes following RESBUF. */ ++ for (unsigned int i = 0; i < 8; ++i) ++ ((uint32_t *) resbuf)[i] = SWAP (ctx->H[i]); ++ ++ return resbuf; ++} ++ ++ ++void ++__sha256_process_bytes (const void *buffer, size_t len, struct sha256_ctx *ctx) ++{ ++ /* When we already have some bits in our internal buffer concatenate ++ both inputs first. */ ++ if (ctx->buflen != 0) ++ { ++ size_t left_over = ctx->buflen; ++ size_t add = 128 - left_over > len ? len : 128 - left_over; ++ ++ memcpy (&ctx->buffer[left_over], buffer, add); ++ ctx->buflen += add; ++ ++ if (ctx->buflen > 64) ++ { ++ sha256_process_block (ctx->buffer, ctx->buflen & ~63, ctx); ++ ++ ctx->buflen &= 63; ++ /* The regions in the following copy operation cannot overlap. */ ++ memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63], ++ ctx->buflen); ++ } ++ ++ buffer = (const char *) buffer + add; ++ len -= add; ++ } ++ ++ /* Process available complete blocks. */ ++ if (len >= 64) ++ { ++#if __GNUC__ >= 2 ++# define UNALIGNED_P(p) (((uintptr_t) p) % __alignof__ (uint32_t) != 0) ++#else ++# define UNALIGNED_P(p) (((uintptr_t) p) % sizeof (uint32_t) != 0) ++#endif ++ if (UNALIGNED_P (buffer)) ++ while (len > 64) ++ { ++ sha256_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx); ++ buffer = (const char *) buffer + 64; ++ len -= 64; ++ } ++ else ++ { ++ sha256_process_block (buffer, len & ~63, ctx); ++ buffer = (const char *) buffer + (len & ~63); ++ len &= 63; ++ } ++ } ++ ++ /* Move remaining bytes into internal buffer. */ ++ if (len > 0) ++ { ++ size_t left_over = ctx->buflen; ++ ++ memcpy (&ctx->buffer[left_over], buffer, len); ++ left_over += len; ++ if (left_over >= 64) ++ { ++ sha256_process_block (ctx->buffer, 64, ctx); ++ left_over -= 64; ++ memcpy (ctx->buffer, &ctx->buffer[64], left_over); ++ } ++ ctx->buflen = left_over; ++ } ++} +diff --git a/libcrypt/sha256.h b/libcrypt/sha256.h +new file mode 100644 +index 0000000..291674f +--- /dev/null ++++ b/libcrypt/sha256.h +@@ -0,0 +1,58 @@ ++/* Declaration of functions and data types used for SHA256 sum computing ++ library functions. ++ Copyright (C) 2007 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, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#ifndef _SHA256_H ++#define _SHA256_H 1 ++ ++#include ++#include ++#include ++ ++ ++/* Structure to save state of computation between the single steps. */ ++struct sha256_ctx ++{ ++ uint32_t H[8]; ++ ++ uint32_t total[2]; ++ uint32_t buflen; ++ char buffer[128] __attribute__ ((__aligned__ (__alignof__ (uint32_t)))); ++}; ++ ++/* Initialize structure containing state of computation. ++ (FIPS 180-2: 5.3.2) */ ++extern void __sha256_init_ctx (struct sha256_ctx *ctx) attribute_hidden; ++ ++/* Starting with the result of former calls of this function (or the ++ initialization function update the context for the next LEN bytes ++ starting at BUFFER. ++ It is NOT required that LEN is a multiple of 64. */ ++extern void __sha256_process_bytes (const void *buffer, size_t len, ++ struct sha256_ctx *ctx) attribute_hidden; ++ ++/* Process the remaining bytes in the buffer and put result from CTX ++ in first 32 bytes following RESBUF. ++ ++ IMPORTANT: On some systems it is required that RESBUF is correctly ++ aligned for a 32 bits value. */ ++extern void *__sha256_finish_ctx (struct sha256_ctx *ctx, void *resbuf) ++ attribute_hidden; ++ ++#endif /* sha256.h */ +-- +1.7.8 + diff --git a/main/libc0.9.32/0022-Add-eventfd-support.patch b/main/libc0.9.32/0022-Add-eventfd-support.patch new file mode 100644 index 0000000000..d42da01206 --- /dev/null +++ b/main/libc0.9.32/0022-Add-eventfd-support.patch @@ -0,0 +1,118 @@ +From 000e9aca3ee3f07c934a154fd375c5f3c7f9cc80 Mon Sep 17 00:00:00 2001 +From: Jean-Christian de Rivaz +Date: Mon, 24 Oct 2011 19:07:43 +0200 +Subject: [PATCH] Add eventfd support. + +Hello, + +I whould like to share this simple patch that add the eventfd call to +uClibc. Please review so it can be accepted to be merged. + +Jean-Christian + +Signed-off-by: Jean-Christian de Rivaz +Signed-off-by: Carmelo Amoroso +(cherry picked from commit 9ed163dc0eaebe8734c35b356c406e9eb1c68d76) +--- + libc/sysdeps/linux/common/Makefile.in | 3 +- + libc/sysdeps/linux/common/eventfd.c | 18 +++++++++++ + libc/sysdeps/linux/common/sys/eventfd.h | 48 +++++++++++++++++++++++++++++++ + 3 files changed, 68 insertions(+), 1 deletions(-) + create mode 100644 libc/sysdeps/linux/common/eventfd.c + create mode 100644 libc/sysdeps/linux/common/sys/eventfd.h + +diff --git a/libc/sysdeps/linux/common/Makefile.in b/libc/sysdeps/linux/common/Makefile.in +index 8f936ff..63f3f6f 100644 +--- a/libc/sysdeps/linux/common/Makefile.in ++++ b/libc/sysdeps/linux/common/Makefile.in +@@ -24,7 +24,8 @@ CSRC-$(UCLIBC_LINUX_SPECIFIC) += capget.c capset.c inotify.c ioperm.c iopl.c \ + remap_file_pages.c sched_getaffinity.c sched_setaffinity.c \ + sendfile64.c sendfile.c setfsgid.c setfsuid.c setresuid.c \ + splice.c vmsplice.c tee.c signalfd.c swapoff.c swapon.c \ +- sync_file_range.c sysctl.c sysinfo.c timerfd.c uselib.c vhangup.c ++ sync_file_range.c sysctl.c sysinfo.c eventfd.c timerfd.c uselib.c \ ++ vhangup.c + # NPTL needs these internally: madvise.c + CSRC-$(findstring y,$(UCLIBC_LINUX_SPECIFIC)$(UCLIBC_HAS_THREADS_NATIVE)) += madvise.c + ifeq ($(UCLIBC_HAS_THREADS_NATIVE),y) +diff --git a/libc/sysdeps/linux/common/eventfd.c b/libc/sysdeps/linux/common/eventfd.c +new file mode 100644 +index 0000000..cc3f3f0 +--- /dev/null ++++ b/libc/sysdeps/linux/common/eventfd.c +@@ -0,0 +1,18 @@ ++/* vi: set sw=4 ts=4: */ ++/* ++ * eventfd() for uClibc ++ * ++ * Copyright (C) 2011 Jean-Christian de Rivaz ++ * ++ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. ++ */ ++ ++#include ++#include ++ ++/* ++ * eventfd() ++ */ ++#ifdef __NR_eventfd ++_syscall2(int, eventfd, int, count, int, flags) ++#endif +diff --git a/libc/sysdeps/linux/common/sys/eventfd.h b/libc/sysdeps/linux/common/sys/eventfd.h +new file mode 100644 +index 0000000..311f803 +--- /dev/null ++++ b/libc/sysdeps/linux/common/sys/eventfd.h +@@ -0,0 +1,48 @@ ++/* Copyright (C) 2007, 2008, 2009 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, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#ifndef _SYS_EVENTFD_H ++#define _SYS_EVENTFD_H 1 ++ ++#include ++ ++ ++/* Type for event counter. */ ++typedef uint64_t eventfd_t; ++ ++/* Flags for signalfd. */ ++enum ++ { ++ EFD_SEMAPHORE = 1, ++#define EFD_SEMAPHORE EFD_SEMAPHORE ++ EFD_CLOEXEC = 02000000, ++#define EFD_CLOEXEC EFD_CLOEXEC ++ EFD_NONBLOCK = 04000 ++#define EFD_NONBLOCK EFD_NONBLOCK ++ }; ++ ++ ++__BEGIN_DECLS ++ ++/* Return file descriptor for generic event channel. Set initial ++ value to COUNT. */ ++extern int eventfd (int __count, int __flags) __THROW; ++ ++__END_DECLS ++ ++#endif /* sys/eventfd.h */ +-- +1.7.8 + diff --git a/main/libc0.9.32/0023-crypt-build-fix.-define-ARRAY_SIZE-macro.patch b/main/libc0.9.32/0023-crypt-build-fix.-define-ARRAY_SIZE-macro.patch new file mode 100644 index 0000000000..623f93a6b1 --- /dev/null +++ b/main/libc0.9.32/0023-crypt-build-fix.-define-ARRAY_SIZE-macro.patch @@ -0,0 +1,26 @@ +From b7300840e0285239351e33fa613898fbb079efd7 Mon Sep 17 00:00:00 2001 +From: Natanael Copa +Date: Fri, 23 Dec 2011 16:24:52 +0100 +Subject: [PATCH] crypt: build fix. define ARRAY_SIZE macro + +Signed-off-by: Natanael Copa +--- + libcrypt/crypt.c | 2 ++ + 1 files changed, 2 insertions(+), 0 deletions(-) + +diff --git a/libcrypt/crypt.c b/libcrypt/crypt.c +index 188a6a0..19f14d9 100644 +--- a/libcrypt/crypt.c ++++ b/libcrypt/crypt.c +@@ -12,6 +12,8 @@ + #include + #include "libcrypt.h" + ++#define ARRAY_SIZE(v) (sizeof(v) / sizeof((v)[0])) ++ + typedef char *(*crypt_impl_f)(const unsigned char *pw, const unsigned char *salt); + + static const struct { +-- +1.7.8 + diff --git a/main/libc0.9.32/APKBUILD b/main/libc0.9.32/APKBUILD index 019712353b..6c6185ec70 100644 --- a/main/libc0.9.32/APKBUILD +++ b/main/libc0.9.32/APKBUILD @@ -4,7 +4,7 @@ pkgname=libc$_abiver _gitver= pkgver=0.9.32 _ver=${pkgver/_/-} -pkgrel=14 +pkgrel=15 pkgdesc="C library for developing embedded Linux systems" url=http://uclibc.org license="LGPL-2" @@ -19,31 +19,41 @@ triggers="uclibc-utils.trigger=/lib:/usr/lib" _snapurl="http://git.uclibc.org/uClibc/snapshot/master.tar.bz2" _snapfile="$pkgname-$pkgver.tar.bz2" + +# patches are tracked in http://git.alpinelinux.org/cgit/uClibc-alpine/ +# branch 0.9.32-alpine + source="http://uclibc.org/downloads/uClibc-${_ver}.tar.bz2 - compat-stack-guard.patch - uclibc-resolv-cname-fix.diff - uclibc-resolv-fix-memory-leak.patch - 0001-resolv-fix-resolver-to-return-TRY_AGAIN-on-timeout.patch - 0001-libm-x86_64-implement-some-fenv-functions.patch - 0001-ldso-limited-support-for-ORIGIN-in-rpath.patch - 0002-stdlib-fix-arc4random-return-type-to-u_int32_t.patch - 0003-ldso-support-RTLD_NOLOAD.patch - 0001-libdl-rudimentary-locking-for-dlopen-dlsym-dlclose.patch - 0001-malloc-standard-synchronize-on-fork.patch - 0001-time-fix-parsing-of-tzdata-files-where-off_t-is-64-b.patch - 0001-getaddrinfo-allow-numeric-service-without-any-hints.patch - 0001-libc-x86-fix-stack-unwinding-and-backtrace-informati.patch - libm-cabsf.patch - libm-cexp.patch - uclibc-ubacktrace-asneeded-fix.patch - uclibc-epoll_pwait-hack.patch + +0001-Compatible-stack-protector-for-non-Thread-Local-stor.patch +0002-resolv-res_query-for-CNAMEs.patch +0003-resolv-fix-memory-leak.patch +0004-resolv-fix-resolver-to-return-TRY_AGAIN-on-timeout.patch +0005-libm-x86_64-implement-some-fenv-functions.patch +0006-ldso-limited-support-for-ORIGIN-in-rpath.patch +0007-stdlib-fix-arc4random-return-type-to-u_int32_t.patch +0008-ldso-support-RTLD_NOLOAD.patch +0009-libdl-rudimentary-locking-for-dlopen-dlsym-dlclose.patch +0010-malloc-standard-synchronize-on-fork.patch +0011-time-fix-parsing-of-tzdata-files-where-off_t-is-64-b.patch +0012-getaddrinfo-allow-numeric-service-without-any-hints.patch +0013-libc-x86-fix-stack-unwinding-and-backtrace-informati.patch +0014-libm-add-cabsf-and-cabsl-functions.patch +0015-libm-implement-generic-cexp-cexpf-and-cexpl.patch +0016-libubacktrace-use-.so.-ABI_VERSION.patch +0017-Fix-__libc_epoll_pwait-compile-failure-on-x86.patch +0018-libcrypt-do-not-cast-away-const-of-key-salt.patch +0019-libcrypt-make-crypt-itself-more-modular.patch +0020-libcrypt-add-support-for-SHA512-CRYPT-password-hashi.patch +0021-libcrypt-add-support-for-SHA256-CRYPT-password-hashi.patch +0022-Add-eventfd-support.patch +0023-crypt-build-fix.-define-ARRAY_SIZE-macro.patch + uclibcconfig.x86 uclibcconfig.x86_64 uclibcconfig.i486 uclibcconfig.arm uclibcconfig.powerpc - sha512-crypt.patch - uclibc-eventfd.patch uclibc-utils.trigger " @@ -132,28 +142,32 @@ libthread_db() { } md5sums="cfcb6c25d8ebe12817499d8749ee8ae1 uClibc-0.9.32.tar.bz2 -a9bfb77ea7dc5fb9abf4d4b19201c614 compat-stack-guard.patch -5d6e3e382b66f59cfd7242a4fe453f98 uclibc-resolv-cname-fix.diff -6bdb884bd00b053247e02b4024d33b39 uclibc-resolv-fix-memory-leak.patch -08f31006426a0fca561f262f36bcfb01 0001-resolv-fix-resolver-to-return-TRY_AGAIN-on-timeout.patch -68913d6f096fd647e8bdb7ef182c05a4 0001-libm-x86_64-implement-some-fenv-functions.patch -bc164e262c5feab55c800780704fa71c 0001-ldso-limited-support-for-ORIGIN-in-rpath.patch -b4fb68ad3d0e8331b1b40c30eb21dfdc 0002-stdlib-fix-arc4random-return-type-to-u_int32_t.patch -6147efd2eee5af5e734896823c2d1a3d 0003-ldso-support-RTLD_NOLOAD.patch -3e151ae3d3613dff9296d166aca3a800 0001-libdl-rudimentary-locking-for-dlopen-dlsym-dlclose.patch -30f27fe51fdc4d121166ad2af18dfb8d 0001-malloc-standard-synchronize-on-fork.patch -2548d9f470c9a5b2c117ec3d6f35c105 0001-time-fix-parsing-of-tzdata-files-where-off_t-is-64-b.patch -9e1ffc8dae55f4489c770f284734804f 0001-getaddrinfo-allow-numeric-service-without-any-hints.patch -e814d39ab0adab58d69396ac0b9acdea 0001-libc-x86-fix-stack-unwinding-and-backtrace-informati.patch -40e9c7f017cc81ee5b19ead000b9b6b7 libm-cabsf.patch -42416385763f7cd50775ed9bfaf2d59e libm-cexp.patch -7c47e9cb284b0da8df6ed2096b2c9c66 uclibc-ubacktrace-asneeded-fix.patch -0ed588014227935fbb83b207282f3c15 uclibc-epoll_pwait-hack.patch +11c206cd4be86514dd9abd811429ad06 0001-Compatible-stack-protector-for-non-Thread-Local-stor.patch +b905f5f0f27348cc91019275dcff51cb 0002-resolv-res_query-for-CNAMEs.patch +208f6ea0a97f2940319456d32549bfc5 0003-resolv-fix-memory-leak.patch +0f082e4b209bb83feb57a4a7dd8c2eb6 0004-resolv-fix-resolver-to-return-TRY_AGAIN-on-timeout.patch +8573d00e91395779c50af23c6aeb6fc5 0005-libm-x86_64-implement-some-fenv-functions.patch +31da620ecb3894fa6d76ef624cd264bb 0006-ldso-limited-support-for-ORIGIN-in-rpath.patch +afafe88bca1ffc1d4eb49de813c39c5b 0007-stdlib-fix-arc4random-return-type-to-u_int32_t.patch +779dbc9f04ad0c005ec4ea6b6ffff8ff 0008-ldso-support-RTLD_NOLOAD.patch +f0fc6dbeb1467812085b60a49654a955 0009-libdl-rudimentary-locking-for-dlopen-dlsym-dlclose.patch +a1c5871c3b799cce8d1dfcf8ca0f3743 0010-malloc-standard-synchronize-on-fork.patch +b2c09cdfc3116c6236dbe96697241a59 0011-time-fix-parsing-of-tzdata-files-where-off_t-is-64-b.patch +ddd3073f1a2696c1a9b40bfa81bfa5bf 0012-getaddrinfo-allow-numeric-service-without-any-hints.patch +78cdafafc99007da8cbdf8d2f841ea47 0013-libc-x86-fix-stack-unwinding-and-backtrace-informati.patch +63af22efb20d9dfd3cb10bc9900f1615 0014-libm-add-cabsf-and-cabsl-functions.patch +7158d0ae15ca742cc1577b47735751df 0015-libm-implement-generic-cexp-cexpf-and-cexpl.patch +ecca599d286ff18afa7f64ab614e88ff 0016-libubacktrace-use-.so.-ABI_VERSION.patch +430b286df16f21cc4b46b6f1894cd834 0017-Fix-__libc_epoll_pwait-compile-failure-on-x86.patch +57562e6688dcbcf708d574de81debf7e 0018-libcrypt-do-not-cast-away-const-of-key-salt.patch +028d8279da6c44457a8a8de4e1e6de36 0019-libcrypt-make-crypt-itself-more-modular.patch +ebf59b00af0a0c44a5992403255a6582 0020-libcrypt-add-support-for-SHA512-CRYPT-password-hashi.patch +2744db828eb9a0e8a1e01b2ca9d083a5 0021-libcrypt-add-support-for-SHA256-CRYPT-password-hashi.patch +e5bb17073c83dcdb972bf22657ca4cc7 0022-Add-eventfd-support.patch +efafd82e78291171392d4706b80a2fb3 0023-crypt-build-fix.-define-ARRAY_SIZE-macro.patch 0e40006f3c284a27313e0d54f91452e2 uclibcconfig.x86 f6aee6bcbc43dcbfcaaba7be244ad368 uclibcconfig.x86_64 0e40006f3c284a27313e0d54f91452e2 uclibcconfig.i486 8ae78c9ab4bd7b1223c29c335c76a8c5 uclibcconfig.arm 70fcde1955810a2369c023b293bae5c5 uclibcconfig.powerpc -436bf7bea962b477bb93119514c90c9b sha512-crypt.patch -26dd7611fda4d29f3dc4a7cf24916931 uclibc-eventfd.patch f3be4f2bc54d7561d252937e10abf0d2 uclibc-utils.trigger" diff --git a/main/libc0.9.32/compat-stack-guard.patch b/main/libc0.9.32/compat-stack-guard.patch deleted file mode 100644 index c69a9c5350..0000000000 --- a/main/libc0.9.32/compat-stack-guard.patch +++ /dev/null @@ -1,55 +0,0 @@ -diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c -index 2857f7e..dce6fd8 100644 ---- a/ldso/ldso/ldso.c -+++ b/ldso/ldso/ldso.c -@@ -103,11 +103,7 @@ extern void _start(void); - #ifdef __UCLIBC_HAS_SSP__ - # include - static uintptr_t stack_chk_guard; --# ifndef THREAD_SET_STACK_GUARD --/* Only exported for architectures that don't store the stack guard canary -- * in local thread area. */ - uintptr_t __stack_chk_guard attribute_relro; --# endif - # ifdef __UCLIBC_HAS_SSP_COMPAT__ - uintptr_t __guard attribute_relro; - # endif -@@ -953,9 +949,8 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, - stack_chk_guard = _dl_setup_stack_chk_guard (); - # ifdef THREAD_SET_STACK_GUARD - THREAD_SET_STACK_GUARD (stack_chk_guard); --# else -- __stack_chk_guard = stack_chk_guard; - # endif -+ __stack_chk_guard = stack_chk_guard; - # ifdef __UCLIBC_HAS_SSP_COMPAT__ - __guard = stack_chk_guard; - # endif -diff --git a/libc/misc/internals/__uClibc_main.c b/libc/misc/internals/__uClibc_main.c -index 315365a..78cd058 100644 ---- a/libc/misc/internals/__uClibc_main.c -+++ b/libc/misc/internals/__uClibc_main.c -@@ -46,12 +46,7 @@ void *__libc_stack_end = NULL; - # ifdef __UCLIBC_HAS_SSP__ - # include - static uintptr_t stack_chk_guard; --# ifndef THREAD_SET_STACK_GUARD --/* Only exported for architectures that don't store the stack guard canary -- * in thread local area. */ --/* for gcc-4.1 non-TLS */ - uintptr_t __stack_chk_guard attribute_relro; --# endif - /* for gcc-3.x + Etoh ssp */ - # ifdef __UCLIBC_HAS_SSP_COMPAT__ - uintptr_t __guard attribute_relro; -@@ -247,9 +242,8 @@ void __uClibc_init(void) - stack_chk_guard = _dl_setup_stack_chk_guard(); - # ifdef THREAD_SET_STACK_GUARD - THREAD_SET_STACK_GUARD (stack_chk_guard); --# else -- __stack_chk_guard = stack_chk_guard; - # endif -+ __stack_chk_guard = stack_chk_guard; - # ifdef __UCLIBC_HAS_SSP_COMPAT__ - __guard = stack_chk_guard; - # endif diff --git a/main/libc0.9.32/libm-cabsf.patch b/main/libc0.9.32/libm-cabsf.patch deleted file mode 100644 index 5ffa11455e..0000000000 --- a/main/libc0.9.32/libm-cabsf.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 0c71b7626655c1023c5e10ebb3b1a294f8e41353 Mon Sep 17 00:00:00 2001 -From: William Pitcock -Date: Tue, 1 Nov 2011 18:55:25 -0500 -Subject: [PATCH 2/2] libm: add cabsf() and cabsl() functions. - -Signed-off-by: William Pitcock ---- - libm/w_cabs.c | 16 ++++++++++++++++ - 1 files changed, 16 insertions(+), 0 deletions(-) - -diff --git a/libm/w_cabs.c b/libm/w_cabs.c -index 4044f4b..b259248 100644 ---- a/libm/w_cabs.c -+++ b/libm/w_cabs.c -@@ -13,3 +13,19 @@ double cabs(double _Complex z) - return hypot(__real__ z, __imag__ z); - } - libm_hidden_def(cabs) -+ -+libm_hidden_proto(cabsf) -+float cabsf(float _Complex z) -+{ -+ return (float) hypot(__real__ z, __imag__ z); -+} -+libm_hidden_def(cabsf) -+ -+#if defined __UCLIBC_HAS_LONG_DOUBLE_MATH__ && !defined __NO_LONG_DOUBLE_MATH -+libm_hidden_proto(cabsl) -+long double cabsl(long double _Complex z) -+{ -+ return hypotl(__real__ z, __imag__ z); -+} -+libm_hidden_def(cabsl) -+#endif --- -1.7.7.1 - diff --git a/main/libc0.9.32/libm-cexp.patch b/main/libc0.9.32/libm-cexp.patch deleted file mode 100644 index 82f914fa95..0000000000 --- a/main/libc0.9.32/libm-cexp.patch +++ /dev/null @@ -1,101 +0,0 @@ -From 8733cd43293bfa04b4334db7873c4de613f5cf75 Mon Sep 17 00:00:00 2001 -From: William Pitcock -Date: Tue, 1 Nov 2011 18:41:30 -0500 -Subject: [PATCH 1/2] libm: implement generic cexp(), cexpf() and cexpl(). - -The cexp*() family of functions is defined by the C99 math standard as -implementing exponential functions for complex types. - -Signed-off-by: William Pitcock ---- - libm/Makefile.in | 3 +- - libm/cexp.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 65 insertions(+), 1 deletions(-) - create mode 100644 libm/cexp.c - -diff --git a/libm/Makefile.in b/libm/Makefile.in -index f0aaa2a..af949e8 100644 ---- a/libm/Makefile.in -+++ b/libm/Makefile.in -@@ -72,7 +72,8 @@ libm_CSRC := \ - s_fpclassify.c s_fpclassifyf.c s_signbit.c s_signbitf.c \ - s_isnan.c s_isnanf.c s_isinf.c s_isinff.c s_finitef.c \ - s_fdim.c s_fma.c s_fmax.c s_fmin.c \ -- s_remquo.c w_exp2.c -+ s_remquo.c w_exp2.c \ -+ cexp.c - - # Not implemented [yet?], see comment in float_wrappers.c: - # fdimf.o fmaf.o fmaxf.o fminf.o -diff --git a/libm/cexp.c b/libm/cexp.c -new file mode 100644 -index 0000000..87512b7 ---- /dev/null -+++ b/libm/cexp.c -@@ -0,0 +1,63 @@ -+/* -+ * Copyright (c) 2011 William Pitcock -+ * -+ * Permission to use, copy, modify, and/or distribute this software for any -+ * purpose with or without fee is hereby granted, provided that the above -+ * copyright notice and this permission notice appear in all copies. -+ * -+ * 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. -+ */ -+ -+#include -+#include -+#include -+ -+__complex__ double cexp(__complex__ double z) -+{ -+ __complex__ double ret; -+ double r_exponent = exp(__real__ z); -+ -+ __real__ ret = r_exponent * cos(__imag__ z); -+ __imag__ ret = r_exponent * sin(__imag__ z); -+ -+ return ret; -+} -+libm_hidden_def(cexp) -+ -+libm_hidden_proto(cexpf) -+__complex__ float cexpf(__complex__ float z) -+{ -+ __complex__ float ret; -+ double r_exponent = exp(__real__ z); -+ -+ __real__ ret = r_exponent * cosf(__imag__ z); -+ __imag__ ret = r_exponent * sinf(__imag__ z); -+ -+ return ret; -+} -+libm_hidden_def(cexpf) -+ -+#if defined __UCLIBC_HAS_LONG_DOUBLE_MATH__ && !defined __NO_LONG_DOUBLE_MATH -+libm_hidden_proto(cexpl) -+__complex__ long double cexpl(__complex__ long double z) -+{ -+ __complex__ long double ret; -+ long double r_exponent = expl(__real__ z); -+ -+ __real__ ret = r_exponent * cosl(__imag__ z); -+ __imag__ ret = r_exponent * sinl(__imag__ z); -+ -+ return ret; -+} -+libm_hidden_def(cexpl) -+#endif --- -1.7.7.1 - diff --git a/main/libc0.9.32/sha512-crypt.patch b/main/libc0.9.32/sha512-crypt.patch deleted file mode 100644 index 6a4b1001b4..0000000000 --- a/main/libc0.9.32/sha512-crypt.patch +++ /dev/null @@ -1,1777 +0,0 @@ -From 71ad18ce94b15cd000a3e90a0a30ee81ac1b443a Mon Sep 17 00:00:00 2001 -From: William Pitcock -Date: Wed, 16 Nov 2011 05:27:48 -0600 -Subject: [PATCH 1/2] libcrypt: make crypt() more modular -To: uclibc@uclibc.org - -By using a function table, we can more cleanly support new crypt -implementations, such as SHA256 ($5$) and SHA512 ($6$). - -Signed-off-by: William Pitcock ---- - libcrypt/crypt.c | 34 ++++++++++++++++++++++++++++------ - 1 files changed, 28 insertions(+), 6 deletions(-) - -diff --git a/libcrypt/crypt.c b/libcrypt/crypt.c -index 8b361d3..28cbc70 100644 ---- a/libcrypt/crypt.c -+++ b/libcrypt/crypt.c -@@ -8,14 +8,36 @@ - #define __FORCE_GLIBC - #include - #include -+#include -+#include - #include "libcrypt.h" - -+#define ARRAY_SIZE(v) (sizeof(v) / sizeof((v)[0])) -+ -+typedef char *(*crypt_impl_f)(const unsigned char *pw, const unsigned char *salt); -+ -+static const struct { -+ const char *salt_pfx; -+ const crypt_impl_f crypt_impl; -+} crypt_impl_tab[] = { -+ { "$1$", __md5_crypt }, -+ { NULL, __des_crypt }, -+}; -+ - char *crypt(const char *key, const char *salt) - { -- /* First, check if we are supposed to be using the MD5 replacement -- * instead of DES... */ -- if (salt[0]=='$' && salt[1]=='1' && salt[2]=='$') -- return __md5_crypt((unsigned char*)key, (unsigned char*)salt); -- else -- return __des_crypt((unsigned char*)key, (unsigned char*)salt); -+ unsigned int i; -+ -+ for (i = 0; i < ARRAY_SIZE(crypt_impl_tab); i++) -+ { -+ if (crypt_impl_tab[i].salt_pfx && -+ strncmp(crypt_impl_tab[i].salt_pfx, salt, strlen(crypt_impl_tab[i].salt_pfx))) -+ continue; -+ -+ return crypt_impl_tab[i].crypt_impl((unsigned char *) key, (unsigned char *) salt); -+ } -+ -+ /* this should never happen, but just incase... */ -+ __set_errno(ENOSYS); -+ return NULL; - } --- -1.7.7.3 - -From 3c0ca4dcbb38987bda7981f6c876a291d3051f12 Mon Sep 17 00:00:00 2001 -From: William Pitcock -Date: Wed, 16 Nov 2011 05:53:34 -0600 -Subject: [PATCH 2/2] libcrypt: add support for SHA512-crypt. -To: uclibc@uclibc.org - -This is based on Ulrich Drepper's implementation in GLIBC, but hacked up to work -in uClibc. A previous version of this patch was rejected, this is the cleaned up -version. - -Signed-off-by: William Pitcock ---- - extra/Configs/Config.in | 6 + - libcrypt/Makefile.in | 1 + - libcrypt/crypt.c | 3 + - libcrypt/libcrypt.h | 3 + - libcrypt/sha512-crypt.c | 339 +++++++++++++++++++++++++++++++++++++++++++++++ - libcrypt/sha512.c | 326 +++++++++++++++++++++++++++++++++++++++++++++ - libcrypt/sha512.h | 58 ++++++++ - 7 files changed, 736 insertions(+), 0 deletions(-) - create mode 100644 libcrypt/sha512-crypt.c - create mode 100644 libcrypt/sha512.c - create mode 100644 libcrypt/sha512.h - -diff --git a/extra/Configs/Config.in b/extra/Configs/Config.in -index 0f0ccfe..1ec041d 100644 ---- a/extra/Configs/Config.in -+++ b/extra/Configs/Config.in -@@ -1174,6 +1174,12 @@ config UCLIBC_HAS_CRYPT_IMPL - help - libcrypt contains crypt(), setkey() and encrypt() - -+config UCLIBC_HAS_SHA512_CRYPT_IMPL -+ bool "libcrypt SHA512 support" -+ default y -+ help -+ Say N here if you do not need SHA512 crypt support. -+ - config UCLIBC_HAS_CRYPT_STUB - bool "libcrypt stubs" - default y -diff --git a/libcrypt/Makefile.in b/libcrypt/Makefile.in -index 1d1fb55..2fceaed 100644 ---- a/libcrypt/Makefile.in -+++ b/libcrypt/Makefile.in -@@ -21,6 +21,7 @@ libcrypt_OUT := $(top_builddir)libcrypt - - libcrypt_SRC-y := - libcrypt_SRC-$(UCLIBC_HAS_CRYPT_IMPL) += crypt.c des.c md5.c -+libcrypt_SRC-$(UCLIBC_HAS_SHA512_CRYPT_IMPL) += sha512.c sha512-crypt.c - libcrypt_SRC-$(UCLIBC_HAS_CRYPT_STUB) += crypt_stub.c - - libcrypt_SRC := $(addprefix $(libcrypt_DIR)/,$(libcrypt_SRC-y)) -diff --git a/libcrypt/crypt.c b/libcrypt/crypt.c -index 28cbc70..2bb2c33 100644 ---- a/libcrypt/crypt.c -+++ b/libcrypt/crypt.c -@@ -21,6 +21,9 @@ static const struct { - const crypt_impl_f crypt_impl; - } crypt_impl_tab[] = { - { "$1$", __md5_crypt }, -+#ifdef __UCLIBC_HAS_SHA512_CRYPT_IMPL__ -+ { "$6$", __sha512_crypt }, -+#endif - { NULL, __des_crypt }, - }; - -diff --git a/libcrypt/libcrypt.h b/libcrypt/libcrypt.h -index 1186620..fcad6ae 100644 ---- a/libcrypt/libcrypt.h -+++ b/libcrypt/libcrypt.h -@@ -9,8 +9,11 @@ - #define __LIBCRYPT_H__ - - extern char *__md5_crypt(const unsigned char *pw, const unsigned char *salt) attribute_hidden; -+extern char *__sha512_crypt(const unsigned char *pw, const unsigned char *salt) attribute_hidden; - extern char *__des_crypt(const unsigned char *pw, const unsigned char *salt) attribute_hidden; - -+extern char *__sha512_crypt_r (const char *key, const char *salt, char *buffer, int buflen) attribute_hidden; -+ - /* shut up gcc-4.x signed warnings */ - #define strcpy(dst,src) strcpy((char*)dst,(char*)src) - #define strlen(s) strlen((char*)s) -diff --git a/libcrypt/sha512-crypt.c b/libcrypt/sha512-crypt.c -new file mode 100644 -index 0000000..dece925 ---- /dev/null -+++ b/libcrypt/sha512-crypt.c -@@ -0,0 +1,339 @@ -+/* One way encryption based on SHA512 sum. -+ Copyright (C) 2007, 2009 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ Contributed by Ulrich Drepper , 2007. -+ -+ 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, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "sha512.h" -+#include "libcrypt.h" -+ -+/* Define our magic string to mark salt for SHA512 "encryption" -+ replacement. */ -+static const char sha512_salt_prefix[] = "$6$"; -+ -+/* Prefix for optional rounds specification. */ -+static const char sha512_rounds_prefix[] = "rounds="; -+ -+/* Maximum salt string length. */ -+#define SALT_LEN_MAX 16 -+/* Default number of rounds if not explicitly specified. */ -+#define ROUNDS_DEFAULT 5000 -+/* Minimum number of rounds. */ -+#define ROUNDS_MIN 1000 -+/* Maximum number of rounds. */ -+#define ROUNDS_MAX 999999999 -+ -+/* Table with characters for base64 transformation. */ -+static const char b64t[64] = -+"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; -+ -+char * -+__sha512_crypt_r (const char *key, -+ const char *salt, -+ char *buffer, -+ int buflen) -+{ -+ unsigned char alt_result[64] -+ __attribute__ ((__aligned__ (__alignof__ (uint64_t)))); -+ unsigned char temp_result[64] -+ __attribute__ ((__aligned__ (__alignof__ (uint64_t)))); -+ size_t salt_len; -+ size_t key_len; -+ size_t cnt; -+ char *cp; -+ char *copied_key = NULL; -+ char *copied_salt = NULL; -+ char *p_bytes; -+ char *s_bytes; -+ /* Default number of rounds. */ -+ size_t rounds = ROUNDS_DEFAULT; -+ bool rounds_custom = false; -+ -+ /* Find beginning of salt string. The prefix should normally always -+ be present. Just in case it is not. */ -+ if (strncmp (sha512_salt_prefix, salt, sizeof (sha512_salt_prefix) - 1) == 0) -+ /* Skip salt prefix. */ -+ salt += sizeof (sha512_salt_prefix) - 1; -+ -+ if (strncmp (salt, sha512_rounds_prefix, sizeof (sha512_rounds_prefix) - 1) -+ == 0) -+ { -+ const char *num = salt + sizeof (sha512_rounds_prefix) - 1; -+ char *endp; -+ unsigned long int srounds = strtoul (num, &endp, 10); -+ if (*endp == '$') -+ { -+ salt = endp + 1; -+ rounds = MAX (ROUNDS_MIN, MIN (srounds, ROUNDS_MAX)); -+ rounds_custom = true; -+ } -+ } -+ -+ salt_len = MIN (strcspn (salt, "$"), SALT_LEN_MAX); -+ key_len = strlen (key); -+ -+ if ((key - (char *) 0) % __alignof__ (uint64_t) != 0) -+ { -+ char *tmp = (char *) alloca (key_len + __alignof__ (uint64_t)); -+ key = copied_key = -+ memcpy (tmp + __alignof__ (uint64_t) -+ - (tmp - (char *) 0) % __alignof__ (uint64_t), -+ key, key_len); -+ assert ((key - (char *) 0) % __alignof__ (uint64_t) == 0); -+ } -+ -+ if ((salt - (char *) 0) % __alignof__ (uint64_t) != 0) -+ { -+ char *tmp = (char *) alloca (salt_len + __alignof__ (uint64_t)); -+ salt = copied_salt = -+ memcpy (tmp + __alignof__ (uint64_t) -+ - (tmp - (char *) 0) % __alignof__ (uint64_t), -+ salt, salt_len); -+ assert ((salt - (char *) 0) % __alignof__ (uint64_t) == 0); -+ } -+ -+ struct sha512_ctx ctx; -+ struct sha512_ctx alt_ctx; -+ -+ /* Prepare for the real work. */ -+ __sha512_init_ctx (&ctx); -+ -+ /* Add the key string. */ -+ __sha512_process_bytes (key, key_len, &ctx); -+ -+ /* The last part is the salt string. This must be at most 16 -+ characters and it ends at the first `$' character. */ -+ __sha512_process_bytes (salt, salt_len, &ctx); -+ -+ -+ /* Compute alternate SHA512 sum with input KEY, SALT, and KEY. The -+ final result will be added to the first context. */ -+ __sha512_init_ctx (&alt_ctx); -+ -+ /* Add key. */ -+ __sha512_process_bytes (key, key_len, &alt_ctx); -+ -+ /* Add salt. */ -+ __sha512_process_bytes (salt, salt_len, &alt_ctx); -+ -+ /* Add key again. */ -+ __sha512_process_bytes (key, key_len, &alt_ctx); -+ -+ /* Now get result of this (64 bytes) and add it to the other -+ context. */ -+ __sha512_finish_ctx (&alt_ctx, alt_result); -+ -+ /* Add for any character in the key one byte of the alternate sum. */ -+ for (cnt = key_len; cnt > 64; cnt -= 64) -+ __sha512_process_bytes (alt_result, 64, &ctx); -+ -+ __sha512_process_bytes (alt_result, cnt, &ctx); -+ -+ /* Take the binary representation of the length of the key and for every -+ 1 add the alternate sum, for every 0 the key. */ -+ for (cnt = key_len; cnt > 0; cnt >>= 1) -+ if ((cnt & 1) != 0) -+ __sha512_process_bytes (alt_result, 64, &ctx); -+ else -+ __sha512_process_bytes (key, key_len, &ctx); -+ -+ /* Create intermediate result. */ -+ __sha512_finish_ctx (&ctx, alt_result); -+ -+ /* Start computation of P byte sequence. */ -+ __sha512_init_ctx (&alt_ctx); -+ -+ /* For every character in the password add the entire password. */ -+ for (cnt = 0; cnt < key_len; ++cnt) -+ __sha512_process_bytes (key, key_len, &alt_ctx); -+ -+ /* Finish the digest. */ -+ __sha512_finish_ctx (&alt_ctx, temp_result); -+ -+ /* Create byte sequence P. */ -+ cp = p_bytes = alloca (key_len); -+ for (cnt = key_len; cnt >= 64; cnt -= 64) -+ cp = mempcpy (cp, temp_result, 64); -+ memcpy (cp, temp_result, cnt); -+ -+ /* Start computation of S byte sequence. */ -+ __sha512_init_ctx (&alt_ctx); -+ -+ /* For every character in the password add the entire password. */ -+ for (cnt = 0; cnt < 16 + alt_result[0]; ++cnt) -+ __sha512_process_bytes (salt, salt_len, &alt_ctx); -+ -+ /* Finish the digest. */ -+ __sha512_finish_ctx (&alt_ctx, temp_result); -+ -+ /* Create byte sequence S. */ -+ cp = s_bytes = alloca (salt_len); -+ for (cnt = salt_len; cnt >= 64; cnt -= 64) -+ cp = mempcpy (cp, temp_result, 64); -+ memcpy (cp, temp_result, cnt); -+ -+ /* Repeatedly run the collected hash value through SHA512 to burn -+ CPU cycles. */ -+ for (cnt = 0; cnt < rounds; ++cnt) -+ { -+ /* New context. */ -+ __sha512_init_ctx (&ctx); -+ -+ /* Add key or last result. */ -+ if ((cnt & 1) != 0) -+ __sha512_process_bytes (p_bytes, key_len, &ctx); -+ else -+ __sha512_process_bytes (alt_result, 64, &ctx); -+ -+ /* Add salt for numbers not divisible by 3. */ -+ if (cnt % 3 != 0) -+ __sha512_process_bytes (s_bytes, salt_len, &ctx); -+ -+ /* Add key for numbers not divisible by 7. */ -+ if (cnt % 7 != 0) -+ __sha512_process_bytes (p_bytes, key_len, &ctx); -+ -+ /* Add key or last result. */ -+ if ((cnt & 1) != 0) -+ __sha512_process_bytes (alt_result, 64, &ctx); -+ else -+ __sha512_process_bytes (p_bytes, key_len, &ctx); -+ -+ /* Create intermediate result. */ -+ __sha512_finish_ctx (&ctx, alt_result); -+ } -+ -+ /* Now we can construct the result string. It consists of three -+ parts. */ -+ cp = stpncpy (buffer, sha512_salt_prefix, MAX (0, buflen)); -+ buflen -= sizeof (sha512_salt_prefix) - 1; -+ -+ if (rounds_custom) -+ { -+ int n = snprintf (cp, MAX (0, buflen), "%s%zu$", -+ sha512_rounds_prefix, rounds); -+ cp += n; -+ buflen -= n; -+ } -+ -+ cp = stpncpy (cp, salt, MIN ((size_t) MAX (0, buflen), salt_len)); -+ buflen -= MIN ((size_t) MAX (0, buflen), salt_len); -+ -+ if (buflen > 0) -+ { -+ *cp++ = '$'; -+ --buflen; -+ } -+ -+ void b64_from_24bit (unsigned int b2, unsigned int b1, unsigned int b0, -+ int n) -+ { -+ unsigned int w = (b2 << 16) | (b1 << 8) | b0; -+ while (n-- > 0 && buflen > 0) -+ { -+ *cp++ = b64t[w & 0x3f]; -+ --buflen; -+ w >>= 6; -+ } -+ } -+ -+ b64_from_24bit (alt_result[0], alt_result[21], alt_result[42], 4); -+ b64_from_24bit (alt_result[22], alt_result[43], alt_result[1], 4); -+ b64_from_24bit (alt_result[44], alt_result[2], alt_result[23], 4); -+ b64_from_24bit (alt_result[3], alt_result[24], alt_result[45], 4); -+ b64_from_24bit (alt_result[25], alt_result[46], alt_result[4], 4); -+ b64_from_24bit (alt_result[47], alt_result[5], alt_result[26], 4); -+ b64_from_24bit (alt_result[6], alt_result[27], alt_result[48], 4); -+ b64_from_24bit (alt_result[28], alt_result[49], alt_result[7], 4); -+ b64_from_24bit (alt_result[50], alt_result[8], alt_result[29], 4); -+ b64_from_24bit (alt_result[9], alt_result[30], alt_result[51], 4); -+ b64_from_24bit (alt_result[31], alt_result[52], alt_result[10], 4); -+ b64_from_24bit (alt_result[53], alt_result[11], alt_result[32], 4); -+ b64_from_24bit (alt_result[12], alt_result[33], alt_result[54], 4); -+ b64_from_24bit (alt_result[34], alt_result[55], alt_result[13], 4); -+ b64_from_24bit (alt_result[56], alt_result[14], alt_result[35], 4); -+ b64_from_24bit (alt_result[15], alt_result[36], alt_result[57], 4); -+ b64_from_24bit (alt_result[37], alt_result[58], alt_result[16], 4); -+ b64_from_24bit (alt_result[59], alt_result[17], alt_result[38], 4); -+ b64_from_24bit (alt_result[18], alt_result[39], alt_result[60], 4); -+ b64_from_24bit (alt_result[40], alt_result[61], alt_result[19], 4); -+ b64_from_24bit (alt_result[62], alt_result[20], alt_result[41], 4); -+ b64_from_24bit (0, 0, alt_result[63], 2); -+ -+ if (buflen <= 0) -+ { -+ __set_errno (ERANGE); -+ buffer = NULL; -+ } -+ else -+ *cp = '\0'; /* Terminate the string. */ -+ -+ /* Clear the buffer for the intermediate result so that people -+ attaching to processes or reading core dumps cannot get any -+ information. We do it in this way to clear correct_words[] -+ inside the SHA512 implementation as well. */ -+ __sha512_init_ctx (&ctx); -+ __sha512_finish_ctx (&ctx, alt_result); -+ memset (&ctx, '\0', sizeof (ctx)); -+ memset (&alt_ctx, '\0', sizeof (alt_ctx)); -+ -+ memset (temp_result, '\0', sizeof (temp_result)); -+ memset (p_bytes, '\0', key_len); -+ memset (s_bytes, '\0', salt_len); -+ if (copied_key != NULL) -+ memset (copied_key, '\0', key_len); -+ if (copied_salt != NULL) -+ memset (copied_salt, '\0', salt_len); -+ -+ return buffer; -+} -+ -+static char *buffer; -+ -+/* This entry point is equivalent to the `crypt' function in Unix -+ libcs. */ -+char * -+__sha512_crypt (const unsigned char *key, const unsigned char *salt) -+{ -+ /* We don't want to have an arbitrary limit in the size of the -+ password. We can compute an upper bound for the size of the -+ result in advance and so we can prepare the buffer we pass to -+ `sha512_crypt_r'. */ -+ static int buflen; -+ int needed = (sizeof (sha512_salt_prefix) - 1 -+ + sizeof (sha512_rounds_prefix) + 9 + 1 -+ + strlen (salt) + 1 + 86 + 1); -+ -+ if (buflen < needed) -+ { -+ char *new_buffer = (char *) realloc (buffer, needed); -+ if (new_buffer == NULL) -+ return NULL; -+ -+ buffer = new_buffer; -+ buflen = needed; -+ } -+ -+ return __sha512_crypt_r ((const char *) key, (const char *) salt, buffer, buflen); -+} -diff --git a/libcrypt/sha512.c b/libcrypt/sha512.c -new file mode 100644 -index 0000000..04e0a06 ---- /dev/null -+++ b/libcrypt/sha512.c -@@ -0,0 +1,326 @@ -+/* Functions to compute SHA512 message digest of files or memory blocks. -+ according to the definition of SHA512 in FIPS 180-2. -+ Copyright (C) 2007 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, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. */ -+ -+/* Written by Ulrich Drepper , 2007. */ -+ -+#ifdef HAVE_CONFIG_H -+# include -+#endif -+ -+#include -+#include -+#include -+#include -+ -+#include "sha512.h" -+ -+#if __BYTE_ORDER == __LITTLE_ENDIAN -+# ifdef _LIBC -+# include -+# define SWAP(n) bswap_64 (n) -+# else -+# define SWAP(n) \ -+ (((n) << 56) \ -+ | (((n) & 0xff00) << 40) \ -+ | (((n) & 0xff0000) << 24) \ -+ | (((n) & 0xff000000) << 8) \ -+ | (((n) >> 8) & 0xff000000) \ -+ | (((n) >> 24) & 0xff0000) \ -+ | (((n) >> 40) & 0xff00) \ -+ | ((n) >> 56)) -+# endif -+#else -+# define SWAP(n) (n) -+#endif -+ -+ -+/* This array contains the bytes used to pad the buffer to the next -+ 64-byte boundary. (FIPS 180-2:5.1.2) */ -+static const unsigned char fillbuf[128] = { 0x80, 0 /* , 0, 0, ... */ }; -+ -+ -+/* Constants for SHA512 from FIPS 180-2:4.2.3. */ -+static const uint64_t K[80] = -+ { -+ UINT64_C (0x428a2f98d728ae22), UINT64_C (0x7137449123ef65cd), -+ UINT64_C (0xb5c0fbcfec4d3b2f), UINT64_C (0xe9b5dba58189dbbc), -+ UINT64_C (0x3956c25bf348b538), UINT64_C (0x59f111f1b605d019), -+ UINT64_C (0x923f82a4af194f9b), UINT64_C (0xab1c5ed5da6d8118), -+ UINT64_C (0xd807aa98a3030242), UINT64_C (0x12835b0145706fbe), -+ UINT64_C (0x243185be4ee4b28c), UINT64_C (0x550c7dc3d5ffb4e2), -+ UINT64_C (0x72be5d74f27b896f), UINT64_C (0x80deb1fe3b1696b1), -+ UINT64_C (0x9bdc06a725c71235), UINT64_C (0xc19bf174cf692694), -+ UINT64_C (0xe49b69c19ef14ad2), UINT64_C (0xefbe4786384f25e3), -+ UINT64_C (0x0fc19dc68b8cd5b5), UINT64_C (0x240ca1cc77ac9c65), -+ UINT64_C (0x2de92c6f592b0275), UINT64_C (0x4a7484aa6ea6e483), -+ UINT64_C (0x5cb0a9dcbd41fbd4), UINT64_C (0x76f988da831153b5), -+ UINT64_C (0x983e5152ee66dfab), UINT64_C (0xa831c66d2db43210), -+ UINT64_C (0xb00327c898fb213f), UINT64_C (0xbf597fc7beef0ee4), -+ UINT64_C (0xc6e00bf33da88fc2), UINT64_C (0xd5a79147930aa725), -+ UINT64_C (0x06ca6351e003826f), UINT64_C (0x142929670a0e6e70), -+ UINT64_C (0x27b70a8546d22ffc), UINT64_C (0x2e1b21385c26c926), -+ UINT64_C (0x4d2c6dfc5ac42aed), UINT64_C (0x53380d139d95b3df), -+ UINT64_C (0x650a73548baf63de), UINT64_C (0x766a0abb3c77b2a8), -+ UINT64_C (0x81c2c92e47edaee6), UINT64_C (0x92722c851482353b), -+ UINT64_C (0xa2bfe8a14cf10364), UINT64_C (0xa81a664bbc423001), -+ UINT64_C (0xc24b8b70d0f89791), UINT64_C (0xc76c51a30654be30), -+ UINT64_C (0xd192e819d6ef5218), UINT64_C (0xd69906245565a910), -+ UINT64_C (0xf40e35855771202a), UINT64_C (0x106aa07032bbd1b8), -+ UINT64_C (0x19a4c116b8d2d0c8), UINT64_C (0x1e376c085141ab53), -+ UINT64_C (0x2748774cdf8eeb99), UINT64_C (0x34b0bcb5e19b48a8), -+ UINT64_C (0x391c0cb3c5c95a63), UINT64_C (0x4ed8aa4ae3418acb), -+ UINT64_C (0x5b9cca4f7763e373), UINT64_C (0x682e6ff3d6b2b8a3), -+ UINT64_C (0x748f82ee5defb2fc), UINT64_C (0x78a5636f43172f60), -+ UINT64_C (0x84c87814a1f0ab72), UINT64_C (0x8cc702081a6439ec), -+ UINT64_C (0x90befffa23631e28), UINT64_C (0xa4506cebde82bde9), -+ UINT64_C (0xbef9a3f7b2c67915), UINT64_C (0xc67178f2e372532b), -+ UINT64_C (0xca273eceea26619c), UINT64_C (0xd186b8c721c0c207), -+ UINT64_C (0xeada7dd6cde0eb1e), UINT64_C (0xf57d4f7fee6ed178), -+ UINT64_C (0x06f067aa72176fba), UINT64_C (0x0a637dc5a2c898a6), -+ UINT64_C (0x113f9804bef90dae), UINT64_C (0x1b710b35131c471b), -+ UINT64_C (0x28db77f523047d84), UINT64_C (0x32caab7b40c72493), -+ UINT64_C (0x3c9ebe0a15c9bebc), UINT64_C (0x431d67c49c100d4c), -+ UINT64_C (0x4cc5d4becb3e42b6), UINT64_C (0x597f299cfc657e2a), -+ UINT64_C (0x5fcb6fab3ad6faec), UINT64_C (0x6c44198c4a475817) -+ }; -+ -+ -+/* Process LEN bytes of BUFFER, accumulating context into CTX. -+ It is assumed that LEN % 128 == 0. */ -+static void -+sha512_process_block (const void *buffer, size_t len, struct sha512_ctx *ctx) -+{ -+ const uint64_t *words = buffer; -+ size_t nwords = len / sizeof (uint64_t); -+ uint64_t a = ctx->H[0]; -+ uint64_t b = ctx->H[1]; -+ uint64_t c = ctx->H[2]; -+ uint64_t d = ctx->H[3]; -+ uint64_t e = ctx->H[4]; -+ uint64_t f = ctx->H[5]; -+ uint64_t g = ctx->H[6]; -+ uint64_t h = ctx->H[7]; -+ -+ /* First increment the byte count. FIPS 180-2 specifies the possible -+ length of the file up to 2^128 bits. Here we only compute the -+ number of bytes. Do a double word increment. */ -+ ctx->total[0] += len; -+ if (ctx->total[0] < len) -+ ++ctx->total[1]; -+ -+ /* Process all bytes in the buffer with 128 bytes in each round of -+ the loop. */ -+ while (nwords > 0) -+ { -+ uint64_t W[80]; -+ uint64_t a_save = a; -+ uint64_t b_save = b; -+ uint64_t c_save = c; -+ uint64_t d_save = d; -+ uint64_t e_save = e; -+ uint64_t f_save = f; -+ uint64_t g_save = g; -+ uint64_t h_save = h; -+ -+ /* Operators defined in FIPS 180-2:4.1.2. */ -+#define Ch(x, y, z) ((x & y) ^ (~x & z)) -+#define Maj(x, y, z) ((x & y) ^ (x & z) ^ (y & z)) -+#define S0(x) (CYCLIC (x, 28) ^ CYCLIC (x, 34) ^ CYCLIC (x, 39)) -+#define S1(x) (CYCLIC (x, 14) ^ CYCLIC (x, 18) ^ CYCLIC (x, 41)) -+#define R0(x) (CYCLIC (x, 1) ^ CYCLIC (x, 8) ^ (x >> 7)) -+#define R1(x) (CYCLIC (x, 19) ^ CYCLIC (x, 61) ^ (x >> 6)) -+ -+ /* It is unfortunate that C does not provide an operator for -+ cyclic rotation. Hope the C compiler is smart enough. */ -+#define CYCLIC(w, s) ((w >> s) | (w << (64 - s))) -+ -+ /* Compute the message schedule according to FIPS 180-2:6.3.2 step 2. */ -+ for (unsigned int t = 0; t < 16; ++t) -+ { -+ W[t] = SWAP (*words); -+ ++words; -+ } -+ for (unsigned int t = 16; t < 80; ++t) -+ W[t] = R1 (W[t - 2]) + W[t - 7] + R0 (W[t - 15]) + W[t - 16]; -+ -+ /* The actual computation according to FIPS 180-2:6.3.2 step 3. */ -+ for (unsigned int t = 0; t < 80; ++t) -+ { -+ uint64_t T1 = h + S1 (e) + Ch (e, f, g) + K[t] + W[t]; -+ uint64_t T2 = S0 (a) + Maj (a, b, c); -+ h = g; -+ g = f; -+ f = e; -+ e = d + T1; -+ d = c; -+ c = b; -+ b = a; -+ a = T1 + T2; -+ } -+ -+ /* Add the starting values of the context according to FIPS 180-2:6.3.2 -+ step 4. */ -+ a += a_save; -+ b += b_save; -+ c += c_save; -+ d += d_save; -+ e += e_save; -+ f += f_save; -+ g += g_save; -+ h += h_save; -+ -+ /* Prepare for the next round. */ -+ nwords -= 16; -+ } -+ -+ /* Put checksum in context given as argument. */ -+ ctx->H[0] = a; -+ ctx->H[1] = b; -+ ctx->H[2] = c; -+ ctx->H[3] = d; -+ ctx->H[4] = e; -+ ctx->H[5] = f; -+ ctx->H[6] = g; -+ ctx->H[7] = h; -+} -+ -+ -+/* Initialize structure containing state of computation. -+ (FIPS 180-2:5.3.3) */ -+void -+__sha512_init_ctx (struct sha512_ctx *ctx) -+{ -+ ctx->H[0] = UINT64_C (0x6a09e667f3bcc908); -+ ctx->H[1] = UINT64_C (0xbb67ae8584caa73b); -+ ctx->H[2] = UINT64_C (0x3c6ef372fe94f82b); -+ ctx->H[3] = UINT64_C (0xa54ff53a5f1d36f1); -+ ctx->H[4] = UINT64_C (0x510e527fade682d1); -+ ctx->H[5] = UINT64_C (0x9b05688c2b3e6c1f); -+ ctx->H[6] = UINT64_C (0x1f83d9abfb41bd6b); -+ ctx->H[7] = UINT64_C (0x5be0cd19137e2179); -+ -+ ctx->total[0] = ctx->total[1] = 0; -+ ctx->buflen = 0; -+} -+ -+ -+/* Process the remaining bytes in the internal buffer and the usual -+ prolog according to the standard and write the result to RESBUF. -+ -+ IMPORTANT: On some systems it is required that RESBUF is correctly -+ aligned for a 32 bits value. */ -+void * -+__sha512_finish_ctx (struct sha512_ctx *ctx, void *resbuf) -+{ -+ /* Take yet unprocessed bytes into account. */ -+ uint64_t bytes = ctx->buflen; -+ size_t pad; -+ -+ /* Now count remaining bytes. */ -+ ctx->total[0] += bytes; -+ if (ctx->total[0] < bytes) -+ ++ctx->total[1]; -+ -+ pad = bytes >= 112 ? 128 + 112 - bytes : 112 - bytes; -+ memcpy (&ctx->buffer[bytes], fillbuf, pad); -+ -+ /* Put the 128-bit file length in *bits* at the end of the buffer. */ -+ *(uint64_t *) &ctx->buffer[bytes + pad + 8] = SWAP (ctx->total[0] << 3); -+ *(uint64_t *) &ctx->buffer[bytes + pad] = SWAP ((ctx->total[1] << 3) | -+ (ctx->total[0] >> 61)); -+ -+ /* Process last bytes. */ -+ sha512_process_block (ctx->buffer, bytes + pad + 16, ctx); -+ -+ /* Put result from CTX in first 64 bytes following RESBUF. */ -+ for (unsigned int i = 0; i < 8; ++i) -+ ((uint64_t *) resbuf)[i] = SWAP (ctx->H[i]); -+ -+ return resbuf; -+} -+ -+ -+void -+__sha512_process_bytes (const void *buffer, size_t len, struct sha512_ctx *ctx) -+{ -+ /* When we already have some bits in our internal buffer concatenate -+ both inputs first. */ -+ if (ctx->buflen != 0) -+ { -+ size_t left_over = ctx->buflen; -+ size_t add = 256 - left_over > len ? len : 256 - left_over; -+ -+ memcpy (&ctx->buffer[left_over], buffer, add); -+ ctx->buflen += add; -+ -+ if (ctx->buflen > 128) -+ { -+ sha512_process_block (ctx->buffer, ctx->buflen & ~127, ctx); -+ -+ ctx->buflen &= 127; -+ /* The regions in the following copy operation cannot overlap. */ -+ memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~127], -+ ctx->buflen); -+ } -+ -+ buffer = (const char *) buffer + add; -+ len -= add; -+ } -+ -+ /* Process available complete blocks. */ -+ if (len >= 128) -+ { -+#if __GNUC__ >= 2 -+# define UNALIGNED_P(p) (((uintptr_t) p) % __alignof__ (uint64_t) != 0) -+#else -+# define UNALIGNED_P(p) (((uintptr_t) p) % sizeof (uint64_t) != 0) -+#endif -+ if (UNALIGNED_P (buffer)) -+ while (len > 128) -+ { -+ sha512_process_block (memcpy (ctx->buffer, buffer, 128), 128, -+ ctx); -+ buffer = (const char *) buffer + 128; -+ len -= 128; -+ } -+ else -+ { -+ sha512_process_block (buffer, len & ~127, ctx); -+ buffer = (const char *) buffer + (len & ~127); -+ len &= 127; -+ } -+ } -+ -+ /* Move remaining bytes into internal buffer. */ -+ if (len > 0) -+ { -+ size_t left_over = ctx->buflen; -+ -+ memcpy (&ctx->buffer[left_over], buffer, len); -+ left_over += len; -+ if (left_over >= 128) -+ { -+ sha512_process_block (ctx->buffer, 128, ctx); -+ left_over -= 128; -+ memcpy (ctx->buffer, &ctx->buffer[128], left_over); -+ } -+ ctx->buflen = left_over; -+ } -+} -diff --git a/libcrypt/sha512.h b/libcrypt/sha512.h -new file mode 100644 -index 0000000..5777827 ---- /dev/null -+++ b/libcrypt/sha512.h -@@ -0,0 +1,58 @@ -+/* Declaration of functions and data types used for SHA512 sum computing -+ library functions. -+ Copyright (C) 2007 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, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. */ -+ -+#ifndef _SHA512_H -+#define _SHA512_H 1 -+ -+#include -+#include -+#include -+ -+ -+/* Structure to save state of computation between the single steps. */ -+struct sha512_ctx -+{ -+ uint64_t H[8]; -+ -+ uint64_t total[2]; -+ uint64_t buflen; -+ char buffer[256] __attribute__ ((__aligned__ (__alignof__ (uint64_t)))); -+}; -+ -+/* Initialize structure containing state of computation. -+ (FIPS 180-2: 5.3.3) */ -+extern void __sha512_init_ctx (struct sha512_ctx *ctx) attribute_hidden; -+ -+/* Starting with the result of former calls of this function (or the -+ initialization function update the context for the next LEN bytes -+ starting at BUFFER. -+ It is NOT required that LEN is a multiple of 128. */ -+extern void __sha512_process_bytes (const void *buffer, size_t len, -+ struct sha512_ctx *ctx) attribute_hidden; -+ -+/* Process the remaining bytes in the buffer and put result from CTX -+ in first 64 bytes following RESBUF. -+ -+ IMPORTANT: On some systems it is required that RESBUF is correctly -+ aligned for a 64 bits value. */ -+extern void *__sha512_finish_ctx (struct sha512_ctx *ctx, void *resbuf) -+ attribute_hidden; -+ -+#endif /* sha512.h */ --- -1.7.7.3 - -From aad4fe2d08d930f3a63a5e31ec315cbedb1aa965 Mon Sep 17 00:00:00 2001 -From: William Pitcock -Date: Wed, 16 Nov 2011 06:05:07 -0600 -Subject: [PATCH] libcrypt/sha512-crypt: convert nested function - b64_from_24bit() into a macro - -The glibc implementation of sha512-crypt used inline functions which should -really be converted into a macro because otherwise a trampoline is potentially -created. - -Signed-off-by: William Pitcock ---- - libcrypt/sha512-crypt.c | 68 +++++++++++++++++++++++----------------------- - 1 files changed, 34 insertions(+), 34 deletions(-) - -diff --git a/libcrypt/sha512-crypt.c b/libcrypt/sha512-crypt.c -index dece925..0321be0 100644 ---- a/libcrypt/sha512-crypt.c -+++ b/libcrypt/sha512-crypt.c -@@ -48,6 +48,18 @@ static const char sha512_rounds_prefix[] = "rounds="; - static const char b64t[64] = - "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - -+#define B64_FROM_24BIT(b2, b1, b0, steps) \ -+ { \ -+ int n = (steps); \ -+ unsigned int w = ((b2) << 16) | ((b1) << 8) | (b0); \ -+ while (n-- > 0 && buflen > 0) \ -+ { \ -+ *cp++ = b64t[w & 0x3f]; \ -+ --buflen; \ -+ w >>= 6; \ -+ } \ -+ } -+ - char * - __sha512_crypt_r (const char *key, - const char *salt, -@@ -246,40 +258,28 @@ __sha512_crypt_r (const char *key, - --buflen; - } - -- void b64_from_24bit (unsigned int b2, unsigned int b1, unsigned int b0, -- int n) -- { -- unsigned int w = (b2 << 16) | (b1 << 8) | b0; -- while (n-- > 0 && buflen > 0) -- { -- *cp++ = b64t[w & 0x3f]; -- --buflen; -- w >>= 6; -- } -- } -- -- b64_from_24bit (alt_result[0], alt_result[21], alt_result[42], 4); -- b64_from_24bit (alt_result[22], alt_result[43], alt_result[1], 4); -- b64_from_24bit (alt_result[44], alt_result[2], alt_result[23], 4); -- b64_from_24bit (alt_result[3], alt_result[24], alt_result[45], 4); -- b64_from_24bit (alt_result[25], alt_result[46], alt_result[4], 4); -- b64_from_24bit (alt_result[47], alt_result[5], alt_result[26], 4); -- b64_from_24bit (alt_result[6], alt_result[27], alt_result[48], 4); -- b64_from_24bit (alt_result[28], alt_result[49], alt_result[7], 4); -- b64_from_24bit (alt_result[50], alt_result[8], alt_result[29], 4); -- b64_from_24bit (alt_result[9], alt_result[30], alt_result[51], 4); -- b64_from_24bit (alt_result[31], alt_result[52], alt_result[10], 4); -- b64_from_24bit (alt_result[53], alt_result[11], alt_result[32], 4); -- b64_from_24bit (alt_result[12], alt_result[33], alt_result[54], 4); -- b64_from_24bit (alt_result[34], alt_result[55], alt_result[13], 4); -- b64_from_24bit (alt_result[56], alt_result[14], alt_result[35], 4); -- b64_from_24bit (alt_result[15], alt_result[36], alt_result[57], 4); -- b64_from_24bit (alt_result[37], alt_result[58], alt_result[16], 4); -- b64_from_24bit (alt_result[59], alt_result[17], alt_result[38], 4); -- b64_from_24bit (alt_result[18], alt_result[39], alt_result[60], 4); -- b64_from_24bit (alt_result[40], alt_result[61], alt_result[19], 4); -- b64_from_24bit (alt_result[62], alt_result[20], alt_result[41], 4); -- b64_from_24bit (0, 0, alt_result[63], 2); -+ B64_FROM_24BIT (alt_result[0], alt_result[21], alt_result[42], 4); -+ B64_FROM_24BIT (alt_result[22], alt_result[43], alt_result[1], 4); -+ B64_FROM_24BIT (alt_result[44], alt_result[2], alt_result[23], 4); -+ B64_FROM_24BIT (alt_result[3], alt_result[24], alt_result[45], 4); -+ B64_FROM_24BIT (alt_result[25], alt_result[46], alt_result[4], 4); -+ B64_FROM_24BIT (alt_result[47], alt_result[5], alt_result[26], 4); -+ B64_FROM_24BIT (alt_result[6], alt_result[27], alt_result[48], 4); -+ B64_FROM_24BIT (alt_result[28], alt_result[49], alt_result[7], 4); -+ B64_FROM_24BIT (alt_result[50], alt_result[8], alt_result[29], 4); -+ B64_FROM_24BIT (alt_result[9], alt_result[30], alt_result[51], 4); -+ B64_FROM_24BIT (alt_result[31], alt_result[52], alt_result[10], 4); -+ B64_FROM_24BIT (alt_result[53], alt_result[11], alt_result[32], 4); -+ B64_FROM_24BIT (alt_result[12], alt_result[33], alt_result[54], 4); -+ B64_FROM_24BIT (alt_result[34], alt_result[55], alt_result[13], 4); -+ B64_FROM_24BIT (alt_result[56], alt_result[14], alt_result[35], 4); -+ B64_FROM_24BIT (alt_result[15], alt_result[36], alt_result[57], 4); -+ B64_FROM_24BIT (alt_result[37], alt_result[58], alt_result[16], 4); -+ B64_FROM_24BIT (alt_result[59], alt_result[17], alt_result[38], 4); -+ B64_FROM_24BIT (alt_result[18], alt_result[39], alt_result[60], 4); -+ B64_FROM_24BIT (alt_result[40], alt_result[61], alt_result[19], 4); -+ B64_FROM_24BIT (alt_result[62], alt_result[20], alt_result[41], 4); -+ B64_FROM_24BIT (0, 0, alt_result[63], 2); - - if (buflen <= 0) - { --- -1.7.7.3 - -From 9b463f10d2b395c80533fa44876f6a387fc69289 Mon Sep 17 00:00:00 2001 -From: William Pitcock -Date: Wed, 16 Nov 2011 06:22:36 -0600 -Subject: [PATCH] libcrypt: add SHA256 crypt support. -To: uclibc@uclibc.org - -This is based on Ulrich Drepper's SHA256 crypt implementation in GLIBC. -I decided to add support for this as an option as there have been a few other -SHA256 patches proposed recently. - -Signed-off-by: William Pitcock ---- - extra/Configs/Config.in | 6 + - libcrypt/Makefile.in | 1 + - libcrypt/crypt.c | 3 + - libcrypt/libcrypt.h | 2 + - libcrypt/sha256-crypt.c | 326 +++++++++++++++++++++++++++++++++++++++++++++++ - libcrypt/sha256.c | 294 ++++++++++++++++++++++++++++++++++++++++++ - libcrypt/sha256.h | 58 +++++++++ - 7 files changed, 690 insertions(+), 0 deletions(-) - create mode 100644 libcrypt/sha256-crypt.c - create mode 100644 libcrypt/sha256.c - create mode 100644 libcrypt/sha256.h - -diff --git a/extra/Configs/Config.in b/extra/Configs/Config.in -index 1ec041d..56db0c4 100644 ---- a/extra/Configs/Config.in -+++ b/extra/Configs/Config.in -@@ -1174,6 +1174,12 @@ config UCLIBC_HAS_CRYPT_IMPL - help - libcrypt contains crypt(), setkey() and encrypt() - -+config UCLIBC_HAS_SHA256_CRYPT_IMPL -+ bool "libcrypt SHA256 support" -+ default y -+ help -+ Say N here if you do not need SHA256 crypt support. -+ - config UCLIBC_HAS_SHA512_CRYPT_IMPL - bool "libcrypt SHA512 support" - default y -diff --git a/libcrypt/Makefile.in b/libcrypt/Makefile.in -index 2fceaed..94753f4 100644 ---- a/libcrypt/Makefile.in -+++ b/libcrypt/Makefile.in -@@ -21,6 +21,7 @@ libcrypt_OUT := $(top_builddir)libcrypt - - libcrypt_SRC-y := - libcrypt_SRC-$(UCLIBC_HAS_CRYPT_IMPL) += crypt.c des.c md5.c -+libcrypt_SRC-$(UCLIBC_HAS_SHA256_CRYPT_IMPL) += sha256.c sha256-crypt.c - libcrypt_SRC-$(UCLIBC_HAS_SHA512_CRYPT_IMPL) += sha512.c sha512-crypt.c - libcrypt_SRC-$(UCLIBC_HAS_CRYPT_STUB) += crypt_stub.c - -diff --git a/libcrypt/crypt.c b/libcrypt/crypt.c -index 2bb2c33..15e3b29 100644 ---- a/libcrypt/crypt.c -+++ b/libcrypt/crypt.c -@@ -21,6 +21,9 @@ static const struct { - const crypt_impl_f crypt_impl; - } crypt_impl_tab[] = { - { "$1$", __md5_crypt }, -+#ifdef __UCLIBC_HAS_SHA256_CRYPT_IMPL__ -+ { "$5$", __sha256_crypt }, -+#endif - #ifdef __UCLIBC_HAS_SHA512_CRYPT_IMPL__ - { "$6$", __sha512_crypt }, - #endif -diff --git a/libcrypt/libcrypt.h b/libcrypt/libcrypt.h -index fcad6ae..67733d1 100644 ---- a/libcrypt/libcrypt.h -+++ b/libcrypt/libcrypt.h -@@ -9,9 +9,11 @@ - #define __LIBCRYPT_H__ - - extern char *__md5_crypt(const unsigned char *pw, const unsigned char *salt) attribute_hidden; -+extern char *__sha256_crypt(const unsigned char *pw, const unsigned char *salt) attribute_hidden; - extern char *__sha512_crypt(const unsigned char *pw, const unsigned char *salt) attribute_hidden; - extern char *__des_crypt(const unsigned char *pw, const unsigned char *salt) attribute_hidden; - -+extern char *__sha256_crypt_r (const char *key, const char *salt, char *buffer, int buflen) attribute_hidden; - extern char *__sha512_crypt_r (const char *key, const char *salt, char *buffer, int buflen) attribute_hidden; - - /* shut up gcc-4.x signed warnings */ -diff --git a/libcrypt/sha256-crypt.c b/libcrypt/sha256-crypt.c -new file mode 100644 -index 0000000..4422148 ---- /dev/null -+++ b/libcrypt/sha256-crypt.c -@@ -0,0 +1,326 @@ -+/* One way encryption based on SHA256 sum. -+ Copyright (C) 2007, 2009 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ Contributed by Ulrich Drepper , 2007. -+ -+ 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, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "sha256.h" -+#include "libcrypt.h" -+ -+/* Define our magic string to mark salt for SHA256 "encryption" -+ replacement. */ -+static const char sha256_salt_prefix[] = "$5$"; -+ -+/* Prefix for optional rounds specification. */ -+static const char sha256_rounds_prefix[] = "rounds="; -+ -+/* Maximum salt string length. */ -+#define SALT_LEN_MAX 16 -+/* Default number of rounds if not explicitly specified. */ -+#define ROUNDS_DEFAULT 5000 -+/* Minimum number of rounds. */ -+#define ROUNDS_MIN 1000 -+/* Maximum number of rounds. */ -+#define ROUNDS_MAX 999999999 -+ -+/* Table with characters for base64 transformation. */ -+static const char b64t[64] = -+"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; -+ -+#define B64_FROM_24BIT(b2, b1, b0, steps) \ -+ { \ -+ int n = (steps); \ -+ unsigned int w = ((b2) << 16) | ((b1) << 8) | (b0); \ -+ while (n-- > 0 && buflen > 0) \ -+ { \ -+ *cp++ = b64t[w & 0x3f]; \ -+ --buflen; \ -+ w >>= 6; \ -+ } \ -+ } -+ -+char * -+__sha256_crypt_r (const char *key, -+ const char *salt, -+ char *buffer, -+ int buflen) -+{ -+ unsigned char alt_result[32] -+ __attribute__ ((__aligned__ (__alignof__ (uint32_t)))); -+ unsigned char temp_result[32] -+ __attribute__ ((__aligned__ (__alignof__ (uint32_t)))); -+ size_t salt_len; -+ size_t key_len; -+ size_t cnt; -+ char *cp; -+ char *copied_key = NULL; -+ char *copied_salt = NULL; -+ char *p_bytes; -+ char *s_bytes; -+ /* Default number of rounds. */ -+ size_t rounds = ROUNDS_DEFAULT; -+ bool rounds_custom = false; -+ -+ /* Find beginning of salt string. The prefix should normally always -+ be present. Just in case it is not. */ -+ if (strncmp (sha256_salt_prefix, salt, sizeof (sha256_salt_prefix) - 1) == 0) -+ /* Skip salt prefix. */ -+ salt += sizeof (sha256_salt_prefix) - 1; -+ -+ if (strncmp (salt, sha256_rounds_prefix, sizeof (sha256_rounds_prefix) - 1) -+ == 0) -+ { -+ const char *num = salt + sizeof (sha256_rounds_prefix) - 1; -+ char *endp; -+ unsigned long int srounds = strtoul (num, &endp, 10); -+ if (*endp == '$') -+ { -+ salt = endp + 1; -+ rounds = MAX (ROUNDS_MIN, MIN (srounds, ROUNDS_MAX)); -+ rounds_custom = true; -+ } -+ } -+ -+ salt_len = MIN (strcspn (salt, "$"), SALT_LEN_MAX); -+ key_len = strlen (key); -+ -+ if ((key - (char *) 0) % __alignof__ (uint32_t) != 0) -+ { -+ char *tmp = (char *) alloca (key_len + __alignof__ (uint32_t)); -+ key = copied_key = -+ memcpy (tmp + __alignof__ (uint32_t) -+ - (tmp - (char *) 0) % __alignof__ (uint32_t), -+ key, key_len); -+ assert ((key - (char *) 0) % __alignof__ (uint32_t) == 0); -+ } -+ -+ if ((salt - (char *) 0) % __alignof__ (uint32_t) != 0) -+ { -+ char *tmp = (char *) alloca (salt_len + __alignof__ (uint32_t)); -+ salt = copied_salt = -+ memcpy (tmp + __alignof__ (uint32_t) -+ - (tmp - (char *) 0) % __alignof__ (uint32_t), -+ salt, salt_len); -+ assert ((salt - (char *) 0) % __alignof__ (uint32_t) == 0); -+ } -+ -+ struct sha256_ctx ctx; -+ struct sha256_ctx alt_ctx; -+ -+ /* Prepare for the real work. */ -+ __sha256_init_ctx (&ctx); -+ -+ /* Add the key string. */ -+ __sha256_process_bytes (key, key_len, &ctx); -+ -+ /* The last part is the salt string. This must be at most 16 -+ characters and it ends at the first `$' character. */ -+ __sha256_process_bytes (salt, salt_len, &ctx); -+ -+ -+ /* Compute alternate SHA256 sum with input KEY, SALT, and KEY. The -+ final result will be added to the first context. */ -+ __sha256_init_ctx (&alt_ctx); -+ -+ /* Add key. */ -+ __sha256_process_bytes (key, key_len, &alt_ctx); -+ -+ /* Add salt. */ -+ __sha256_process_bytes (salt, salt_len, &alt_ctx); -+ -+ /* Add key again. */ -+ __sha256_process_bytes (key, key_len, &alt_ctx); -+ -+ /* Now get result of this (32 bytes) and add it to the other -+ context. */ -+ __sha256_finish_ctx (&alt_ctx, alt_result); -+ -+ /* Add for any character in the key one byte of the alternate sum. */ -+ for (cnt = key_len; cnt > 32; cnt -= 32) -+ __sha256_process_bytes (alt_result, 32, &ctx); -+ __sha256_process_bytes (alt_result, cnt, &ctx); -+ -+ /* Take the binary representation of the length of the key and for every -+ 1 add the alternate sum, for every 0 the key. */ -+ for (cnt = key_len; cnt > 0; cnt >>= 1) -+ if ((cnt & 1) != 0) -+ __sha256_process_bytes (alt_result, 32, &ctx); -+ else -+ __sha256_process_bytes (key, key_len, &ctx); -+ -+ /* Create intermediate result. */ -+ __sha256_finish_ctx (&ctx, alt_result); -+ -+ /* Start computation of P byte sequence. */ -+ __sha256_init_ctx (&alt_ctx); -+ -+ /* For every character in the password add the entire password. */ -+ for (cnt = 0; cnt < key_len; ++cnt) -+ __sha256_process_bytes (key, key_len, &alt_ctx); -+ -+ /* Finish the digest. */ -+ __sha256_finish_ctx (&alt_ctx, temp_result); -+ -+ /* Create byte sequence P. */ -+ cp = p_bytes = alloca (key_len); -+ for (cnt = key_len; cnt >= 32; cnt -= 32) -+ cp = mempcpy (cp, temp_result, 32); -+ memcpy (cp, temp_result, cnt); -+ -+ /* Start computation of S byte sequence. */ -+ __sha256_init_ctx (&alt_ctx); -+ -+ /* For every character in the password add the entire password. */ -+ for (cnt = 0; cnt < 16 + alt_result[0]; ++cnt) -+ __sha256_process_bytes (salt, salt_len, &alt_ctx); -+ -+ /* Finish the digest. */ -+ __sha256_finish_ctx (&alt_ctx, temp_result); -+ -+ /* Create byte sequence S. */ -+ cp = s_bytes = alloca (salt_len); -+ for (cnt = salt_len; cnt >= 32; cnt -= 32) -+ cp = mempcpy (cp, temp_result, 32); -+ memcpy (cp, temp_result, cnt); -+ -+ /* Repeatedly run the collected hash value through SHA256 to burn -+ CPU cycles. */ -+ for (cnt = 0; cnt < rounds; ++cnt) -+ { -+ /* New context. */ -+ __sha256_init_ctx (&ctx); -+ -+ /* Add key or last result. */ -+ if ((cnt & 1) != 0) -+ __sha256_process_bytes (p_bytes, key_len, &ctx); -+ else -+ __sha256_process_bytes (alt_result, 32, &ctx); -+ -+ /* Add salt for numbers not divisible by 3. */ -+ if (cnt % 3 != 0) -+ __sha256_process_bytes (s_bytes, salt_len, &ctx); -+ -+ /* Add key for numbers not divisible by 7. */ -+ if (cnt % 7 != 0) -+ __sha256_process_bytes (p_bytes, key_len, &ctx); -+ -+ /* Add key or last result. */ -+ if ((cnt & 1) != 0) -+ __sha256_process_bytes (alt_result, 32, &ctx); -+ else -+ __sha256_process_bytes (p_bytes, key_len, &ctx); -+ -+ /* Create intermediate result. */ -+ __sha256_finish_ctx (&ctx, alt_result); -+ } -+ -+ /* Now we can construct the result string. It consists of three -+ parts. */ -+ cp = stpncpy (buffer, sha256_salt_prefix, MAX (0, buflen)); -+ buflen -= sizeof (sha256_salt_prefix) - 1; -+ -+ if (rounds_custom) -+ { -+ int n = snprintf (cp, MAX (0, buflen), "%s%zu$", -+ sha256_rounds_prefix, rounds); -+ cp += n; -+ buflen -= n; -+ } -+ -+ cp = stpncpy (cp, salt, MIN ((size_t) MAX (0, buflen), salt_len)); -+ buflen -= MIN ((size_t) MAX (0, buflen), salt_len); -+ -+ if (buflen > 0) -+ { -+ *cp++ = '$'; -+ --buflen; -+ } -+ -+ B64_FROM_24BIT (alt_result[0], alt_result[10], alt_result[20], 4); -+ B64_FROM_24BIT (alt_result[21], alt_result[1], alt_result[11], 4); -+ B64_FROM_24BIT (alt_result[12], alt_result[22], alt_result[2], 4); -+ B64_FROM_24BIT (alt_result[3], alt_result[13], alt_result[23], 4); -+ B64_FROM_24BIT (alt_result[24], alt_result[4], alt_result[14], 4); -+ B64_FROM_24BIT (alt_result[15], alt_result[25], alt_result[5], 4); -+ B64_FROM_24BIT (alt_result[6], alt_result[16], alt_result[26], 4); -+ B64_FROM_24BIT (alt_result[27], alt_result[7], alt_result[17], 4); -+ B64_FROM_24BIT (alt_result[18], alt_result[28], alt_result[8], 4); -+ B64_FROM_24BIT (alt_result[9], alt_result[19], alt_result[29], 4); -+ B64_FROM_24BIT (0, alt_result[31], alt_result[30], 3); -+ if (buflen <= 0) -+ { -+ __set_errno (ERANGE); -+ buffer = NULL; -+ } -+ else -+ *cp = '\0'; /* Terminate the string. */ -+ -+ /* Clear the buffer for the intermediate result so that people -+ attaching to processes or reading core dumps cannot get any -+ information. We do it in this way to clear correct_words[] -+ inside the SHA256 implementation as well. */ -+ __sha256_init_ctx (&ctx); -+ __sha256_finish_ctx (&ctx, alt_result); -+ memset (&ctx, '\0', sizeof (ctx)); -+ memset (&alt_ctx, '\0', sizeof (alt_ctx)); -+ -+ memset (temp_result, '\0', sizeof (temp_result)); -+ memset (p_bytes, '\0', key_len); -+ memset (s_bytes, '\0', salt_len); -+ if (copied_key != NULL) -+ memset (copied_key, '\0', key_len); -+ if (copied_salt != NULL) -+ memset (copied_salt, '\0', salt_len); -+ -+ return buffer; -+} -+ -+static char *buffer; -+ -+/* This entry point is equivalent to the `crypt' function in Unix -+ libcs. */ -+char * -+__sha256_crypt (const unsigned char *key, const unsigned char *salt) -+{ -+ /* We don't want to have an arbitrary limit in the size of the -+ password. We can compute an upper bound for the size of the -+ result in advance and so we can prepare the buffer we pass to -+ `sha256_crypt_r'. */ -+ static int buflen; -+ int needed = (sizeof (sha256_salt_prefix) - 1 -+ + sizeof (sha256_rounds_prefix) + 9 + 1 -+ + strlen (salt) + 1 + 43 + 1); -+ -+ if (buflen < needed) -+ { -+ char *new_buffer = (char *) realloc (buffer, needed); -+ if (new_buffer == NULL) -+ return NULL; -+ -+ buffer = new_buffer; -+ buflen = needed; -+ } -+ -+ return __sha256_crypt_r ((const char *) key, (const char *) salt, buffer, buflen); -+} -diff --git a/libcrypt/sha256.c b/libcrypt/sha256.c -new file mode 100644 -index 0000000..e652a67 ---- /dev/null -+++ b/libcrypt/sha256.c -@@ -0,0 +1,294 @@ -+/* Functions to compute SHA256 message digest of files or memory blocks. -+ according to the definition of SHA256 in FIPS 180-2. -+ Copyright (C) 2007 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, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. */ -+ -+/* Written by Ulrich Drepper , 2007. */ -+ -+#ifdef HAVE_CONFIG_H -+# include -+#endif -+ -+#include -+#include -+#include -+#include -+ -+#include "sha256.h" -+ -+#if __BYTE_ORDER == __LITTLE_ENDIAN -+# ifdef _LIBC -+# include -+# define SWAP(n) bswap_32 (n) -+# else -+# define SWAP(n) \ -+ (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) -+# endif -+#else -+# define SWAP(n) (n) -+#endif -+ -+ -+/* This array contains the bytes used to pad the buffer to the next -+ 64-byte boundary. (FIPS 180-2:5.1.1) */ -+static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ }; -+ -+ -+/* Constants for SHA256 from FIPS 180-2:4.2.2. */ -+static const uint32_t K[64] = -+ { -+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, -+ 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, -+ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, -+ 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, -+ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, -+ 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, -+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, -+ 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, -+ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, -+ 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, -+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, -+ 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, -+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, -+ 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, -+ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, -+ 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 -+ }; -+ -+ -+/* Process LEN bytes of BUFFER, accumulating context into CTX. -+ It is assumed that LEN % 64 == 0. */ -+static void -+sha256_process_block (const void *buffer, size_t len, struct sha256_ctx *ctx) -+{ -+ const uint32_t *words = buffer; -+ size_t nwords = len / sizeof (uint32_t); -+ uint32_t a = ctx->H[0]; -+ uint32_t b = ctx->H[1]; -+ uint32_t c = ctx->H[2]; -+ uint32_t d = ctx->H[3]; -+ uint32_t e = ctx->H[4]; -+ uint32_t f = ctx->H[5]; -+ uint32_t g = ctx->H[6]; -+ uint32_t h = ctx->H[7]; -+ -+ /* First increment the byte count. FIPS 180-2 specifies the possible -+ length of the file up to 2^64 bits. Here we only compute the -+ number of bytes. Do a double word increment. */ -+ ctx->total[0] += len; -+ if (ctx->total[0] < len) -+ ++ctx->total[1]; -+ -+ /* Process all bytes in the buffer with 64 bytes in each round of -+ the loop. */ -+ while (nwords > 0) -+ { -+ uint32_t W[64]; -+ uint32_t a_save = a; -+ uint32_t b_save = b; -+ uint32_t c_save = c; -+ uint32_t d_save = d; -+ uint32_t e_save = e; -+ uint32_t f_save = f; -+ uint32_t g_save = g; -+ uint32_t h_save = h; -+ -+ /* Operators defined in FIPS 180-2:4.1.2. */ -+#define Ch(x, y, z) ((x & y) ^ (~x & z)) -+#define Maj(x, y, z) ((x & y) ^ (x & z) ^ (y & z)) -+#define S0(x) (CYCLIC (x, 2) ^ CYCLIC (x, 13) ^ CYCLIC (x, 22)) -+#define S1(x) (CYCLIC (x, 6) ^ CYCLIC (x, 11) ^ CYCLIC (x, 25)) -+#define R0(x) (CYCLIC (x, 7) ^ CYCLIC (x, 18) ^ (x >> 3)) -+#define R1(x) (CYCLIC (x, 17) ^ CYCLIC (x, 19) ^ (x >> 10)) -+ -+ /* It is unfortunate that C does not provide an operator for -+ cyclic rotation. Hope the C compiler is smart enough. */ -+#define CYCLIC(w, s) ((w >> s) | (w << (32 - s))) -+ -+ /* Compute the message schedule according to FIPS 180-2:6.2.2 step 2. */ -+ for (unsigned int t = 0; t < 16; ++t) -+ { -+ W[t] = SWAP (*words); -+ ++words; -+ } -+ for (unsigned int t = 16; t < 64; ++t) -+ W[t] = R1 (W[t - 2]) + W[t - 7] + R0 (W[t - 15]) + W[t - 16]; -+ -+ /* The actual computation according to FIPS 180-2:6.2.2 step 3. */ -+ for (unsigned int t = 0; t < 64; ++t) -+ { -+ uint32_t T1 = h + S1 (e) + Ch (e, f, g) + K[t] + W[t]; -+ uint32_t T2 = S0 (a) + Maj (a, b, c); -+ h = g; -+ g = f; -+ f = e; -+ e = d + T1; -+ d = c; -+ c = b; -+ b = a; -+ a = T1 + T2; -+ } -+ -+ /* Add the starting values of the context according to FIPS 180-2:6.2.2 -+ step 4. */ -+ a += a_save; -+ b += b_save; -+ c += c_save; -+ d += d_save; -+ e += e_save; -+ f += f_save; -+ g += g_save; -+ h += h_save; -+ -+ /* Prepare for the next round. */ -+ nwords -= 16; -+ } -+ -+ /* Put checksum in context given as argument. */ -+ ctx->H[0] = a; -+ ctx->H[1] = b; -+ ctx->H[2] = c; -+ ctx->H[3] = d; -+ ctx->H[4] = e; -+ ctx->H[5] = f; -+ ctx->H[6] = g; -+ ctx->H[7] = h; -+} -+ -+ -+/* Initialize structure containing state of computation. -+ (FIPS 180-2:5.3.2) */ -+void -+__sha256_init_ctx (struct sha256_ctx *ctx) -+{ -+ ctx->H[0] = 0x6a09e667; -+ ctx->H[1] = 0xbb67ae85; -+ ctx->H[2] = 0x3c6ef372; -+ ctx->H[3] = 0xa54ff53a; -+ ctx->H[4] = 0x510e527f; -+ ctx->H[5] = 0x9b05688c; -+ ctx->H[6] = 0x1f83d9ab; -+ ctx->H[7] = 0x5be0cd19; -+ -+ ctx->total[0] = ctx->total[1] = 0; -+ ctx->buflen = 0; -+} -+ -+ -+/* Process the remaining bytes in the internal buffer and the usual -+ prolog according to the standard and write the result to RESBUF. -+ -+ IMPORTANT: On some systems it is required that RESBUF is correctly -+ aligned for a 32 bits value. */ -+void * -+__sha256_finish_ctx (struct sha256_ctx *ctx, void *resbuf) -+{ -+ /* Take yet unprocessed bytes into account. */ -+ uint32_t bytes = ctx->buflen; -+ size_t pad; -+ -+ /* Now count remaining bytes. */ -+ ctx->total[0] += bytes; -+ if (ctx->total[0] < bytes) -+ ++ctx->total[1]; -+ -+ pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes; -+ memcpy (&ctx->buffer[bytes], fillbuf, pad); -+ -+ /* Put the 64-bit file length in *bits* at the end of the buffer. */ -+ *(uint32_t *) &ctx->buffer[bytes + pad + 4] = SWAP (ctx->total[0] << 3); -+ *(uint32_t *) &ctx->buffer[bytes + pad] = SWAP ((ctx->total[1] << 3) | -+ (ctx->total[0] >> 29)); -+ -+ /* Process last bytes. */ -+ sha256_process_block (ctx->buffer, bytes + pad + 8, ctx); -+ -+ /* Put result from CTX in first 32 bytes following RESBUF. */ -+ for (unsigned int i = 0; i < 8; ++i) -+ ((uint32_t *) resbuf)[i] = SWAP (ctx->H[i]); -+ -+ return resbuf; -+} -+ -+ -+void -+__sha256_process_bytes (const void *buffer, size_t len, struct sha256_ctx *ctx) -+{ -+ /* When we already have some bits in our internal buffer concatenate -+ both inputs first. */ -+ if (ctx->buflen != 0) -+ { -+ size_t left_over = ctx->buflen; -+ size_t add = 128 - left_over > len ? len : 128 - left_over; -+ -+ memcpy (&ctx->buffer[left_over], buffer, add); -+ ctx->buflen += add; -+ -+ if (ctx->buflen > 64) -+ { -+ sha256_process_block (ctx->buffer, ctx->buflen & ~63, ctx); -+ -+ ctx->buflen &= 63; -+ /* The regions in the following copy operation cannot overlap. */ -+ memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63], -+ ctx->buflen); -+ } -+ -+ buffer = (const char *) buffer + add; -+ len -= add; -+ } -+ -+ /* Process available complete blocks. */ -+ if (len >= 64) -+ { -+#if __GNUC__ >= 2 -+# define UNALIGNED_P(p) (((uintptr_t) p) % __alignof__ (uint32_t) != 0) -+#else -+# define UNALIGNED_P(p) (((uintptr_t) p) % sizeof (uint32_t) != 0) -+#endif -+ if (UNALIGNED_P (buffer)) -+ while (len > 64) -+ { -+ sha256_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx); -+ buffer = (const char *) buffer + 64; -+ len -= 64; -+ } -+ else -+ { -+ sha256_process_block (buffer, len & ~63, ctx); -+ buffer = (const char *) buffer + (len & ~63); -+ len &= 63; -+ } -+ } -+ -+ /* Move remaining bytes into internal buffer. */ -+ if (len > 0) -+ { -+ size_t left_over = ctx->buflen; -+ -+ memcpy (&ctx->buffer[left_over], buffer, len); -+ left_over += len; -+ if (left_over >= 64) -+ { -+ sha256_process_block (ctx->buffer, 64, ctx); -+ left_over -= 64; -+ memcpy (ctx->buffer, &ctx->buffer[64], left_over); -+ } -+ ctx->buflen = left_over; -+ } -+} -diff --git a/libcrypt/sha256.h b/libcrypt/sha256.h -new file mode 100644 -index 0000000..291674f ---- /dev/null -+++ b/libcrypt/sha256.h -@@ -0,0 +1,58 @@ -+/* Declaration of functions and data types used for SHA256 sum computing -+ library functions. -+ Copyright (C) 2007 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, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. */ -+ -+#ifndef _SHA256_H -+#define _SHA256_H 1 -+ -+#include -+#include -+#include -+ -+ -+/* Structure to save state of computation between the single steps. */ -+struct sha256_ctx -+{ -+ uint32_t H[8]; -+ -+ uint32_t total[2]; -+ uint32_t buflen; -+ char buffer[128] __attribute__ ((__aligned__ (__alignof__ (uint32_t)))); -+}; -+ -+/* Initialize structure containing state of computation. -+ (FIPS 180-2: 5.3.2) */ -+extern void __sha256_init_ctx (struct sha256_ctx *ctx) attribute_hidden; -+ -+/* Starting with the result of former calls of this function (or the -+ initialization function update the context for the next LEN bytes -+ starting at BUFFER. -+ It is NOT required that LEN is a multiple of 64. */ -+extern void __sha256_process_bytes (const void *buffer, size_t len, -+ struct sha256_ctx *ctx) attribute_hidden; -+ -+/* Process the remaining bytes in the buffer and put result from CTX -+ in first 32 bytes following RESBUF. -+ -+ IMPORTANT: On some systems it is required that RESBUF is correctly -+ aligned for a 32 bits value. */ -+extern void *__sha256_finish_ctx (struct sha256_ctx *ctx, void *resbuf) -+ attribute_hidden; -+ -+#endif /* sha256.h */ --- -1.7.7.3 - diff --git a/main/libc0.9.32/uclibc-epoll_pwait-hack.patch b/main/libc0.9.32/uclibc-epoll_pwait-hack.patch deleted file mode 100644 index 7e28056848..0000000000 --- a/main/libc0.9.32/uclibc-epoll_pwait-hack.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff --git a/libc/sysdeps/linux/common/epoll.c b/libc/sysdeps/linux/common/epoll.c -index 85b0cfd..8fff9e6 100644 ---- a/libc/sysdeps/linux/common/epoll.c -+++ b/libc/sysdeps/linux/common/epoll.c -@@ -67,12 +67,13 @@ extern __typeof(epoll_pwait) __libc_epoll_pwait; - int __libc_epoll_pwait(int epfd, struct epoll_event *events, int maxevents, - int timeout, const sigset_t *set) - { -+ int n = _NSIG / 8; - if (SINGLE_THREAD_P) -- return INLINE_SYSCALL(epoll_pwait, 6, epfd, events, maxevents, timeout, set, _NSIG / 8); -+ return INLINE_SYSCALL(epoll_pwait, 6, epfd, events, maxevents, timeout, set, n); - # ifdef __UCLIBC_HAS_THREADS_NATIVE__ - else { - int oldtype = LIBC_CANCEL_ASYNC (); -- int result = INLINE_SYSCALL(epoll_pwait, 6, epfd, events, maxevents, timeout, set, _NSIG / 8); -+ int result = INLINE_SYSCALL(epoll_pwait, 6, epfd, events, maxevents, timeout, set, n); - LIBC_CANCEL_RESET (oldtype); - return result; - } diff --git a/main/libc0.9.32/uclibc-eventfd.patch b/main/libc0.9.32/uclibc-eventfd.patch deleted file mode 100644 index 1525366c34..0000000000 --- a/main/libc0.9.32/uclibc-eventfd.patch +++ /dev/null @@ -1,141 +0,0 @@ -From: jc@eclis.ch -To: uclibc@uclibc.org -Subject: [PATCH 1/1] Add eventfd support. -Date: Mon, 24 Oct 2011 19:07:43 +0200 -Message-Id: <1319476064-32442-1-git-send-email-jc@eclis.ch> -X-Mailer: git-send-email 1.7.2.5 -X-BeenThere: uclibc@uclibc.org -X-Mailman-Version: 2.1.14 -Precedence: list -List-Id: "Discussion and development of uClibc \(the embedded C library\)" - -List-Unsubscribe: , - -List-Archive: -List-Post: -List-Help: -List-Subscribe: , - -MIME-Version: 1.0 -Content-Type: text/plain; charset="us-ascii" -Content-Transfer-Encoding: 7bit -Errors-To: uclibc-bounces@uclibc.org -Sender: uclibc-bounces@uclibc.org - -From: Jean-Christian de Rivaz - -Hello, - -I whould like to share this simple patch that add the eventfd call to -uClibc. Please review so it can be accepted to be merged. - -Jean-Christian - -Signed-off-by: Jean-Christian de Rivaz ---- - libc/sysdeps/linux/common/Makefile.in | 3 +- - libc/sysdeps/linux/common/eventfd.c | 18 +++++++++++ - libc/sysdeps/linux/common/sys/eventfd.h | 48 +++++++++++++++++++++++++++++++ - 3 files changed, 68 insertions(+), 1 deletions(-) - create mode 100644 libc/sysdeps/linux/common/eventfd.c - create mode 100644 libc/sysdeps/linux/common/sys/eventfd.h - -diff --git a/libc/sysdeps/linux/common/Makefile.in b/libc/sysdeps/linux/common/Makefile.in -index 8f936ff..63f3f6f 100644 ---- a/libc/sysdeps/linux/common/Makefile.in -+++ b/libc/sysdeps/linux/common/Makefile.in -@@ -24,7 +24,8 @@ CSRC-$(UCLIBC_LINUX_SPECIFIC) += capget.c capset.c inotify.c ioperm.c iopl.c \ - remap_file_pages.c sched_getaffinity.c sched_setaffinity.c \ - sendfile64.c sendfile.c setfsgid.c setfsuid.c setresuid.c \ - splice.c vmsplice.c tee.c signalfd.c swapoff.c swapon.c \ -- sync_file_range.c sysctl.c sysinfo.c timerfd.c uselib.c vhangup.c -+ sync_file_range.c sysctl.c sysinfo.c eventfd.c timerfd.c uselib.c \ -+ vhangup.c - # NPTL needs these internally: madvise.c - CSRC-$(findstring y,$(UCLIBC_LINUX_SPECIFIC)$(UCLIBC_HAS_THREADS_NATIVE)) += madvise.c - ifeq ($(UCLIBC_HAS_THREADS_NATIVE),y) -diff --git a/libc/sysdeps/linux/common/eventfd.c b/libc/sysdeps/linux/common/eventfd.c -new file mode 100644 -index 0000000..cc3f3f0 ---- /dev/null -+++ b/libc/sysdeps/linux/common/eventfd.c -@@ -0,0 +1,18 @@ -+/* vi: set sw=4 ts=4: */ -+/* -+ * eventfd() for uClibc -+ * -+ * Copyright (C) 2011 Jean-Christian de Rivaz -+ * -+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. -+ */ -+ -+#include -+#include -+ -+/* -+ * eventfd() -+ */ -+#ifdef __NR_eventfd -+_syscall2(int, eventfd, int, count, int, flags) -+#endif -diff --git a/libc/sysdeps/linux/common/sys/eventfd.h b/libc/sysdeps/linux/common/sys/eventfd.h -new file mode 100644 -index 0000000..311f803 ---- /dev/null -+++ b/libc/sysdeps/linux/common/sys/eventfd.h -@@ -0,0 +1,48 @@ -+/* Copyright (C) 2007, 2008, 2009 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, write to the Free -+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -+ 02111-1307 USA. */ -+ -+#ifndef _SYS_EVENTFD_H -+#define _SYS_EVENTFD_H 1 -+ -+#include -+ -+ -+/* Type for event counter. */ -+typedef uint64_t eventfd_t; -+ -+/* Flags for signalfd. */ -+enum -+ { -+ EFD_SEMAPHORE = 1, -+#define EFD_SEMAPHORE EFD_SEMAPHORE -+ EFD_CLOEXEC = 02000000, -+#define EFD_CLOEXEC EFD_CLOEXEC -+ EFD_NONBLOCK = 04000 -+#define EFD_NONBLOCK EFD_NONBLOCK -+ }; -+ -+ -+__BEGIN_DECLS -+ -+/* Return file descriptor for generic event channel. Set initial -+ value to COUNT. */ -+extern int eventfd (int __count, int __flags) __THROW; -+ -+__END_DECLS -+ -+#endif /* sys/eventfd.h */ --- -1.7.2.5 - -_______________________________________________ -uClibc mailing list -uClibc@uclibc.org -http://lists.busybox.net/mailman/listinfo/uclibc diff --git a/main/libc0.9.32/uclibc-resolv-cname-fix.diff b/main/libc0.9.32/uclibc-resolv-cname-fix.diff deleted file mode 100644 index cf5e777f7e..0000000000 --- a/main/libc0.9.32/uclibc-resolv-cname-fix.diff +++ /dev/null @@ -1,19 +0,0 @@ -diff --git a/libc/inet/resolv.c b/libc/inet/resolv.c -index 1e394d4..03d68fe 100644 ---- a/libc/inet/resolv.c -+++ b/libc/inet/resolv.c -@@ -3099,11 +3099,9 @@ int res_query(const char *dname, int class, int type, - - free(a.dotted); - -- if (a.atype == type) { /* CNAME */ -- if (i > anslen) -- i = anslen; -- memcpy(answer, packet, i); -- } -+ i = MIN(anslen, i); -+ memcpy(answer, packet, i); -+ - free(packet); - return i; - } diff --git a/main/libc0.9.32/uclibc-resolv-fix-memory-leak.patch b/main/libc0.9.32/uclibc-resolv-fix-memory-leak.patch deleted file mode 100644 index 8738ba7745..0000000000 --- a/main/libc0.9.32/uclibc-resolv-fix-memory-leak.patch +++ /dev/null @@ -1,33 +0,0 @@ -From bb8d500a75a3050fe3198773ce7b07f669fe8f13 Mon Sep 17 00:00:00 2001 -From: Bernhard Reutner-Fischer -Date: Fri, 14 Oct 2011 15:47:42 +0000 -Subject: resolv: fix memory leak - -Timothy Holdener writes: -small memory leak in __dns_lookup() when the A record -in the DNS answer is preceded by one or more CNAME records. - -Signed-off-by: Bernhard Reutner-Fischer ---- -diff --git a/libc/inet/resolv.c b/libc/inet/resolv.c -index 38254bd..e415d30 100644 ---- a/libc/inet/resolv.c -+++ b/libc/inet/resolv.c -@@ -1507,6 +1507,7 @@ int attribute_hidden __dns_lookup(const char *name, - DPRINTF("Decoding answer at pos %d\n", pos); - - first_answer = 1; -+ a->dotted = NULL; - for (j = 0; j < h.ancount; j++) { - i = __decode_answer(packet, pos, packet_len, &ma); - if (i < 0) { -@@ -1523,6 +1524,7 @@ int attribute_hidden __dns_lookup(const char *name, - ma.buf = a->buf; - ma.buflen = a->buflen; - ma.add_count = a->add_count; -+ free(a->dotted); - memcpy(a, &ma, sizeof(ma)); - if (a->atype != T_SIG && (NULL == a->buf || (type != T_A && type != T_AAAA))) - break; --- -cgit v0.9.0.1-2-gef13 diff --git a/main/libc0.9.32/uclibc-ubacktrace-asneeded-fix.patch b/main/libc0.9.32/uclibc-ubacktrace-asneeded-fix.patch deleted file mode 100644 index 8fc06508eb..0000000000 --- a/main/libc0.9.32/uclibc-ubacktrace-asneeded-fix.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- uClibc-0.9.32-rc3.orig/Makefile.in -+++ uClibc-0.9.32-rc3/Makefile.in -@@ -336,7 +336,7 @@ - endif - ifeq ($(UCLIBC_HAS_BACKTRACE),y) - # Add the AS_NEEDED entry for libubacktrace.so -- if [ -f $(top_builddir)lib/libc.so -a -f $(PREFIX)$(RUNTIME_PREFIX)$(MULTILIB_DIR)/$(SHARED_LIBNAME) ] ; then \ -+ if [ -f $(top_builddir)lib/libc.so -a -f $(PREFIX)$(DEVEL_PREFIX)$(MULTILIB_DIR)/libc.so ] ; then \ - echo "GROUP ( $(UBACKTRACE_ASNEEDED) )" >> $(PREFIX)$(DEVEL_PREFIX)$(MULTILIB_DIR)/libc.so; \ - fi - endif ---- uClibc-0.9.32-rc3.orig/Rules.mak -+++ uClibc-0.9.32-rc3/Rules.mak -@@ -118,7 +118,7 @@ - - LIBC := libc - SHARED_LIBNAME := $(LIBC).so.$(ABI_VERSION) --UBACKTRACE_DSO := libubacktrace.so.$(MAJOR_VERSION) -+UBACKTRACE_DSO := libubacktrace.so.$(ABI_VERSION) - ifneq ($(findstring $(TARGET_ARCH) , hppa64 ia64 mips64 powerpc64 s390x sparc64 x86_64 ),) - UCLIBC_LDSO_NAME := ld64-uClibc - ARCH_NATIVE_BIT := 64 -- cgit v1.2.3