diff options
Diffstat (limited to 'elf')
-rw-r--r-- | elf/dl-load.c | 10 | ||||
-rw-r--r-- | elf/dl-minimal.c | 14 | ||||
-rw-r--r-- | elf/rtld.c | 15 |
3 files changed, 24 insertions, 15 deletions
diff --git a/elf/dl-load.c b/elf/dl-load.c index d80f30813f..9d9ba94539 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -513,8 +513,7 @@ decompose_rpath (struct r_search_path_struct *sps, { /* This object is on the list of objects for which the RUNPATH and RPATH must not be used. */ - result = (struct r_search_path_elem **) - malloc (sizeof (*result)); + result = calloc (1, sizeof *result); if (result == NULL) { signal_error_cache: @@ -523,8 +522,6 @@ decompose_rpath (struct r_search_path_struct *sps, INTUSE(_dl_signal_error) (ENOMEM, NULL, NULL, errstring); } - result[0] = NULL; - sps->dirs = result; sps->malloced = 1; @@ -994,7 +991,8 @@ cannot allocate TLS data structures for initial thread"); } /* Now we install the TCB in the thread register. */ - if (__builtin_expect (TLS_INIT_TP (tcb, 0), 0) != -1) + errstring = TLS_INIT_TP (tcb, 0); + if (__builtin_expect (errstring == NULL, 1)) { /* Now we are all good. */ l->l_tls_modid = ++GL(dl_tls_max_dtv_idx); @@ -1002,7 +1000,9 @@ cannot allocate TLS data structures for initial thread"); } /* The kernel is too old or somesuch. */ + errval = 0; _dl_deallocate_tls (tcb, 1); + goto call_lose; } #endif diff --git a/elf/dl-minimal.c b/elf/dl-minimal.c index d1619cfb0c..3a51df30fb 100644 --- a/elf/dl-minimal.c +++ b/elf/dl-minimal.c @@ -104,9 +104,10 @@ malloc (size_t n) void * weak_function calloc (size_t nmemb, size_t size) { - size_t total = nmemb * size; - void *result = malloc (total); - return memset (result, '\0', total); + /* New memory from the trivial malloc above is always already cleared. + (We make sure that's true in the rare occasion it might not be, + by clearing memory in free, below.) */ + return malloc (nmemb * size); } /* This will rarely be called. */ @@ -115,7 +116,12 @@ free (void *ptr) { /* We can free only the last block allocated. */ if (ptr == alloc_last_block) - alloc_ptr = alloc_last_block; + { + /* Since this is rare, we clear the freed block here + so that calloc can presume malloc returns cleared memory. */ + memset (alloc_last_block, '\0', alloc_ptr - alloc_last_block); + alloc_ptr = alloc_last_block; + } } /* This is only called with the most recent block returned by malloc. */ diff --git a/elf/rtld.c b/elf/rtld.c index f1886431b8..e43a0e998d 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -404,16 +404,17 @@ _dl_start (void *arg) INSTALL_DTV ((char *) tlsblock + bootstrap_map.l_tls_offset, initdtv); - if (TLS_INIT_TP ((char *) tlsblock + bootstrap_map.l_tls_offset, 0) - != 0) - _dl_fatal_printf ("cannot setup thread-local storage\n"); + const char *lossage = TLS_INIT_TP ((char *) tlsblock + + bootstrap_map.l_tls_offset, 0); # elif TLS_DTV_AT_TP INSTALL_DTV (tlsblock, initdtv); - if (TLS_INIT_TP (tlsblock, 0) != 0) - _dl_fatal_printf ("cannot setup thread-local storage\n"); + const char *lossage = TLS_INIT_TP (tlsblock, 0); # else # error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" # endif + if (__builtin_expect (lossage != NULL, 0)) + _dl_fatal_printf ("cannot set up thread-local storage: %s\n", + lossage); /* So far this is module number one. */ bootstrap_map.l_tls_modid = 1; @@ -1564,7 +1565,9 @@ cannot allocate TLS data structures for initial thread"); /* And finally install it for the main thread. If ld.so itself uses TLS we know the thread pointer was initialized earlier. */ - TLS_INIT_TP (tcbp, USE___THREAD); + const char *lossage = TLS_INIT_TP (tcbp, USE___THREAD); + if (__builtin_expect (lossage != NULL, 0)) + _dl_fatal_printf ("cannot set up thread-local storage: %s\n", lossage); } #endif |