Skip to content

Commit 1d32bd4

Browse files
committed
generator.c: Handle stupidly large depth
1 parent ab6972d commit 1d32bd4

2 files changed

Lines changed: 21 additions & 1 deletion

File tree

ext/json/ext/fbuffer/fbuffer.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,15 @@ static inline void fbuffer_inc_capa(FBuffer *fb, size_t requested)
131131
}
132132
}
133133

134+
static inline size_t fbuffer_size_mul_or_raise(size_t a, size_t b)
135+
{
136+
size_t result = a * b;
137+
if (RB_UNLIKELY(a != 0 && (result / a) != b)) {
138+
rb_raise(rb_eArgError, "Buffer overflow, the resulting document is too large to be generated");
139+
}
140+
return result;
141+
}
142+
134143
static inline void fbuffer_append_reserved(FBuffer *fb, const char *newstr, size_t len)
135144
{
136145
MEMCPY(fb->ptr + fb->len, newstr, char, len);
@@ -175,7 +184,7 @@ static void fbuffer_append_str_repeat(FBuffer *fb, VALUE str, size_t repeat)
175184
size_t len;
176185
RSTRING_GETMEM(str, ptr, len);
177186

178-
fbuffer_inc_capa(fb, repeat * len);
187+
fbuffer_inc_capa(fb, fbuffer_size_mul_or_raise(repeat, len));
179188
while (repeat) {
180189
#if JSON_DEBUG
181190
fb->requested = len;

test/json/json_generator_test.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1081,4 +1081,15 @@ def test_negative_depth_raises
10811081
end
10821082
end
10831083

1084+
def test_large_depth_raises
1085+
assert_raise(RangeError, ArgumentError) do
1086+
JSON.generate([[1]],
1087+
indent: " " * 5,
1088+
array_nl: "\n",
1089+
depth: 3_689_348_814_741_910_324,
1090+
max_nesting: 0
1091+
)
1092+
end
1093+
end
1094+
10841095
end

0 commit comments

Comments
 (0)