Changeset 36

Show
Ignore:
Timestamp:
03/18/07 01:37:02 (8 years ago)
Author:
wez
Message:

be more libc friendly when replacing malloc().

Use our own getenv() on glibc platforms, as the glibc implementation calls
malloc() internally. This allows the use of env vars to enable debugging modes
in the app.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/envvar.c

    r2 r36  
    9494#endif 
    9595 
     96#ifdef __GLIBC__ 
     97/* replace getenv() with a specialized version that doesn't 
     98 * need to allocate memory.  We can't use strlen or strcmp 
     99 * here. */ 
     100#include <unistd.h> 
     101static char *safe_getenv(const char *name) 
     102{ 
     103        int i, l; 
     104        for (l = 0; name[l]; l++) 
     105                ; 
     106        for (i = 0; __environ[i]; i++) { 
     107                if (!memcmp(__environ[i], name, l) && __environ[i][l] == '=') { 
     108                        return &__environ[i][l+1]; 
     109                } 
     110        } 
     111        return NULL; 
     112} 
     113#define getenv(x) safe_getenv(x) 
     114#endif 
     115 
    96116static arg_process_t umem_log_process; 
    97117 
     
    554574                STATE_START, 
    555575                STATE_GETENV, 
     576                STATE_DLOPEN, 
    556577                STATE_DLSYM, 
    557578                STATE_FUNC, 
     
    577598                        where = "during getenv(3C) calls -- " 
    578599                            "getenv(3C) results ignored."; 
     600                        break; 
     601                case STATE_DLOPEN: 
     602                        where = "during dlopen(3C) call -- " 
     603                            "_umem_*() results ignored."; 
    579604                        break; 
    580605                case STATE_DLSYM: 
     
    624649# define dlerror()              0 
    625650#endif 
     651        state = STATE_DLOPEN; 
    626652        /* get a handle to the "a.out" object */ 
    627653        if ((h = dlopen(0, RTLD_FIRST | RTLD_LAZY)) != NULL) { 
  • trunk/malloc.c

    r27 r36  
    4242#include "misc.h" 
    4343 
     44#ifdef __GLIBC__ 
     45# include <malloc.h> 
     46#endif 
     47 
    4448/* 
    4549 * malloc_data_t is an 8-byte structure which is located "before" the pointer 
     
    5963} malloc_data_t; 
    6064 
     65#ifdef __GLIBC__ 
     66static void *umem_malloc_hook(size_t size_arg, const void *caller) 
     67#else 
    6168void * 
    6269malloc(size_t size_arg) 
     70#endif 
    6371{ 
    6472#ifdef _LP64 
     
    121129} 
    122130 
     131#ifndef __GLIBC__ 
    123132void * 
    124133calloc(size_t nelem, size_t elsize) 
     
    139148        return (retval); 
    140149} 
     150#endif 
    141151 
    142152/* 
     
    147157 */ 
    148158 
     159#ifdef __GLIBC__ 
     160static void *umem_memalign_hook(size_t size_arg, size_t align, const void *caller) 
     161#else 
    149162void * 
    150163memalign(size_t align, size_t size_arg) 
     164#endif 
    151165{ 
    152166        size_t size; 
     
    227241} 
    228242 
     243#ifndef __GLIBC__ 
    229244void * 
    230245valloc(size_t size) 
     
    232247        return (memalign(pagesize, size)); 
    233248} 
     249#endif 
    234250 
    235251/* 
     
    377393} 
    378394 
     395#ifdef __GLIBC__ 
     396static void umem_free_hook(void *buf, const void *caller) 
     397#else 
    379398void 
    380399free(void *buf) 
     400#endif 
    381401{ 
    382402        if (buf == NULL) 
     
    389409} 
    390410 
     411#ifdef __GLIBC__ 
     412static void *umem_realloc_hook(void *buf_arg, size_t newsize, const void *caller) 
     413#else 
    391414void * 
    392415realloc(void *buf_arg, size_t newsize) 
     416#endif 
    393417{ 
    394418        size_t oldsize; 
     
    418442} 
    419443 
     444#ifdef __GLIBC__ 
     445static void __attribute__((constructor)) umem_malloc_init_hook(void) 
     446{ 
     447        if (__malloc_hook != umem_malloc_hook) { 
     448                umem_startup(NULL, 0, 0, NULL, NULL); 
     449                __malloc_hook = umem_malloc_hook; 
     450                __free_hook = umem_free_hook; 
     451                __realloc_hook = umem_realloc_hook; 
     452                __memalign_hook = umem_memalign_hook; 
     453        } 
     454} 
     455 
     456void (*__malloc_initialize_hook)(void) = umem_malloc_init_hook; 
     457 
     458#else 
    420459void __attribute__((constructor)) 
    421460__malloc_umem_init (void) 
    422461{ 
    423   umem_startup(NULL, 0, 0, NULL, NULL); 
    424 
     462        umem_startup(NULL, 0, 0, NULL, NULL); 
     463
     464#endif 
     465