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