File tree Expand file tree Collapse file tree 2 files changed +20
-4
lines changed Expand file tree Collapse file tree 2 files changed +20
-4
lines changed Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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 ;
You can’t perform that action at this time.
0 commit comments