Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(151)

Unified Diff: src/trusted/service_runtime/sel_validate_image.c

Issue 10134056: Refactor the process of choosing validators. (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client
Patch Set: draft that does not fully build Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/trusted/service_runtime/sel_validate_image.c
diff --git a/src/trusted/service_runtime/sel_validate_image.c b/src/trusted/service_runtime/sel_validate_image.c
index 197c98ddcbfcf1c8b73ed6c2a26096cd549be40d..0b9e9974b5d0995e02f3b747ae49be3b0a97912f 100644
--- a/src/trusted/service_runtime/sel_validate_image.c
+++ b/src/trusted/service_runtime/sel_validate_image.c
@@ -27,30 +27,67 @@ static int NaClValidateStatus(NaClValidationStatus status) {
}
}
-typedef NaClValidationStatus (*ValidateFunc) (
- uintptr_t, uint8_t*, size_t, int, int,
- const NaClCPUFeatures*, struct NaClValidationCache*);
-
-static ValidateFunc NaClSelectValidator(struct NaClApp *nap) {
- ValidateFunc ret = NACL_SUBARCH_NAME(ApplyValidator,
- NACL_TARGET_ARCH, NACL_TARGET_SUBARCH);
- /* Avoid linking two validators into Chromium to keep download size small. */
-#if defined(__arm__) || !defined(NACL_STANDALONE)
- UNREFERENCED_PARAMETER(nap);
+Bool UseDfaValidator() {
+ if (getenv("NACL_DANGEROUS_USE_DFA_VALIDATOR") != NULL) {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void NaClSelectValidator(struct NaClValidatorInterface **val) {
+ /* TODO: make it more nested. */
Nick Bray 2012/04/27 22:21:36 I started with it being nested, but unless you ind
pasko-google - do not use 2012/05/12 12:18:40 to me it looks almost equally horrible, so I'd bet
+#if defined(__i386__) && defined(NACL_STANDALONE)
+ if (UseDfaValidator()) {
+ fprintf(stderr, "DANGER! USING THE UNSTABLE DFA VALIDATOR!\n");
Nick Bray 2012/04/27 22:21:36 Nit: Experimental? Untested?
pasko-google - do not use 2012/05/12 12:18:40 Done.
+ NaClDfaValidatorInit_x86_32(val);
+ } else {
+ NaClValidatorInit_x86_32(val);
+ }
+#elif defined(__i386__)
+ NaClValidatorInit_x86_32(val);
+#elif defined(__x86_64__) && defined(NACL_STANDALONE)
+ if (UseDfaValidator()) {
+ fprintf(stderr, "DANGER! USING THE UNSTABLE DFA VALIDATOR!\n");
+ NaClDfaValidatorInit_x86_64(val);
+ } else {
+ NaClValidatorInit_x86_64(val);
+ }
+#elif defined(__x86_64__)
+ NaClValidatorInit_x86_64(val);
+#elif defined(__arm__)
+ NaClValidatorInitArm(val);
#else
- if (nap->enable_dfa_validator) {
- ret = NACL_SUBARCH_NAME(ApplyDfaValidator,
- NACL_TARGET_ARCH, NACL_TARGET_SUBARCH);
+#error "No validator available for this architecture!"
+#endif
+}
+
+#if 0
+void NaClSelectValidator(struct NaClApp *nap) {
+ nap->validate_func = NACL_SUBARCH_NAME(ApplyValidator,
+ NACL_TARGET_ARCH, NACL_TARGET_SUBARCH);
+#if !defined(__arm__) && defined(NACL_STANDALONE)
+ if (getenv("NACL_DANGEROUS_USE_DFA_VALIDATOR") != NULL) {
+ fprintf(stderr, "DANGER! USING THE UNSTABLE DFA VALIDATOR!\n");
+ nap->validate_func = NACL_SUBARCH_NAME(ApplyDfaValidator,
+ NACL_TARGET_ARCH, NACL_TARGET_SUBARCH);
}
#endif
- return ret;
+ nap->validate_copy_func = ValidatorCopyNotImplemented;
+ nap->validate_code_replacement_func = ValidatorCodeReplacementNotImplemented;
+#ifndef __arm__
+ nap->validate_copy_func = NACL_SUBARCH_NAME(ApplyValidatorCopy,
+ NACL_TARGET_ARCH, NACL_TARGET_SUBARCH);
+ nap->validate_code_replacement_func = NACL_SUBARCH_NAME(
+ ApplyValidatorCodeReplacement, NACL_TARGET_ARCH, NACL_TARGET_SUBARCH);
+#endif
}
+#endif
int NaClValidateCode(struct NaClApp *nap, uintptr_t guest_addr,
uint8_t *data, size_t size) {
NaClValidationStatus status = NaClValidationSucceeded;
struct NaClValidationCache *cache = nap->validation_cache;
- ValidateFunc validate_func = NaClSelectValidator(nap);
+ struct NaClValidatorInterface *validator = nap->validator;
if (size < kMinimumCachedCodeSize) {
/*
@@ -79,26 +116,27 @@ int NaClValidateCode(struct NaClApp *nap, uintptr_t guest_addr,
"stub_out_mode and fixed_feature_cpu_mode are incompatible\n");
return LOAD_VALIDATION_FAILED;
}
+
if (nap->validator_stub_out_mode) {
/* Validation caching is currently incompatible with stubout. */
cache = NULL;
/* In stub out mode, we do two passes. The second pass acts as a
sanity check that bad instructions were indeed overwritten with
allowable HLTs. */
- status = validate_func(guest_addr, data, size,
- TRUE, /* stub out */
- FALSE, /* text is not read-only */
- &nap->cpu_features,
- cache);
+ status = validator->Validate(guest_addr, data, size,
+ TRUE, /* stub out */
+ FALSE, /* text is not read-only */
+ &nap->cpu_features,
+ cache);
}
if (status == NaClValidationSucceeded) {
/* Fixed feature CPU mode implies read-only. */
int readonly_text = nap->fixed_feature_cpu_mode;
- status = validate_func(guest_addr, data, size,
- FALSE, /* do not stub out */
- readonly_text,
- &nap->cpu_features,
- cache);
+ status = validator->Validate(guest_addr, data, size,
+ FALSE, /* do not stub out */
+ readonly_text,
+ &nap->cpu_features,
+ cache);
}
return NaClValidateStatus(status);
}
@@ -114,11 +152,8 @@ int NaClValidateCodeReplacement(struct NaClApp *nap, uintptr_t guest_addr,
return LOAD_BAD_FILE;
}
- return NaClValidateStatus(
- NACL_SUBARCH_NAME(ApplyValidatorCodeReplacement,
- NACL_TARGET_ARCH,
- NACL_TARGET_SUBARCH)
- (guest_addr, data_old, data_new, size, &nap->cpu_features));
+ return NaClValidateStatus(nap->validator->ValidateCodeReplacement(
+ guest_addr, data_old, data_new, size, &nap->cpu_features));
}
int NaClCopyCode(struct NaClApp *nap, uintptr_t guest_addr,
@@ -130,11 +165,8 @@ int NaClCopyCode(struct NaClApp *nap, uintptr_t guest_addr,
* before reaching this.
*/
if (nap->fixed_feature_cpu_mode) return LOAD_BAD_FILE;
- return NaClValidateStatus(
- NACL_SUBARCH_NAME(ApplyValidatorCopy,
- NACL_TARGET_ARCH,
- NACL_TARGET_SUBARCH)
- (guest_addr, data_old, data_new, size, &nap->cpu_features));
+ return NaClValidateStatus(nap->validator->ValidateCopy(
Nick Bray 2012/04/27 22:21:36 Bad name. Validating a copy of what? Hence why I
+ guest_addr, data_old, data_new, size, &nap->cpu_features));
}
NaClErrorCode NaClValidateImage(struct NaClApp *nap) {

Powered by Google App Engine
This is Rietveld 408576698