2008-03-31 Miguel de Icaza <miguel@novell.com>
authorMiguel de Icaza <miguel@gnome.org>
Mon, 31 Mar 2008 22:22:08 +0000 (22:22 -0000)
committerMiguel de Icaza <miguel@gnome.org>
Mon, 31 Mar 2008 22:22:08 +0000 (22:22 -0000)
* serial.c (write_serial): Avoid infinite loops, see #375580.

svn path=/trunk/mono/; revision=99480

support/ChangeLog
support/serial.c

index 1b719cb6d07d47e4ba4eacb0bd8ae53cb2e8bb9c..424d27243fadc62470a9b0197a6453877ab82cbb 100644 (file)
@@ -1,3 +1,7 @@
+2008-03-31  Miguel de Icaza  <miguel@novell.com>
+
+       * serial.c (write_serial): Avoid infinite loops, see #375580.
+
 2008-02-12  Jonathan Pryor  <jpryor@novell.com>
 
        * signal.c: SLES9 has glib 2.2, so we can't rely on g_atomic_int_*().
index 9443e0bb92301756c8d80c3db36ed31dafcec662..4775805aaf5950ddcb38db917c617e4a26722c80 100644 (file)
@@ -95,7 +95,7 @@ write_serial (int fd, guchar *buffer, int offset, int count, int timeout)
        fd_set writefs;
        guint32 n;
 
-       n = count - offset;
+       n = count;
 
        FD_SET(fd, &writefs);
        tmval.tv_sec = timeout / 1000;
@@ -113,7 +113,12 @@ write_serial (int fd, guchar *buffer, int offset, int count, int timeout)
                        }
                }               
 
-               t = write(fd, buffer + offset, count);
+               do {
+                       t = write (fd, buffer + offset, n);
+               } while (t == -1 && errno == EINTR);
+
+               if (t < 0)
+                       return -1;
                
                if (timeout > 0)
                {
@@ -121,7 +126,7 @@ write_serial (int fd, guchar *buffer, int offset, int count, int timeout)
                        {
                                return -1;
                        }
-       }
+               }
 
                offset += t;
                n -= t;