[glib] Fix several recently-introduced bugs in g_output_stream_write_async()



commit fd3ec4df87ce05f364799b7eb8b0219420d755c4
Author: Dan Winship <danw gnome org>
Date:   Fri Apr 27 09:27:38 2012 -0400

    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

 gio/ginputstream.c  |   12 ++++++++++--
 gio/goutputstream.c |   15 +++++++++++++--
 2 files changed, 23 insertions(+), 4 deletions(-)
---
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)))



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]