Skip to content

Commit d7a1d7b

Browse files
authored
Merge pull request #318 from Shopify/refactor-buffer-view
Refactor buffer views
2 parents da7cbf8 + ede36dc commit d7a1d7b

11 files changed

Lines changed: 46 additions & 3 deletions

File tree

ChangeLog

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
* Undefine `#clone` and `#dup` on `MessagePack::Buffer`, `MessagePack::Packer` and `MessagePack::Unpacker`.
2+
These methods were never intended, and using them could cause leaks or crashes or worse.
13
* Fix a possible GC crash when GC trigger inside `MessagePack::Buffer.new` (#314).
24

35
2022-09-30 1.6.0:

ext/msgpack/buffer_class.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ static const rb_data_type_t buffer_data_type = {
6969
static const rb_data_type_t buffer_view_data_type = {
7070
.wrap_struct_name = "msgpack:buffer_view",
7171
.function = {
72-
.dmark = msgpack_buffer_mark,
72+
.dmark = NULL,
7373
.dfree = NULL,
7474
.dsize = NULL,
7575
},

ext/msgpack/packer_class.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ static void Packer_free(void *ptr)
4747
static void Packer_mark(void *ptr)
4848
{
4949
msgpack_packer_t* pk = ptr;
50+
msgpack_buffer_mark(pk);
5051
msgpack_packer_mark(pk);
5152
msgpack_packer_ext_registry_mark(&pk->ext_registry);
5253
}
@@ -106,7 +107,7 @@ VALUE MessagePack_Packer_initialize(int argc, VALUE* argv, VALUE self)
106107
msgpack_packer_t *pk = MessagePack_Packer_get(self);
107108

108109
msgpack_packer_ext_registry_init(&pk->ext_registry);
109-
pk->buffer_ref = MessagePack_Buffer_wrap(PACKER_BUFFER_(pk), self);
110+
pk->buffer_ref = Qnil;
110111

111112
MessagePack_Buffer_set_options(PACKER_BUFFER_(pk), io, options);
112113

@@ -129,6 +130,9 @@ static VALUE Packer_compatibility_mode_p(VALUE self)
129130
static VALUE Packer_buffer(VALUE self)
130131
{
131132
msgpack_packer_t *pk = MessagePack_Packer_get(self);
133+
if (!RTEST(pk->buffer_ref)) {
134+
pk->buffer_ref = MessagePack_Buffer_wrap(PACKER_BUFFER_(pk), self);
135+
}
132136
return pk->buffer_ref;
133137
}
134138

ext/msgpack/unpacker_class.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ static void Unpacker_free(void *ptr)
5151
static void Unpacker_mark(void *ptr)
5252
{
5353
msgpack_unpacker_t* uk = ptr;
54+
msgpack_buffer_mark(uk);
5455
msgpack_unpacker_mark(uk);
5556
msgpack_unpacker_ext_registry_mark(uk->ext_registry);
5657
}
@@ -117,7 +118,7 @@ VALUE MessagePack_Unpacker_initialize(int argc, VALUE* argv, VALUE self)
117118

118119
msgpack_unpacker_t *uk = MessagePack_Unpacker_get(self);
119120

120-
uk->buffer_ref = MessagePack_Buffer_wrap(UNPACKER_BUFFER_(uk), self);
121+
uk->buffer_ref = Qnil;
121122

122123
MessagePack_Buffer_set_options(UNPACKER_BUFFER_(uk), io, options);
123124

@@ -177,6 +178,9 @@ NORETURN(static void raise_unpacker_error(int r))
177178
static VALUE Unpacker_buffer(VALUE self)
178179
{
179180
msgpack_unpacker_t *uk = MessagePack_Unpacker_get(self);
181+
if (!RTEST(uk->buffer_ref)) {
182+
uk->buffer_ref = MessagePack_Buffer_wrap(UNPACKER_BUFFER_(uk), self);
183+
}
180184
return uk->buffer_ref;
181185
}
182186

lib/msgpack.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
require "msgpack/msgpack"
88
end
99

10+
require "msgpack/buffer"
1011
require "msgpack/packer"
1112
require "msgpack/unpacker"
1213
require "msgpack/factory"

lib/msgpack/buffer.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module MessagePack
2+
class Buffer
3+
# see ext for other methods
4+
5+
# The semantic of duping a buffer is just too weird.
6+
undef_method :dup
7+
undef_method :clone
8+
end
9+
end

lib/msgpack/packer.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ module MessagePack
22
class Packer
33
# see ext for other methods
44

5+
# The semantic of duping a packer is just too weird.
6+
undef_method :dup
7+
undef_method :clone
8+
59
def registered_types
610
list = []
711

lib/msgpack/unpacker.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ module MessagePack
22
class Unpacker
33
# see ext for other methods
44

5+
# The semantic of duping an unpacker is just too weird.
6+
undef_method :dup
7+
undef_method :clone
8+
59
def registered_types
610
list = []
711

spec/cruby/buffer_spec.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,11 @@
590590
expect(ObjectSpace.memsize_of(buffer)).to be == empty_size
591591
end
592592

593+
it "doesn't allow #dup or #clone" do
594+
expect(subject).to_not respond_to :dup
595+
expect(subject).to_not respond_to :clone
596+
end
597+
593598
it "doesn't crash when marking an uninitialized buffer" do
594599
stress = GC.stress
595600
begin

spec/packer_spec.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -573,6 +573,11 @@ def to_msgpack_ext
573573
end
574574
end
575575

576+
it "doesn't allow #dup or #clone" do
577+
expect(subject).to_not respond_to :dup
578+
expect(subject).to_not respond_to :clone
579+
end
580+
576581
it "doesn't crash when marking an uninitialized buffer" do
577582
stress = GC.stress
578583
begin

0 commit comments

Comments
 (0)