adb: actually enable fdsan.
adb was using a custom unique_fd closer that didn't have an implementation for fdsan, which meant that none of our FDs were actually tracked. Guard this behind ifdefs so that we only use this on Windows, and delete our implementation of Pipe in favor of the one in libbase while we're at it. libbase's implementation always sets O_CLOEXEC, so fix up the instance of Pipe that doesn't expect that. Test: mma Test: adb start-server Test: debuggerd `pidof adbd` Change-Id: Ic29d641a2f93fb42384b00c51775048c8bcbe152
This commit is contained in:
parent
9d100f1043
commit
297d9bf8ea
3 changed files with 8 additions and 45 deletions
|
@ -891,6 +891,10 @@ int launch_server(const std::string& socket_spec) {
|
|||
// child side of the fork
|
||||
pipe_read.reset();
|
||||
|
||||
// android::base::Pipe unconditionally opens the pipe with O_CLOEXEC.
|
||||
// Undo this manually.
|
||||
fcntl(pipe_write.get(), F_SETFD, 0);
|
||||
|
||||
char reply_fd[30];
|
||||
snprintf(reply_fd, sizeof(reply_fd), "%d", pipe_write.get());
|
||||
// child process
|
||||
|
|
|
@ -21,49 +21,8 @@
|
|||
|
||||
#include "sysdeps.h"
|
||||
|
||||
#if defined(_WIN32)
|
||||
void AdbCloser::Close(int fd) {
|
||||
adb_close(fd);
|
||||
}
|
||||
|
||||
#if !defined(_WIN32)
|
||||
bool Pipe(unique_fd* read, unique_fd* write, int flags) {
|
||||
int pipefd[2];
|
||||
#if !defined(__APPLE__)
|
||||
if (pipe2(pipefd, flags) != 0) {
|
||||
return false;
|
||||
}
|
||||
#else
|
||||
// Darwin doesn't have pipe2. Implement it ourselves.
|
||||
if (flags != 0 && (flags & ~(O_CLOEXEC | O_NONBLOCK)) != 0) {
|
||||
errno = EINVAL;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (pipe(pipefd) != 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (flags & O_CLOEXEC) {
|
||||
if (fcntl(pipefd[0], F_SETFD, FD_CLOEXEC) != 0 ||
|
||||
fcntl(pipefd[1], F_SETFD, FD_CLOEXEC) != 0) {
|
||||
adb_close(pipefd[0]);
|
||||
adb_close(pipefd[1]);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (flags & O_NONBLOCK) {
|
||||
if (fcntl(pipefd[0], F_SETFL, O_NONBLOCK) != 0 ||
|
||||
fcntl(pipefd[1], F_SETFL, O_NONBLOCK) != 0) {
|
||||
adb_close(pipefd[0]);
|
||||
adb_close(pipefd[1]);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
read->reset(pipefd[0]);
|
||||
write->reset(pipefd[1]);
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -21,15 +21,15 @@
|
|||
|
||||
#include <android-base/unique_fd.h>
|
||||
|
||||
#if defined(_WIN32)
|
||||
// Helper to automatically close an FD when it goes out of scope.
|
||||
struct AdbCloser {
|
||||
static void Close(int fd);
|
||||
};
|
||||
|
||||
using unique_fd = android::base::unique_fd_impl<AdbCloser>;
|
||||
|
||||
#if !defined(_WIN32)
|
||||
bool Pipe(unique_fd* read, unique_fd* write, int flags = 0);
|
||||
#else
|
||||
using unique_fd = android::base::unique_fd;
|
||||
#endif
|
||||
|
||||
template <typename T>
|
||||
|
|
Loading…
Reference in a new issue