summaryrefslogtreecommitdiff
path: root/libyajl-CVE-2022-24795.patch
diff options
context:
space:
mode:
Diffstat (limited to 'libyajl-CVE-2022-24795.patch')
-rw-r--r--libyajl-CVE-2022-24795.patch36
1 files changed, 36 insertions, 0 deletions
diff --git a/libyajl-CVE-2022-24795.patch b/libyajl-CVE-2022-24795.patch
new file mode 100644
index 0000000..3fb9177
--- /dev/null
+++ b/libyajl-CVE-2022-24795.patch
@@ -0,0 +1,36 @@
+From d3a528c788ba9e531fab91db41d3a833c54da325 Mon Sep 17 00:00:00 2001
+From: Jacek Tomasiak <jacek.tomasiak@gmail.com>
+Date: Thu, 12 May 2022 13:02:47 +0200
+Subject: [PATCH] Fix CVE-2022-24795 (from brianmario/yajl-ruby)
+
+The buffer reallocation could cause heap corruption because of `need`
+overflow for large inputs. In addition, there's a possible infinite loop
+in case `need` reaches zero.
+
+The fix is to `abort()` if the loop ends with lower value of `need` than
+when it started.
+---
+ src/yajl_buf.c | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+Index: yajl-2.1.0/src/yajl_buf.c
+===================================================================
+--- yajl-2.1.0.orig/src/yajl_buf.c
++++ yajl-2.1.0/src/yajl_buf.c
+@@ -45,7 +45,15 @@ void yajl_buf_ensure_available(yajl_buf
+
+ need = buf->len;
+
+- while (want >= (need - buf->used)) need <<= 1;
++ while (need > 0 && want >= (need - buf->used)) {
++ /* this eventually "overflows" to zero */
++ need <<= 1;
++ }
++
++ /* overflow */
++ if (need < buf->len) {
++ abort();
++ }
+
+ if (need != buf->len) {
+ buf->data = (unsigned char *) YA_REALLOC(buf->alloc, buf->data, need);