Chromium Code Reviews| Index: src/trusted/service_runtime/sel_validate_image.c |
| =================================================================== |
| --- src/trusted/service_runtime/sel_validate_image.c (revision 3931) |
| +++ 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) { |
| @@ -59,6 +60,13 @@ |
| return LOAD_BAD_FILE; |
| } |
| + if ((guest_addr % nap->bundle_size) != 0 || |
| + (size % nap->bundle_size) != 0) { |
| + NaClLog(1, "NaClValidateCodeReplacement: " |
| + "code replacement is not properly bundle-aligned\n"); |
| + return LOAD_BAD_FILE; |
| + } |
| + |
| vstate = NCValidateInit(guest_addr, guest_addr + size, nap->bundle_size); |
| if (vstate == NULL) { |
| return LOAD_BAD_FILE; |
| @@ -97,6 +105,7 @@ |
| if (vstate == NULL) { |
| return LOAD_BAD_FILE; |
| } |
| + |
| NaClValidatorStateSetLogVerbosity(vstate, LOG_ERROR); |
| if (nap->validator_stub_out_mode) { |
| @@ -124,28 +133,49 @@ |
| 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; |
| + |
| + if (nap->validator_stub_out_mode) { |
| + NaClLog(1, "NaClValidateCodeReplacement: " |
| + "stub_out_mode not supported for code replacement\n"); |
| + return LOAD_BAD_FILE; |
| + } |
| + |
| + if ((guest_addr % nap->bundle_size) != 0 || |
| + (size % nap->bundle_size) != 0) { |
| + NaClLog(1, "NaClValidateCodeReplacement: " |
| + "code replacement is not properly bundle-aligned\n"); |
| + return LOAD_BAD_FILE; |
| + } |
| + |
| + vstate = NaClValidatorStateCreate(guest_addr, size, nap->bundle_size, |
| + RegR15); |
| + if (vstate == NULL) { |
|
bsy
2011/01/05 00:56:22
plz use NULL == vstate style in TCB code.
elijahtaylor (use chromium)
2011/01/05 21:08:48
Fixed.
|
| + return LOAD_BAD_FILE; |
| + } |
| + NaClValidatorStateSetLogVerbosity(vstate, LOG_ERROR); |
| + |
| + 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 |