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 c782756..95a2509 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 c782756..95a2509 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 8667ae2..49d7cb3 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 80e8e34..39b3337 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;
 }