Blame SOURCES/0006-gdatainputstream-Handle-stop_chars_len-internally-as.patch

e5da31
From 587a525b7eb44e770857cfd4526ebb49ded4e4c8 Mon Sep 17 00:00:00 2001
e5da31
From: Philip Withnall <pwithnall@endlessos.org>
e5da31
Date: Thu, 4 Feb 2021 13:49:00 +0000
e5da31
Subject: [PATCH 06/12] gdatainputstream: Handle stop_chars_len internally as
e5da31
 gsize
e5da31
e5da31
Previously it was handled as a `gssize`, which meant that if the
e5da31
`stop_chars` string was longer than `G_MAXSSIZE` there would be an
e5da31
overflow.
e5da31
e5da31
Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
e5da31
Helps: #2319
e5da31
---
e5da31
 gio/gdatainputstream.c | 25 +++++++++++++++++--------
e5da31
 1 file changed, 17 insertions(+), 8 deletions(-)
e5da31
e5da31
diff --git a/gio/gdatainputstream.c b/gio/gdatainputstream.c
e5da31
index 9f207b158..f9891bb09 100644
e5da31
--- a/gio/gdatainputstream.c
e5da31
+++ b/gio/gdatainputstream.c
e5da31
@@ -27,6 +27,7 @@
e5da31
 #include "gioenumtypes.h"
e5da31
 #include "gioerror.h"
e5da31
 #include "glibintl.h"
e5da31
+#include "gstrfuncsprivate.h"
e5da31
 
e5da31
 #include <string.h>
e5da31
 
e5da31
@@ -856,7 +857,7 @@ static gssize
e5da31
 scan_for_chars (GDataInputStream *stream,
e5da31
 		gsize            *checked_out,
e5da31
 		const char       *stop_chars,
e5da31
-                gssize            stop_chars_len)
e5da31
+                gsize             stop_chars_len)
e5da31
 {
e5da31
   GBufferedInputStream *bstream;
e5da31
   const char *buffer;
e5da31
@@ -952,7 +953,7 @@ typedef struct
e5da31
   gsize checked;
e5da31
 
e5da31
   gchar *stop_chars;
e5da31
-  gssize stop_chars_len;
e5da31
+  gsize stop_chars_len;
e5da31
   gsize length;
e5da31
 } GDataInputStreamReadData;
e5da31
 
e5da31
@@ -1078,12 +1079,17 @@ g_data_input_stream_read_async (GDataInputStream    *stream,
e5da31
 {
e5da31
   GDataInputStreamReadData *data;
e5da31
   GTask *task;
e5da31
+  gsize stop_chars_len_unsigned;
e5da31
 
e5da31
   data = g_slice_new0 (GDataInputStreamReadData);
e5da31
-  if (stop_chars_len == -1)
e5da31
-    stop_chars_len = strlen (stop_chars);
e5da31
-  data->stop_chars = g_memdup (stop_chars, stop_chars_len);
e5da31
-  data->stop_chars_len = stop_chars_len;
e5da31
+
e5da31
+  if (stop_chars_len < 0)
e5da31
+    stop_chars_len_unsigned = strlen (stop_chars);
e5da31
+  else
e5da31
+    stop_chars_len_unsigned = (gsize) stop_chars_len;
e5da31
+
e5da31
+  data->stop_chars = g_memdup2 (stop_chars, stop_chars_len_unsigned);
e5da31
+  data->stop_chars_len = stop_chars_len_unsigned;
e5da31
   data->last_saw_cr = FALSE;
e5da31
 
e5da31
   task = g_task_new (stream, cancellable, callback, user_data);
e5da31
@@ -1338,17 +1344,20 @@ g_data_input_stream_read_upto (GDataInputStream  *stream,
e5da31
   gssize found_pos;
e5da31
   gssize res;
e5da31
   char *data_until;
e5da31
+  gsize stop_chars_len_unsigned;
e5da31
 
e5da31
   g_return_val_if_fail (G_IS_DATA_INPUT_STREAM (stream), NULL);
e5da31
 
e5da31
   if (stop_chars_len < 0)
e5da31
-    stop_chars_len = strlen (stop_chars);
e5da31
+    stop_chars_len_unsigned = strlen (stop_chars);
e5da31
+  else
e5da31
+    stop_chars_len_unsigned = (gsize) stop_chars_len;
e5da31
 
e5da31
   bstream = G_BUFFERED_INPUT_STREAM (stream);
e5da31
 
e5da31
   checked = 0;
e5da31
 
e5da31
-  while ((found_pos = scan_for_chars (stream, &checked, stop_chars, stop_chars_len)) == -1)
e5da31
+  while ((found_pos = scan_for_chars (stream, &checked, stop_chars, stop_chars_len_unsigned)) == -1)
e5da31
     {
e5da31
       if (g_buffered_input_stream_get_available (bstream) ==
e5da31
           g_buffered_input_stream_get_buffer_size (bstream))
e5da31
-- 
e5da31
2.31.1
e5da31