Skip to content

Commit 750719c

Browse files
committed
fix: fix SEGV for streaming decompress with GC.compact
1 parent c277524 commit 750719c

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

ext/zstdruby/streaming_decompress.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,15 @@ struct streaming_decompress_t {
66
size_t buf_size;
77
};
88

9+
static void
10+
streaming_decompress_mark(void *p)
11+
{
12+
struct streaming_decompress_t *sd = p;
13+
// rb_gc_mark((VALUE)sd->ctx);
14+
rb_gc_mark(sd->buf);
15+
// rb_gc_mark(sd->buf_size);
16+
}
17+
918
static void
1019
streaming_decompress_free(void *p)
1120
{
@@ -25,7 +34,7 @@ streaming_decompress_memsize(const void *p)
2534

2635
static const rb_data_type_t streaming_decompress_type = {
2736
"streaming_decompress",
28-
{ 0, streaming_decompress_free, streaming_decompress_memsize, },
37+
{ streaming_decompress_mark, streaming_decompress_free, streaming_decompress_memsize, },
2938
0, 0, RUBY_TYPED_FREE_IMMEDIATELY
3039
};
3140

spec/zstd-ruby-streaming-decompress_spec.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,21 @@
1616
expect(result).to eq(str)
1717
end
1818
end
19+
20+
describe 'streaming decompress + GC.compact' do
21+
it 'shoud work' do
22+
# str = SecureRandom.hex(150)
23+
str = "foo bar buzz" * 100
24+
cstr = Zstd.compress(str)
25+
stream = Zstd::StreamingDecompress.new
26+
result = ''
27+
result << stream.decompress(cstr[0, 5])
28+
result << stream.decompress(cstr[5, 5])
29+
GC.compact
30+
result << stream.decompress(cstr[10..-1])
31+
expect(result).to eq(str)
32+
end
33+
end
34+
1935
end
2036

0 commit comments

Comments
 (0)