RE: [PATCH] fixdep: use fflush() and ferror() to ensure successful write to files

From: David Laight
Date: Mon Feb 21 2022 - 17:33:28 EST


From: Masahiro Yamada
> Sent: 21 February 2022 16:43
> To: linux-kbuild@xxxxxxxxxxxxxxx
>
> Checking the return value of (v)printf does not ensure the successful
> write to the .cmd file.
>
> Call fflush() and ferror() to make sure that everything has been
> written to the file.
>
> Signed-off-by: Masahiro Yamada <masahiroy@xxxxxxxxxx>

Reviewed-by: David Laight <dvid.laight@xxxxxxxxxx>

I'll note that you've lost the perror("fixdep").
But I suspect that isn't very meaningful.
If the disk is full it'd probably get lost anyway.


> ---
>
> scripts/basic/fixdep.c | 44 ++++++++++++++++--------------------------
> 1 file changed, 17 insertions(+), 27 deletions(-)
>
> diff --git a/scripts/basic/fixdep.c b/scripts/basic/fixdep.c
> index 44e887cff49b..fad6f29373a9 100644
> --- a/scripts/basic/fixdep.c
> +++ b/scripts/basic/fixdep.c
> @@ -105,25 +105,6 @@ static void usage(void)
> exit(1);
> }
>
> -/*
> - * In the intended usage of this program, the stdout is redirected to .*.cmd
> - * files. The return value of printf() must be checked to catch any error,
> - * e.g. "No space left on device".
> - */
> -static void xprintf(const char *format, ...)
> -{
> - va_list ap;
> - int ret;
> -
> - va_start(ap, format);
> - ret = vprintf(format, ap);
> - if (ret < 0) {
> - perror("fixdep");
> - exit(1);
> - }
> - va_end(ap);
> -}
> -
> struct item {
> struct item *next;
> unsigned int len;
> @@ -189,7 +170,7 @@ static void use_config(const char *m, int slen)
>
> define_config(m, slen, hash);
> /* Print out a dependency path from a symbol name. */
> - xprintf(" $(wildcard include/config/%.*s) \\\n", slen, m);
> + printf(" $(wildcard include/config/%.*s) \\\n", slen, m);
> }
>
> /* test if s ends in sub */
> @@ -318,13 +299,13 @@ static void parse_dep_file(char *m, const char *target)
> */
> if (!saw_any_target) {
> saw_any_target = 1;
> - xprintf("source_%s := %s\n\n",
> - target, m);
> - xprintf("deps_%s := \\\n", target);
> + printf("source_%s := %s\n\n",
> + target, m);
> + printf("deps_%s := \\\n", target);
> }
> is_first_dep = 0;
> } else {
> - xprintf(" %s \\\n", m);
> + printf(" %s \\\n", m);
> }
>
> buf = read_file(m);
> @@ -347,8 +328,8 @@ static void parse_dep_file(char *m, const char *target)
> exit(1);
> }
>
> - xprintf("\n%s: $(deps_%s)\n\n", target, target);
> - xprintf("$(deps_%s):\n", target);
> + printf("\n%s: $(deps_%s)\n\n", target, target);
> + printf("$(deps_%s):\n", target);
> }
>
> int main(int argc, char *argv[])
> @@ -363,11 +344,20 @@ int main(int argc, char *argv[])
> target = argv[2];
> cmdline = argv[3];
>
> - xprintf("cmd_%s := %s\n\n", target, cmdline);
> + printf("cmd_%s := %s\n\n", target, cmdline);
>
> buf = read_file(depfile);
> parse_dep_file(buf, target);
> free(buf);
>
> + fflush(stdout);
> +
> + /*
> + * In the intended usage, the stdout is redirected to .*.cmd files.
> + * Call ferror() to catch errors such as "No space left on device".
> + */
> + if (ferror(stdout))
> + exit(1);
> +
> return 0;
> }
> --
> 2.32.0

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)