Print this page
6543 Fix memory leak in uu_avl_pool_destroy


 111 }
 112 
 113 void
 114 uu_avl_pool_destroy(uu_avl_pool_t *pp)
 115 {
 116         if (pp->uap_debug) {
 117                 if (pp->uap_null_avl.ua_next_enc !=
 118                     UU_PTR_ENCODE(&pp->uap_null_avl) ||
 119                     pp->uap_null_avl.ua_prev_enc !=
 120                     UU_PTR_ENCODE(&pp->uap_null_avl)) {
 121                         uu_panic("uu_avl_pool_destroy: Pool \"%.*s\" (%p) has "
 122                             "outstanding avls, or is corrupt.\n",
 123                             (int)sizeof (pp->uap_name), pp->uap_name,
 124                             (void *)pp);
 125                 }
 126         }
 127         (void) pthread_mutex_lock(&uu_apool_list_lock);
 128         pp->uap_next->uap_prev = pp->uap_prev;
 129         pp->uap_prev->uap_next = pp->uap_next;
 130         (void) pthread_mutex_unlock(&uu_apool_list_lock);

 131         pp->uap_prev = NULL;
 132         pp->uap_next = NULL;
 133         uu_free(pp);
 134 }
 135 
 136 void
 137 uu_avl_node_init(void *base, uu_avl_node_t *np, uu_avl_pool_t *pp)
 138 {
 139         uintptr_t *na = (uintptr_t *)np;
 140 
 141         if (pp->uap_debug) {
 142                 uintptr_t offset = (uintptr_t)np - (uintptr_t)base;
 143                 if (offset + sizeof (*np) > pp->uap_objsize) {
 144                         uu_panic("uu_avl_node_init(%p, %p, %p (\"%s\")): "
 145                             "offset %ld doesn't fit in object (size %ld)\n",
 146                             base, (void *)np, (void *)pp, pp->uap_name,
 147                             (long)offset, (long)pp->uap_objsize);
 148                 }
 149                 if (offset != pp->uap_nodeoffset) {
 150                         uu_panic("uu_avl_node_init(%p, %p, %p (\"%s\")): "




 111 }
 112 
 113 void
 114 uu_avl_pool_destroy(uu_avl_pool_t *pp)
 115 {
 116         if (pp->uap_debug) {
 117                 if (pp->uap_null_avl.ua_next_enc !=
 118                     UU_PTR_ENCODE(&pp->uap_null_avl) ||
 119                     pp->uap_null_avl.ua_prev_enc !=
 120                     UU_PTR_ENCODE(&pp->uap_null_avl)) {
 121                         uu_panic("uu_avl_pool_destroy: Pool \"%.*s\" (%p) has "
 122                             "outstanding avls, or is corrupt.\n",
 123                             (int)sizeof (pp->uap_name), pp->uap_name,
 124                             (void *)pp);
 125                 }
 126         }
 127         (void) pthread_mutex_lock(&uu_apool_list_lock);
 128         pp->uap_next->uap_prev = pp->uap_prev;
 129         pp->uap_prev->uap_next = pp->uap_next;
 130         (void) pthread_mutex_unlock(&uu_apool_list_lock);
 131         (void) pthread_mutex_destroy(&pp->uap_lock);
 132         pp->uap_prev = NULL;
 133         pp->uap_next = NULL;
 134         uu_free(pp);
 135 }
 136 
 137 void
 138 uu_avl_node_init(void *base, uu_avl_node_t *np, uu_avl_pool_t *pp)
 139 {
 140         uintptr_t *na = (uintptr_t *)np;
 141 
 142         if (pp->uap_debug) {
 143                 uintptr_t offset = (uintptr_t)np - (uintptr_t)base;
 144                 if (offset + sizeof (*np) > pp->uap_objsize) {
 145                         uu_panic("uu_avl_node_init(%p, %p, %p (\"%s\")): "
 146                             "offset %ld doesn't fit in object (size %ld)\n",
 147                             base, (void *)np, (void *)pp, pp->uap_name,
 148                             (long)offset, (long)pp->uap_objsize);
 149                 }
 150                 if (offset != pp->uap_nodeoffset) {
 151                         uu_panic("uu_avl_node_init(%p, %p, %p (\"%s\")): "