diff options
author | Jeff Brown <jeffbrown@google.com> | 2014-09-10 16:48:46 -0700 |
---|---|---|
committer | Jeff Brown <jeffbrown@google.com> | 2014-09-11 14:19:52 -0700 |
commit | 00c0cd4a24bd0f040055f9e786e2df1fa3b7d2d3 (patch) | |
tree | 87654f391f5e9dca11fd5e84901545890d3d5b16 /cmds/app_process | |
parent | 98ff7bce66f03da14e39fa7e532a7202bde7dce6 (diff) | |
download | frameworks_base-00c0cd4a24bd0f040055f9e786e2df1fa3b7d2d3.zip frameworks_base-00c0cd4a24bd0f040055f9e786e2df1fa3b7d2d3.tar.gz frameworks_base-00c0cd4a24bd0f040055f9e786e2df1fa3b7d2d3.tar.bz2 |
Clean entire arg block when setting process name.
When Android processes fork from Zygote, we rewrite the command line
with a new name, eg. "system_server". When we do this, we should
fill the entire block with zeros to remove corrupted argument
information that may otherwise remain in the /proc/<pid>/cmdline buffer
and be seen in tools and stack dumps.
Fixed an issue where VM options could be overwritten after setting
the nice name if the name was too long.
Bug: 17474152
Change-Id: Ie6cf9ed7752a04300a340e26cd6812bb35c59e1b
Diffstat (limited to 'cmds/app_process')
-rw-r--r-- | cmds/app_process/app_main.cpp | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/cmds/app_process/app_main.cpp b/cmds/app_process/app_main.cpp index 6e77e13..1bb28c3 100644 --- a/cmds/app_process/app_main.cpp +++ b/cmds/app_process/app_main.cpp @@ -133,8 +133,7 @@ static size_t computeArgBlockSize(int argc, char* const argv[]) { // names if the zygote command line decreases in size. uintptr_t start = reinterpret_cast<uintptr_t>(argv[0]); uintptr_t end = reinterpret_cast<uintptr_t>(argv[argc - 1]); - end += strlen(argv[argc - 1]); - + end += strlen(argv[argc - 1]) + 1; return (end - start); } @@ -220,15 +219,27 @@ int main(int argc, char* const argv[]) // // For zygote starts, all remaining arguments are passed to the zygote. // main function. + // + // Note that we must copy argument string values since we will rewrite the + // entire argument block when we apply the nice name to argv0. - - int i = runtime.addVmArguments(argc, argv); + int i; + for (i = 0; i < argc; i++) { + if (argv[i][0] != '-') { + break; + } + if (argv[i][1] == '-' && argv[i][2] == 0) { + ++i; // Skip --. + break; + } + runtime.addOption(strdup(argv[i])); + } // Parse runtime arguments. Stop at first unrecognized option. bool zygote = false; bool startSystemServer = false; bool application = false; - const char* niceName = NULL; + String8 niceName; String8 className; ++i; // Skip unused "parent dir" argument. @@ -242,7 +253,7 @@ int main(int argc, char* const argv[]) } else if (strcmp(arg, "--application") == 0) { application = true; } else if (strncmp(arg, "--nice-name=", 12) == 0) { - niceName = arg + 12; + niceName.setTo(arg + 12); } else if (strncmp(arg, "--", 2) != 0) { className.setTo(arg); break; @@ -287,9 +298,9 @@ int main(int argc, char* const argv[]) } } - if (niceName && *niceName) { - runtime.setArgv0(niceName); - set_process_name(niceName); + if (!niceName.isEmpty()) { + runtime.setArgv0(niceName.string()); + set_process_name(niceName.string()); } if (zygote) { |