@@ -332,6 +332,7 @@ void tracecmd_msg_send_close_msg(struct tracecmd_msg_handle *msg_handle);
int tracecmd_msg_initial_setting(struct tracecmd_msg_handle *msg_handle);
int tracecmd_msg_send_port_array(struct tracecmd_msg_handle *msg_handle,
int *ports);
+int tracecmd_msg_read_data(struct tracecmd_msg_handle *msg_handle, int ofd);
int tracecmd_msg_collect_data(struct tracecmd_msg_handle *msg_handle, int ofd);
bool tracecmd_msg_done(struct tracecmd_msg_handle *msg_handle);
void tracecmd_msg_set_done(struct tracecmd_msg_handle *msg_handle);
@@ -626,7 +626,7 @@ int tracecmd_msg_finish_sending_data(struct tracecmd_msg_handle *msg_handle)
return 0;
}
-int tracecmd_msg_collect_data(struct tracecmd_msg_handle *msg_handle, int ofd)
+int tracecmd_msg_read_data(struct tracecmd_msg_handle *msg_handle, int ofd)
{
struct tracecmd_msg msg;
int t, n, cmd;
@@ -659,13 +659,34 @@ int tracecmd_msg_collect_data(struct tracecmd_msg_handle *msg_handle, int ofd)
if (errno == EINTR)
continue;
warning("writing to file");
- return -errno;
+ ret = -errno;
+ goto error;
}
t -= s;
s = n - t;
}
+
+ msg_free(&msg);
}
+ return 0;
+
+error:
+ error_operation_for_server(&msg);
+ msg_free(&msg);
+ return ret;
+}
+
+int tracecmd_msg_collect_data(struct tracecmd_msg_handle *msg_handle, int ofd)
+{
+ struct tracecmd_msg msg;
+ u32 cmd;
+ int ret;
+
+ ret = tracecmd_msg_read_data(msg_handle, ofd);
+ if (ret)
+ goto error;
+
/* check the finish message of the client */
while (!tracecmd_msg_done(msg_handle)) {
ret = tracecmd_msg_recv(msg_handle->fd, &msg);
@@ -683,11 +704,14 @@ int tracecmd_msg_collect_data(struct tracecmd_msg_handle *msg_handle, int ofd)
ret = -EINVAL;
goto error;
}
+
+ msg_free(&msg);
}
return 0;
error:
error_operation_for_server(&msg);
+ msg_free(&msg);
return ret;
}
This patch addresses leaking tracecmd_msg messages in tracecmd_msg_collect_data. It also splits out tracecmd_msg_read_data from tracecmd_msg_collect_data which only reads incomming data and doesn't wait for a final MSG_CLOSE message and is used by the VM tracing agent. Signed-off-by: Slavomir Kaslev <kaslevs@vmware.com> --- include/trace-cmd/trace-cmd.h | 1 + tracecmd/trace-msg.c | 28 ++++++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-)