debuggerd: switch to base::{Send,Receive}FileDescriptors.
Bug: http://b/12204763 Test: debuggerd_test Change-Id: I0be40916214de51ab36fd6bd6d44090a84312e51
This commit is contained in:
parent
14f9500a35
commit
5f87bbdb0a
|
@ -26,6 +26,7 @@
|
|||
|
||||
#include <chrono>
|
||||
|
||||
#include <android-base/cmsg.h>
|
||||
#include <android-base/file.h>
|
||||
#include <android-base/logging.h>
|
||||
#include <android-base/parseint.h>
|
||||
|
@ -41,6 +42,7 @@
|
|||
|
||||
using namespace std::chrono_literals;
|
||||
|
||||
using android::base::SendFileDescriptors;
|
||||
using android::base::unique_fd;
|
||||
|
||||
static bool send_signal(pid_t pid, const DebuggerdDumpType dump_type) {
|
||||
|
@ -146,15 +148,16 @@ bool debuggerd_trigger_dump(pid_t tid, DebuggerdDumpType dump_type, unsigned int
|
|||
PLOG(ERROR) << "failed to set pipe buffer size";
|
||||
}
|
||||
|
||||
if (send_fd(set_timeout(sockfd), &req, sizeof(req), std::move(pipe_write)) != sizeof(req)) {
|
||||
ssize_t rc = SendFileDescriptors(set_timeout(sockfd), &req, sizeof(req), pipe_write.get());
|
||||
pipe_write.reset();
|
||||
if (rc != sizeof(req)) {
|
||||
PLOG(ERROR) << "libdebuggerd_client: failed to send output fd to tombstoned";
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check to make sure we've successfully registered.
|
||||
InterceptResponse response;
|
||||
ssize_t rc =
|
||||
TEMP_FAILURE_RETRY(recv(set_timeout(sockfd.get()), &response, sizeof(response), MSG_TRUNC));
|
||||
rc = TEMP_FAILURE_RETRY(recv(set_timeout(sockfd.get()), &response, sizeof(response), MSG_TRUNC));
|
||||
if (rc == 0) {
|
||||
LOG(ERROR) << "libdebuggerd_client: failed to read initial response from tombstoned: "
|
||||
<< "timeout reached?";
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#include <android/fdsan.h>
|
||||
#include <android/set_abort_message.h>
|
||||
|
||||
#include <android-base/cmsg.h>
|
||||
#include <android-base/file.h>
|
||||
#include <android-base/logging.h>
|
||||
#include <android-base/macros.h>
|
||||
|
@ -53,6 +54,8 @@
|
|||
#include "util.h"
|
||||
|
||||
using namespace std::chrono_literals;
|
||||
|
||||
using android::base::SendFileDescriptors;
|
||||
using android::base::unique_fd;
|
||||
|
||||
#if defined(__LP64__)
|
||||
|
@ -123,12 +126,14 @@ static void tombstoned_intercept(pid_t target_pid, unique_fd* intercept_fd, uniq
|
|||
|
||||
ASSERT_GE(pipe_buffer_size, 1024 * 1024);
|
||||
|
||||
if (send_fd(intercept_fd->get(), &req, sizeof(req), std::move(output_pipe_write)) != sizeof(req)) {
|
||||
ssize_t rc = SendFileDescriptors(intercept_fd->get(), &req, sizeof(req), output_pipe_write.get());
|
||||
output_pipe_write.reset();
|
||||
if (rc != sizeof(req)) {
|
||||
FAIL() << "failed to send output fd to tombstoned: " << strerror(errno);
|
||||
}
|
||||
|
||||
InterceptResponse response;
|
||||
ssize_t rc = TEMP_FAILURE_RETRY(read(intercept_fd->get(), &response, sizeof(response)));
|
||||
rc = TEMP_FAILURE_RETRY(read(intercept_fd->get(), &response, sizeof(response)));
|
||||
if (rc == -1) {
|
||||
FAIL() << "failed to read response from tombstoned: " << strerror(errno);
|
||||
} else if (rc == 0) {
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include <event2/event.h>
|
||||
#include <event2/listener.h>
|
||||
|
||||
#include <android-base/cmsg.h>
|
||||
#include <android-base/logging.h>
|
||||
#include <android-base/unique_fd.h>
|
||||
#include <cutils/sockets.h>
|
||||
|
@ -31,6 +32,7 @@
|
|||
#include "protocol.h"
|
||||
#include "util.h"
|
||||
|
||||
using android::base::ReceiveFileDescriptors;
|
||||
using android::base::unique_fd;
|
||||
|
||||
static void intercept_close_cb(evutil_socket_t sockfd, short event, void* arg) {
|
||||
|
@ -96,7 +98,8 @@ static void intercept_request_cb(evutil_socket_t sockfd, short ev, void* arg) {
|
|||
{
|
||||
unique_fd rcv_fd;
|
||||
InterceptRequest intercept_request;
|
||||
ssize_t result = recv_fd(sockfd, &intercept_request, sizeof(intercept_request), &rcv_fd);
|
||||
ssize_t result =
|
||||
ReceiveFileDescriptors(sockfd, &intercept_request, sizeof(intercept_request), &rcv_fd);
|
||||
|
||||
if (result == -1) {
|
||||
PLOG(WARNING) << "failed to read from intercept socket";
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#include <event2/listener.h>
|
||||
#include <event2/thread.h>
|
||||
|
||||
#include <android-base/cmsg.h>
|
||||
#include <android-base/logging.h>
|
||||
#include <android-base/properties.h>
|
||||
#include <android-base/stringprintf.h>
|
||||
|
@ -45,6 +46,7 @@
|
|||
#include "intercept_manager.h"
|
||||
|
||||
using android::base::GetIntProperty;
|
||||
using android::base::SendFileDescriptors;
|
||||
using android::base::StringPrintf;
|
||||
using android::base::unique_fd;
|
||||
|
||||
|
@ -224,7 +226,10 @@ static void perform_request(Crash* crash) {
|
|||
TombstonedCrashPacket response = {
|
||||
.packet_type = CrashPacketType::kPerformDump
|
||||
};
|
||||
ssize_t rc = send_fd(crash->crash_socket_fd, &response, sizeof(response), std::move(output_fd));
|
||||
ssize_t rc =
|
||||
SendFileDescriptors(crash->crash_socket_fd, &response, sizeof(response), output_fd.get());
|
||||
output_fd.reset();
|
||||
|
||||
if (rc == -1) {
|
||||
PLOG(WARNING) << "failed to send response to CrashRequest";
|
||||
goto fail;
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
|
||||
#include <utility>
|
||||
|
||||
#include <android-base/cmsg.h>
|
||||
#include <android-base/unique_fd.h>
|
||||
#include <async_safe/log.h>
|
||||
#include <cutils/sockets.h>
|
||||
|
@ -28,6 +29,7 @@
|
|||
#include "protocol.h"
|
||||
#include "util.h"
|
||||
|
||||
using android::base::ReceiveFileDescriptors;
|
||||
using android::base::unique_fd;
|
||||
|
||||
bool tombstoned_connect(pid_t pid, unique_fd* tombstoned_socket, unique_fd* output_fd,
|
||||
|
@ -53,7 +55,7 @@ bool tombstoned_connect(pid_t pid, unique_fd* tombstoned_socket, unique_fd* outp
|
|||
}
|
||||
|
||||
unique_fd tmp_output_fd;
|
||||
ssize_t rc = recv_fd(sockfd, &packet, sizeof(packet), &tmp_output_fd);
|
||||
ssize_t rc = ReceiveFileDescriptors(sockfd, &packet, sizeof(packet), &tmp_output_fd);
|
||||
if (rc == -1) {
|
||||
async_safe_format_log(ANDROID_LOG_ERROR, "libc",
|
||||
"failed to read response to DumpRequest packet: %s", strerror(errno));
|
||||
|
|
|
@ -24,73 +24,9 @@
|
|||
#include <android-base/file.h>
|
||||
#include <android-base/stringprintf.h>
|
||||
#include <android-base/strings.h>
|
||||
#include <android-base/unique_fd.h>
|
||||
#include <cutils/sockets.h>
|
||||
#include "protocol.h"
|
||||
|
||||
using android::base::unique_fd;
|
||||
|
||||
ssize_t send_fd(int sockfd, const void* data, size_t len, unique_fd fd) {
|
||||
char cmsg_buf[CMSG_SPACE(sizeof(int))];
|
||||
|
||||
iovec iov = { .iov_base = const_cast<void*>(data), .iov_len = len };
|
||||
msghdr msg = {
|
||||
.msg_iov = &iov, .msg_iovlen = 1, .msg_control = cmsg_buf, .msg_controllen = sizeof(cmsg_buf),
|
||||
};
|
||||
auto cmsg = CMSG_FIRSTHDR(&msg);
|
||||
cmsg->cmsg_level = SOL_SOCKET;
|
||||
cmsg->cmsg_type = SCM_RIGHTS;
|
||||
cmsg->cmsg_len = CMSG_LEN(sizeof(int));
|
||||
*reinterpret_cast<int*>(CMSG_DATA(cmsg)) = fd.get();
|
||||
|
||||
return TEMP_FAILURE_RETRY(sendmsg(sockfd, &msg, 0));
|
||||
}
|
||||
|
||||
ssize_t recv_fd(int sockfd, void* _Nonnull data, size_t len, unique_fd* _Nullable out_fd) {
|
||||
char cmsg_buf[CMSG_SPACE(sizeof(int))];
|
||||
|
||||
iovec iov = { .iov_base = const_cast<void*>(data), .iov_len = len };
|
||||
msghdr msg = {
|
||||
.msg_iov = &iov,
|
||||
.msg_iovlen = 1,
|
||||
.msg_control = cmsg_buf,
|
||||
.msg_controllen = sizeof(cmsg_buf),
|
||||
.msg_flags = 0,
|
||||
};
|
||||
auto cmsg = CMSG_FIRSTHDR(&msg);
|
||||
cmsg->cmsg_level = SOL_SOCKET;
|
||||
cmsg->cmsg_type = SCM_RIGHTS;
|
||||
cmsg->cmsg_len = CMSG_LEN(sizeof(int));
|
||||
|
||||
ssize_t result = TEMP_FAILURE_RETRY(recvmsg(sockfd, &msg, 0));
|
||||
if (result == -1) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
unique_fd fd;
|
||||
bool received_fd = msg.msg_controllen == sizeof(cmsg_buf);
|
||||
if (received_fd) {
|
||||
fd.reset(*reinterpret_cast<int*>(CMSG_DATA(cmsg)));
|
||||
}
|
||||
|
||||
if ((msg.msg_flags & MSG_TRUNC) != 0) {
|
||||
errno = EFBIG;
|
||||
return -1;
|
||||
} else if ((msg.msg_flags & MSG_CTRUNC) != 0) {
|
||||
errno = ERANGE;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (out_fd) {
|
||||
*out_fd = std::move(fd);
|
||||
} else if (received_fd) {
|
||||
errno = ERANGE;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
std::string get_process_name(pid_t pid) {
|
||||
std::string result = "<unknown>";
|
||||
android::base::ReadFileToString(android::base::StringPrintf("/proc/%d/cmdline", pid), &result);
|
||||
|
|
|
@ -21,29 +21,5 @@
|
|||
#include <sys/cdefs.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <android-base/unique_fd.h>
|
||||
|
||||
// *** WARNING ***
|
||||
// tombstoned's sockets are SOCK_SEQPACKET sockets.
|
||||
// Short reads are treated as errors and short writes are assumed to not happen.
|
||||
|
||||
// Sends a packet with an attached fd.
|
||||
ssize_t send_fd(int sockfd, const void* _Nonnull data, size_t len, android::base::unique_fd fd);
|
||||
|
||||
// Receives a packet and optionally, its attached fd.
|
||||
// If out_fd is non-null, packets can optionally have an attached fd.
|
||||
// If out_fd is null, received packets must not have an attached fd.
|
||||
//
|
||||
// Errors:
|
||||
// EOVERFLOW: sockfd is SOCK_DGRAM or SOCK_SEQPACKET and buffer is too small.
|
||||
// The first len bytes of the packet are stored in data, but the
|
||||
// rest of the packet is dropped.
|
||||
// ERANGE: too many file descriptors were attached to the packet.
|
||||
// ENOMSG: not enough file descriptors were attached to the packet.
|
||||
//
|
||||
// plus any errors returned by the underlying recvmsg.
|
||||
ssize_t recv_fd(int sockfd, void* _Nonnull data, size_t len,
|
||||
android::base::unique_fd* _Nullable out_fd);
|
||||
|
||||
std::string get_process_name(pid_t pid);
|
||||
std::string get_thread_name(pid_t tid);
|
||||
|
|
Loading…
Reference in New Issue