diff options
author | Jim Meyering <jim@meyering.net> | 2012-05-02 18:41:27 +0800 |
---|---|---|
committer | Chong Yidong <cyd@gnu.org> | 2012-05-02 18:41:27 +0800 |
commit | 1e6f32f816c83b5a78e514d77b8f1d7052561d2e (patch) | |
tree | 26c37c6d4368e90607cbe43fa27f732ce652f3a4 /lib-src/emacsclient.c | |
parent | c7b8541ee7840221973a2b3908d5535c1d32598b (diff) | |
download | emacs-1e6f32f816c83b5a78e514d77b8f1d7052561d2e.tar.gz |
* lib-src/emacsclient.c (send_to_emacs): Avoid invalid strcpy
upon partial send.
Fixes: debbugs:11374
Diffstat (limited to 'lib-src/emacsclient.c')
-rw-r--r-- | lib-src/emacsclient.c | 40 |
1 files changed, 22 insertions, 18 deletions
diff --git a/lib-src/emacsclient.c b/lib-src/emacsclient.c index ea55398306b..d8e9e256584 100644 --- a/lib-src/emacsclient.c +++ b/lib-src/emacsclient.c @@ -119,6 +119,8 @@ char *(getcwd) (char *, size_t); # define IF_LINT(Code) /* empty */ #endif +#define min(x, y) (((x) < (y)) ? (x) : (y)) + /* Name used to invoke this program. */ const char *progname; @@ -783,33 +785,35 @@ sock_err_message (const char *function_name) static void send_to_emacs (HSOCKET s, const char *data) { - while (data) + size_t dlen; + + if (!data) + return; + + dlen = strlen (data); + while (*data) { - size_t dlen = strlen (data); - if (dlen + sblen >= SEND_BUFFER_SIZE) - { - int part = SEND_BUFFER_SIZE - sblen; - strncpy (&send_buffer[sblen], data, part); - data += part; - sblen = SEND_BUFFER_SIZE; - } - else if (dlen) - { - strcpy (&send_buffer[sblen], data); - data = NULL; - sblen += dlen; - } - else - break; + size_t part = min (dlen, SEND_BUFFER_SIZE - sblen); + memcpy (&send_buffer[sblen], data, part); + data += part; + sblen += part; if (sblen == SEND_BUFFER_SIZE || (sblen > 0 && send_buffer[sblen-1] == '\n')) { int sent = send (s, send_buffer, sblen, 0); + if (sent < 0) + { + message (TRUE, "%s: failed to send %d bytes to socket: %s\n", + progname, sblen, strerror (errno)); + fail (); + } if (sent != sblen) - strcpy (send_buffer, &send_buffer[sent]); + memmove (send_buffer, &send_buffer[sent], sblen - sent); sblen -= sent; } + + dlen -= part; } } |