emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] /srv/bzr/emacs/emacs-24 r107936: Backport fix for Bug#1137


From: Chong Yidong
Subject: [Emacs-diffs] /srv/bzr/emacs/emacs-24 r107936: Backport fix for Bug#11374 from trunk
Date: Wed, 02 May 2012 21:08:38 +0800
User-agent: Bazaar (2.3.1)

------------------------------------------------------------
revno: 107936 [merge]
committer: Chong Yidong <address@hidden>
branch nick: emacs-24
timestamp: Wed 2012-05-02 21:08:38 +0800
message:
  Backport fix for Bug#11374 from trunk
modified:
  lib-src/ChangeLog
  lib-src/emacsclient.c
=== modified file 'lib-src/ChangeLog'
--- a/lib-src/ChangeLog 2012-05-02 10:12:13 +0000
+++ b/lib-src/ChangeLog 2012-05-02 13:06:50 +0000
@@ -1,4 +1,11 @@
-2012-05-02  Jim Meyering  <address@hidden>
+2012-05-02  Juanma Barranquero  <address@hidden>
+
+       * emacsclient.c (min): Undef before redefining it.
+
+2012-05-02  Jim Meyering  <address@hidden>
+
+       * 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).

=== modified file 'lib-src/emacsclient.c'
--- a/lib-src/emacsclient.c     2012-04-15 08:49:24 +0000
+++ b/lib-src/emacsclient.c     2012-05-02 13:06:50 +0000
@@ -119,6 +119,11 @@
 # define IF_LINT(Code) /* empty */
 #endif
 
+#ifdef min
+#undef min
+#endif
+#define min(x, y) (((x) < (y)) ? (x) : (y))
+
 
 /* Name used to invoke this program.  */
 const char *progname;
@@ -783,33 +788,35 @@
 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;
     }
 }
 


reply via email to

[Prev in Thread] Current Thread [Next in Thread]