浏览代码

merge upstream changes

Waldemar Brodkorb 9 年之前
父节点
当前提交
f03fbbb009

+ 19 - 1
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); \
 	} \
 \

+ 23 - 1
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);		      \
       }									      \
 									      \

+ 0 - 7
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

+ 1 - 1
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;
 }

+ 1 - 1
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;

+ 3 - 1
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));
 }

+ 1 - 1
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;
 }
 

+ 1 - 1
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);

+ 8 - 3
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);
 }

+ 1 - 1
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;

+ 2 - 2
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

+ 1 - 1
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);

+ 4 - 1
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);

+ 11 - 7
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);
 }

+ 3 - 0
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

+ 1 - 1
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
 

+ 1 - 1
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);
 

+ 1 - 1
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);

+ 3 - 3
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;