#define _GNU_SOURCE
#include <dlfcn.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
typedef void* (*malloc_t)(size_t);
static malloc_t libc_malloc = NULL;
static unsigned long malloc_max_called = 1000 * 1000;
void initialize() {
libc_malloc = (malloc_t)dlsym(RTLD_NEXT, "malloc");
if (libc_malloc == NULL) {
perror("dlsym");
exit(1);
}
char const* const s = getenv("MALLOC_MAX_CALLED");
if (s == NULL) return;
sscanf(s, "%lu", &malloc_max_called);
}
unsigned long count = 0;
void* malloc(size_t n) {
if (libc_malloc == NULL) initialize();
if (count >= malloc_max_called) return NULL;
count++;
return libc_malloc(n);
}
% gcc -Wall -g -fPIC -shared failing_malloc.c -o failing_malloc.so -ldl
% MALLOC_MAX_CALLED=1000 LD_PRELOAD=./failing_malloc.so ./a.out