Commit c20b8d4d authored by Alexander Larsson's avatar Alexander Larsson

Check that close_fn is not %NULL before calling (#578499)

Some streams have no close function, so this caused a crash.
parent 0a280dad
......@@ -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);
}
}
}
......
......@@ -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);
}
}
}
......
......@@ -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);
}
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment