From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932111AbbIBSSO (ORCPT ); Wed, 2 Sep 2015 14:18:14 -0400 Received: from mail-oi0-f50.google.com ([209.85.218.50]:34265 "EHLO mail-oi0-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754958AbbIBSSM convert rfc822-to-8bit (ORCPT ); Wed, 2 Sep 2015 14:18:12 -0400 MIME-Version: 1.0 In-Reply-To: <55E735FE.1030901@list.ru> References: <55CA90B4.2010205@list.ru> <55D2D0DE.3080707@list.ru> <55D44DF2.30802@list.ru> <55D4AF1D.2070100@list.ru> <55E6BEAC.8080302@list.ru> <55E735FE.1030901@list.ru> From: Andy Lutomirski Date: Wed, 2 Sep 2015 11:17:51 -0700 Message-ID: Subject: Re: [regression] x86/signal/64: Fix SS handling for signals delivered to 64-bit programs breaks dosemu To: Stas Sergeev Cc: Linus Torvalds , Raymond Jennings , Cyrill Gorcunov , Pavel Emelyanov , Linux kernel Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Sep 2, 2015 at 10:46 AM, Stas Sergeev wrote: > 02.09.2015 17:21, Andy Lutomirski пишет: >>>> This should work for old DOSEMU. It's a bit gross, but it has the >>>> nice benefit that everyone (even things that aren't DOSEMU) gain the >>>> ability to catch signals thrown from bogus SS contexts, which probably >>>> improves debugability. It's also nice to not have the SA flag. >>> >>> Pros: >>> - No new SA flag >>> - May improve debugability in some unknown scenario where people >>> do not want to just use the new flag to get their things improved >>> >>> Cons: >>> - Does not allow to cleanly use siglongjmp(), as then there is a risk >>> to jump to 64bit code with bad SS >> >> What's the issue here? I don't understand. >> >> On musl, (sig)longjmp just restores rsp, rbx, rbp, and r12-r15, so it >> won't be affected. AFAIK all implementations of siglongjmp are likely >> to call sigprocmask or similar, and that will clobber SS. I'm not >> aware of an implementation of siglongjmp that uses sigreturn. > I am not saying siglongjmp() will be affected. > Quite the opposite: it won't, which is bad. :) > If you have always correct SS, you can use siglongjmp(). If you have > broken SS at times, siglongjmp() will be an asking for troubles, as > it exactly does not restore SS. > dosemu could do a good use of siglongjmp() to get back to 64bit code > from its sighandler. This seems like it would be relying unpleasantly heavily on libc internals. What *does* work is to raise a signal and stash away the entire signal context. Then raise another signal and restore the old context. Of course, this needs SS support in sigcontext, and may still need to handle DS and ES manually. > >>> - Async signals can silently "validate" SS behind your back >> >> True, and that's unfortunate. But async signals without SA_SAVE_SS >> set with the other approach have exactly the same problem. > Yes, and as such, they should be blocked. > You could improve on that and on siglongjmp(). > And on TLS in the future. *I* can't do anything to siglongjmp because that's almost entirely outside the kernel. :-/ > >>> Is the new SA flag such a big deal here to even bother? >> >> Not really, but given that the new behavior seems clearly better >> behaved than the old, it would be nice to be able to have the good >> behavior, or at least most of it, be the default. > Surely, but how about then having the heuristics you suggest, > only if the new SA_hyz is not set? And when it is set, have a > properly defined and predictable behaviour. Then it seems like > we'll get all the possible wishes covered. That could work. The result is quite similar to explicitly setting UC_STRICT_RESTORE_SS. I'll draft up an implementation and we can go from there. --Andy -- Andy Lutomirski AMA Capital Management, LLC