diff options
author | Johnny Shaw <johnny.shaw@live.com> | 2022-05-21 00:01:41 +0300 |
---|---|---|
committer | Milo Yip <miloyip@gmail.com> | 2022-05-21 04:35:41 +0300 |
commit | dd3f730d745257744cf110fd051fdcd27bf48009 (patch) | |
tree | 35345319aad4598cdf226562f6740dd45c38d4de | |
parent | 781a4e667d84aeedbeb8184b7b62425ea66ec59f (diff) |
Make schema dtor robust against exceptions
-rw-r--r-- | include/rapidjson/schema.h | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/include/rapidjson/schema.h b/include/rapidjson/schema.h index 248632b0..188d659d 100644 --- a/include/rapidjson/schema.h +++ b/include/rapidjson/schema.h @@ -380,13 +380,19 @@ struct SchemaValidationContext { if (hasher) factory.DestroryHasher(hasher); if (validators) { - for (SizeType i = 0; i < validatorCount; i++) - factory.DestroySchemaValidator(validators[i]); + for (SizeType i = 0; i < validatorCount; i++) { + if (validators[i]) { + factory.DestroySchemaValidator(validators[i]); + } + } factory.FreeState(validators); } if (patternPropertiesValidators) { - for (SizeType i = 0; i < patternPropertiesValidatorCount; i++) - factory.DestroySchemaValidator(patternPropertiesValidators[i]); + for (SizeType i = 0; i < patternPropertiesValidatorCount; i++) { + if (patternPropertiesValidators[i]) { + factory.DestroySchemaValidator(patternPropertiesValidators[i]); + } + } factory.FreeState(patternPropertiesValidators); } if (patternPropertiesSchemas) @@ -1301,6 +1307,7 @@ private: if (validatorCount_) { RAPIDJSON_ASSERT(context.validators == 0); context.validators = static_cast<ISchemaValidator**>(context.factory.MallocState(sizeof(ISchemaValidator*) * validatorCount_)); + std::memset(context.validators, 0, sizeof(ISchemaValidator*) * validatorCount_); context.validatorCount = validatorCount_; // Always return after first failure for these sub-validators @@ -2544,6 +2551,7 @@ private: ISchemaValidator**& va = CurrentContext().patternPropertiesValidators; SizeType& validatorCount = CurrentContext().patternPropertiesValidatorCount; va = static_cast<ISchemaValidator**>(MallocState(sizeof(ISchemaValidator*) * count)); + std::memset(va, 0, sizeof(ISchemaValidator*) * count); for (SizeType i = 0; i < count; i++) va[validatorCount++] = CreateSchemaValidator(*sa[i], true); // Inherit continueOnError } |