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