Skip to content

Commit b4f2acb

Browse files
authored
Merge pull request #550 from redboltz/fix_cpp_array_of
Fixed array and map size overflow.
2 parents 9d37316 + 7e13912 commit b4f2acb

File tree

2 files changed

+20
-4
lines changed

2 files changed

+20
-4
lines changed

include/msgpack/v1/unpack.hpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,11 @@ struct unpack_array {
203203
if (n > u.limit().array()) throw msgpack::array_size_overflow("array size overflow");
204204
o.type = msgpack::type::ARRAY;
205205
o.via.array.size = 0;
206-
o.via.array.ptr = static_cast<msgpack::object*>(u.zone().allocate_align(n*sizeof(msgpack::object)));
206+
size_t size = n*sizeof(msgpack::object);
207+
if (size / sizeof(msgpack::object) != n) {
208+
throw msgpack::array_size_overflow("array size overflow");
209+
}
210+
o.via.array.ptr = static_cast<msgpack::object*>(u.zone().allocate_align(size));
207211
}
208212
};
209213

@@ -221,7 +225,11 @@ struct unpack_map {
221225
if (n > u.limit().map()) throw msgpack::map_size_overflow("map size overflow");
222226
o.type = msgpack::type::MAP;
223227
o.via.map.size = 0;
224-
o.via.map.ptr = static_cast<msgpack::object_kv*>(u.zone().allocate_align(n*sizeof(msgpack::object_kv)));
228+
size_t size = n*sizeof(msgpack::object_kv);
229+
if (size / sizeof(msgpack::object_kv) != n) {
230+
throw msgpack::map_size_overflow("map size overflow");
231+
}
232+
o.via.map.ptr = static_cast<msgpack::object_kv*>(u.zone().allocate_align(size));
225233
}
226234
};
227235

include/msgpack/v2/unpack.hpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,8 +215,12 @@ class create_object_visitor {
215215
obj->via.array.ptr = MSGPACK_NULLPTR;
216216
}
217217
else {
218+
size_t size = num_elements*sizeof(msgpack::object);
219+
if (size / sizeof(msgpack::object) != num_elements) {
220+
throw msgpack::array_size_overflow("array size overflow");
221+
}
218222
obj->via.array.ptr =
219-
static_cast<msgpack::object*>(m_zone->allocate_align(num_elements*sizeof(msgpack::object)));
223+
static_cast<msgpack::object*>(m_zone->allocate_align(size));
220224
}
221225
m_stack.push_back(obj->via.array.ptr);
222226
return true;
@@ -242,8 +246,12 @@ class create_object_visitor {
242246
obj->via.map.ptr = MSGPACK_NULLPTR;
243247
}
244248
else {
249+
size_t size = num_kv_pairs*sizeof(msgpack::object_kv);
250+
if (size / sizeof(msgpack::object_kv) != num_kv_pairs) {
251+
throw msgpack::map_size_overflow("map size overflow");
252+
}
245253
obj->via.map.ptr =
246-
static_cast<msgpack::object_kv*>(m_zone->allocate_align(num_kv_pairs*sizeof(msgpack::object_kv)));
254+
static_cast<msgpack::object_kv*>(m_zone->allocate_align(size));
247255
}
248256
m_stack.push_back(reinterpret_cast<msgpack::object*>(obj->via.map.ptr));
249257
return true;

0 commit comments

Comments
 (0)