Check that close_fn is not %NULL before calling (#578499)
authorAlexander Larsson <alexl@redhat.com>
Wed, 20 May 2009 11:37:55 +0000 (13:37 +0200)
committerAlexander Larsson <alexl@redhat.com>
Wed, 20 May 2009 11:41:25 +0000 (13:41 +0200)
Some streams have no close function, so this caused a crash.

gio/ginputstream.c
gio/giostream.c
gio/goutputstream.c

index 3d95c8b..d3e2224 100644 (file)
@@ -1165,13 +1165,16 @@ close_async_thread (GSimpleAsyncResult *res,
      cancellation, since we want to close things anyway, although
      possibly in a quick-n-dirty way. At least we never want to leak
      open handles */
-  
+
   class = G_INPUT_STREAM_GET_CLASS (object);
-  result = class->close_fn (G_INPUT_STREAM (object), cancellable, &error);
-  if (!result)
+  if (class->close_fn)
     {
-      g_simple_async_result_set_from_error (res, error);
-      g_error_free (error);
+      result = class->close_fn (G_INPUT_STREAM (object), cancellable, &error);
+      if (!result)
+       {
+         g_simple_async_result_set_from_error (res, error);
+         g_error_free (error);
+       }
     }
 }
 
index 7669734..a79e099 100644 (file)
@@ -569,11 +569,14 @@ close_async_thread (GSimpleAsyncResult *res,
      open handles */
 
   class = G_IO_STREAM_GET_CLASS (object);
-  result = class->close_fn (G_IO_STREAM (object), cancellable, &error);
-  if (!result)
+  if (class->close_fn)
     {
-      g_simple_async_result_set_from_error (res, error);
-      g_error_free (error);
+      result = class->close_fn (G_IO_STREAM (object), cancellable, &error);
+      if (!result)
+       {
+         g_simple_async_result_set_from_error (res, error);
+         g_error_free (error);
+       }
     }
 }
 
index a040a51..9e2a875 100644 (file)
@@ -456,13 +456,14 @@ g_output_stream_real_splice (GOutputStream             *stream,
   if (flags & G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET)
     {
       /* But write errors on close are bad! */
-      if (!class->close_fn (stream, cancellable, error))
+      if (class->close_fn &&
+         !class->close_fn (stream, cancellable, error))
        res = FALSE;
     }
 
   if (res)
     return bytes_copied;
-  
+
   return -1;
 }
 
@@ -1307,13 +1308,16 @@ close_async_thread (GSimpleAsyncResult *res,
      cancellation, since we want to close things anyway, although
      possibly in a quick-n-dirty way. At least we never want to leak
      open handles */
-  
+
   class = G_OUTPUT_STREAM_GET_CLASS (object);
-  result = class->close_fn (G_OUTPUT_STREAM (object), cancellable, &error);
-  if (!result)
+  if (class->close_fn)
     {
-      g_simple_async_result_set_from_error (res, error);
-      g_error_free (error);
+      result = class->close_fn (G_OUTPUT_STREAM (object), cancellable, &error);
+      if (!result)
+       {
+         g_simple_async_result_set_from_error (res, error);
+         g_error_free (error);
+       }
     }
 }