diff options
author | Waldemar Brodkorb <wbx@openadk.org> | 2015-01-26 11:22:42 -0600 |
---|---|---|
committer | Waldemar Brodkorb <wbx@openadk.org> | 2015-01-26 11:22:42 -0600 |
commit | f03fbbb009c0df52d363719a592e2ac33577d9a6 (patch) | |
tree | 01671bcc5099ef304faf5ae86d58bbf32f9d0b7c | |
parent | 97dc8cb71d96a4bbfda0aa51740433d5da825b6a (diff) | |
parent | 92de8a5f6ffb1ff9f7183fd08d872aa098b75ae2 (diff) |
merge upstream changes
-rw-r--r-- | ldso/ldso/xtensa/dl-startup.h | 20 | ||||
-rw-r--r-- | ldso/ldso/xtensa/dl-sysdep.h | 24 | ||||
-rw-r--r-- | ldso/ldso/xtensa/resolve.S | 7 | ||||
-rw-r--r-- | libc/misc/dirent/opendir.c | 2 | ||||
-rw-r--r-- | libc/stdlib/_atexit.c | 2 | ||||
-rw-r--r-- | libc/stdlib/malloc-simple/alloc.c | 4 | ||||
-rw-r--r-- | libc/stdlib/malloc-standard/malloc.c | 2 | ||||
-rw-r--r-- | libc/stdlib/malloc-standard/malloc.h | 2 | ||||
-rw-r--r-- | libc/stdlib/setenv.c | 11 | ||||
-rw-r--r-- | libc/stdlib/unix_grantpt.c | 2 | ||||
-rw-r--r-- | libc/string/_collate.c | 4 | ||||
-rw-r--r-- | libc/sysdeps/linux/common/mknod.c | 2 | ||||
-rw-r--r-- | libc/sysdeps/linux/common/sync_file_range.c | 5 | ||||
-rw-r--r-- | libcrypt/crypt.c | 18 | ||||
-rw-r--r-- | libpthread/nptl/sysdeps/unix/sysv/linux/arm/Makefile.arch | 3 | ||||
-rw-r--r-- | test/nptl/Makefile.in | 2 | ||||
-rw-r--r-- | test/nptl/tst-cancel7.c | 2 | ||||
-rw-r--r-- | test/nptl/tst-exec4.c | 2 | ||||
-rw-r--r-- | test/nptl/tst-mqueue7.c | 6 |
19 files changed, 85 insertions, 35 deletions
diff --git a/ldso/ldso/xtensa/dl-startup.h b/ldso/ldso/xtensa/dl-startup.h index 70a6255d9..8fe54a3c7 100644 --- a/ldso/ldso/xtensa/dl-startup.h +++ b/ldso/ldso/xtensa/dl-startup.h @@ -83,6 +83,7 @@ do { \ unsigned long l_addr = tpnt->loadaddr; \ Elf32_Word relative_count; \ unsigned long rel_addr; \ + Elf32_Addr prev_got_start = 0, prev_got_end = 0; \ int x; \ \ got_loc = (xtensa_got_location *) \ @@ -93,7 +94,24 @@ do { \ got_start = got_loc[x].offset & ~(PAGE_SIZE - 1); \ got_end = ((got_loc[x].offset + got_loc[x].length + PAGE_SIZE - 1) \ & ~(PAGE_SIZE - 1)); \ - _dl_mprotect ((void *)(got_start + l_addr), got_end - got_start, \ + if (got_end >= prev_got_start && got_start <= prev_got_end) { \ + if (got_end > prev_got_end) \ + prev_got_end = got_end; \ + if (got_start < prev_got_start) \ + prev_got_start = got_start; \ + continue; \ + } else if (prev_got_start != prev_got_end) { \ + _dl_mprotect ((void *)(prev_got_start + l_addr), \ + prev_got_end - prev_got_start, \ + PROT_READ | PROT_WRITE | PROT_EXEC); \ + } \ + prev_got_start = got_start; \ + prev_got_end = got_end; \ + } \ +\ + if (prev_got_start != prev_got_end) { \ + _dl_mprotect ((void *)(prev_got_start + l_addr), \ + prev_got_end - prev_got_start, \ PROT_READ | PROT_WRITE | PROT_EXEC); \ } \ \ diff --git a/ldso/ldso/xtensa/dl-sysdep.h b/ldso/ldso/xtensa/dl-sysdep.h index 148de5b95..d308237d3 100644 --- a/ldso/ldso/xtensa/dl-sysdep.h +++ b/ldso/ldso/xtensa/dl-sysdep.h @@ -36,6 +36,7 @@ typedef struct xtensa_got_location_struct { do { \ xtensa_got_location *got_loc; \ Elf32_Addr l_addr = MODULE->loadaddr; \ + Elf32_Addr prev_got_start = 0, prev_got_end = 0; \ int x; \ \ got_loc = (xtensa_got_location *) \ @@ -47,7 +48,28 @@ typedef struct xtensa_got_location_struct { got_start = got_loc[x].offset & ~(PAGE_SIZE - 1); \ got_end = ((got_loc[x].offset + got_loc[x].length + PAGE_SIZE - 1) \ & ~(PAGE_SIZE - 1)); \ - _dl_mprotect ((void *)(got_start + l_addr) , got_end - got_start, \ + if (got_end >= prev_got_start && got_start <= prev_got_end) \ + { \ + if (got_end > prev_got_end) \ + prev_got_end = got_end; \ + if (got_start < prev_got_start) \ + prev_got_start = got_start; \ + continue; \ + } \ + else if (prev_got_start != prev_got_end) \ + { \ + _dl_mprotect ((void *)(prev_got_start + l_addr), \ + prev_got_end - prev_got_start, \ + PROT_READ | PROT_WRITE | PROT_EXEC); \ + } \ + prev_got_start = got_start; \ + prev_got_end = got_end; \ + } \ + \ + if (prev_got_start != prev_got_end) \ + { \ + _dl_mprotect ((void *)(prev_got_start + l_addr), \ + prev_got_end - prev_got_start, \ PROT_READ | PROT_WRITE | PROT_EXEC); \ } \ \ diff --git a/ldso/ldso/xtensa/resolve.S b/ldso/ldso/xtensa/resolve.S index d1ae8aa04..8061af247 100644 --- a/ldso/ldso/xtensa/resolve.S +++ b/ldso/ldso/xtensa/resolve.S @@ -31,13 +31,6 @@ .global _dl_linux_resolve .type _dl_linux_resolve, @function _dl_linux_resolve: - /* Fix up the high 2 bits of the return address. */ - movi a13, 0f - slli a12, a0, 2 -0: extui a13, a13, 30, 2 - ssai 2 - src a12, a13, a12 - /* Call the fixup function. */ movi a8, _dl_linux_resolver callx8 a8 diff --git a/libc/misc/dirent/opendir.c b/libc/misc/dirent/opendir.c index 66a5cc9e9..8af00f88c 100644 --- a/libc/misc/dirent/opendir.c +++ b/libc/misc/dirent/opendir.c @@ -110,7 +110,7 @@ DIR *opendir(const char *name) if (!ptr) { close_not_cancel_no_status(fd); - __set_errno(ENOMEM); + /* __set_errno(ENOMEM); */ } return ptr; } diff --git a/libc/stdlib/_atexit.c b/libc/stdlib/_atexit.c index ef6772fb5..3faa9f05f 100644 --- a/libc/stdlib/_atexit.c +++ b/libc/stdlib/_atexit.c @@ -257,7 +257,7 @@ struct exit_function attribute_hidden *__new_exitfn(void) efp = realloc(__exit_function_table, (__exit_slots+20)*sizeof(struct exit_function)); if (efp == NULL) { - __set_errno(ENOMEM); + /* __set_errno(ENOMEM); */ goto DONE; } __exit_function_table = efp; diff --git a/libc/stdlib/malloc-simple/alloc.c b/libc/stdlib/malloc-simple/alloc.c index 14f384632..a3c068a5b 100644 --- a/libc/stdlib/malloc-simple/alloc.c +++ b/libc/stdlib/malloc-simple/alloc.c @@ -42,8 +42,10 @@ void *malloc(size_t size) result = mmap((void *) 0, size + sizeof(size_t), PROT_READ | PROT_WRITE, MMAP_FLAGS, 0, 0); - if (result == MAP_FAILED) + if (result == MAP_FAILED) { + __set_errno(ENOMEM); return 0; + } * (size_t *) result = size; return(result + sizeof(size_t)); } diff --git a/libc/stdlib/malloc-standard/malloc.c b/libc/stdlib/malloc-standard/malloc.c index 3253ebda6..2abb5bbdd 100644 --- a/libc/stdlib/malloc-standard/malloc.c +++ b/libc/stdlib/malloc-standard/malloc.c @@ -744,7 +744,7 @@ static void* __malloc_alloc(size_t nb, mstate av) } /* catch all failure paths */ - errno = ENOMEM; + __set_errno(ENOMEM); return 0; } diff --git a/libc/stdlib/malloc-standard/malloc.h b/libc/stdlib/malloc-standard/malloc.h index d945627c6..1a4cc5a62 100644 --- a/libc/stdlib/malloc-standard/malloc.h +++ b/libc/stdlib/malloc-standard/malloc.h @@ -512,7 +512,7 @@ nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ #define checked_request2size(req, sz) \ if (REQUEST_OUT_OF_RANGE(req)) { \ - errno = ENOMEM; \ + __set_errno(ENOMEM); \ return 0; \ } \ (sz) = request2size(req); diff --git a/libc/stdlib/setenv.c b/libc/stdlib/setenv.c index 00e3f3d65..ecc302536 100644 --- a/libc/stdlib/setenv.c +++ b/libc/stdlib/setenv.c @@ -41,7 +41,7 @@ static char **last_environ; to reuse values once generated for a `setenv' call since we can never free the strings. [in uclibc, we do not] */ static int __add_to_environ(const char *name, const char *value, - int replace) + int replace) { register char **ep; register size_t size; @@ -76,7 +76,7 @@ static int __add_to_environ(const char *name, const char *value, /* We allocated this space; we can extend it. */ new_environ = realloc(last_environ, (size + 2) * sizeof(char *)); if (new_environ == NULL) { - __set_errno(ENOMEM); + /* __set_errno(ENOMEM); */ goto DONE; } if (__environ != last_environ) { @@ -97,7 +97,7 @@ static int __add_to_environ(const char *name, const char *value, var_val = malloc(namelen + 1 + vallen); if (var_val == NULL) { - __set_errno(ENOMEM); + /* __set_errno(ENOMEM); */ goto DONE; } memcpy(var_val, name, namelen); @@ -116,6 +116,11 @@ static int __add_to_environ(const char *name, const char *value, int setenv(const char *name, const char *value, int replace) { + if (name == NULL || *name == '\0' || strchr (name, '=') != NULL) { + __set_errno(EINVAL); + return -1; + } + /* NB: setenv("VAR", NULL, 1) inserts "VAR=" string */ return __add_to_environ(name, value ? value : "", replace); } diff --git a/libc/stdlib/unix_grantpt.c b/libc/stdlib/unix_grantpt.c index 5dbb7f52d..66c18c0ed 100644 --- a/libc/stdlib/unix_grantpt.c +++ b/libc/stdlib/unix_grantpt.c @@ -68,7 +68,7 @@ pts_name (int fd, char **pts, size_t buf_len) if (! new_buf) { rv = -1; - errno = ENOMEM; + /* __set_errno(ENOMEM); */ break; } buf = new_buf; diff --git a/libc/string/_collate.c b/libc/string/_collate.c index 2ebfb9317..93501b85e 100644 --- a/libc/string/_collate.c +++ b/libc/string/_collate.c @@ -367,7 +367,7 @@ static void next_weight(col_state_t *cs, int pass __LOCALE_PARAM ) if (cs->back_buf == cs->ibb) { /* was using internal buffer */ cs->bp = malloc(cs->bb_size + 128); if (!cs->bp) { - __set_errno(ENOMEM); + /* __set_errno(ENOMEM); */ #ifdef __UCLIBC_MJN3_ONLY__ #warning what to do here? #endif @@ -379,7 +379,7 @@ static void next_weight(col_state_t *cs, int pass __LOCALE_PARAM ) } else { cs->bp = realloc(cs->back_buf, cs->bb_size + 128); if (!cs->bp) { - __set_errno(ENOMEM); + /* __set_errno(ENOMEM); */ #ifdef __UCLIBC_MJN3_ONLY__ #warning what to do here? #endif diff --git a/libc/sysdeps/linux/common/mknod.c b/libc/sysdeps/linux/common/mknod.c index 794e19f57..e0c54e6e3 100644 --- a/libc/sysdeps/linux/common/mknod.c +++ b/libc/sysdeps/linux/common/mknod.c @@ -25,7 +25,7 @@ int mknod(const char *path, mode_t mode, dev_t dev) k_dev = (dev) & ((1ULL << 32) - 1); if (k_dev != dev) { - __set_errno (EINVAL); + __set_errno(EINVAL); return -1; } return INLINE_SYSCALL(mknod, 3, path, mode, (unsigned int)k_dev); diff --git a/libc/sysdeps/linux/common/sync_file_range.c b/libc/sysdeps/linux/common/sync_file_range.c index 8d4ed9210..6cd7e94d6 100644 --- a/libc/sysdeps/linux/common/sync_file_range.c +++ b/libc/sysdeps/linux/common/sync_file_range.c @@ -23,10 +23,13 @@ static int __NC(sync_file_range)(int fd, off64_t offset, off64_t nbytes, unsigned int flags) { # if defined __powerpc__ && __WORDSIZE == 64 - return INLINE_SYSCALL(sync_file_range, 4, fd, offset, nbytes, flags); + return INLINE_SYSCALL(sync_file_range, 4, fd, flags, offset, nbytes); # elif defined __mips__ && _MIPS_SIM == _ABIO32 return INLINE_SYSCALL(sync_file_range, 7, fd, 0, OFF64_HI_LO(offset), OFF64_HI_LO(nbytes), flags); +# elif defined __NR_sync_file_range2 + return INLINE_SYSCALL(sync_file_range, 6, fd, flags, + OFF64_HI_LO(offset), OFF64_HI_LO(nbytes)); # else return INLINE_SYSCALL(sync_file_range, 6, fd, OFF64_HI_LO(offset), OFF64_HI_LO(nbytes), flags); diff --git a/libcrypt/crypt.c b/libcrypt/crypt.c index f79c9fe8b..10061a073 100644 --- a/libcrypt/crypt.c +++ b/libcrypt/crypt.c @@ -14,17 +14,21 @@ char *crypt(const char *key, const char *salt) const unsigned char *ukey = (const unsigned char *)key; const unsigned char *usalt = (const unsigned char *)salt; - if (salt[0] == '$' && salt[2] == '$') { - if (*++salt == '1') - return __md5_crypt(ukey, usalt); + if (salt[0] == '$') { + if (salt[1] && salt[2] == '$') { /* no blowfish '2X' here ATM */ + if (*++salt == '1') + return __md5_crypt(ukey, usalt); #ifdef __UCLIBC_HAS_SHA256_CRYPT_IMPL__ - else if (*salt == '5') - return __sha256_crypt(ukey, usalt); + else if (*salt == '5') + return __sha256_crypt(ukey, usalt); #endif #ifdef __UCLIBC_HAS_SHA512_CRYPT_IMPL__ - else if (*salt == '6') - return __sha512_crypt(ukey, usalt); + else if (*salt == '6') + return __sha512_crypt(ukey, usalt); #endif + } + /* __set_errno(EINVAL);*/ /* ENOSYS might be misleading */ + return NULL; } return __des_crypt(ukey, usalt); } diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/Makefile.arch b/libpthread/nptl/sysdeps/unix/sysv/linux/arm/Makefile.arch index 861ae9e64..5522ce349 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/Makefile.arch +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/arm/Makefile.arch @@ -18,3 +18,6 @@ libc_linux_arch_SSRC-OMIT = waitpid.S # This macro should be alternatively implemented in THUMB # assembly. ASFLAGS-pt-vfork.S = -marm +CFLAGS-OMIT-pt-vfork.S = -mthumb +ASFLAGS-vfork.S = -marm +CFLAGS-OMIT-vfork.S = -mthumb diff --git a/test/nptl/Makefile.in b/test/nptl/Makefile.in index d20d2c1a5..700a464cf 100644 --- a/test/nptl/Makefile.in +++ b/test/nptl/Makefile.in @@ -207,7 +207,7 @@ tst-tls5: tst-tls5mod.so tst-cleanupx4 : tst-cleanup4aux.o tst-fini1: tst-fini1mod.so -OPTS_tst-cancel7 = --command ./tst-cancel7 +OPTS_tst-cancel7 = -c ./tst-cancel7 OPTS_tst-mqueue7 = -- ./tst-mqueue7 OPTS_tst-exec4 = ./tst-exec4 diff --git a/test/nptl/tst-cancel7.c b/test/nptl/tst-cancel7.c index 3bdfa9fa6..616c0a8ce 100644 --- a/test/nptl/tst-cancel7.c +++ b/test/nptl/tst-cancel7.c @@ -32,7 +32,7 @@ char pidfilename[] = "/tmp/tst-cancel7-XXXXXX"; static void * tf (void *arg) { - const char *args = " --direct --pidfile "; + const char *args = " -d -p "; char *cmd = alloca (strlen (command) + strlen (args) + strlen (pidfilename) + 1); diff --git a/test/nptl/tst-exec4.c b/test/nptl/tst-exec4.c index b5d290f77..1a4b88c69 100644 --- a/test/nptl/tst-exec4.c +++ b/test/nptl/tst-exec4.c @@ -51,7 +51,7 @@ tf (void *arg) char **argv = (char **) alloca ((n + 1) * sizeof (char *)); for (n = 0; oldargv[n + 1] != NULL; ++n) argv[n] = oldargv[n + 1]; - argv[n++] = (char *) "--direct"; + argv[n++] = (char *) "-d"; argv[n] = NULL; execv (argv[0], argv); diff --git a/test/nptl/tst-mqueue7.c b/test/nptl/tst-mqueue7.c index d1a652903..d3ea2b7c8 100644 --- a/test/nptl/tst-mqueue7.c +++ b/test/nptl/tst-mqueue7.c @@ -87,14 +87,14 @@ do_test (int argc, char **argv) return 1; } - char after_exec_arg[sizeof "--after-exec=0x" + sizeof (long) * 3]; + char after_exec_arg[sizeof "-a=0x" + sizeof (long) * 3]; snprintf (after_exec_arg, sizeof (after_exec_arg), - "--after-exec=0x%lx", (long) q); + "-a=0x%lx", (long) q); const char *newargv[argc + 2]; for (int i = 1; i < argc; ++i) newargv[i - 1] = argv[i]; - newargv[argc - 1] = "--direct"; + newargv[argc - 1] = "-d"; newargv[argc] = after_exec_arg; newargv[argc + 1] = NULL; |