delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2015/06/26/08:03:19

X-Recipient: archive-cygwin AT delorie DOT com
DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id
:list-unsubscribe:list-subscribe:list-archive:list-post
:list-help:sender:message-id:date:from:mime-version:to:subject
:references:in-reply-to:content-type:content-transfer-encoding;
q=dns; s=default; b=pAZHireTeQGqE9a7gFo3/lz3NYFZb+0+AuyoCctFZJa
UacueeMvitdDkKdS4pRw6tg8WYTbLC9C7o/Z5+ZckkC2fyhPmo6A0NEFSCNIXQF9
WDHxtXscrvx/dUm+3muzwAuOiNtxdGjBZvUEK3K7vQHXRw+XEZsGn+t2BT0BvJBg
=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id
:list-unsubscribe:list-subscribe:list-archive:list-post
:list-help:sender:message-id:date:from:mime-version:to:subject
:references:in-reply-to:content-type:content-transfer-encoding;
s=default; bh=20nvePHMvWfC8juQyneT7YDwYdQ=; b=MdtkCcKaWsH7PHAuh
RIIn7I4MvQa55MedSEL1T7ACPNWgMKCBs9WxFzRkBYf0tKDoDzuktIQ+xLh4p6+B
rUz9PgaPyrgsNbifn0tuSz0RwHoo5jHwAKzuEhEuF/WcgcV3OEd3Dv3cYV8iArub
/zs4PycjuAW0SZXEi/CO3GM1uQ=
Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Id: <cygwin.cygwin.com>
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com
Authentication-Results: sourceware.org; auth=none
X-Virus-Found: No
X-Spam-SWARE-Status: No, score=-1.1 required=5.0 tests=AWL,BAYES_50,RP_MATCHES_RCVD,SPF_HELO_PASS,SPF_PASS autolearn=ham version=3.3.2
X-HELO: limerock04.mail.cornell.edu
X-CornellRouted: This message has been Routed already.
Message-ID: <558D3F4C.6090207@cornell.edu>
Date: Fri, 26 Jun 2015 08:02:20 -0400
From: Ken Brown <kbrown AT cornell DOT edu>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0
MIME-Version: 1.0
To: cygwin AT cygwin DOT com
Subject: Re: [ANNOUNCEMENT] TEST RELEASE: Cygwin 2.1.0-0.1
References: <announce DOT 20150620205512 DOT GA28301 AT calimero DOT vinschen DOT de> <558706D5 DOT 1020508 AT cornell DOT edu> <20150622110835 DOT GE28301 AT calimero DOT vinschen DOT de> <20150626111249 DOT GS31223 AT calimero DOT vinschen DOT de>
In-Reply-To: <20150626111249.GS31223@calimero.vinschen.de>
X-IsSubscribed: yes

Hi Corinna,

On 6/26/2015 7:12 AM, Corinna Vinschen wrote:
> Hi Ken,
>
> On Jun 22 13:08, Corinna Vinschen wrote:
>> On Jun 21 14:47, Ken Brown wrote:
>>> On 6/20/2015 4:55 PM, Corinna Vinschen wrote:
>>>> - First cut of an implementation to allow signal handlers running on an
>>>>    alternate signal stack.
>>>>
>>>> - New API sigaltstack, plus definitions for SA_ONSTACK, SS_ONSTACK, SS_DISABLE,
>>>>    MINSIGSTKSZ, SIGSTKSZ.
>>>
>>> I must be doing something wrong.  Shouldn't including signal.h make the new
>>> API available?
>>>
>>> $ uname -a
>>> CYGWIN_NT-6.1-WOW fiona 2.1.0(0.287/5/3) 2015-06-20 21:44 i686 Cygwin
>>>
>>> $ cygcheck -cd cygwin-devel
>>> Cygwin Package Information
>>> Package              Version
>>> cygwin-devel         2.1.0-0.1
>>>
>>> $ cat test.c
>>> #include <signal.h>
>>> int
>>> main()
>>> {
>>>    int foo = SIGSTKSZ;
>>>    return 0;
>>> }
>>>
>>> $ gcc test.c
>>> test.c: In function ‘main’:
>>> test.c:6:13: error: ‘SIGSTKSZ’ undeclared (first use in this function)
>>>     int foo = SIGSTKSZ;
>>>               ^
>>
>> You're not doing anything wrong.  The relevant definitions in
>> sys/signal.h were originally only available for RTEMS.  I just
>> made them availbale for all platforms.  The problem was that the
>> orignal code missed to include sys/cdefs.h, which is required to
>> get the macros guarding the definitions.  I fixed that in the git
>> repo.
>>
>> I also made a bigger change to code setting up the alternate stack when
>> calling the signal handler function.  It turned out that my code moving
>> to the new stack missed to safe all potentially clobbered volatile
>> registers on both platforms.
>>
>> I'll upload new snapshots and 2.1.0-0.2 test releases shortly.
>
> did you have a chance to test this a bit, in the meantime?

Yes, but I don't have anything definitive to report yet.  I tried to test a 
facility in emacs that uses the alternate stack to recover from stack overflow 
(of the main stack) under some circumstances.  The configure script did detect 
the alternate stack.

I then made the stack overflow by defining an elisp function that did an 
infinite recursion.  emacs still crashed, but the "segmentation fault" message 
was printed twice instead of once.  I haven't had a chance yet to investigate 
further and try to see what's going on.  What I hope is that the alternate stack 
functioned correctly but the code was still not able to recover for some reason. 
  I've appended below the signal handler in case you want to see if you think it 
ought to work on Cygwin.

Ken

The signal handler:

/* Attempt to recover from SIGSEGV caused by C stack overflow.  */
static void
handle_sigsegv (int sig, siginfo_t *siginfo, void *arg)
{
   /* Hard GC error may lead to stack overflow caused by
      too nested calls to mark_object.  No way to survive.  */
   if (!gc_in_progress)
     {
       struct rlimit rlim;

       if (!getrlimit (RLIMIT_STACK, &rlim))
	{
	  enum { STACK_DANGER_ZONE = 16 * 1024 };
	  char *beg, *end, *addr;

	  beg = stack_bottom;
	  end = stack_bottom + stack_direction * rlim.rlim_cur;
	  if (beg > end)
	    addr = beg, beg = end, end = addr;
	  addr = (char *) siginfo->si_addr;
	  /* If we're somewhere on stack and too close to
	     one of its boundaries, most likely this is it.  */
	  if (beg < addr && addr < end
	      && (addr - beg < STACK_DANGER_ZONE
		  || end - addr < STACK_DANGER_ZONE))
	    siglongjmp (return_to_command_loop, 1);
	}
     }

   /* Otherwise we can't do anything with this.  */
   deliver_fatal_thread_signal (sig);
}

The code to set up the signal handler on the alternate stack:

static bool
init_sigsegv (void)
{
   struct sigaction sa;
   stack_t ss;

   stack_direction = ((char *) &ss < stack_bottom) ? -1 : 1;

   ss.ss_sp = sigsegv_stack;
   ss.ss_size = sizeof (sigsegv_stack);
   ss.ss_flags = 0;
   if (sigaltstack (&ss, NULL) < 0)
     return 0;

   sigfillset (&sa.sa_mask);
   sa.sa_sigaction = handle_sigsegv;
   sa.sa_flags = SA_SIGINFO | SA_ONSTACK | emacs_sigaction_flags ();
   return sigaction (SIGSEGV, &sa, NULL) < 0 ? 0 : 1;
}

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019