浏览代码

Merge commit 'origin/master' into nptl

Conflicts:
	libc/signal/sigpause.c
	libc/string/x86_64/memset.S

Signed-off-by: Austin Foxley <austinf@cetoncorp.com>
Austin Foxley 14 年之前
父节点
当前提交
875d11eec5

+ 3 - 3
libc/stdlib/malloc/free.c

@@ -177,14 +177,14 @@ __free_to_heap (void *mem, struct heap_free_area **heap
 	      /* Start searching again from the end of this block.  */
 	      start = mmb_end;
 
+	      /* Release the descriptor block we used.  */
+	      free_to_heap (mmb, &__malloc_mmb_heap, &__malloc_mmb_heap_lock);
+
 	      /* We have to unlock the heap before we recurse to free the mmb
 		 descriptor, because we might be unmapping from the mmb
 		 heap.  */
               __heap_unlock (heap_lock);
 
-	      /* Release the descriptor block we used.  */
-	      free_to_heap (mmb, &__malloc_mmb_heap, &__malloc_mmb_heap_lock);
-
 	      /* Do the actual munmap.  */
 	      munmap ((void *)mmb_start, mmb_end - mmb_start);
 

+ 4 - 3
libc/stdlib/malloc/malloc.c

@@ -46,7 +46,7 @@ struct malloc_mmb *__malloc_mmapped_blocks = 0;
 HEAP_DECLARE_STATIC_FREE_AREA (initial_mmb_fa, 48); /* enough for 3 mmbs */
 struct heap_free_area *__malloc_mmb_heap = HEAP_INIT_WITH_FA (initial_mmb_fa);
 #ifdef HEAP_USE_LOCKING
-malloc_mutex_t __malloc_mmb_heap_lock = PTHREAD_MUTEX_INITIALIZER;
+malloc_mutex_t __malloc_mmb_heap_lock = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
 #endif
 #endif /* __UCLIBC_UCLINUX_BROKEN_MUNMAP__ */
 
@@ -149,19 +149,19 @@ __malloc_from_heap (size_t size, struct heap_free_area **heap
 	  /* Try again to allocate.  */
 	  mem = __heap_alloc (heap, &size);
 
-	  __heap_unlock (heap_lock);
 
 #if !defined(MALLOC_USE_SBRK) && defined(__UCLIBC_UCLINUX_BROKEN_MUNMAP__)
 	  /* Insert a record of BLOCK in sorted order into the
 	     __malloc_mmapped_blocks list.  */
 
+	  new_mmb = malloc_from_heap (sizeof *new_mmb, &__malloc_mmb_heap, &__malloc_mmb_heap_lock);
+
 	  for (prev_mmb = 0, mmb = __malloc_mmapped_blocks;
 	       mmb;
 	       prev_mmb = mmb, mmb = mmb->next)
 	    if (block < mmb->mem)
 	      break;
 
-	  new_mmb = malloc_from_heap (sizeof *new_mmb, &__malloc_mmb_heap, &__malloc_mmb_heap_lock);
 	  new_mmb->next = mmb;
 	  new_mmb->mem = block;
 	  new_mmb->size = block_size;
@@ -175,6 +175,7 @@ __malloc_from_heap (size_t size, struct heap_free_area **heap
 			    (unsigned)new_mmb,
 			    (unsigned)new_mmb->mem, block_size);
 #endif /* !MALLOC_USE_SBRK && __UCLIBC_UCLINUX_BROKEN_MUNMAP__ */
+	  __heap_unlock (heap_lock);
 	}
     }
 

+ 1 - 0
libc/string/x86_64/bzero.S

@@ -1,5 +1,6 @@
 #include <features.h>
 #ifdef __UCLIBC_SUSV3_LEGACY__
 # define memset bzero
+# define __memset_chk __bzero_chk
 # include "memset.S"
 #endif

+ 2 - 0
libc/string/x86_64/memcpy.S

@@ -29,7 +29,9 @@
 #if defined __PIC__ && !defined NOT_IN_libc
 ENTRY (__memcpy_chk)
 	cmpq	%rdx, %rcx
+#if defined __UCLIBC_HAS_SSP__
 	jb	HIDDEN_JUMPTARGET (__chk_fail)
+#endif
 END (__memcpy_chk)
 #endif
 ENTRY (BP_SYM (memcpy))

+ 1 - 0
libc/string/x86_64/mempcpy.S

@@ -1,3 +1,4 @@
 #define memcpy mempcpy
+#define __memcpy_chk __mempcpy_chk
 #include "memcpy.S"
 libc_hidden_def(mempcpy)

+ 3 - 1
libc/string/x86_64/memset.S

@@ -29,10 +29,12 @@
 #define LARGE $120000
 
         .text
-#if !BZERO_P && defined __PIC__ && !defined NOT_IN_libc
+#if defined __PIC__ && !defined NOT_IN_libc
 ENTRY (__memset_chk)
 	cmpq	%rdx, %rcx
+#if defined __UCLIBC_HAS_SSP__
 	jb	HIDDEN_JUMPTARGET (__chk_fail)
+#endif
 END (__memset_chk)
 #endif
 ENTRY (memset)

+ 1 - 2
libc/sysdeps/linux/common/ssp.c

@@ -100,7 +100,6 @@ void __stack_chk_fail(void)
 		terminate();
 }
 
-#if 0
 void __chk_fail(void) attribute_noreturn;
 void __chk_fail(void)
 {
@@ -115,4 +114,4 @@ void __chk_fail(void)
 	while(1)
 		terminate();
 }
-#endif
+

+ 1 - 1
libpthread/linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h

@@ -130,7 +130,7 @@ __LABEL($syscall_error)						\
 extern int __local_multiple_threads attribute_hidden;
 #   define SINGLE_THREAD_P \
   __builtin_expect (__local_multiple_threads == 0, 1)
-# elif defined(PIC)
+# elif defined(__PIC__)
 #  define SINGLE_THREAD_P(reg)  ldl reg, __local_multiple_threads(gp) !gprel
 # else
 #  define SINGLE_THREAD_P(reg)					\