X-Recipient: archive-cygwin@delorie.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; q=dns; s=default; b=NlsLXU
	DRFA9k3ZnDtwReyHLHVlv2mAXM1rZbxFXkl2ZLgmdwNZBH8o75hpv5jOrs7kqLSG
	Em1HVyvgRLc9cpfCvDhP19si+ApRW/Vz8bVI7hT3mwmEzZrRAfbN+XDy5iAnBJOS
	Lmq5TXnMI8MxKehdg79JZQzgL23wBjxsp2YZw=
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; s=default; bh=dG3MWypXBiD+
	ZCBbp8R2HnbS11w=; b=MoocPopEYwiXfUl2HKnYC+G5+XCjKvleMY5VkNKyfkCv
	18bJ0ONqp3DgmjSg5BaLalBYBTBWE1luZ3vOfnhbZnLk2LFMmePUi/j4jkvAitE9
	TU7GOM9olvzVcdiSrFDsfRC5xor+ZAs3LteTfLs+ntxo+xbW+vT/YgcQj+gS+iI=
Mailing-List: contact cygwin-help@cygwin.com; run by ezmlm
List-Id: <cygwin.cygwin.com>
List-Subscribe: <mailto:cygwin-subscribe@cygwin.com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin@cygwin.com>
List-Help: <mailto:cygwin-help@cygwin.com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner@cygwin.com
Mail-Followup-To: cygwin@cygwin.com
Delivered-To: mailing list cygwin@cygwin.com
Authentication-Results: sourceware.org; auth=none
X-Virus-Found: No
X-Spam-SWARE-Status: No, score=-1.7 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD,SPF_HELO_PASS,SPF_PASS autolearn=ham version=3.3.2
X-HELO: mx1.redhat.com
Message-ID: <52D98E1D.8010907@redhat.com>
Date: Fri, 17 Jan 2014 13:10:05 -0700
From: Eric Blake <eblake@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.2.0
MIME-Version: 1.0
To: cygwin@cygwin.com
Subject: Re: fork() + file descriptor bug in 1.7.27(0.271/5/3) 2013-12-09 11:54
References: <831845.98759.bm@smtp116.sbc.mail.ne1.yahoo.com> <52D55D96.8070407@redhat.com> <946338.89157.bm@smtp116.sbc.mail.ne1.yahoo.com>
In-Reply-To: <946338.89157.bm@smtp116.sbc.mail.ne1.yahoo.com>
OpenPGP: url=http://people.redhat.com/eblake/eblake.gpg
Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="SKoUmSLRLvoGcmRfkfPqjmshMl6iSDoKS"
X-IsSubscribed: yes

--SKoUmSLRLvoGcmRfkfPqjmshMl6iSDoKS
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

On 01/14/2014 08:50 AM, tednolan@bellsouth.net wrote:
> In message <52D55D96.8070407@redhat.com>you write:
>>
>> Your program may be violating POSIX, which would trigger undefined behav=
ior.
>>
>> Quoting POSIX:
>> pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15=
_05
>>
>=20
> [long quote elided]
>=20
> Yikes!  That's pretty impenatrable.  And if it says what I think it says,
> it seems to violate the way I've understood Unix fork() and how fds=20
> (and stdio buffers) are inherited since forever.

It says that, intuitively,

putc('a');
fork();
exit();

may or may not print 'a' twice, because both parent and child are
operating on the same stream buffer when they call exit() (which implies
a fflush()).  The fix is to:

putc('a');
fflush(NULL);
fork();
exit();

and now you are guaranteed 'a' is only printed once.

You have the same problem, but in the read direction.  You have both
parent and child with a stream buffer that hasn't yet been flushed back
to the fd underlying the stream.  If you add an fflush(NULL) before the
fork(), your bug should go away (if it doesn't, then _that's_ a cygwin
bug).  Yes, it's annoying that BSD and glibc don't comply with POSIX
behavior, and thereby mask the effects of your bug.  And we are patching
cygwin to mirror glibc's bug, so that your bug will also be masked on
cygwin.  But that's no excuse to not fix your program to not trigger the
bug in the first place.

>=20
> However..
>=20
> Do I understand that to say that if the first thing my child does is
>=20
> 	fclose(fp);
>=20
> everything should be hunky-dory?

No.  You have to fix things _in the parent, before the fork()_ for
everything to be hunky-dory.  The easiest way to do that is to
fflush(NULL) before fork()ing.

--=20
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org


--SKoUmSLRLvoGcmRfkfPqjmshMl6iSDoKS
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1
Comment: Public key at http://people.redhat.com/eblake/eblake.gpg
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQEcBAEBCAAGBQJS2Y4dAAoJEKeha0olJ0Nq6U0H/0mYdkHTWlygTIRU2BHrVdeV
Ir8mmc4le9Aw9PX/ZzEu6FJhtGqjfQ9bGRckiYTTyb7MjbH05TmjP2AeEMKdMQzP
Z5E9UwbJTOZ7UGTNNZbcA2UAxq8ggCyAwYxZe5rEccUCKnOI4NaPsU1QMKSUaq3c
2cENoph920n4eaSY50kqwISACe9b3aiwRknYGoTqtvcINMzgkxxjlNvI0KTu95EO
4Ob3WE7QEzVvVHHSYIa21lDj/wjDJXOevbTFG1cDCR487+xErza3GPt+DOx/gKH4
ImYuhY5oCglDmRrODAbQMt2EvD4/JRVLR5W0UbF+hYkbW54ADSvGO5S16uz3PBk=
=PdoG
-----END PGP SIGNATURE-----

--SKoUmSLRLvoGcmRfkfPqjmshMl6iSDoKS--
