Index: src/trusted/validator_ragel/dfa_validate_32.c |
diff --git a/src/trusted/validator_ragel/dfa_validate_32.c b/src/trusted/validator_ragel/dfa_validate_32.c |
index bdbe510a5745417d872ceb43a56ff5b50317dd13..5f3003a4d3259c1542ccbca8ba0345146aa6fc24 100644 |
--- a/src/trusted/validator_ragel/dfa_validate_32.c |
+++ b/src/trusted/validator_ragel/dfa_validate_32.c |
@@ -40,8 +40,14 @@ NaClValidationStatus ApplyDfaValidator_x86_32( |
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,9 +82,21 @@ NaClValidationStatus ApplyDfaValidator_x86_32( |
} else { |
if (ValidateChunkIA32(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 = ValidateChunkIA32(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) |
status = NaClValidationFailedOutOfMemory; |