Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/miloyip/rapidjson.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohnny Shaw <johnny.shaw@live.com>2022-05-21 00:01:41 +0300
committerMilo Yip <miloyip@gmail.com>2022-05-21 04:35:41 +0300
commitdd3f730d745257744cf110fd051fdcd27bf48009 (patch)
tree35345319aad4598cdf226562f6740dd45c38d4de
parent781a4e667d84aeedbeb8184b7b62425ea66ec59f (diff)
Make schema dtor robust against exceptions
-rw-r--r--include/rapidjson/schema.h16
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
}