From: Dan Winship Date: Tue, 7 Jun 2011 21:15:17 +0000 (-0400) Subject: g_output_stream_splice: deal with overflow X-Git-Tag: 2.29.12~48 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=37ab5ced317342137c60c90feab26e1ac69b6285;p=platform%2Fupstream%2Fglib.git g_output_stream_splice: deal with overflow On 32-bit machines in particular, bytes_written may overflow a gssize. Notice when that happens and just return G_MAXSSIZE instead. https://bugzilla.gnome.org/show_bug.cgi?id=649246 --- diff --git a/gio/goutputstream.c b/gio/goutputstream.c index 02f013e..cac5c92 100644 --- a/gio/goutputstream.c +++ b/gio/goutputstream.c @@ -348,7 +348,10 @@ g_output_stream_flush (GOutputStream *stream, * Splices an input stream into an output stream. * * Returns: a #gssize containing the size of the data spliced, or - * -1 if an error occurred. + * -1 if an error occurred. Note that if the number of bytes + * spliced is greater than %G_MAXSSIZE, then that will be + * returned, and there is no way to determine the actual number + * of bytes spliced. **/ gssize g_output_stream_splice (GOutputStream *stream, @@ -397,7 +400,7 @@ g_output_stream_real_splice (GOutputStream *stream, { GOutputStreamClass *class = G_OUTPUT_STREAM_GET_CLASS (stream); gssize n_read, n_written; - gssize bytes_copied; + gsize bytes_copied; char buffer[8192], *p; gboolean res; @@ -437,6 +440,9 @@ g_output_stream_real_splice (GOutputStream *stream, n_read -= n_written; bytes_copied += n_written; } + + if (bytes_copied > G_MAXSSIZE) + bytes_copied = G_MAXSSIZE; } while (res); @@ -880,7 +886,10 @@ g_output_stream_splice_async (GOutputStream *stream, * * Finishes an asynchronous stream splice operation. * - * Returns: a #gssize of the number of bytes spliced. + * Returns: a #gssize of the number of bytes spliced. Note that if the + * number of bytes spliced is greater than %G_MAXSSIZE, then that + * will be returned, and there is no way to determine the actual + * number of bytes spliced. **/ gssize g_output_stream_splice_finish (GOutputStream *stream,