Index: src/trusted/service_runtime/sel_validate_image.c |
=================================================================== |
--- src/trusted/service_runtime/sel_validate_image.c (revision 3669) |
+++ src/trusted/service_runtime/sel_validate_image.c (working copy) |
@@ -10,10 +10,11 @@ |
#if NACL_ARCH(NACL_BUILD_ARCH) == NACL_x86 |
+# include "native_client/src/trusted/validator_x86/nccopycode.h" |
+ |
# if NACL_TARGET_SUBARCH == 32 |
# include "native_client/src/trusted/validator_x86/ncvalidate.h" |
-# include "native_client/src/trusted/validator_x86/nccopycode.h" |
int NaClValidateCode(struct NaClApp *nap, uintptr_t guest_addr, |
uint8_t *data, size_t size) { |
@@ -97,6 +98,7 @@ |
if (vstate == NULL) { |
return LOAD_BAD_FILE; |
} |
+ |
NaClValidatorStateSetLogVerbosity(vstate, LOG_ERROR); |
if (nap->validator_stub_out_mode) { |
@@ -124,28 +126,41 @@ |
int NaClValidateCodeReplacement(struct NaClApp *nap, uintptr_t guest_addr, |
uint8_t *data_old, uint8_t *data_new, |
size_t size) { |
- UNREFERENCED_PARAMETER(nap); |
- UNREFERENCED_PARAMETER(guest_addr); |
- UNREFERENCED_PARAMETER(data_old); |
- UNREFERENCED_PARAMETER(data_new); |
- UNREFERENCED_PARAMETER(size); |
- NaClLog(1, "NaClValidateCodeReplacement: " |
- "code replacement not yet supported on x86_64\n"); |
- return LOAD_UNIMPLEMENTED; |
+ struct NaClValidatorState *vstate; |
+ int is_ok; |
+ |
+ vstate = NaClValidatorStateCreate(guest_addr, size, nap->bundle_size, |
+ RegR15); |
+ if (vstate == NULL) { |
+ return LOAD_BAD_FILE; |
+ } |
+ NaClValidatorStateSetLogVerbosity(vstate, LOG_ERROR); |
+ |
+ if (nap->validator_stub_out_mode) { |
+ NaClLog(1, "NaClValidateCodeReplacement: " |
+ "stub_out_mode not supported for code replacement\n"); |
+ return LOAD_BAD_FILE; |
+ } |
+ NaClValidateSegmentPair(data_old, data_new, guest_addr, size, vstate); |
+ is_ok = NaClValidatesOk(vstate); |
+ NaClValidatorStateDestroy(vstate); |
+ if (!is_ok) { |
+ return LOAD_VALIDATION_FAILED; |
+ } |
+ return LOAD_OK; |
} |
- |
int NaClCopyCode(struct NaClApp *nap, uintptr_t guest_addr, |
uint8_t *data_old, uint8_t *data_new, |
size_t size) { |
+ int result; |
UNREFERENCED_PARAMETER(nap); |
- UNREFERENCED_PARAMETER(guest_addr); |
- UNREFERENCED_PARAMETER(data_old); |
- UNREFERENCED_PARAMETER(data_new); |
- UNREFERENCED_PARAMETER(size); |
- NaClLog(1, "NaClCopyCode: " |
- "code replacement not yet supported on x86_64\n"); |
- return LOAD_UNIMPLEMENTED; |
+ |
+ result = NaClCopyCodeIter(data_old, data_new, guest_addr, size); |
+ if (result != 0) { |
+ return LOAD_UNLOADABLE; |
+ } |
+ return LOAD_OK; |
} |
# endif |