1 /* $NetBSD: ch_malloc.c,v 1.2 2020/08/11 13:15:39 christos Exp $ */ 2 3 /* ch_malloc.c - malloc routines that test returns from malloc and friends */ 4 /* $OpenLDAP$ */ 5 /* This work is part of OpenLDAP Software <http://www.openldap.org/>. 6 * 7 * Copyright 1998-2020 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 <sys/cdefs.h> 32 __RCSID("$NetBSD: ch_malloc.c,v 1.2 2020/08/11 13:15:39 christos Exp $"); 33 34 #include "portable.h" 35 36 #include <stdio.h> 37 38 #include <ac/stdlib.h> 39 40 #include <ac/string.h> 41 #include <ac/socket.h> 42 43 #include "slap.h" 44 45 BerMemoryFunctions ch_mfuncs = { 46 (BER_MEMALLOC_FN *)ch_malloc, 47 (BER_MEMCALLOC_FN *)ch_calloc, 48 (BER_MEMREALLOC_FN *)ch_realloc, 49 (BER_MEMFREE_FN *)ch_free 50 }; 51 52 void * 53 ch_malloc( 54 ber_len_t size 55 ) 56 { 57 void *new; 58 59 if ( (new = (void *) ber_memalloc_x( size, NULL )) == NULL ) { 60 Debug( LDAP_DEBUG_ANY, "ch_malloc of %lu bytes failed\n", 61 (long) size, 0, 0 ); 62 assert( 0 ); 63 exit( EXIT_FAILURE ); 64 } 65 66 return( new ); 67 } 68 69 void * 70 ch_realloc( 71 void *block, 72 ber_len_t size 73 ) 74 { 75 void *new, *ctx; 76 77 if ( block == NULL ) { 78 return( ch_malloc( size ) ); 79 } 80 81 if( size == 0 ) { 82 ch_free( block ); 83 return NULL; 84 } 85 86 ctx = slap_sl_context( block ); 87 if ( ctx ) { 88 return slap_sl_realloc( block, size, ctx ); 89 } 90 91 if ( (new = (void *) ber_memrealloc_x( block, size, NULL )) == NULL ) { 92 Debug( LDAP_DEBUG_ANY, "ch_realloc of %lu bytes failed\n", 93 (long) size, 0, 0 ); 94 assert( 0 ); 95 exit( EXIT_FAILURE ); 96 } 97 98 return( new ); 99 } 100 101 void * 102 ch_calloc( 103 ber_len_t nelem, 104 ber_len_t size 105 ) 106 { 107 void *new; 108 109 if ( (new = (void *) ber_memcalloc_x( nelem, size, NULL )) == NULL ) { 110 Debug( LDAP_DEBUG_ANY, "ch_calloc of %lu elems of %lu bytes failed\n", 111 (long) nelem, (long) size, 0 ); 112 assert( 0 ); 113 exit( EXIT_FAILURE ); 114 } 115 116 return( new ); 117 } 118 119 char * 120 ch_strdup( 121 const char *string 122 ) 123 { 124 char *new; 125 126 if ( (new = ber_strdup_x( string, NULL )) == NULL ) { 127 Debug( LDAP_DEBUG_ANY, "ch_strdup(%s) failed\n", string, 0, 0 ); 128 assert( 0 ); 129 exit( EXIT_FAILURE ); 130 } 131 132 return( new ); 133 } 134 135 void 136 ch_free( void *ptr ) 137 { 138 void *ctx; 139 140 ctx = slap_sl_context( ptr ); 141 if (ctx) { 142 slap_sl_free( ptr, ctx ); 143 } else { 144 ber_memfree_x( ptr, NULL ); 145 } 146 } 147 148