]> git.sur5r.net Git - openldap/blob - servers/slapd/ch_malloc.c
Merge remote-tracking branch 'origin/mdb.master' into OPENLDAP_REL_ENG_2_5
[openldap] / servers / slapd / ch_malloc.c
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-2014 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 *
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, 0, 0 );
57                 assert( 0 );
58                 exit( EXIT_FAILURE );
59         }
60
61         return( new );
62 }
63
64 void *
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, 0, 0 );
89                 assert( 0 );
90                 exit( EXIT_FAILURE );
91         }
92
93         return( new );
94 }
95
96 void *
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, 0 );
107                 assert( 0 );
108                 exit( EXIT_FAILURE );
109         }
110
111         return( new );
112 }
113
114 char *
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, 0, 0 );
123                 assert( 0 );
124                 exit( EXIT_FAILURE );
125         }
126
127         return( new );
128 }
129
130 void
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