Skip to content

Commit 8d96df6

Browse files
committed
[struct_pack] fix deserialize stack overflow when struct member count is huge
1 parent 11c78a3 commit 8d96df6

File tree

1 file changed

+7
-18
lines changed

1 file changed

+7
-18
lines changed

include/ylt/struct_pack/unpacker.hpp

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -618,26 +618,15 @@ class unpacker {
618618
}
619619
}
620620

621-
template <size_t size_type, uint64_t version, bool NotSkip>
622-
constexpr struct_pack::err_code STRUCT_PACK_INLINE deserialize_many() {
623-
return {};
624-
}
625621
template <size_t size_type, uint64_t version, bool NotSkip,
626-
uint64_t parent_tag = 0, typename First, typename... Args>
622+
uint64_t parent_tag = 0, typename... Args>
627623
constexpr struct_pack::err_code STRUCT_PACK_INLINE
628-
deserialize_many(First &&first_item, Args &&...items) {
629-
auto code =
630-
deserialize_one<size_type, version, NotSkip, parent_tag>(first_item);
631-
if SP_UNLIKELY (code) {
632-
return code;
633-
}
634-
if constexpr (sizeof...(items) > 0) {
635-
return deserialize_many<size_type, version, NotSkip, parent_tag>(
636-
items...);
637-
}
638-
else {
639-
return code;
640-
}
624+
deserialize_many(Args &&...items) {
625+
struct_pack::err_code code;
626+
627+
((code = deserialize_one<size_type, version, NotSkip, parent_tag>(items)) ||
628+
...);
629+
return code;
641630
}
642631

643632
constexpr struct_pack::err_code STRUCT_PACK_INLINE

0 commit comments

Comments
 (0)