summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWaldemar Brodkorb <wbx@openadk.org>2015-01-26 11:22:42 -0600
committerWaldemar Brodkorb <wbx@openadk.org>2015-01-26 11:22:42 -0600
commitf03fbbb009c0df52d363719a592e2ac33577d9a6 (patch)
tree01671bcc5099ef304faf5ae86d58bbf32f9d0b7c
parent97dc8cb71d96a4bbfda0aa51740433d5da825b6a (diff)
parent92de8a5f6ffb1ff9f7183fd08d872aa098b75ae2 (diff)
merge upstream changes
-rw-r--r--ldso/ldso/xtensa/dl-startup.h20
-rw-r--r--ldso/ldso/xtensa/dl-sysdep.h24
-rw-r--r--ldso/ldso/xtensa/resolve.S7
-rw-r--r--libc/misc/dirent/opendir.c2
-rw-r--r--libc/stdlib/_atexit.c2
-rw-r--r--libc/stdlib/malloc-simple/alloc.c4
-rw-r--r--libc/stdlib/malloc-standard/malloc.c2
-rw-r--r--libc/stdlib/malloc-standard/malloc.h2
-rw-r--r--libc/stdlib/setenv.c11
-rw-r--r--libc/stdlib/unix_grantpt.c2
-rw-r--r--libc/string/_collate.c4
-rw-r--r--libc/sysdeps/linux/common/mknod.c2
-rw-r--r--libc/sysdeps/linux/common/sync_file_range.c5
-rw-r--r--libcrypt/crypt.c18
-rw-r--r--libpthread/nptl/sysdeps/unix/sysv/linux/arm/Makefile.arch3
-rw-r--r--test/nptl/Makefile.in2
-rw-r--r--test/nptl/tst-cancel7.c2
-rw-r--r--test/nptl/tst-exec4.c2
-rw-r--r--test/nptl/tst-mqueue7.c6
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;