diff --git a/ChangeLog b/ChangeLog index c04f40f8f..683c2cb37 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2006-06-01 Matthias Clasen + + * 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. + 2006-05-26 Matthias Clasen * configure.in: Bump version diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index c04f40f8f..683c2cb37 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,11 @@ +2006-06-01 Matthias Clasen + + * 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. + 2006-05-26 Matthias Clasen * configure.in: Bump version diff --git a/glib/giochannel.c b/glib/giochannel.c index 68956864d..bc86a6a64 100644 --- a/glib/giochannel.c +++ b/glib/giochannel.c @@ -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; diff --git a/tests/iochannel-test.c b/tests/iochannel-test.c index 80e8e3433..a7c9f8ab3 100644 --- a/tests/iochannel-test.c +++ b/tests/iochannel-test.c @@ -11,6 +11,46 @@ #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 ; @@ -126,5 +166,7 @@ gint main (gint argc, gchar * argv[]) g_io_channel_unref(gio_r); g_io_channel_unref(gio_w); + test_small_writes (); + return 0; }