From d52537a5ad23968f5c7e292c639aa2572cabc666 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Thu, 14 Mar 2024 19:04:57 +0200 Subject: [PATCH] Restore removed va_start calls; add missing va_end as reported in #264. --- .../serialization/extended_type_info_no_rtti.hpp | 15 +++++++++------ .../serialization/extended_type_info_typeid.hpp | 15 +++++++++------ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/include/boost/serialization/extended_type_info_no_rtti.hpp b/include/boost/serialization/extended_type_info_no_rtti.hpp index 9e56974a1..4d915f605 100644 --- a/include/boost/serialization/extended_type_info_no_rtti.hpp +++ b/include/boost/serialization/extended_type_info_no_rtti.hpp @@ -129,23 +129,26 @@ class extended_type_info_no_rtti : } void * construct(unsigned int count, ...) const BOOST_OVERRIDE { // count up the arguments + void * r = NULL; std::va_list ap; + va_start(ap, count); switch(count){ case 0: - return factory::type, 0>(ap); + r = factory::type, 0>(ap); case 1: - return factory::type, 1>(ap); + r = factory::type, 1>(ap); case 2: - return factory::type, 2>(ap); + r = factory::type, 2>(ap); case 3: - return factory::type, 3>(ap); + r = factory::type, 3>(ap); case 4: - return factory::type, 4>(ap); + r = factory::type, 4>(ap); default: BOOST_ASSERT(false); // too many arguments // throw exception here? - return NULL; } + va_end(ap); + return r; } void destroy(void const * const p) const BOOST_OVERRIDE { boost::serialization::access::destroy( diff --git a/include/boost/serialization/extended_type_info_typeid.hpp b/include/boost/serialization/extended_type_info_typeid.hpp index 65285644c..82382fbd3 100644 --- a/include/boost/serialization/extended_type_info_typeid.hpp +++ b/include/boost/serialization/extended_type_info_typeid.hpp @@ -112,23 +112,26 @@ class extended_type_info_typeid : } void * construct(unsigned int count, ...) const BOOST_OVERRIDE { // count up the arguments + void * r = NULL; std::va_list ap; + va_start(ap, count); switch(count){ case 0: - return factory::type, 0>(ap); + r = factory::type, 0>(ap); case 1: - return factory::type, 1>(ap); + r = factory::type, 1>(ap); case 2: - return factory::type, 2>(ap); + r = factory::type, 2>(ap); case 3: - return factory::type, 3>(ap); + r = factory::type, 3>(ap); case 4: - return factory::type, 4>(ap); + r = factory::type, 4>(ap); default: BOOST_ASSERT(false); // too many arguments // throw exception here? - return NULL; } + va_end(ap); + return r; } void destroy(void const * const p) const BOOST_OVERRIDE { boost::serialization::access::destroy(