Skip to content

Commit 3927c5c

Browse files
mameclaude
authored andcommitted
Fix JSON::ResumableParser#parse leaking the in_use lock on an empty buffer
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent e5fa06a commit 3927c5c

2 files changed

Lines changed: 16 additions & 0 deletions

File tree

ext/json/ext/parser/parser.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2377,6 +2377,7 @@ static VALUE cResumableParser_parse(VALUE self)
23772377
{
23782378
JSON_ResumableParser *parser = ResumableParser_acquire(self, true);
23792379
if (!parser->buffer) {
2380+
parser->in_use = false;
23802381
return Qfalse;
23812382
}
23822383

test/json/resumable_parser_test.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,21 @@ def test_clear
4848
refute_predicate @parser, :value?
4949
end
5050

51+
def test_parse_with_empty_buffer_keeps_parser_usable
52+
# parse before any feed must not leak the in_use lock
53+
refute @parser.parse
54+
@parser << '[1, 2, 3]'
55+
assert @parser.parse
56+
assert_equal [1, 2, 3], @parser.value
57+
58+
# same after a clear with no following feed
59+
@parser.clear
60+
refute @parser.parse
61+
@parser << '[4]'
62+
assert @parser.parse
63+
assert_equal [4], @parser.value
64+
end
65+
5166
def test_parse_document_direct
5267
@parser << '[true]'
5368
assert_equal true, @parser.parse

0 commit comments

Comments
 (0)