Home | History | Annotate | Line # | Download | only in slapd
      1 /*	$NetBSD: ch_malloc.c,v 1.4 2025/09/05 21:16:25 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-2024 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.4 2025/09/05 21:16:25 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 );
     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 );
     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 );
    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 );
    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