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

Some streams have no close function, so this caused a crash.
This commit is contained in:
Alexander Larsson 2009-05-20 13:37:55 +02:00
parent 0a280dadec
commit c20b8d4d53
3 changed files with 26 additions and 16 deletions

View File

@ -1167,6 +1167,8 @@ close_async_thread (GSimpleAsyncResult *res,
open handles */ open handles */
class = G_INPUT_STREAM_GET_CLASS (object); class = G_INPUT_STREAM_GET_CLASS (object);
if (class->close_fn)
{
result = class->close_fn (G_INPUT_STREAM (object), cancellable, &error); result = class->close_fn (G_INPUT_STREAM (object), cancellable, &error);
if (!result) if (!result)
{ {
@ -1174,6 +1176,7 @@ close_async_thread (GSimpleAsyncResult *res,
g_error_free (error); g_error_free (error);
} }
} }
}
static void static void
g_input_stream_real_close_async (GInputStream *stream, g_input_stream_real_close_async (GInputStream *stream,

View File

@ -569,6 +569,8 @@ close_async_thread (GSimpleAsyncResult *res,
open handles */ open handles */
class = G_IO_STREAM_GET_CLASS (object); class = G_IO_STREAM_GET_CLASS (object);
if (class->close_fn)
{
result = class->close_fn (G_IO_STREAM (object), cancellable, &error); result = class->close_fn (G_IO_STREAM (object), cancellable, &error);
if (!result) if (!result)
{ {
@ -576,6 +578,7 @@ close_async_thread (GSimpleAsyncResult *res,
g_error_free (error); g_error_free (error);
} }
} }
}
static void static void
g_io_stream_real_close_async (GIOStream *stream, g_io_stream_real_close_async (GIOStream *stream,

View File

@ -456,7 +456,8 @@ g_output_stream_real_splice (GOutputStream *stream,
if (flags & G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET) if (flags & G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET)
{ {
/* But write errors on close are bad! */ /* 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; res = FALSE;
} }
@ -1309,6 +1310,8 @@ close_async_thread (GSimpleAsyncResult *res,
open handles */ open handles */
class = G_OUTPUT_STREAM_GET_CLASS (object); class = G_OUTPUT_STREAM_GET_CLASS (object);
if (class->close_fn)
{
result = class->close_fn (G_OUTPUT_STREAM (object), cancellable, &error); result = class->close_fn (G_OUTPUT_STREAM (object), cancellable, &error);
if (!result) if (!result)
{ {
@ -1316,6 +1319,7 @@ close_async_thread (GSimpleAsyncResult *res,
g_error_free (error); g_error_free (error);
} }
} }
}
static void static void
g_output_stream_real_close_async (GOutputStream *stream, g_output_stream_real_close_async (GOutputStream *stream,