[glib] g_output_stream_splice: deal with overflow
- From: Dan Winship <danw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib] g_output_stream_splice: deal with overflow
- Date: Wed, 6 Jul 2011 12:39:52 +0000 (UTC)
commit 37ab5ced317342137c60c90feab26e1ac69b6285
Author: Dan Winship <danw gnome org>
Date: Tue Jun 7 17:15:17 2011 -0400
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
gio/goutputstream.c | 15 ++++++++++++---
1 files changed, 12 insertions(+), 3 deletions(-)
---
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,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]