Răsfoiți Sursa

avoid cancellation in pclose

at the point pclose might receive and act on cancellation, it has
already invalidated the FILE passed to it. thus, per musl's QOI
guarantees about cancellation and resource allocation/deallocation,
it's not a candidate for cancellation.

if it were required to be a cancellation point by posix, we would have
to switch the order of deallocation, but somehow still close the pipe
in order to trigger the child process to exit. i looked into doing
this, but the logic gets ugly, and i'm not sure the semantics are
conformant, so i'd rather just leave it alone unless there's a need to
change it.
Rich Felker 12 ani în urmă
părinte
comite
1af8c25504
1 a modificat fișierele cu 4 adăugiri și 3 ștergeri
  1. 4 3
      src/stdio/pclose.c

+ 4 - 3
src/stdio/pclose.c

@@ -1,11 +1,12 @@
 #include "stdio_impl.h"
+#include "syscall.h"
 
 int pclose(FILE *f)
 {
-	int status;
+	int status, r;
 	pid_t pid = f->pipe_pid;
 	fclose(f);
-	while (waitpid(pid, &status, 0) == -1)
-		if (errno != EINTR) return -1;
+	while ((r=__syscall(SYS_wait4, pid, &status, 0, 0)) == -EINTR);
+	if (r<0) return __syscall_ret(r);
 	return status;
 }