Avoid running in an assertion with small writes. (#343566, Chris Wilson)
authorMatthias Clasen <mclasen@redhat.com>
Thu, 1 Jun 2006 15:57:38 +0000 (15:57 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Thu, 1 Jun 2006 15:57:38 +0000 (15:57 +0000)
2006-06-01  Matthias Clasen  <mclasen@redhat.com>

* glib/giochannel.c (g_io_channel_write_chars): Avoid
running in an assertion with small writes.  (#343566, Chris
Wilson)

* tests/iochannel-test.c: Add a testcase for small writes.

ChangeLog
ChangeLog.pre-2-12
glib/giochannel.c
tests/iochannel-test.c

index c782756f2b95e1a575d872bf8c46cf6c442c720e..95a25090e271d1c21d5565e0da13da0ef5b9827f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2006-06-01  Matthias Clasen  <mclasen@redhat.com>
 
+       * glib/giochannel.c (g_io_channel_write_chars): Avoid
+       running in an assertion with small writes.  (#343566, Chris
+       Wilson)
+
+       * tests/iochannel-test.c: Add a testcase for small writes.
+
        * glib/glib.symbols: 
        * glib/ghash.h: 
        * glib/ghash.c: Add g_hash_table_{remove,steal}_all to
index c782756f2b95e1a575d872bf8c46cf6c442c720e..95a25090e271d1c21d5565e0da13da0ef5b9827f 100644 (file)
@@ -1,5 +1,11 @@
 2006-06-01  Matthias Clasen  <mclasen@redhat.com>
 
+       * glib/giochannel.c (g_io_channel_write_chars): Avoid
+       running in an assertion with small writes.  (#343566, Chris
+       Wilson)
+
+       * tests/iochannel-test.c: Add a testcase for small writes.
+
        * glib/glib.symbols: 
        * glib/ghash.h: 
        * glib/ghash.c: Add g_hash_table_{remove,steal}_all to
index 8667ae2ec042e6711d6782705d82cf50e03efa09..49d7cb33dc080e935a03e5e6b69ca57bb47b5fd2 100644 (file)
@@ -2009,7 +2009,7 @@ g_io_channel_write_chars (GIOChannel      *channel,
        * and never receiving an EAGAIN.
        */
 
-      if (channel->write_buf->len >= channel->buf_size)
+      if (channel->write_buf->len >= channel->buf_size - MAX_CHAR_SIZE)
         {
           gsize did_write = 0, this_time;
 
index 80e8e343386f919a5d60d0753da0491ed20c1ccf..39b3337a37c68b9289144bd46fd7342cca9108d7 100644 (file)
 
 #define BUFFER_SIZE 1024
 
+static void
+test_small_writes (void)
+{
+  GIOChannel *io;
+  GIOStatus status;
+  guint cnt; 
+  gchar tmp;
+  GError *error = NULL;
+
+  io = g_io_channel_new_file ("iochannel-test-outfile", "w", &error);
+  if (error)
+    {
+      g_warning ("Unable to open file %s: %s", 
+                "iochannel-test-outfile", 
+                error->message);
+      g_error_free (error);
+      
+      exit (1);
+    }
+
+  g_io_channel_set_encoding (io, NULL, NULL);
+  g_io_channel_set_buffer_size (io, 1022);
+
+  cnt = 2 * g_io_channel_get_buffer_size (io);
+  tmp = 0;
+  while (cnt)
+    {
+      status = g_io_channel_write_chars (io, &tmp, 1, NULL, NULL);
+      if (status == G_IO_STATUS_ERROR)
+       break;
+      if (status == G_IO_STATUS_NORMAL)
+       cnt--;
+    }
+
+  g_assert (status == G_IO_STATUS_NORMAL);
+
+  g_io_channel_unref (io);
+}
+
+
 gint main (gint argc, gchar * argv[])
 {
     GIOChannel *gio_r, *gio_w ;
@@ -125,6 +166,8 @@ gint main (gint argc, gchar * argv[])
 
     g_io_channel_unref(gio_r);
     g_io_channel_unref(gio_w);
+
+    test_small_writes ();
     
     return 0;
 }