Merge "Installd: Disallow relocation for decryption"

This commit is contained in:
Andreas Gampe 2015-01-07 22:04:28 +00:00 committed by Gerrit Code Review
commit 96e4409e8c

View File

@ -640,7 +640,7 @@ static int split_count(const char *str)
return count; return count;
} }
static int split(char *buf, char **argv) static int split(char *buf, const char **argv)
{ {
char *ctx; char *ctx;
int count = 0; int count = 0;
@ -732,6 +732,9 @@ static void run_dex2oat(int zip_fd, int oat_fd, const char* input_file_name,
bool have_dex2oat_isa_variant = property_get(dex2oat_isa_variant_key, bool have_dex2oat_isa_variant = property_get(dex2oat_isa_variant_key,
dex2oat_isa_variant, NULL) > 0; dex2oat_isa_variant, NULL) > 0;
const char *dex2oat_norelocation = "-Xnorelocate";
bool have_dex2oat_relocation_skip_flag = false;
char dex2oat_flags[PROPERTY_VALUE_MAX]; char dex2oat_flags[PROPERTY_VALUE_MAX];
int dex2oat_flags_count = property_get("dalvik.vm.dex2oat-flags", int dex2oat_flags_count = property_get("dalvik.vm.dex2oat-flags",
dex2oat_flags, NULL) <= 0 ? 0 : split_count(dex2oat_flags); dex2oat_flags, NULL) <= 0 ? 0 : split_count(dex2oat_flags);
@ -804,6 +807,7 @@ static void run_dex2oat(int zip_fd, int oat_fd, const char* input_file_name,
if (skip_compilation) { if (skip_compilation) {
strcpy(dex2oat_compiler_filter_arg, "--compiler-filter=verify-none"); strcpy(dex2oat_compiler_filter_arg, "--compiler-filter=verify-none");
have_dex2oat_compiler_filter_flag = true; have_dex2oat_compiler_filter_flag = true;
have_dex2oat_relocation_skip_flag = true;
} else if (vm_safe_mode) { } else if (vm_safe_mode) {
strcpy(dex2oat_compiler_filter_arg, "--compiler-filter=interpret-only"); strcpy(dex2oat_compiler_filter_arg, "--compiler-filter=interpret-only");
have_dex2oat_compiler_filter_flag = true; have_dex2oat_compiler_filter_flag = true;
@ -813,7 +817,7 @@ static void run_dex2oat(int zip_fd, int oat_fd, const char* input_file_name,
ALOGV("Running %s in=%s out=%s\n", DEX2OAT_BIN, input_file_name, output_file_name); ALOGV("Running %s in=%s out=%s\n", DEX2OAT_BIN, input_file_name, output_file_name);
char* argv[7 // program name, mandatory arguments and the final NULL const char* argv[7 // program name, mandatory arguments and the final NULL
+ (have_dex2oat_isa_variant ? 1 : 0) + (have_dex2oat_isa_variant ? 1 : 0)
+ (have_dex2oat_isa_features ? 1 : 0) + (have_dex2oat_isa_features ? 1 : 0)
+ (have_profile_file ? 1 : 0) + (have_profile_file ? 1 : 0)
@ -822,9 +826,10 @@ static void run_dex2oat(int zip_fd, int oat_fd, const char* input_file_name,
+ (have_dex2oat_Xmx_flag ? 2 : 0) + (have_dex2oat_Xmx_flag ? 2 : 0)
+ (have_dex2oat_compiler_filter_flag ? 1 : 0) + (have_dex2oat_compiler_filter_flag ? 1 : 0)
+ (have_dex2oat_swap_fd ? 1 : 0) + (have_dex2oat_swap_fd ? 1 : 0)
+ (have_dex2oat_relocation_skip_flag ? 2 : 0)
+ dex2oat_flags_count]; + dex2oat_flags_count];
int i = 0; int i = 0;
argv[i++] = (char*)DEX2OAT_BIN; argv[i++] = DEX2OAT_BIN;
argv[i++] = zip_fd_arg; argv[i++] = zip_fd_arg;
argv[i++] = zip_location_arg; argv[i++] = zip_location_arg;
argv[i++] = oat_fd_arg; argv[i++] = oat_fd_arg;
@ -843,11 +848,11 @@ static void run_dex2oat(int zip_fd, int oat_fd, const char* input_file_name,
argv[i++] = top_k_profile_threshold_arg; argv[i++] = top_k_profile_threshold_arg;
} }
if (have_dex2oat_Xms_flag) { if (have_dex2oat_Xms_flag) {
argv[i++] = (char*)RUNTIME_ARG; argv[i++] = RUNTIME_ARG;
argv[i++] = dex2oat_Xms_arg; argv[i++] = dex2oat_Xms_arg;
} }
if (have_dex2oat_Xmx_flag) { if (have_dex2oat_Xmx_flag) {
argv[i++] = (char*)RUNTIME_ARG; argv[i++] = RUNTIME_ARG;
argv[i++] = dex2oat_Xmx_arg; argv[i++] = dex2oat_Xmx_arg;
} }
if (have_dex2oat_compiler_filter_flag) { if (have_dex2oat_compiler_filter_flag) {
@ -859,10 +864,14 @@ static void run_dex2oat(int zip_fd, int oat_fd, const char* input_file_name,
if (dex2oat_flags_count) { if (dex2oat_flags_count) {
i += split(dex2oat_flags, argv + i); i += split(dex2oat_flags, argv + i);
} }
if (have_dex2oat_relocation_skip_flag) {
argv[i++] = RUNTIME_ARG;
argv[i++] = dex2oat_norelocation;
}
// Do not add after dex2oat_flags, they should override others for debugging. // Do not add after dex2oat_flags, they should override others for debugging.
argv[i] = NULL; argv[i] = NULL;
execv(DEX2OAT_BIN, (char* const *)argv); execv(DEX2OAT_BIN, (char * const *)argv);
ALOGE("execv(%s) failed: %s\n", DEX2OAT_BIN, strerror(errno)); ALOGE("execv(%s) failed: %s\n", DEX2OAT_BIN, strerror(errno));
} }