The phypUUIDTable_Push and phypUUIDTable_Pull leaked their fd's on normal return. I also noted that the Read function had a cut-n-paste error from the write function on a couple of VIR_WARN's The openSSHSession leaked the sock on the failure path. Additionally that turns into the internal_socket in the phypOpen code. That was neither saved nor closed on any path. So I used the connnection_data->sock field to save the socket for eventual close. Of interest here is that phypExec used the connection_data->sock field even though it had never been initialized. --- src/phyp/phyp_driver.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c index f89871f..b74cab8 100644 --- a/src/phyp/phyp_driver.c +++ b/src/phyp/phyp_driver.c @@ -577,6 +577,7 @@ phypUUIDTable_Push(virConnectPtr conn) libssh2_channel_free(channel); channel = NULL; } + VIR_FORCE_FCLOSE(fd); virBufferFreeAndReset(&username); return 0; @@ -665,7 +666,7 @@ phypUUIDTable_ReadFile(virConnectPtr conn) int id; if ((fd = open(local_file, O_RDONLY)) == -1) { - VIR_WARN("Unable to write information to local file."); + VIR_WARN("Unable to read information from local file."); goto err; } @@ -682,13 +683,13 @@ phypUUIDTable_ReadFile(virConnectPtr conn) uuid_table->lpars[i]->id = id; } else { VIR_WARN - ("Unable to read from information to local file."); + ("Unable to read from information from local file."); goto err; } rc = read(fd, uuid_table->lpars[i]->uuid, VIR_UUID_BUFLEN); if (rc != VIR_UUID_BUFLEN) { - VIR_WARN("Unable to read information to local file."); + VIR_WARN("Unable to read information from local file."); goto err; } } @@ -713,7 +714,7 @@ phypUUIDTable_Pull(virConnectPtr conn) struct stat fileinfo; char buffer[1024]; int rc = 0; - int fd; + int fd = -1; int got = 0; int amount = 0; int total = 0; @@ -820,6 +821,7 @@ err: libssh2_channel_free(channel); channel = NULL; } + VIR_FORCE_CLOSE(fd); return -1; } @@ -985,7 +987,7 @@ openSSHSession(virConnectPtr conn, virConnectAuthPtr auth, const char *hostname = conn->uri->server; char *username = NULL; char *password = NULL; - int sock; + int sock = -1; int rc; struct addrinfo *ai = NULL, *cur; struct addrinfo hints; @@ -1135,6 +1137,7 @@ disconnect: libssh2_session_disconnect(session, "Disconnecting..."); libssh2_session_free(session); err: + VIR_FORCE_CLOSE(sock); VIR_FREE(userhome); VIR_FREE(pubkey); VIR_FREE(pvtkey); @@ -1191,6 +1194,7 @@ phypOpen(virConnectPtr conn, virReportOOMError(); goto failure; } + connection_data->sock = -1; if (conn->uri->path) { /* need to shift one byte in order to remove the first "/" of URI component */ @@ -1227,6 +1231,7 @@ phypOpen(virConnectPtr conn, } connection_data->session = session; + connection_data->sock = internal_socket; uuid_table->nlpars = 0; uuid_table->lpars = NULL; @@ -1270,6 +1275,8 @@ failure: libssh2_session_free(session); } + if (connection_data) + VIR_FORCE_CLOSE(connection_data->sock); VIR_FREE(connection_data); return VIR_DRV_OPEN_ERROR; @@ -1289,6 +1296,8 @@ phypClose(virConnectPtr conn) phypUUIDTable_Free(phyp_driver->uuid_table); VIR_FREE(phyp_driver->managed_system); VIR_FREE(phyp_driver); + + VIR_FORCE_CLOSE(connection_data->sock); VIR_FREE(connection_data); return 0; } -- 1.7.11.7 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list