dlclose on errors

This commit is contained in:
Wim Taymans 2020-06-23 15:25:45 +02:00
parent f08c35259c
commit 35bb7d794b

View file

@ -46,28 +46,33 @@ static inline struct spa_handle *load_handle(const struct spa_support *support,
if ((hnd = dlopen(path, RTLD_NOW)) == NULL) { if ((hnd = dlopen(path, RTLD_NOW)) == NULL) {
fprintf(stderr, "can't load %s: %s\n", lib, dlerror()); fprintf(stderr, "can't load %s: %s\n", lib, dlerror());
errno = -ENOENT; res = -ENOENT;
return NULL; goto error;
} }
if ((enum_func = dlsym(hnd, SPA_HANDLE_FACTORY_ENUM_FUNC_NAME)) == NULL) { if ((enum_func = dlsym(hnd, SPA_HANDLE_FACTORY_ENUM_FUNC_NAME)) == NULL) {
fprintf(stderr, "can't find enum function\n"); fprintf(stderr, "can't find enum function\n");
errno = -ENOENT; res = -ENXIO;
return NULL; goto error_close;
} }
if ((factory = get_factory(enum_func, name, SPA_VERSION_HANDLE_FACTORY)) == NULL) { if ((factory = get_factory(enum_func, name, SPA_VERSION_HANDLE_FACTORY)) == NULL) {
fprintf(stderr, "can't find factory\n"); fprintf(stderr, "can't find factory\n");
errno = -ENOENT; res = -ENOENT;
return NULL; goto error_close;
} }
handle = calloc(1, spa_handle_factory_get_size(factory, NULL)); handle = calloc(1, spa_handle_factory_get_size(factory, NULL));
if ((res = spa_handle_factory_init(factory, handle, if ((res = spa_handle_factory_init(factory, handle,
NULL, support, n_support)) < 0) { NULL, support, n_support)) < 0) {
fprintf(stderr, "can't make factory instance: %d\n", res); fprintf(stderr, "can't make factory instance: %d\n", res);
errno = -res; goto error_close;
return NULL;
} }
return handle; return handle;
error_close:
dlclose(hnd);
error:
errno = -res;
return NULL;
} }
static inline uint32_t get_cpu_flags(void) static inline uint32_t get_cpu_flags(void)