]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/sl_malloc.c
fix ITS#3753
[openldap] / servers / slapd / sl_malloc.c
index 9abc8653c12d904a451ad6c123b420d869838a51..d065c57ec9166a3cb99da6699810de0eb4136513 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2003-2004 The OpenLDAP Foundation.
+ * Copyright 2003-2005 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -300,7 +300,7 @@ slap_sl_malloc(
                                }
                                so_right = LDAP_LIST_FIRST(&sh->sh_sopool);
                                LDAP_LIST_REMOVE(so_right, so_link);
-                               so_right->so_ptr = so_left->so_ptr + (1 << j);
+                               so_right->so_ptr = (void *)((char *)so_left->so_ptr + (1 << j));
                                if (j == order + 1) {
                                        ptr = so_left->so_ptr;
                                        diff = (unsigned long)((char*)ptr -
@@ -326,6 +326,9 @@ slap_sl_malloc(
                        return (void*)ch_malloc(size);
                }
        }
+
+       /* FIXME: missing return; guessing... */
+       return NULL;
 }
 
 void *
@@ -373,6 +376,10 @@ slap_sl_realloc(void *ptr, ber_len_t size, void *ctx)
        }
 
        if (sh->sh_stack) {
+               /* round up to doubleword boundary */
+               size += pad + sizeof( ber_len_t );
+               size &= ~pad;
+
                /* Never shrink blocks */
                if (size <= p[-1]) {
                        new = p;
@@ -495,7 +502,7 @@ slap_sl_free(void *ptr, void *ctx)
                                        while (so) {
                                                if ((char*)so->so_ptr == (char*)tmpp) {
                                                        LDAP_LIST_REMOVE(so, so_link);
-                                               } else if ((char*)tmpp == so->so_ptr + order_size) {
+                                               } else if ((char*)tmpp == (char *)so->so_ptr + order_size) {
                                                        LDAP_LIST_REMOVE(so, so_link);
                                                        tmpp = so->so_ptr;
                                                        break;
@@ -549,6 +556,8 @@ slap_sl_context( void *ptr )
        struct slab_heap *sh = NULL;
        void *ctx;
 
+       if ( slapMode & SLAP_TOOL_MODE ) return NULL;
+
 #ifdef NO_THREADS
        sh = slheap;
 #else