On Sun, Jun 25, 2017 at 8:13 PM, Andrew Pinski <pins...@gmail.com> wrote:
> On Sun, Jun 25, 2017 at 12:08 PM, Yuri Gribov <tetra2...@gmail.com> wrote:
>> Hi all,
>>
>> Libgcc unwinder currently does not do any verification of pointers
>> which it chases on stack. In practice this not so rarely causes
>> segfaults when unwinding on corrupted stacks (e.g. when when trying to
>> print diagnostic on
>> fatal error) [1]. Ironically this usually happens in error reporting
>> code which puzzles users.
>>
>> I've attached one motivating example - with current libgcc it will
>> abort inside unwinder when trying to access invalid address
>> (0x0a0a0a0a).
>>
>> There is an old request to provide a safer version of
>> _Unwind_Backtrace (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67336)
>> that would check pointer validity prior to dereferencing. I've
>> attached a draft patch to see if this approach is viable and hopefully
>> get some advice.
>>
>> The change is rather straightforward: I add a new
>> _Unwind_Backtrace_Checked which checks return value of msync on every
>> potentially unsafe access (libunwind does something like this as well,
>> although in a very incomplete manner).
>> To avoid paying for syscalls too often, I cache the last checked
>> memory page. Potentially parsing /proc/$$/maps would allow for much
>> faster verification but I didn't bother too much as new APIs are
>> intended for reporting fatal errors where speed isn't an issue.
>>
>> The code is only implemented for DW2 unwinder (probably used on most 
>> targets).
>>
>> So my questions now are:
>> 1) Would this feature considered useful i.e. will it be accepted for
>> trunk once implementation is polished/tested?
>> 2) Should I strive to implement it for all possible targets or DW2
>> would do for now? I don't have easy access to other platforms (ARM,
>> C6x, etc.) so this may delay implementation.
>> 3) Any suggestions/comments on this attached draft implementation?
>> E.g. alternative syscalls to use (Andrew suggested futex), how many
>> verified addresses to cache, whether I should verify unwind table
>> accesses in addition to stack accesses, etc.
>
> The version script should be using GCC_8.0.0 since 6.2.0 has already
> shipped months ago.
> Also all patches should be submitted against the trunk and not a
> released version.

Well, that's an RFC so I thought maybe original patch might be enough
for general ok/not ok decision...

-Y

Reply via email to