fix: -Wunsafe-buffer-usage warnings when read()ing and write()ing integers (#44208)

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Charles Kerr <charles@charleskerr.com>
This commit is contained in:
trop[bot] 2024-10-11 18:31:27 -05:00 committed by GitHub
parent 9011532b2e
commit 7887395e92
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -25,6 +25,18 @@ namespace electron {
namespace { namespace {
// write |ref|'s raw bytes to |fd|.
template <typename T>
void WriteValToFd(int fd, const T& ref) {
base::span<const uint8_t> bytes = base::byte_span_from_ref(ref);
while (!bytes.empty()) {
const ssize_t rv = HANDLE_EINTR(write(fd, bytes.data(), bytes.size()));
RAW_CHECK(rv >= 0);
const size_t n_bytes_written = rv >= 0 ? static_cast<size_t>(rv) : 0U;
bytes = bytes.subspan(n_bytes_written);
}
}
// See comment in |PreEarlyInitialization()|, where sigaction is called. // See comment in |PreEarlyInitialization()|, where sigaction is called.
void SIGCHLDHandler(int signal) {} void SIGCHLDHandler(int signal) {}
@ -49,15 +61,7 @@ void GracefulShutdownHandler(int signal) {
RAW_CHECK(g_pipe_pid == getpid()); RAW_CHECK(g_pipe_pid == getpid());
RAW_CHECK(g_shutdown_pipe_write_fd != -1); RAW_CHECK(g_shutdown_pipe_write_fd != -1);
RAW_CHECK(g_shutdown_pipe_read_fd != -1); RAW_CHECK(g_shutdown_pipe_read_fd != -1);
size_t bytes_written = 0; WriteValToFd(g_shutdown_pipe_write_fd, signal);
do {
int rv = HANDLE_EINTR(
write(g_shutdown_pipe_write_fd,
reinterpret_cast<const char*>(&signal) + bytes_written,
sizeof(signal) - bytes_written));
RAW_CHECK(rv >= 0);
bytes_written += rv;
} while (bytes_written < sizeof(signal));
} }
// See comment in |PostCreateMainMessageLoop()|, where sigaction is called. // See comment in |PostCreateMainMessageLoop()|, where sigaction is called.
@ -130,26 +134,33 @@ NOINLINE void ExitPosted() {
sleep(UINT_MAX); sleep(UINT_MAX);
} }
// read |sizeof(T)| raw bytes from |fd| and return the result
template <typename T>
[[nodiscard]] std::optional<T> ReadValFromFd(int fd) {
auto val = T{};
base::span<uint8_t> bytes = base::byte_span_from_ref(val);
while (!bytes.empty()) {
const ssize_t rv = HANDLE_EINTR(read(fd, bytes.data(), bytes.size()));
if (rv < 0) {
NOTREACHED_IN_MIGRATION() << "Unexpected error: " << strerror(errno);
ShutdownFDReadError();
return {};
}
if (rv == 0) {
NOTREACHED_IN_MIGRATION() << "Unexpected closure of shutdown pipe.";
ShutdownFDClosedError();
return {};
}
const size_t n_bytes_read = static_cast<size_t>(rv);
bytes = bytes.subspan(n_bytes_read);
}
return val;
}
void ShutdownDetector::ThreadMain() { void ShutdownDetector::ThreadMain() {
base::PlatformThread::SetName("CrShutdownDetector"); base::PlatformThread::SetName("CrShutdownDetector");
int signal; const int signal = ReadValFromFd<int>(shutdown_fd_).value_or(0);
size_t bytes_read = 0;
do {
const ssize_t ret = HANDLE_EINTR(
read(shutdown_fd_, reinterpret_cast<char*>(&signal) + bytes_read,
sizeof(signal) - bytes_read));
if (ret < 0) {
NOTREACHED_IN_MIGRATION() << "Unexpected error: " << strerror(errno);
ShutdownFDReadError();
break;
} else if (ret == 0) {
NOTREACHED_IN_MIGRATION() << "Unexpected closure of shutdown pipe.";
ShutdownFDClosedError();
break;
}
bytes_read += ret;
} while (bytes_read < sizeof(signal));
VLOG(1) << "Handling shutdown for signal " << signal << "."; VLOG(1) << "Handling shutdown for signal " << signal << ".";
if (!task_runner_->PostTask(FROM_HERE, if (!task_runner_->PostTask(FROM_HERE,