Sebastian Benoit <be...@openbsd.org> writes:

> Todd C. Miller(todd.mil...@courtesan.com) on 2015.12.28 10:46:08 -0700:
>> On Fri, 25 Dec 2015 00:30:29 +0100, Ingo Schwarze wrote:
>> 
>> > Besides, i don't see the point in messing with FILE flags at all
>> > in case of encoding errors.  As opposed to fgetwc(3) and fputwc(3),
>> > the manual doesn't document this fiddling, and POSIX doesn't ask
>> > for it.  No other conversions in printf(3) set the error indicator.
>> > It isn't required because printf(3) provides a proper error return
>> > (-1) in the first place.  Has anybody ever seen any code calling
>> > ferror(3) after printf(3)?  That just wouldn't make sense.
>> > Of course, printf(3) can result in the error indicator getting set,
>> > but only if the underlying low-level write calls fail.
>> 
>> You are correct that neither our man page nor ISO C document
>> setting the error indicator.  I get your expected output on Linux
>> and Solaris so I think this diff is correct.  I wonder if it is
>> worth documenting that the error indicator is not set in fprintf(3)?
>> 
>> We do have code in our tree that checks ferror() after doing writes
>> via fprintf.  One example src/usr.sbin/smtpd, but I have not done
>> an exhaustive check.
>
> ntpd is one of these.
>
> if the error is set, then ntpd has a bug i think, since it never calls
> clearerr()
>
> ok?

I think it makes sense to try to recover, so calling clearerr() is
needed.  But as said by millert you can't rely on fprintf to set the
error indicator; the write might not be committed to disk, and the
ftruncate and fsync calls below won't magically update the FILE's error
indicator.

What about using "r = fflush(freqfp);" instead of ferror?

> diff --git usr.sbin/ntpd/ntpd.c usr.sbin/ntpd/ntpd.c
> index cf88fe8..df7dedb 100644
> --- usr.sbin/ntpd/ntpd.c
> +++ usr.sbin/ntpd/ntpd.c
> @@ -558,6 +558,7 @@ writefreq(double d)
>               if (warnonce) {
>                       log_warnx("can't write %s", DRIFTFILE);
>                       warnonce = 0;
> +                     clearerr(freqfp);
>               }
>               return 0;
>       }



-- 
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE

Reply via email to