|
|
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 |
|