From e2b3b80e439905ba7be9416a61b55df8da0c698f Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Fri, 29 Mar 2019 14:14:27 -0400 Subject: linux_core_dumper: add explicit casts for exception fields MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some of the fields we save might have signed types depending on the system (e.g. `typedef int pid_t`). Depending on the toolchain, we can trip -Werror=narrowing failures like: src/client/linux/minidump_writer/linux_core_dumper.cc:248:66: error: narrowing conversion of ‘(__pid_t)info->siginfo_t::_sifields.siginfo_t::::_kill.siginfo_t::::::si_pid’ from ‘__pid_t {aka int}’ to ‘long unsigned int’ inside { } [-Werror=narrowing] set_crash_exception_info({info->si_pid, info->si_uid}); ^^^^^^ src/client/linux/minidump_writer/linux_core_dumper.cc:252:71: error: narrowing conversion of ‘(int)info->siginfo_t::_sifields.siginfo_t::::_sigsys.siginfo_t::::::_syscall’ from ‘int’ to ‘long unsigned int’ inside { } [-Werror=narrowing] set_crash_exception_info({info->si_syscall, info->si_arch}); ^^^^^^^^^^ Since the exception info fields are all uint64_t which should be large enough to handle all the fields in the siginfo_t structure, add casts for all the assignments to avoid these errors. We have implicit casts even without them, so we aren't changing behavior. Bug: google-breakpad:791 Bug: chromium:945653 Change-Id: Ib04e015998f08b857159ac13e9a065a66d228d49 Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/1544862 Reviewed-by: Mark Mentovai --- src/client/linux/minidump_writer/linux_core_dumper.cc | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/client/linux/minidump_writer/linux_core_dumper.cc b/src/client/linux/minidump_writer/linux_core_dumper.cc index 3b1eabb4..41506898 100644 --- a/src/client/linux/minidump_writer/linux_core_dumper.cc +++ b/src/client/linux/minidump_writer/linux_core_dumper.cc @@ -242,14 +242,21 @@ bool LinuxCoreDumper::EnumerateThreads() { break; } - // Set crash_exception_info for common signals. + // Set crash_exception_info for common signals. Since exception info is + // unsigned, but some of these fields might be signed, we always cast. switch (info->si_signo) { case MD_EXCEPTION_CODE_LIN_SIGKILL: - set_crash_exception_info({info->si_pid, info->si_uid}); + set_crash_exception_info({ + static_cast(info->si_pid), + static_cast(info->si_uid), + }); break; case MD_EXCEPTION_CODE_LIN_SIGSYS: #ifdef si_syscall - set_crash_exception_info({info->si_syscall, info->si_arch}); + set_crash_exception_info({ + static_cast(info->si_syscall), + static_cast(info->si_arch), + }); #endif break; } -- cgit v1.2.1