Tell bionic when we overwrite argv[0].

Otherwise bionic might still have a pointer into the old content.

(Cherrypick of 07ce3ccc80c26105f2ccfc8c255353274d8b5861.)

Bug: https://issuetracker.google.com/152893281
Test: treehugger
Merged-In: I25e31c5da33e529c750ef6f2e3f36ca62cf4d231
Change-Id: I25e31c5da33e529c750ef6f2e3f36ca62cf4d231
This commit is contained in:
Elliott Hughes
2020-04-17 13:11:00 -07:00
parent bf517e48a2
commit 94cc1b3972

View File

@@ -301,6 +301,8 @@ AndroidRuntime::~AndroidRuntime()
}
void AndroidRuntime::setArgv0(const char* argv0, bool setProcName) {
// Set the kernel's task name, for as much of the name as we can fit.
// The kernel's TASK_COMM_LEN minus one for the terminating NUL == 15.
if (setProcName) {
int len = strlen(argv0);
if (len < 15) {
@@ -309,8 +311,14 @@ void AndroidRuntime::setArgv0(const char* argv0, bool setProcName) {
pthread_setname_np(pthread_self(), argv0 + len - 15);
}
}
// Directly change the memory pointed to by argv[0].
memset(mArgBlockStart, 0, mArgBlockLength);
strlcpy(mArgBlockStart, argv0, mArgBlockLength);
// Let bionic know that we just did that, because __progname points
// into argv[0] (https://issuetracker.google.com/152893281).
setprogname(mArgBlockStart);
}
status_t AndroidRuntime::callMain(const String8& className, jclass clazz,