69d2f98197
This commit fixes two somewhat related issues in shell_service. - The fd returned by StartSubprocess is owned by a unique_fd contained in the Subprocess object, but also gets closed by the caller. Resolve this by duping the returned file descriptor. - A Subprocess object can be destroyed immediately after its initial construction in StartSubprocess if we're sufficiently unlucky. Split up the fork/exec and "start management thread" steps, so that we can safely do everything we need to do on the Subprocess before handing it over to the thread that'll eventually destroy it. Also includes squashed patches from AOSP master that allow for use of unique_fd inside adb. Bug: http://b/29254462 Change-Id: Id9cf0b7e7a7293bee7176919edc758597691c636 (cherry picked from commitc0e6e40cc9
) (cherry picked from commit54c72aaccc
) (cherry picked from commit2c5d1d7cd9
) (cherry picked from commit2a7b86337f
) (cherry picked from commit13ea01db45
) (cherry picked from commit344778da41
)
66 lines
1.9 KiB
C++
66 lines
1.9 KiB
C++
/*
|
|
* Copyright (C) 2016 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include <inttypes.h>
|
|
#include <fcntl.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
|
|
#include <android-base/unique_fd.h>
|
|
|
|
#include "LineBuffer.h"
|
|
#include "ProcessMappings.h"
|
|
#include "log.h"
|
|
|
|
// This function is not re-entrant since it uses a static buffer for
|
|
// the line data.
|
|
bool ProcessMappings(pid_t pid, allocator::vector<Mapping>& mappings) {
|
|
char map_buffer[1024];
|
|
snprintf(map_buffer, sizeof(map_buffer), "/proc/%d/maps", pid);
|
|
android::base::unique_fd fd(open(map_buffer, O_RDONLY));
|
|
if (fd == -1) {
|
|
return false;
|
|
}
|
|
|
|
LineBuffer line_buf(fd, map_buffer, sizeof(map_buffer));
|
|
char* line;
|
|
size_t line_len;
|
|
while (line_buf.GetLine(&line, &line_len)) {
|
|
int name_pos;
|
|
char perms[5];
|
|
Mapping mapping{};
|
|
if (sscanf(line, "%" SCNxPTR "-%" SCNxPTR " %4s %*x %*x:%*x %*d %n",
|
|
&mapping.begin, &mapping.end, perms, &name_pos) == 3) {
|
|
if (perms[0] == 'r') {
|
|
mapping.read = true;
|
|
}
|
|
if (perms[1] == 'w') {
|
|
mapping.write = true;
|
|
}
|
|
if (perms[2] == 'x') {
|
|
mapping.execute = true;
|
|
}
|
|
if (perms[3] == 'p') {
|
|
mapping.priv = true;
|
|
}
|
|
if ((size_t)name_pos < line_len) {
|
|
strlcpy(mapping.name, line + name_pos, sizeof(mapping.name));
|
|
}
|
|
mappings.emplace_back(mapping);
|
|
}
|
|
}
|
|
return true;
|
|
}
|