From: Alexander Larsson Date: Wed, 20 May 2009 11:37:55 +0000 (+0200) Subject: Check that close_fn is not %NULL before calling (#578499) X-Git-Url: http://git.openbox.org/?a=commitdiff_plain;h=c20b8d4d53a4e90f0e822276f6fbd94d52ff3c85;p=dana%2Fcg-glib.git Check that close_fn is not %NULL before calling (#578499) Some streams have no close function, so this caused a crash. --- diff --git a/gio/ginputstream.c b/gio/ginputstream.c index 3d95c8ba..d3e22248 100644 --- a/gio/ginputstream.c +++ b/gio/ginputstream.c @@ -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); + } } } diff --git a/gio/giostream.c b/gio/giostream.c index 7669734d..a79e0995 100644 --- a/gio/giostream.c +++ b/gio/giostream.c @@ -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); + } } } diff --git a/gio/goutputstream.c b/gio/goutputstream.c index a040a514..9e2a875f 100644 --- a/gio/goutputstream.c +++ b/gio/goutputstream.c @@ -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); + } } }