Skip to content

Commit 2ce61ea

Browse files
committed
Limit large inter decoding
This can be changed with the decoding_integer_digit_limit compile-time env option
1 parent ed8f1c2 commit 2ce61ea

File tree

3 files changed

+22
-1
lines changed

3 files changed

+22
-1
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
22

3+
## 1.4.1 (06.07.2023)
4+
5+
* Add limit to decoded integer sizes of 1024 digits. This can be changed
6+
with the `decoding_integer_digit_limit` app env config.
7+
38
## 1.4.0 (12.09.2022)
49

510
### Enhancements

lib/decoder.ex

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,13 @@ defmodule Jason.Decoder do
156156
error(original, skip + 1)
157157
end
158158

159+
if function_exported?(Application, :compile_env, 3) do
160+
@integer_digit_limit Application.compile_env(:jason, :decoding_integer_digit_limit, 1024)
161+
else
162+
# use apply to avoid warnings in newer Elixir versions
163+
@integer_digit_limit apply(Application, :get_env, [:jason, :decoding_integer_digit_limit, 1024])
164+
end
165+
159166
defp number(<<byte, rest::bits>>, original, skip, stack, decode, len)
160167
when byte in '0123456789' do
161168
number(rest, original, skip, stack, decode, len + 1)
@@ -168,7 +175,11 @@ defmodule Jason.Decoder do
168175
number_exp_copy(rest, original, skip + len + 1, stack, decode, prefix)
169176
end
170177
defp number(<<rest::bits>>, original, skip, stack, decode, len) do
171-
int = String.to_integer(binary_part(original, skip, len))
178+
token = binary_part(original, skip, len)
179+
if byte_size(token) > @integer_digit_limit do
180+
token_error(token, skip)
181+
end
182+
int = String.to_integer(token)
172183
continue(rest, original, skip + len, stack, decode, int)
173184
end
174185

test/decode_test.exs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,11 @@ defmodule Jason.DecodeTest do
171171
assert parse!(body) == expected
172172
end
173173

174+
test "large integers" do
175+
massive_integer = String.duplicate("1", 2_000)
176+
assert_fail_with(massive_integer, "unexpected sequence at position 0: #{inspect massive_integer}")
177+
end
178+
174179
defp parse!(json, opts \\ []) do
175180
Jason.decode!(json, opts)
176181
end

0 commit comments

Comments
 (0)