From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/5939 Path: news.gmane.org!not-for-mail From: Rich Felker Newsgroups: gmane.linux.lib.musl.general Subject: Re: fgets behaviour after eof Date: Wed, 27 Aug 2014 13:14:00 -0400 Message-ID: <20140827171400.GR12888@brightrain.aerifal.cx> References: <20140827111620.GY22308@port70.net> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: ger.gmane.org 1409159661 4889 80.91.229.3 (27 Aug 2014 17:14:21 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Wed, 27 Aug 2014 17:14:21 +0000 (UTC) To: musl@lists.openwall.com Original-X-From: musl-return-5946-gllmg-musl=m.gmane.org@lists.openwall.com Wed Aug 27 19:14:14 2014 Return-path: Envelope-to: gllmg-musl@plane.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by plane.gmane.org with smtp (Exim 4.69) (envelope-from ) id 1XMgnV-0000w1-15 for gllmg-musl@plane.gmane.org; Wed, 27 Aug 2014 19:14:13 +0200 Original-Received: (qmail 24265 invoked by uid 550); 27 Aug 2014 17:14:12 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: Original-Received: (qmail 24252 invoked from network); 27 Aug 2014 17:14:12 -0000 Content-Disposition: inline In-Reply-To: <20140827111620.GY22308@port70.net> User-Agent: Mutt/1.5.21 (2010-09-15) Original-Sender: Rich Felker Xref: news.gmane.org gmane.linux.lib.musl.general:5939 Archived-At: On Wed, Aug 27, 2014 at 01:16:20PM +0200, Szabolcs Nagy wrote: > However the behaviour of fgets(s, 1, f) is unclear if feof(f) is true, > in this case nothing is read so fgets cannot "encounter" end-of-file, > so it may set s[0]=0 and return s or it could check feof and return 0. > (glibc does not check feof) Sorry, I missed the fact n==1. In this case, no read ever occurs (0 bytes have already been read) so the following text simply applies: "The fgets() function shall read bytes from stream into the array pointed to by s, until n-1 bytes are read, or a is read and transferred to s, or an end-of-file condition is encountered. The string is then terminated with a null byte." and of course: "Upon successful completion, fgets() shall return s." This is all handled correctly in the special case at the top of the function. The only thing that may be incorrect is the failure to wait on the file lock in this case; formally, all operations on FILE are supposed to obtain the lock, and presumably fgets(f, 1, &(char){0}) could be a sort of 'barrier' to "wait until thread with lock on f has unlocked it". Your other correction at the end of the function, when EOF or error was seen, still applies though. Rich