diff --git a/capsule/capsule-init.c b/capsule/capsule-init.c index 228b581f626567d0caefcd9ba49e7cf3d26e2daf..dd427408509e8c91926220b6219d1c479658ff00 100644 --- a/capsule/capsule-init.c +++ b/capsule/capsule-init.c @@ -141,6 +141,7 @@ get_capsule_metadata (struct link_map *map, const char *only) symbol++ ) { capsule_metadata *meta = NULL; + capsule cap = NULL; char *name = (char *)strtab + symbol->st_name; if( !name || strcmp( "capsule_meta", name ) ) @@ -166,9 +167,25 @@ get_capsule_metadata (struct link_map *map, const char *only) meta->active_prefix = capsule_get_prefix( meta->default_prefix, meta->soname ); + cap = meta->handle; + + if( cap == NULL ) + { + cap = xcalloc( 1, sizeof(struct _capsule) ); + DEBUG( DEBUG_CAPSULE, + "Creating new capsule %p for metadata %p (%s … %s)", + cap, meta, meta->active_prefix, meta->soname ); + cap->meta = meta; + cap->prefix = meta->active_prefix; + cap->seen.all = ptr_list_alloc( 32 ); + cap->seen.some = ptr_list_alloc( 32 ); + meta->handle = cap; + } + ptr_list_add_ptr( _capsule_metadata_list, meta, ptr_equal ); - DEBUG( DEBUG_CAPSULE, "found metatdata for %s … %s at %p", - meta->active_prefix, meta->soname, meta ); + DEBUG( DEBUG_CAPSULE, + "found metadata for %s … %s at %p (capsule: %p)", + meta->active_prefix, meta->soname, meta, cap ); break; } } @@ -386,7 +403,6 @@ get_cached_metadata (const char *soname) capsule capsule_init (const char *soname) { - capsule handle = xcalloc( 1, sizeof(struct _capsule) ); capsule_metadata *meta = NULL; meta = get_cached_metadata( soname ); @@ -409,8 +425,6 @@ capsule_init (const char *soname) abort(); } - handle->prefix = meta->active_prefix; - for( size_t i = 0; i < _capsule_metadata_list->next; i++ ) { capsule_metadata *cm = ptr_list_nth_ptr( _capsule_metadata_list, i ); @@ -425,17 +439,7 @@ capsule_init (const char *soname) DUMP_STRV( nowrap, cm->combined_nowrap ); } - handle->seen.all = ptr_list_alloc( 32 ); - handle->seen.some = ptr_list_alloc( 32 ); - - // poke the initialised metadata back into the handle - // and vice versa: - handle->meta = meta; - meta->handle = handle; - - meta->closed = 0; - - return handle; + return meta->handle; } #define CLEAR(f,x) ({ f( x ); x = NULL; })