Todd C. Miller([email protected]) 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?
(sorry for hijacking the thread)
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;
}