delorie.com/archives/browse.cgi | search |
DMARC-Filter: | OpenDMARC Filter v1.4.2 delorie.com 5232BZM82622855 |
Authentication-Results: | delorie.com; dmarc=pass (p=none dis=none) header.from=cygwin.com |
Authentication-Results: | delorie.com; spf=pass smtp.mailfrom=cygwin.com |
DKIM-Filter: | OpenDKIM Filter v2.11.0 delorie.com 5232BZM82622855 |
Authentication-Results: | delorie.com; |
dkim=pass (1024-bit key, unprotected) header.d=cygwin.com header.i=@cygwin.com header.a=rsa-sha256 header.s=default header.b=JFyhmCXO | |
X-Recipient: | archive-cygwin AT delorie DOT com |
DKIM-Filter: | OpenDKIM Filter v2.11.0 sourceware.org D96D03858D38 |
DKIM-Signature: | v=1; a=rsa-sha256; c=relaxed/relaxed; d=cygwin.com; |
s=default; t=1740967893; | |
bh=UjpCVS278BKo83ktYWUmHcqzcsy5zpElNoBsxEgW44M=; | |
h=Date:Subject:To:References:In-Reply-To:List-Id:List-Unsubscribe: | |
List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: | |
From; | |
b=JFyhmCXOJLTDN2UnH1OR8k8qjv4fgukwJwq435SC21WT8HazCtL6bTxylDy7egXxj | |
BMU1uLjKtaeG/DMWE9vlHe+P1ghfz0dFjHXuznoIpwvD/JIi+sdako+sbdMJDr2BYQ | |
hlNfd/pKOAf/+XWoTfFa4I7Xcsz34arK4Pep/Bik= | |
X-Original-To: | cygwin AT cygwin DOT com |
Delivered-To: | cygwin AT cygwin DOT com |
DMARC-Filter: | OpenDMARC Filter v1.4.2 sourceware.org 7BB803858D28 |
ARC-Filter: | OpenARC Filter v1.0.0 sourceware.org 7BB803858D28 |
ARC-Seal: | i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1740967852; cv=none; |
b=xUFu8oPDlbiBsEkmllKk33Ao94J90TgsP17EFjxeOwqWvbHXaOZXz9DpnMUflMcbHc2Uyb8IRFAEyaLL9Vo1QiaDg96znFGqzrWeTdInR4wLMOheBxToGtH+S7OEQdf3ZsgJMIlSgh1x+XckzYD6NY5mn3GPqI5GKk5rZL+315o= | |
ARC-Message-Signature: | i=1; a=rsa-sha256; d=sourceware.org; s=key; |
t=1740967852; c=relaxed/simple; | |
bh=L4u3/8z7OUx47gRBWfRvGhPBbkFa1Gyi/XmcNgJ8pH4=; | |
h=DKIM-Signature:Message-ID:Date:MIME-Version:Subject:To:From; | |
b=rGbXX/+8Pt3IJDUpZ2nYRkWq+WtGGGITTc6QKF6w10fG3iTNeR8z/EJtJ7LksbG3Zrh3uE+97KsaWF8XGttsDLdjXi6KakoB1lIx4KG4juHBI/+19ag3CTfvFbJ6VFTk+XswFlgCuDqWzDd8r7u8SJz9M9/uxJ/TlxMbkyV9Ml4= | |
ARC-Authentication-Results: | i=1; server2.sourceware.org |
DKIM-Filter: | OpenDKIM Filter v2.11.0 sourceware.org 7BB803858D28 |
Message-ID: | <d812cd8e-37c9-499b-a26c-cfb02d87c763@anduin.net> |
Date: | Mon, 3 Mar 2025 03:10:48 +0100 |
MIME-Version: | 1.0 |
User-Agent: | Mozilla Thunderbird |
Subject: | Re: pipe.cc: Missing FILE_SYNCHRONOUS_IO_NONALERT in call to |
NtOpenFile call in nt_create() - possibly leading to ENOSPC in UCRT | |
To: | cygwin AT cygwin DOT com |
References: | <fa85130b-9763-4b36-a431-1641667be253 AT anduin DOT net> |
<Z73dBsUPT4UeAqt6 AT calimero DOT vinschen DOT de> | |
Autocrypt: | addr=bird AT anduin DOT net; keydata= |
xjMEXmi1hRYJKwYBBAHaRw8BAQdA+UswELoxV9TRrA9wXuhDQx/nBBqfyM93OcWy/jnXR0XN | |
JEtudXQgU3QuIE9zbXVuZHNlbiA8YmlyZEBhbmR1aW4ubmV0PsKWBBMWCAA+FiEE7y46McDW | |
gR4aNBubwAsG7Zek51UFAl5otYUCGwMFCQlmAYAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AA | |
CgkQwAsG7Zek51WDgQEA+ZNXiRxhbhcycILk6+PpFpA1J7dYqZWSvX1dGUkARHABAKpfwVbg | |
cRXFxJkz9uhTixDtOOFYGWAjwQQnG6YLDzwMzjgEXmi1hRIKKwYBBAGXVQEFAQEHQLiSD2of | |
92ORL5i0n6YFBpHoW9orQDGQYGEDp0sZCr0BAwEIB8J+BBgWCAAmFiEE7y46McDWgR4aNBub | |
wAsG7Zek51UFAl5otYUCGwwFCQlmAYAACgkQwAsG7Zek51X1OwEAuSCsZoxd1pXxTtzjCyIZ | |
srWjCEWz2K8l2AzHWNnvww8A/1/b/SPnb7kbqFcy/StMPa7QV1yyGWXm+pvK8TJFdUoG | |
In-Reply-To: | <Z73dBsUPT4UeAqt6@calimero.vinschen.de> |
X-SA-Authenticated: | Yes |
X-Content-Filtered-By: | Mailman/MimeDel 2.1.30 |
X-BeenThere: | cygwin AT cygwin DOT com |
X-Mailman-Version: | 2.1.30 |
List-Id: | General Cygwin discussions and problem reports <cygwin.cygwin.com> |
List-Unsubscribe: | <https://cygwin.com/mailman/options/cygwin>, |
<mailto:cygwin-request AT cygwin DOT com?subject=unsubscribe> | |
List-Archive: | <https://cygwin.com/pipermail/cygwin/> |
List-Post: | <mailto:cygwin AT cygwin DOT com> |
List-Help: | <mailto:cygwin-request AT cygwin DOT com?subject=help> |
List-Subscribe: | <https://cygwin.com/mailman/listinfo/cygwin>, |
<mailto:cygwin-request AT cygwin DOT com?subject=subscribe> | |
From: | "knut st. osmundsen via Cygwin" <cygwin AT cygwin DOT com> |
Reply-To: | "knut st. osmundsen" <bird-cygwin AT anduin DOT net> |
Errors-To: | cygwin-bounces~archive-cygwin=delorie DOT com AT cygwin DOT com |
Sender: | "Cygwin" <cygwin-bounces~archive-cygwin=delorie DOT com AT cygwin DOT com> |
X-MIME-Autoconverted: | from base64 to 8bit by delorie.com id 5232BZM82622855 |
Hi Corinna, On 25/02/2025 16:08, Corinna Vinschen via Cygwin wrote: > Hi Knut, > > On Feb 25 01:51, knut st. osmundsen via Cygwin wrote: >> Hi, >> >> I've been hunting an issue for some days now, where a non-cygwin program >> using microsoft's UCRT sometimes end up with a sticky error on stdout when >> running under cygwin perl with a pipe capturing stdout and stderr. When the >> problem triggers, the pipe buffer appears to be full and it really looks >> like it's hitting the errno=ENOSPC/doserrno=0 situation at the tail end of >> _write_nolock() in ucrt/lowio/write.cpp. >> >> I *think* the issue is that the write end of the pipe isn't configured to be >> synchronous. In winsup/cygwin/fhandler/pipe.cc, the nt_create() function >> sets FILE_SYNCHRONOUS_IO_NONALERT when creating the _read_ end of the pipe >> using NtCreateNamedPipeFile, citing some C# program compatibility need. >> But, the call to NtOpenFile below that opens the _write_ end of the pipe >> doesn't set it. It does set the SYNCHRONIZE access right, but doesn't set >> the FILE_SYNCHRONOUS_IO_NONALERT flag (last parameter, is zero). This is >> akin to calling CreateFile with FILE_FLAG_OVERLAPPED, if I understand it >> correctly. > We can't make the write side of the pipe synchronous easily, because > this means a pretty big rewrite of the current code. Right now, if > we'd add the FILE_SYNCHRONOUS_IO_NONALERT, you couldn't interrupt > NtWriteFile with a signal. Sorry, I didn't look at the rest of the code before firing off the email. I totally understand it would be a major pain to rework that, if it's at all doable. > We can add such a change to the TODO list for 3.7, using NtWriteFile > in a thread or something like that. > > However, maybe there's a chance we can fix this for 3.6, if you would > be able to create simple testcase in plain C, reproducing your issue, > and the actual problem is not the FILE_SYNCHRONOUS_IO_NONALERT. Been exploring the issue some more over the last few days. I *think* I've gotten to the bottom of it now, but a testcase require more work. But no worries, this is stuff that has been broken for ages and the OS+UCRT vendor is really at blame here. The problem is that when the pipe buffer goes full and there are two or more concurrent WriteFile calls from UCRT/whatever that isn't aware that it's an asynchronous handle, i.e. no OVERLAPPED parameter, WriteFile will get a STATUS_PENDING back from the NtWriteFile call and follow that up with a NtWaitForSingleObject call on the pipe handle since it must not return while the IO_STATUS_BLOCK variable on the stack can still be written to by the kernel. There is a potential race between the two threads calling NtWriteFile and NtWaitForSingleObject. If the wait order is inverse of the write order, the wrong (*) WriteFile caller will be woken up when some ReadFile activity triggers the completion of the first WriteFile call. So, the call that is woken up prematurely returns zero bytes read (initial value set by the kernel code) and runs the risk of stack corruption later on when the operation is actually completed. I've got some incomplete proof of concept code for this that sporadically ends up with a corrupted security cookie or EBP. Took me some time to understand the occasional stack corruption problem, as I obviously suspected a bug in the testcase first, but the code is fine and it can be anything other than unexpected writes by the kernel causing it. This also tallies with the reported amount of readable bytes in the pipe after these events (when they don't cause stack corruption), as these account for the whole amount of the WriteFile calls returning zero bytes written. Once I get some time again, I'll try hammer the testcase code into shape and share it. Kind Regards,  bird. (*) It is also possible they are both woken up, if a NotificationEvent (waking up all waiters, manual reset) is associated with the file object on the kernel side rather than a SynchronizationEvent (single wakeup, autoreset). Haven't had time to check this yet, but I hope this isn't the case. -- Problem reports: https://cygwin.com/problems.html FAQ: https://cygwin.com/faq/ Documentation: https://cygwin.com/docs.html Unsubscribe info: https://cygwin.com/ml/#unsubscribe-simple
webmaster | delorie software privacy |
Copyright © 2019 by DJ Delorie | Updated Jul 2019 |