summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSeonah Moon <seonah1.moon@samsung.com>2018-06-18 11:36:46 +0900
committerSeonah Moon <seonah1.moon@samsung.com>2018-06-18 13:14:58 +0900
commit99e5d143b36993ac01cc03509bfb9c36b705bf74 (patch)
tree78b298071461fc1a04a39a7b0be32d1683b5b168
parent90e606af7fd3f63453dd423615ff03a4dacab914 (diff)
downloadlibsoup-99e5d143b36993ac01cc03509bfb9c36b705bf74.tar.gz
libsoup-99e5d143b36993ac01cc03509bfb9c36b705bf74.tar.bz2
libsoup-99e5d143b36993ac01cc03509bfb9c36b705bf74.zip
Fix chunked decoding buffer overrun (CVE-2017-2885)submit/tizen_4.0/20180618.083157accepted/tizen/4.0/unified/20180619.142403
https://bugzilla.gnome.org/show_bug.cgi?id=785774 Change-Id: Ifc0acb59c638fec66993969230994c20dfbcd803
-rw-r--r--libsoup/soup-filter-input-stream.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/libsoup/soup-filter-input-stream.c b/libsoup/soup-filter-input-stream.c
index 8067b882..deeee76c 100644
--- a/libsoup/soup-filter-input-stream.c
+++ b/libsoup/soup-filter-input-stream.c
@@ -201,7 +201,7 @@ soup_filter_input_stream_read_until (SoupFilterInputStream *fstream,
GCancellable *cancellable,
GError **error)
{
- gssize nread;
+ gssize nread, read_length;
guint8 *p, *buf, *end;
gboolean eof = FALSE;
GError *my_error = NULL;
@@ -254,10 +254,11 @@ soup_filter_input_stream_read_until (SoupFilterInputStream *fstream,
} else
buf = fstream->priv->buf->data;
- /* Scan for the boundary */
- end = buf + fstream->priv->buf->len;
- if (!eof)
- end -= boundary_length;
+ /* Scan for the boundary within the range we can possibly return. */
+ if (include_boundary)
+ end = buf + MIN (fstream->priv->buf->len, length) - boundary_length;
+ else
+ end = buf + MIN (fstream->priv->buf->len - boundary_length, length);
for (p = buf; p <= end; p++) {
if (*p == *(guint8*)boundary &&
!memcmp (p, boundary, boundary_length)) {
@@ -271,10 +272,9 @@ soup_filter_input_stream_read_until (SoupFilterInputStream *fstream,
if (!*got_boundary && fstream->priv->buf->len < length && !eof)
goto fill_buffer;
- /* Return everything up to 'p' (which is either just after the boundary if
- * include_boundary is TRUE, just before the boundary if include_boundary is
- * FALSE, @boundary_len - 1 bytes before the end of the buffer, or end-of-
- * file).
- */
- return read_from_buf (fstream, buffer, p - buf);
+ if (eof && !*got_boundary)
+ read_length = MIN (fstream->priv->buf->len, length);
+ else
+ read_length = p - buf;
+ return read_from_buf (fstream, buffer, read_length);
}