On Thu, Aug 14, 2025 at 07:24:19AM +0200, Stefano Brivio wrote:
On Thu, 14 Aug 2025 07:12:55 +0200 Stefano Brivio
wrote: On Thu, 14 Aug 2025 14:10:20 +1000 David Gibson
wrote: On Wed, Aug 13, 2025 at 06:45:05PM +0200, Stefano Brivio wrote:
I didn't imagine that occasionally truncated pcap and log files, as a result of commit a9d63f91a59a ("passt-repair: use _exit() over return"), would be such a big deal, until I tried to debug TCP issues with this beauty:
I think the problems are more introduced by the previous patch d0006fa784a7 ("treewide: use _exit() over exit()").
Oops, right.
while true; do ./pasta --trace -l /tmp/pasta.log -p /tmp/pasta.pcap --config-net -t 5555 -- socat TCP-LISTEN:5555 OPEN:/tmp/large.rcv,trunc & (sleep 0.3; socat -T2 OPEN:large.bin TCP:88.198.0.164:5555; ); wait; diff large.bin /tmp/large.rcv || break; done
...flush files and pcap if we're using them. Ignore fsync() errors for the log file as we obviously can't reliably log them.
Signed-off-by: Stefano Brivio
Hmmmmm.
I mean, yes, AFAICT this patch will address the immediate problem. But between this and 081df67d1fb2 ("conf: flush stdout before early exit") it seems more and more to me that _exit() just isn't what we want. Basically the assertion in d0006fa784a7 that "no exit handlers are needed" doesn't really seem to be true.
It was a wrong assumption but just for a couple of cases, and mind that exit() doesn't give you any guarantee anyway. While glibc might guarantee those flushes, we're not just building against glibc.
So, strictly speaking, at least for correctness, we should actually keep those fflush() calls plus the ones I'm adding here, even with exit().
Ah, wait, sorry, I just double checked and starting from Issue 7 of POSIX (referring to _exit() and _Exit()):
Austin Group Interpretation 1003.1-2001 #031 is applied, separating these functions from the exit() function.
and:
The exit() function shall then flush all open streams with unwritten buffered data and close all open streams.
Yeah, I was thinking that sounded wrong. I wasn't sure where it would be specified, but to not flush stdio streams on normal program exit (i.e. exit(3)) would be Really Weird. -- David Gibson (he or they) | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you, not the other way | around. http://www.ozlabs.org/~dgibson