From: Dan Winship Date: Fri, 27 Apr 2012 13:27:38 +0000 (-0400) Subject: Fix several recently-introduced bugs in g_output_stream_write_async() X-Git-Tag: 2.33.1~15 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fd3ec4df87ce05f364799b7eb8b0219420d755c4;p=platform%2Fupstream%2Fglib.git Fix several recently-introduced bugs in g_output_stream_write_async() g_output_stream_write_async() was not initializing the newly-added members of the WriteData structure, causing various problems. Also, g_input_stream_read_async() was now leaking its cancellable. Fix that as well. https://bugzilla.gnome.org/show_bug.cgi?id=674612 --- diff --git a/gio/ginputstream.c b/gio/ginputstream.c index c410d52..4f9f48e 100644 --- a/gio/ginputstream.c +++ b/gio/ginputstream.c @@ -932,6 +932,14 @@ typedef struct { } ReadData; static void +free_read_data (ReadData *op) +{ + if (op->cancellable) + g_object_unref (op->cancellable); + g_slice_free (ReadData, op); +} + +static void read_async_thread (GSimpleAsyncResult *res, GObject *object, GCancellable *cancellable) @@ -1017,9 +1025,9 @@ g_input_stream_real_read_async (GInputStream *stream, GSimpleAsyncResult *res; ReadData *op; - op = g_new (ReadData, 1); + op = g_slice_new0 (ReadData); res = g_simple_async_result_new (G_OBJECT (stream), callback, user_data, g_input_stream_real_read_async); - g_simple_async_result_set_op_res_gpointer (res, op, g_free); + g_simple_async_result_set_op_res_gpointer (res, op, (GDestroyNotify) free_read_data); op->buffer = buffer; op->count_requested = count; op->cancellable = cancellable ? g_object_ref (cancellable) : NULL; diff --git a/gio/goutputstream.c b/gio/goutputstream.c index 9d3815d..e238d8b 100644 --- a/gio/goutputstream.c +++ b/gio/goutputstream.c @@ -1273,6 +1273,14 @@ typedef struct { } WriteData; static void +free_write_data (WriteData *op) +{ + if (op->cancellable) + g_object_unref (op->cancellable); + g_slice_free (WriteData, op); +} + +static void write_async_thread (GSimpleAsyncResult *res, GObject *object, GCancellable *cancellable) @@ -1355,11 +1363,14 @@ g_output_stream_real_write_async (GOutputStream *stream, GSimpleAsyncResult *res; WriteData *op; - op = g_new0 (WriteData, 1); + op = g_slice_new0 (WriteData); res = g_simple_async_result_new (G_OBJECT (stream), callback, user_data, g_output_stream_real_write_async); - g_simple_async_result_set_op_res_gpointer (res, op, g_free); + g_simple_async_result_set_op_res_gpointer (res, op, (GDestroyNotify) free_write_data); op->buffer = buffer; op->count_requested = count; + op->cancellable = cancellable ? g_object_ref (cancellable) : NULL; + op->io_priority = io_priority; + op->need_idle = TRUE; if (G_IS_POLLABLE_OUTPUT_STREAM (stream) && g_pollable_output_stream_can_poll (G_POLLABLE_OUTPUT_STREAM (stream)))