| Index: src/trusted/validator_ragel/dfa_validate_64.c
|
| diff --git a/src/trusted/validator_ragel/dfa_validate_64.c b/src/trusted/validator_ragel/dfa_validate_64.c
|
| index f91d36fe95be581edacec83c3c3a303e2dec2f6e..3fd2453e7cfd81516292dcf93c9def26d983f44e 100644
|
| --- a/src/trusted/validator_ragel/dfa_validate_64.c
|
| +++ b/src/trusted/validator_ragel/dfa_validate_64.c
|
| @@ -40,8 +40,14 @@ static NaClValidationStatus ApplyDfaValidator_x86_64(
|
| enum NaClValidationStatus status = NaClValidationFailed;
|
| void *query = NULL;
|
| struct StubOutCallbackData callback_data;
|
| + /* For revalidation */
|
| + struct StubOutCallbackData reval_callback_data;
|
| + Bool reval_result = FALSE;
|
| +
|
| callback_data.flags = flags;
|
| callback_data.did_rewrite = 0;
|
| + reval_callback_data.flags = flags;
|
| + reval_callback_data.did_rewrite = 0;
|
| UNREFERENCED_PARAMETER(guest_addr);
|
|
|
| if (stubout_mode)
|
| @@ -76,8 +82,19 @@ static NaClValidationStatus ApplyDfaValidator_x86_64(
|
| } else {
|
| if (ValidateChunkAMD64(data, size, 0 /*options*/, cpu_features,
|
| NaClDfaStubOutUnsupportedInstruction,
|
| - &callback_data))
|
| - status = NaClValidationSucceeded;
|
| + &callback_data)) {
|
| + /* If code is rewritten, revalidate. */
|
| + if (callback_data.did_rewrite == 1) {
|
| + reval_result = ValidateChunkAMD64(data, size, 0 /*options*/,
|
| + cpu_features,
|
| + NaClDfaStubOutUnsupportedInstruction,
|
| + &reval_callback_data);
|
| + if (reval_result && reval_callback_data.did_rewrite == 0)
|
| + status = NaClValidationSucceeded;
|
| + } else {
|
| + status = NaClValidationSucceeded;
|
| + }
|
| + }
|
| }
|
|
|
| if (status != NaClValidationSucceeded && errno == ENOMEM)
|
|
|