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:
parent
9011532b2e
commit
7887395e92
1 changed files with 37 additions and 26 deletions
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue