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=Q3FqzjqQcTreCUjt5mDRP66L7glIzBYGkK/zrk7htYz 9/nrkbtKqk82yv9DNqwWKvxG6AYeZ3G7LnD/xvo7U6niDKCR3Zahx2a2MRgetPgc Chd7M+eEvw8gwxKtNoXXqJLL6Kp1XYj5mkVkhKj3XeGKxhJMhPe8OzrePDDRW+eI = 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=g5TR/Ql8iXIblvGfjh4HQLUpgVs=; b=jhxer7Q/vPcxVOWVk bZg7DwD07QML6aGlo9+2XWefwrXDs2bFkOFi0+dbf4yGZU8Odb71G892wDZMEDyD ldfVLjAYQYCmvIismNroY0D4/k3DIfeweEZ9p4q3dxWk/e5pPV2vRPXS2PZ1YKvZ wTy6C/5oXYffCLJAi0yzhmr48w= Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com X-Spam-SWARE-Status: No, score=-4.3 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_THREADED,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_NO,RP_MATCHES_RCVD,SPF_NEUTRAL autolearn=ham version=3.3.2 Message-ID: <521204EA.6020607@cs.utoronto.ca> Date: Mon, 19 Aug 2013 07:43:38 -0400 From: Ryan Johnson User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: cygwin AT cygwin DOT com Subject: Re: Stack size on 64-bit Cygwin References: <520E905A DOT 409 AT cornell DOT edu> <20130819093242 DOT GB18757 AT calimero DOT vinschen DOT de> <5211F83A DOT 30901 AT cs DOT utoronto DOT ca> <5211FBB6 DOT 6070108 AT cs DOT utoronto DOT ca> <20130819113919 DOT GA29385 AT calimero DOT vinschen DOT de> In-Reply-To: <20130819113919.GA29385@calimero.vinschen.de> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 19/08/2013 7:39 AM, Corinna Vinschen wrote: > On Aug 19 07:04, Ryan Johnson wrote: >> On 19/08/2013 6:49 AM, Ryan Johnson wrote: >>> One thing I don't understand, though: shouldn't a stack overflow >>> normally manifest as a seg fault when trying to access the invalid >>> addresses, rather than silent memory corruption? > That would be helpful. > >>> However, /proc/pid/maps for emacs shows: >>>> 00010000-00020000 rw-s 00000000 0000:0000 0 >>>> [win heap 1 default shared] >>>> 00020000-00030000 rw-s 00000000 0000:0000 0 [win heap 2 default shared] >>>> 00030000-001E4000 ===p 00000000 0000:0000 0 [stack (tid 4896)] >>>> 001E4000-001E6000 rw-g 001B4000 0000:0000 0 [stack (tid 4896)] >>>> 001E6000-00230000 rw-p 001B6000 0000:0000 0 [stack (tid 4896)] >>> GDB reports that thread 4896 is the main thread... so I guess >>> Windows doesn't reserve a red zone around its stack, but instead >>> chooses to place the main thread stack right next to the >>> fully-mapped global shared heap to maximize the potential for Fun? > Right. I have no idea what the two shared mem regions preceeding the > stack are good for, though. > > >> Some googling turns up >> http://comments.gmane.org/gmane.comp.java.openjdk.hotspot.runtime.devel/7706 >>> Windows only uses reserved but only partially committed memory for its stacks. In order to detect when to >>> commit more stack, it installs a one-shot guard page (btw the same type of guard page that is used for the >>> hotspot yellow and red zone) right at the edge of the currently commited stack zone. When a thread accesses >>> this guard page an exception is thrown which Windows catches internally, commits more stack and >>> re-establishes the one-shot guard page at the new edge of the commited zone. When Windows detects such an >>> exception inside the _last 4 pages_ of a stack (I couldn't find any documentation for that on MSDN, I found >>> this value from manually testing on several Windows machines with 4k stack pages) it throws a STACK_OVERFLOW_EXCEPTION. >> So maybe emacs just had the incredibly bad luck to alloca() a large >> buffer right at end-of-stack and then somehow managed to skip over >> the 4 guard pages when accessing it? > That's unlikely since alloca is designed to probe the stack in 4K > steps. And STATUS_STACK_OVERFLOW is translated to a SEGV by Cygwin's > exception handler. ... and yet somehow emacs managed to get around that protection (unintentially), leading to all that fun over the last week. What went wrong? Ryan -- 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