The branch, master has been updated
via fa1375c09f13118c5be70aa6ba64284bdda1c03f (commit)
from f141e9b37a8d8a0c89c4f74137df9e5088b4b7af (commit)
- Log -----------------------------------------------------------------
commit fa1375c09f13118c5be70aa6ba64284bdda1c03f
Author: Nicholas Marriott <[email protected]>
Commit: Nicholas Marriott <[email protected]>
Similarly for MSG_COMMAND - allow full imsg limit not arbitrary 2048.
---
client.c | 64 ++++++++++++++++++++++++++++++++++++++++++-------------
server-client.c | 45 +++++++++++++++++++++++---------------
server-fn.c | 1 -
tmux.h | 21 +++++++----------
4 files changed, 85 insertions(+), 46 deletions(-)
diff --git a/client.c b/client.c
index de9ec52..0a1c8da 100644
--- a/client.c
+++ b/client.c
@@ -54,7 +54,8 @@ int client_get_lock(char *);
int client_connect(char *, int);
void client_send_identify(int);
void client_send_environ(void);
-void client_write_server(enum msgtype, void *, size_t);
+int client_write_one(enum msgtype, int, const void *, size_t);
+int client_write_server(enum msgtype, const void *, size_t);
void client_update_event(void);
void client_signal(int, short, void *);
void client_stdin_callback(int, short, void *);
@@ -165,12 +166,13 @@ client_main(int argc, char **argv, int flags)
{
struct cmd *cmd;
struct cmd_list *cmdlist;
- struct msg_command_data cmddata;
- int cmdflags, fd;
+ struct msg_command_data *data;
+ int cmdflags, fd, i;
pid_t ppid;
enum msgtype msg;
char *cause;
struct termios tio, saved_tio;
+ size_t size;
/* Set up the initial command. */
cmdflags = 0;
@@ -265,19 +267,32 @@ client_main(int argc, char **argv, int flags)
/* Send first command. */
if (msg == MSG_COMMAND) {
+ /* How big is the command? */
+ size = 0;
+ for (i = 0; i < argc; i++)
+ size += strlen(argv[i]) + 1;
+ data = xmalloc((sizeof *data) + size);
+
/* Fill in command line arguments. */
- cmddata.pid = environ_pid;
- cmddata.session_id = environ_session_id;
+ data->pid = environ_pid;
+ data->session_id = environ_session_id;
/* Prepare command for server. */
- cmddata.argc = argc;
- if (cmd_pack_argv(
- argc, argv, cmddata.argv, sizeof cmddata.argv) != 0) {
+ data->argc = argc;
+ if (cmd_pack_argv(argc, argv, (char*)(data + 1), size) != 0) {
fprintf(stderr, "command too long\n");
+ free(data);
return (1);
}
+ size += sizeof *data;
- client_write_server(msg, &cmddata, sizeof cmddata);
+ /* Send the command. */
+ if (client_write_server(msg, data, size) != 0) {
+ fprintf(stderr, "failed to send command\n");
+ free(data);
+ return (1);
+ }
+ free(data);
} else if (msg == MSG_SHELL)
client_write_server(msg, NULL, 0);
@@ -349,12 +364,29 @@ client_send_environ(void)
}
}
+/* Helper to send one message. */
+int
+client_write_one(enum msgtype type, int fd, const void *buf, size_t len)
+{
+ int retval;
+
+ retval = imsg_compose(&client_ibuf, type, PROTOCOL_VERSION, -1, fd,
+ (void*)buf, len);
+ if (retval != 1)
+ return (-1);
+ return (0);
+}
+
/* Write a message to the server without a file descriptor. */
-void
-client_write_server(enum msgtype type, void *buf, size_t len)
+int
+client_write_server(enum msgtype type, const void *buf, size_t len)
{
- imsg_compose(&client_ibuf, type, PROTOCOL_VERSION, -1, -1, buf, len);
- client_update_event();
+ int retval;
+
+ retval = client_write_one(type, -1, buf, len);
+ if (retval == 0)
+ client_update_event();
+ return (retval);
}
/* Update client event based on whether it needs to read or read and write. */
@@ -537,14 +569,16 @@ client_dispatch_wait(void *data0)
fatalx("bad MSG_STDOUT size");
memcpy(&stdoutdata, data, sizeof stdoutdata);
- client_write(STDOUT_FILENO, stdoutdata.data,
stdoutdata.size);
+ client_write(STDOUT_FILENO, stdoutdata.data,
+ stdoutdata.size);
break;
case MSG_STDERR:
if (datalen != sizeof stderrdata)
fatalx("bad MSG_STDERR size");
memcpy(&stderrdata, data, sizeof stderrdata);
- client_write(STDERR_FILENO, stderrdata.data,
stderrdata.size);
+ client_write(STDERR_FILENO, stderrdata.data,
+ stderrdata.size);
break;
case MSG_VERSION:
if (datalen != 0)
diff --git a/server-client.c b/server-client.c
index 31a286b..11f1937 100644
--- a/server-client.c
+++ b/server-client.c
@@ -40,7 +40,7 @@ void server_client_reset_state(struct client *);
int server_client_assume_paste(struct session *);
int server_client_msg_dispatch(struct client *);
-void server_client_msg_command(struct client *, struct msg_command_data *);
+void server_client_msg_command(struct client *, struct imsg *);
void server_client_msg_identify(
struct client *, struct msg_identify_data *, int);
void server_client_msg_shell(struct client *);
@@ -786,10 +786,10 @@ int
server_client_msg_dispatch(struct client *c)
{
struct imsg imsg;
- struct msg_command_data commanddata;
struct msg_identify_data identifydata;
struct msg_environ_data environdata;
struct msg_stdin_data stdindata;
+ const char *data;
ssize_t n, datalen;
if ((n = imsg_read(&c->ibuf)) == -1 || n == 0)
@@ -800,6 +800,8 @@ server_client_msg_dispatch(struct client *c)
return (-1);
if (n == 0)
return (0);
+
+ data = imsg.data;
datalen = imsg.hdr.len - IMSG_HEADER_SIZE;
if (imsg.hdr.peerid != PROTOCOL_VERSION) {
@@ -811,13 +813,6 @@ server_client_msg_dispatch(struct client *c)
log_debug("got %d from client %d", imsg.hdr.type, c->ibuf.fd);
switch (imsg.hdr.type) {
- case MSG_COMMAND:
- if (datalen != sizeof commanddata)
- fatalx("bad MSG_COMMAND size");
- memcpy(&commanddata, imsg.data, sizeof commanddata);
-
- server_client_msg_command(c, &commanddata);
- break;
case MSG_IDENTIFY:
if (datalen != sizeof identifydata)
fatalx("bad MSG_IDENTIFY size");
@@ -827,10 +822,13 @@ server_client_msg_dispatch(struct client *c)
#endif
server_client_msg_identify(c, &identifydata, imsg.fd);
break;
+ case MSG_COMMAND:
+ server_client_msg_command(c, &imsg);
+ break;
case MSG_STDIN:
if (datalen != sizeof stdindata)
fatalx("bad MSG_STDIN size");
- memcpy(&stdindata, imsg.data, sizeof stdindata);
+ memcpy(&stdindata, data, sizeof stdindata);
if (c->stdin_callback == NULL)
break;
@@ -905,15 +903,26 @@ server_client_msg_dispatch(struct client *c)
/* Handle command message. */
void
-server_client_msg_command(struct client *c, struct msg_command_data *data)
+server_client_msg_command(struct client *c, struct imsg *imsg)
{
- struct cmd_list *cmdlist = NULL;
- int argc;
- char **argv, *cause;
-
- argc = data->argc;
- data->argv[(sizeof data->argv) - 1] = '\0';
- if (cmd_unpack_argv(data->argv, sizeof data->argv, argc, &argv) != 0) {
+ struct msg_command_data data;
+ char *buf;
+ size_t len;
+ struct cmd_list *cmdlist = NULL;
+ int argc;
+ char **argv, *cause;
+
+ if (imsg->hdr.len - IMSG_HEADER_SIZE < sizeof data)
+ fatalx("bad MSG_COMMAND size");
+ memcpy(&data, imsg->data, sizeof data);
+
+ buf = (char*)imsg->data + sizeof data;
+ len = imsg->hdr.len - IMSG_HEADER_SIZE - sizeof data;
+ if (len > 0 && buf[len - 1] != '\0')
+ fatalx("bad MSG_COMMAND string");
+
+ argc = data.argc;
+ if (cmd_unpack_argv(buf, len, argc, &argv) != 0) {
cmdq_error(c->cmdq, "command too long");
goto error;
}
diff --git a/server-fn.c b/server-fn.c
index f025b3a..1b49985 100644
--- a/server-fn.c
+++ b/server-fn.c
@@ -236,7 +236,6 @@ void
server_lock_client(struct client *c)
{
const char *cmd;
- size_t cmdlen;
if (c->flags & CLIENT_CONTROL)
return;
diff --git a/tmux.h b/tmux.h
index 96ce0c6..5e6de25 100644
--- a/tmux.h
+++ b/tmux.h
@@ -55,7 +55,6 @@ extern char **environ;
* Maximum sizes of strings in message data. Don't forget to bump
* PROTOCOL_VERSION if any of these change!
*/
-#define COMMAND_LENGTH 2048 /* packed argv size */
#define TERMINAL_LENGTH 128 /* length of TERM environment variable */
#define ENVIRON_LENGTH 1024 /* environment variable length */
@@ -468,16 +467,14 @@ enum msgtype {
* Don't forget to bump PROTOCOL_VERSION if any of these change!
*/
struct msg_command_data {
- pid_t pid; /* from $TMUX or -1 */
- int session_id; /* from $TMUX or -1 */
+ pid_t pid; /* from $TMUX or -1 */
+ int session_id; /* from $TMUX or -1 */
- int argc;
- char argv[COMMAND_LENGTH];
-};
+ int argc;
+}; /* followed by packed argv */
struct msg_identify_data {
char cwd[MAXPATHLEN];
-
char term[TERMINAL_LENGTH];
#ifdef __CYGWIN__
@@ -1316,7 +1313,7 @@ struct client {
#define CLIENT_EXIT 0x4
#define CLIENT_REDRAW 0x8
#define CLIENT_STATUS 0x10
-#define CLIENT_REPEAT 0x20 /* allow command to repeat within repeat time */
+#define CLIENT_REPEAT 0x20
#define CLIENT_SUSPENDED 0x40
#define CLIENT_BAD 0x80
#define CLIENT_IDENTIFY 0x100
@@ -1919,10 +1916,10 @@ void server_window_loop(void);
/* server-fn.c */
void server_fill_environ(struct session *, struct environ *);
void server_write_ready(struct client *);
-int server_write_client(
- struct client *, enum msgtype, const void *, size_t);
-void server_write_session(
- struct session *, enum msgtype, const void *, size_t);
+int server_write_client(struct client *, enum msgtype, const void *,
+ size_t);
+void server_write_session(struct session *, enum msgtype, const void *,
+ size_t);
void server_redraw_client(struct client *);
void server_status_client(struct client *);
void server_redraw_session(struct session *);
-----------------------------------------------------------------------
Summary of changes:
client.c | 64 ++++++++++++++++++++++++++++++++++++++++++-------------
server-client.c | 45 +++++++++++++++++++++++---------------
server-fn.c | 1 -
tmux.h | 21 +++++++----------
4 files changed, 85 insertions(+), 46 deletions(-)
hooks/post-receive
--
tmux
------------------------------------------------------------------------------
October Webinars: Code for Performance
Free Intel webinars can help you accelerate application performance.
Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most from
the latest Intel processors and coprocessors. See abstracts and register >
http://pubads.g.doubleclick.net/gampad/clk?id=60134791&iu=/4140/ostg.clktrk
_______________________________________________
tmux-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-cvs