"Todd C. Miller" <[email protected]> writes:
> On Tue, 29 Dec 2015 13:25:16 +0100,
> =?utf-8?Q?J=C3=A9r=C3=A9mie_Courr=C3=A8ges-
> Anglas?= wrote:
>
>> 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?
>
> How does this look?
>
> - todd
>
> Index: ntpd.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/ntpd/ntpd.c,v
> retrieving revision 1.101
> diff -u -p -u -r1.101 ntpd.c
> --- ntpd.c 19 Dec 2015 17:55:29 -0000 1.101
> +++ ntpd.c 29 Dec 2015 17:51:56 -0000
> @@ -552,12 +552,12 @@ writefreq(double d)
> if (freqfp == NULL)
> return 0;
> rewind(freqfp);
> - fprintf(freqfp, "%.3f\n", d * 1e6); /* scale to ppm */
> - r = ferror(freqfp);
> - if (r != 0) {
> + r = fprintf(freqfp, "%.3f\n", d * 1e6); /* scale to ppm */
> + if (r < 0 || fflush(freqfp) != 0) {
Fine with me.
> if (warnonce) {
> log_warnx("can't write %s", DRIFTFILE);
> warnonce = 0;
> + clearerr(freqfp);
> }
Looking closer, the clearerr() call should probably be out of the
conditional.
With that fixed, ok jca@
> return 0;
> }
>
--
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE