diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c index 2914f2fa8a..14777dd94a 100644 --- a/daemon/libvirtd.c +++ b/daemon/libvirtd.c @@ -1600,15 +1600,20 @@ static void *qemudWorker(void *data) } } -static int qemudStartWorker(struct qemud_server *server, - struct qemud_worker *worker) { +static int +qemudStartWorker(struct qemud_server *server, + struct qemud_worker *worker) +{ pthread_attr_t attr; - pthread_attr_init(&attr); + int ret = -1; + + if (pthread_attr_init(&attr) != 0) + return -1; /* We want to join workers, so don't detach them */ /*pthread_attr_setdetachstate(&attr, 1);*/ if (worker->hasThread) - return -1; + goto cleanup; worker->server = server; worker->hasThread = 1; @@ -1621,10 +1626,13 @@ static int qemudStartWorker(struct qemud_server *server, worker) != 0) { worker->hasThread = 0; worker->server = NULL; - return -1; + goto cleanup; } - return 0; + ret = 0; +cleanup: + pthread_attr_destroy(&attr); + return ret; } @@ -2414,9 +2422,14 @@ cleanup: } -static int qemudStartEventLoop(struct qemud_server *server) { +static int +qemudStartEventLoop(struct qemud_server *server) +{ pthread_attr_t attr; - pthread_attr_init(&attr); + int ret = -1; + + if (pthread_attr_init(&attr) != 0) + return -1; /* We want to join the eventloop, so don't detach it */ /*pthread_attr_setdetachstate(&attr, 1);*/ @@ -2424,11 +2437,14 @@ static int qemudStartEventLoop(struct qemud_server *server) { &attr, qemudRunLoop, server) != 0) - return -1; + goto cleanup; server->hasEventThread = 1; - return 0; + ret = 0; +cleanup: + pthread_attr_destroy(&attr); + return ret; } diff --git a/src/util/threads-pthread.c b/src/util/threads-pthread.c index c406f27de0..ea71589bc4 100644 --- a/src/util/threads-pthread.c +++ b/src/util/threads-pthread.c @@ -157,9 +157,15 @@ int virThreadCreate(virThreadPtr thread, { struct virThreadArgs *args; pthread_attr_t attr; - pthread_attr_init(&attr); - if (VIR_ALLOC(args) < 0) - return -1; + int ret = -1; + int err; + + if ((err = pthread_attr_init(&attr)) != 0) + goto cleanup; + if (VIR_ALLOC(args) < 0) { + err = ENOMEM; + goto cleanup; + } args->func = func; args->opaque = opaque; @@ -167,14 +173,19 @@ int virThreadCreate(virThreadPtr thread, if (!joinable) pthread_attr_setdetachstate(&attr, 1); - int ret = pthread_create(&thread->thread, &attr, virThreadHelper, args); - if (ret != 0) { + err = pthread_create(&thread->thread, &attr, virThreadHelper, args); + if (err != 0) { VIR_FREE(args); - errno = ret; - return -1; + goto cleanup; } /* New thread owns 'args' in success case, so don't free */ - return 0; + + ret = 0; +cleanup: + pthread_attr_destroy(&attr); + if (ret < 0) + errno = err; + return ret; } void virThreadSelf(virThreadPtr thread)