On Wed, 4 Jun 2025 17:00:36 +0200
Stefano Brivio
On Thu, 29 May 2025 13:08:58 -0400 Jon Maloy
wrote: Before doing an early exit any contents of stdout is normally flushed. This doesn't happen when the output goes into a pipe and we return with _exit(). We now add an explicit flush in such cases.
Fixes: d0006fa784a7 ("treewide: use _exit() over exit()")
Signed-off-by: Jon Maloy
--- conf.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/conf.c b/conf.c index a6d7e22..a1d55a3 100644 --- a/conf.c +++ b/conf.c @@ -975,6 +975,7 @@ static void usage(const char *name, FILE *f, int status) " SPEC is as described for TCP above\n" " default: none\n");
+ fflush(f); _exit(status);
pasta_opts: @@ -1029,6 +1030,7 @@ pasta_opts: " --ns-mac-addr ADDR Set MAC address on tap interface\n" " --no-splice Disable inbound socket splicing\n");
+ fflush(f); _exit(status); }
@@ -1594,6 +1596,7 @@ void conf(struct ctx *c, int argc, char **argv) FPRINTF(stdout, c->mode == MODE_PASTA ? "pasta " : "passt "); FPRINTF(stdout, VERSION_BLOB); + fflush(stdout);
I was about to apply this, but clang-tidy now complains:
/home/sbrivio/passt/conf.c:978:2: error: the value returned by this function should not be disregarded; neglecting it may lead to errors [cert-err33-c,-warnings-as-errors] 978 | fflush(f); | ^~~~~~~~~ /home/sbrivio/passt/conf.c:978:2: note: cast the expression to void to silence this warning /home/sbrivio/passt/conf.c:1033:2: error: the value returned by this function should not be disregarded; neglecting it may lead to errors [cert-err33-c,-warnings-as-errors] 1033 | fflush(f); | ^~~~~~~~~ /home/sbrivio/passt/conf.c:1033:2: note: cast the expression to void to silence this warning /home/sbrivio/passt/conf.c:1599:4: error: the value returned by this function should not be disregarded; neglecting it may lead to errors [cert-err33-c,-warnings-as-errors] 1599 | fflush(stdout); | ^~~~~~~~~~~~~~ /home/sbrivio/passt/conf.c:1599:4: note: cast the expression to void to silence this warning
I don't see any sensible way to use the return value from fflush(), because, of course, if 'f' or stdout is not a valid stream or isn't open for writing (that's the only defined error for fflush()), it doesn't make sense to even try and print a warning to stdout or stderr.
So I would rather suppress the warning as suggested by clang-tidy (casting to void instead of a specific clang-tidy suppression, just in case other static checkers start complaining as well). I can do this on merge if you're fine with it.
I took that as a yes and went ahead with it, thanks for the fix! -- Stefano