From: Slavomir Kaslev <kaslevs@vmware.com>
To: rostedt@goodmis.org
Cc: linux-trace-devel@vger.kernel.org, slavomir.kaslev@gmail.com
Subject: [PATCH 2/3] trace-cmd: Use text encoding for transmitting ports in protocol V3
Date: Fri, 15 Mar 2019 17:33:25 +0200 [thread overview]
Message-ID: <20190315153326.5602-3-kaslevs@vmware.com> (raw)
In-Reply-To: <20190315153326.5602-1-kaslevs@vmware.com>
Ports are now encoded as text in the buffer at the end of protocol V3 messages.
Signed-off-by: Slavomir Kaslev <kaslevs@vmware.com>
---
tracecmd/trace-msg.c | 77 +++++++++++++++++++++++++++++++++++---------
1 file changed, 61 insertions(+), 16 deletions(-)
diff --git a/tracecmd/trace-msg.c b/tracecmd/trace-msg.c
index 4b43849..48f1eac 100644
--- a/tracecmd/trace-msg.c
+++ b/tracecmd/trace-msg.c
@@ -104,10 +104,7 @@ struct tracecmd_msg {
struct tracecmd_msg_tinit tinit;
struct tracecmd_msg_rinit rinit;
};
- union {
- be32 *port_array;
- void *buf;
- };
+ void *buf;
} __attribute__((packed));
static int msg_write(int fd, struct tracecmd_msg *msg)
@@ -159,19 +156,41 @@ static int make_tinit(struct tracecmd_msg_handle *msg_handle,
return 0;
}
+static int write_ints(char *buf, size_t buf_len, int *arr, int arr_len)
+{
+ int i, ret, tot = 0;
+
+ for (i = 0; i < arr_len; i++) {
+ ret = snprintf(buf, buf_len, "%d", arr[i]);
+ if (ret < 0)
+ return ret;
+
+ /* Count the '\0' byte */
+ ret++;
+ tot += ret;
+ if (buf)
+ buf += ret;
+ if (buf_len >= ret)
+ buf_len -= ret;
+ else
+ buf_len = 0;
+ }
+
+ return tot;
+}
+
static int make_rinit(struct tracecmd_msg *msg, int cpus, int *ports)
{
- int i;
+ int data_size;
- msg->rinit.cpus = htonl(cpus);
- msg->port_array = malloc(sizeof(*ports) * cpus);
- if (!msg->port_array)
+ data_size = write_ints(NULL, 0, ports, cpus);
+ msg->buf = malloc(data_size);
+ if (!msg->buf)
return -ENOMEM;
+ write_ints(msg->buf, data_size, ports, cpus);
- for (i = 0; i < cpus; i++)
- msg->port_array[i] = htonl(ports[i]);
-
- msg->hdr.size = htonl(ntohl(msg->hdr.size) + sizeof(*ports) * cpus);
+ msg->rinit.cpus = htonl(cpus);
+ msg->hdr.size = htonl(ntohl(msg->hdr.size) + data_size);
return 0;
}
@@ -380,8 +399,9 @@ int tracecmd_msg_send_init_data(struct tracecmd_msg_handle *msg_handle,
struct tracecmd_msg msg;
int fd = msg_handle->fd;
unsigned int *ports;
- int i, cpus;
- int ret;
+ int i, cpus, ret;
+ char *p, *buf_end;
+ ssize_t buf_len;
*client_ports = NULL;
@@ -405,10 +425,35 @@ int tracecmd_msg_send_init_data(struct tracecmd_msg_handle *msg_handle,
goto error;
}
+ buf_len = ntohl(msg.hdr.size) - MSG_HDR_LEN - ntohl(msg.hdr.cmd_size);
+ if (buf_len <= 0) {
+ ret = -EINVAL;
+ goto error;
+ }
+
+ if (((char *)msg.buf)[buf_len-1] != '\0') {
+ ret = -EINVAL;
+ goto error;
+ }
+
cpus = ntohl(msg.rinit.cpus);
ports = malloc_or_die(sizeof(*ports) * cpus);
- for (i = 0; i < cpus; i++)
- ports[i] = ntohl(msg.port_array[i]);
+ if (!ports) {
+ ret = -ENOMEM;
+ goto out;
+ }
+
+ buf_end = (char *)msg.buf + buf_len;
+ for (i = 0, p = msg.buf; i < cpus; i++, p++) {
+ if (p >= buf_end) {
+ free(ports);
+ ret = -EINVAL;
+ goto error;
+ }
+
+ ports[i] = atoi(p);
+ p = strchr(p, '\0');
+ }
*client_ports = ports;
--
2.19.1
next prev parent reply other threads:[~2019-03-15 15:33 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-15 15:33 [PATCH 0/3] Switch V3 messages to text encoding of variable length buffer Slavomir Kaslev
2019-03-15 15:33 ` [PATCH 1/3] trace-cmd: Use text encoding for options in protocol V3 Slavomir Kaslev
2019-03-15 15:33 ` Slavomir Kaslev [this message]
2019-03-15 15:33 ` [PATCH 3/3] trace-cmd: Add msg_buf_len() function Slavomir Kaslev
2019-03-15 19:08 ` Steven Rostedt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190315153326.5602-3-kaslevs@vmware.com \
--to=kaslevs@vmware.com \
--cc=linux-trace-devel@vger.kernel.org \
--cc=rostedt@goodmis.org \
--cc=slavomir.kaslev@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).