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