Ignore:
Timestamp:
Jan 10, 2007, 6:17:26 PM (15 years ago)
Author:
Sam Hocevar
Message:
  • Implemented memory limits. Probably breaks on other arches because of all the new functions.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • zzuf/trunk/src/load-mem.c

    r1639 r1641  
    2323/* Use this to get mmap64() on glibc systems */
    2424#define _LARGEFILE64_SOURCE
     25/* Use this to get posix_memalign */
     26#define _XOPEN_SOURCE 600
    2527
    2628#if defined HAVE_STDINT_H
     
    3234#include <string.h>
    3335#include <dlfcn.h>
    34 
     36#include <errno.h>
     37#include <signal.h>
     38
     39#include <malloc.h>
    3540#include <unistd.h>
    3641#include <sys/mman.h>
     
    4651
    4752/* Library functions that we divert */
    48 static void *  (*mmap_orig)    (void *start, size_t length, int prot,
    49                                 int flags, int fd, off_t offset);
     53static void *  (*calloc_orig)   (size_t nmemb, size_t size);
     54static void *  (*malloc_orig)   (size_t size);
     55static void    (*free_orig)     (void *ptr);
     56static void *  (*valloc_orig)   (size_t size);
     57static void *  (*memalign_orig) (size_t boundary, size_t size);
     58static int     (*posix_memalign_orig) (void **memptr, size_t alignment,
     59                                       size_t size);
     60static void *  (*realloc_orig)  (void *ptr, size_t size);
     61static int     (*brk_orig)      (void *end_data_segment);
     62static void *  (*sbrk_orig)     (intptr_t increment);
     63
     64static void *  (*mmap_orig)     (void *start, size_t length, int prot,
     65                                 int flags, int fd, off_t offset);
     66/* TODO */
     67/* static void *  (*mremap_orig)   (void *old_address, size_t old_size,
     68                                 size_t new_size, int flags); */
    5069#ifdef HAVE_MMAP64
    51 static void *  (*mmap64_orig)  (void *start, size_t length, int prot,
    52                                 int flags, int fd, off64_t offset);
    53 #endif
    54 static int     (*munmap_orig)  (void *start, size_t length);
     70static void *  (*mmap64_orig)   (void *start, size_t length, int prot,
     71                                 int flags, int fd, off64_t offset);
     72#endif
     73static int     (*munmap_orig)   (void *start, size_t length);
    5574#ifdef HAVE_MAP_FD
    5675static kern_return_t (*map_fd_orig) (int fd, vm_offset_t offset,
     
    6180void _zz_load_mem(void)
    6281{
     82    LOADSYM(calloc);
     83    LOADSYM(malloc);
     84    LOADSYM(free);
     85    LOADSYM(realloc);
     86    LOADSYM(valloc);
     87    LOADSYM(memalign);
     88    LOADSYM(posix_memalign);
     89    LOADSYM(brk);
     90    LOADSYM(sbrk);
     91
    6392    LOADSYM(mmap);
    6493#ifdef HAVE_MMAP64
     
    6998    LOADSYM(map_fd);
    7099#endif
     100}
     101
     102/* 32k of ugly static memory for programs that call us *before* we’re
     103 * initialised */
     104uint64_t dummy_buffer[4096];
     105
     106void *calloc(size_t nmemb, size_t size)
     107{
     108    void *ret;
     109    if(!_zz_ready)
     110    {
     111        /* Calloc says we must zero the data */
     112        int i = (nmemb * size + 7) / 8;
     113        while(i--)
     114            dummy_buffer[i] = 0;
     115        return dummy_buffer;
     116    }
     117    ret = calloc_orig(nmemb, size);
     118    if(ret == NULL && _zz_memory && errno == ENOMEM)
     119        raise(SIGKILL);
     120    return ret;
     121}
     122
     123void *malloc(size_t size)
     124{
     125    void *ret;
     126    if(!_zz_ready)
     127        return dummy_buffer;
     128    ret = malloc_orig(size);
     129    if(ret == NULL && _zz_memory && errno == ENOMEM)
     130        raise(SIGKILL);
     131    return ret;
     132}
     133
     134void free(void *ptr)
     135{
     136    if(ptr == dummy_buffer)
     137        return;
     138    if(!_zz_ready)
     139        LOADSYM(free);
     140    free_orig(ptr);
     141}
     142
     143void *realloc(void *ptr, size_t size)
     144{
     145    void *ret;
     146    if(ptr == dummy_buffer)
     147        return ptr;
     148    if(!_zz_ready)
     149        LOADSYM(realloc);
     150    ret = realloc_orig(ptr, size);
     151    if(ret == NULL && _zz_memory && errno == ENOMEM)
     152        raise(SIGKILL);
     153    return ret;
     154}
     155
     156void *valloc(size_t size)
     157{
     158    void *ret;
     159    if(!_zz_ready)
     160        LOADSYM(valloc);
     161    ret = valloc_orig(size);
     162    if(ret == NULL && _zz_memory && errno == ENOMEM)
     163        raise(SIGKILL);
     164    return ret;
     165}
     166
     167void *memalign(size_t boundary, size_t size)
     168{
     169    void *ret;
     170    if(!_zz_ready)
     171        LOADSYM(memalign);
     172    ret = memalign_orig(boundary, size);
     173    if(ret == NULL && _zz_memory && errno == ENOMEM)
     174        raise(SIGKILL);
     175    return ret;
     176}
     177
     178int posix_memalign(void **memptr, size_t alignment, size_t size)
     179{
     180    int ret;
     181    if(!_zz_ready)
     182        LOADSYM(posix_memalign);
     183    ret = posix_memalign_orig(memptr, alignment, size);
     184    if(ret == ENOMEM && _zz_memory)
     185        raise(SIGKILL);
     186    return ret;
     187}
     188
     189int brk(void *end_data_segment)
     190{
     191    int ret;
     192    if(!_zz_ready)
     193        LOADSYM(brk);
     194    ret = brk_orig(end_data_segment);
     195    if(ret == -1 && _zz_memory && errno == ENOMEM)
     196        raise(SIGKILL);
     197    return ret;
     198}
     199
     200void *sbrk(intptr_t increment)
     201{
     202    void *ret;
     203    if(!_zz_ready)
     204        LOADSYM(sbrk);
     205    ret = sbrk_orig(increment);
     206    if(ret == (void *)-1 && _zz_memory && errno == ENOMEM)
     207        raise(SIGKILL);
     208    return ret;
    71209}
    72210
Note: See TracChangeset for help on using the changeset viewer.