/* * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved. * Copyright (C) 2004 Red Hat, Inc. All rights reserved. * * This file is part of LVM2. * * This copyrighted material is made available to anyone wishing to use, * modify, copy, or redistribute it subject to the terms and conditions * of the GNU General Public License v.2. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "log.h" #include #include static void _print_help(FILE *out, const char *prog) { fprintf(out, "usage : %s [-hlbufd]\n\n", prog); fprintf(out, " h : this message\n"); fprintf(out, " l : cause memory leak\n"); fprintf(out, " b : overrun memory block\n"); fprintf(out, " u : underrun memory block\n"); fprintf(out, " f : free random pointer\n"); fprintf(out, " d : free block twice\n"); } struct block_list { struct block_list *next; char dummy[9]; }; static void _leak_memory(void) { int i; struct block_list *b, *head, **l = &head, *n; /* allocate a list of blocks */ for (i = 0; i < 1000; i++) { if (!(b = dbg_malloc(sizeof(*b)))) { log_fatal("Couldn't allocate memory"); exit(1); } b->next = 0; *l = b; l = &b->next; } /* free off every other block */ for (b = head, i = 0; b; b = n, i++) { n = b->next; if(i & 0x1) dbg_free(b); } } static void _bounds_overrun(void) { char *b; /* allocate a block */ b = dbg_malloc(534); /* overrun */ b[534] = 56; /* free it, which should trigger the bounds error */ dbg_free(b); } static void _bounds_underrun(void) { char *b; /* allocate a block */ b = dbg_malloc(534); /* underrun */ *(b - 1) = 56; /* free it, which should trigger the bounds error */ dbg_free(b); } static void _free_dud(void) { char *b; /* allocate a block */ b = dbg_malloc(534); /* free it, which should trigger the bounds error */ dbg_free(b + 100); } static void _free_twice(void) { char *b; /* allocate a block */ b = dbg_malloc(534); /* free it, which should trigger the bounds error */ dbg_free(b); dbg_free(b); } int main(int argc, char **argv) { char opt; init_log(stderr); init_debug(_LOG_DEBUG); opt = getopt(argc, argv, "hlbufd"); switch(opt) { case EOF: case 'h': _print_help(stdout, argv[0]); break; case 'l': _leak_memory(); break; case 'b': _bounds_overrun(); break; case 'u': _bounds_underrun(); break; case 'f': _free_dud(); break; case 'd': _free_twice(); break; case '?': fprintf(stderr, "Unknown option -%c\n", opt); exit(1); } dump_memory(); fin_log(); return 0; }