From 687d464f5c60cfe135436dab3dc29620ea8d1f95 Mon Sep 17 00:00:00 2001 From: Chong Yidong Date: Wed, 2 May 2012 21:06:08 +0800 Subject: [PATCH] Backport Bug#11374 fix from trunk --- lib-src/ChangeLog | 5 ++++- lib-src/emacsclient.c | 40 ++++++++++++++++++++++------------------ 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/lib-src/ChangeLog b/lib-src/ChangeLog index 8e07193ae0c..90fd722141b 100644 --- a/lib-src/ChangeLog +++ b/lib-src/ChangeLog @@ -1,4 +1,7 @@ -2012-05-02 Jim Meyering +2012-05-02 Jim Meyering + + * emacsclient.c (send_to_emacs): Avoid invalid strcpy upon partial + send (Bug#11374). * lib-src/pop.c (pop_stat, pop_list, pop_multi_first, pop_last): NUL-terminate the error buffer (Bug#11372). diff --git a/lib-src/emacsclient.c b/lib-src/emacsclient.c index 48b4384d487..931f6d10c5c 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; } } -- 2.39.5