Bug fix: look for addresses based on fprintf *in addition* to errno.
authorOrion Lawlor <olawlor@acm.org>
Tue, 13 Apr 2004 22:53:29 +0000 (22:53 +0000)
committerOrion Lawlor <olawlor@acm.org>
Tue, 13 Apr 2004 22:53:29 +0000 (22:53 +0000)
This should prevent the "hang at shutdown" bug under MacOS X.

I noticed I seem to be using errno, not fprintf, to figure out
where shared libraries live.  This is really stupid, because errno
is secretly a thread-private variable on many machines.  Adding
fprintf's address actually shrinks the range found by isomalloc
dramatically.

My little standalone 'dev/unix/mmap' test shows that you can
overwrite *any* address using mmap(MAP_FIXED) under OS X,
with no errors at all, so it's likely we were blowing away a few
pages of dynamically linked libraries before.

The long-term answer to this may be to *manually* search for
a usable address range, and store the range in the machine config,
instead of the current (complicated, error-prone) automated
search.

src/conv-core/isomalloc.c

index 8806f7a12c7885bb38760aca764d907185adae54..9cd3e5f39c20ba8f0694f836f06ba725c1c2ddc9 100644 (file)
@@ -569,7 +569,8 @@ the largest usable free region on the machine.
 static int find_largest_free_region(memRegion_t *destRegion) {
     char *staticData =(char *) __static_data_loc();
     char *code = (char *)&find_free_region;
-    char *codeDll = (char *)&errno;
+    char *threadData = (char *)&errno;
+    char *codeDll = (char *)fprintf;
     char *heapLil = (char*) malloc(1);
     char *heapBig = (char*) malloc(6*meg);
     char *stack = (char *)__cur_stack_frame();
@@ -605,6 +606,9 @@ static int find_largest_free_region(memRegion_t *destRegion) {
     regions[7].type="Result of a non-fixed call to mmap";
     regions[7].start=mmapAny; regions[7].len=1u*gig; 
 
+    regions[8].type="Thread private data";
+    regions[8].start=threadData; regions[8].len=256u*meg; 
+
     _MEMCHECK(heapBig); free(heapBig);
     _MEMCHECK(heapLil); free(heapLil); 
     call_munmap(mmapAny,mmapAnyLen);