1/* $NetBSD: ch_malloc.c,v 1.1.1.3 2010/12/12 15:22:24 adam Exp $ */ 2 3/* ch_malloc.c - malloc routines that test returns from malloc and friends */ 4/* OpenLDAP: pkg/ldap/servers/slapd/ch_malloc.c,v 1.28.2.5 2010/04/13 20:23:12 kurt Exp */ 5/* This work is part of OpenLDAP Software <http://www.openldap.org/>. 6 * 7 * Copyright 1998-2010 The OpenLDAP Foundation. 8 * All rights reserved. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted only as authorized by the OpenLDAP 12 * Public License. 13 * 14 * A copy of this license is available in the file LICENSE in the 15 * top-level directory of the distribution or, alternatively, at 16 * <http://www.OpenLDAP.org/license.html>. 17 */ 18/* Portions Copyright (c) 1995 Regents of the University of Michigan. 19 * All rights reserved. 20 * 21 * Redistribution and use in source and binary forms are permitted 22 * provided that this notice is preserved and that due credit is given 23 * to the University of Michigan at Ann Arbor. The name of the University 24 * may not be used to endorse or promote products derived from this 25 * software without specific prior written permission. This software 26 * is provided ``as is'' without express or implied warranty. 27 */ 28 29#define CH_FREE 1 30 31#include "portable.h" 32 33#include <stdio.h> 34 35#include <ac/stdlib.h> 36 37#include <ac/string.h> 38#include <ac/socket.h> 39 40#include "slap.h" 41 42BerMemoryFunctions ch_mfuncs = { 43 (BER_MEMALLOC_FN *)ch_malloc, 44 (BER_MEMCALLOC_FN *)ch_calloc, 45 (BER_MEMREALLOC_FN *)ch_realloc, 46 (BER_MEMFREE_FN *)ch_free 47}; 48 49void * 50ch_malloc( 51 ber_len_t size 52) 53{ 54 void *new; 55 56 if ( (new = (void *) ber_memalloc_x( size, NULL )) == NULL ) { 57 Debug( LDAP_DEBUG_ANY, "ch_malloc of %lu bytes failed\n", 58 (long) size, 0, 0 ); 59 assert( 0 ); 60 exit( EXIT_FAILURE ); 61 } 62 63 return( new ); 64} 65 66void * 67ch_realloc( 68 void *block, 69 ber_len_t size 70) 71{ 72 void *new, *ctx; 73 74 if ( block == NULL ) { 75 return( ch_malloc( size ) ); 76 } 77 78 if( size == 0 ) { 79 ch_free( block ); 80 return NULL; 81 } 82 83 ctx = slap_sl_context( block ); 84 if ( ctx ) { 85 return slap_sl_realloc( block, size, ctx ); 86 } 87 88 if ( (new = (void *) ber_memrealloc_x( block, size, NULL )) == NULL ) { 89 Debug( LDAP_DEBUG_ANY, "ch_realloc of %lu bytes failed\n", 90 (long) size, 0, 0 ); 91 assert( 0 ); 92 exit( EXIT_FAILURE ); 93 } 94 95 return( new ); 96} 97 98void * 99ch_calloc( 100 ber_len_t nelem, 101 ber_len_t size 102) 103{ 104 void *new; 105 106 if ( (new = (void *) ber_memcalloc_x( nelem, size, NULL )) == NULL ) { 107 Debug( LDAP_DEBUG_ANY, "ch_calloc of %lu elems of %lu bytes failed\n", 108 (long) nelem, (long) size, 0 ); 109 assert( 0 ); 110 exit( EXIT_FAILURE ); 111 } 112 113 return( new ); 114} 115 116char * 117ch_strdup( 118 const char *string 119) 120{ 121 char *new; 122 123 if ( (new = ber_strdup_x( string, NULL )) == NULL ) { 124 Debug( LDAP_DEBUG_ANY, "ch_strdup(%s) failed\n", string, 0, 0 ); 125 assert( 0 ); 126 exit( EXIT_FAILURE ); 127 } 128 129 return( new ); 130} 131 132void 133ch_free( void *ptr ) 134{ 135 void *ctx; 136 137 ctx = slap_sl_context( ptr ); 138 if (ctx) { 139 slap_sl_free( ptr, ctx ); 140 } else { 141 ber_memfree_x( ptr, NULL ); 142 } 143} 144 145