@@ -113,10 +113,13 @@ struct unpack_array {
113
113
if (n > u.limit ().array ()) throw msgpack::array_size_overflow (" array size overflow" );
114
114
o.type = msgpack::type::ARRAY;
115
115
o.via .array .size = 0 ;
116
- size_t size = n*sizeof (msgpack::object);
117
- if (size / sizeof (msgpack::object) != n) {
116
+
117
+ #if SIZE_MAX == UINT_MAX
118
+ if (n > SIZE_MAX/sizeof (msgpack::object))
118
119
throw msgpack::array_size_overflow (" array size overflow" );
119
- }
120
+ #endif // SIZE_MAX == UINT_MAX
121
+
122
+ size_t size = n*sizeof (msgpack::object);
120
123
o.via .array .ptr = static_cast <msgpack::object*>(u.zone ().allocate_align (size, MSGPACK_ZONE_ALIGNOF (msgpack::object)));
121
124
}
122
125
};
@@ -125,6 +128,7 @@ inline void unpack_array_item(msgpack::object& c, msgpack::object const& o)
125
128
{
126
129
#if defined(__GNUC__) && !defined(__clang__)
127
130
std::memcpy (&c.via .array .ptr [c.via .array .size ++], &o, sizeof (msgpack::object));
131
+
128
132
#else /* __GNUC__ && !__clang__ */
129
133
c.via .array .ptr [c.via .array .size ++] = o;
130
134
#endif /* __GNUC__ && !__clang__ */
@@ -135,10 +139,13 @@ struct unpack_map {
135
139
if (n > u.limit ().map ()) throw msgpack::map_size_overflow (" map size overflow" );
136
140
o.type = msgpack::type::MAP;
137
141
o.via .map .size = 0 ;
138
- size_t size = n*sizeof (msgpack::object_kv);
139
- if (size / sizeof (msgpack::object_kv) != n) {
142
+
143
+ #if SIZE_MAX == UINT_MAX
144
+ if (n > SIZE_MAX/sizeof (msgpack::object_kv))
140
145
throw msgpack::map_size_overflow (" map size overflow" );
141
- }
146
+ #endif // SIZE_MAX == UINT_MAX
147
+
148
+ size_t size = n*sizeof (msgpack::object_kv);
142
149
o.via .map .ptr = static_cast <msgpack::object_kv*>(u.zone ().allocate_align (size, MSGPACK_ZONE_ALIGNOF (msgpack::object_kv)));
143
150
}
144
151
};
0 commit comments