diff options
author | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2021-03-07 03:56:38 +0000 |
---|---|---|
committer | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2021-03-07 03:56:38 +0000 |
commit | 7f8184372a7db4ad9ac7b30ce892b61e3d375dac (patch) | |
tree | 7c7acddb499d850c3cf22dbc2ddc71834a804e48 /lib | |
parent | aff215cc29a295b7bdcc604ae1e71c5514113c29 (diff) | |
download | netpbm-mirror-7f8184372a7db4ad9ac7b30ce892b61e3d375dac.tar.gz netpbm-mirror-7f8184372a7db4ad9ac7b30ce892b61e3d375dac.tar.xz netpbm-mirror-7f8184372a7db4ad9ac7b30ce892b61e3d375dac.zip |
Release 10.93.01
git-svn-id: http://svn.code.sf.net/p/netpbm/code/advanced@4038 9d0c8265-081b-0410-96cb-a4ca84ce46f8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libsystem.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/lib/libsystem.c b/lib/libsystem.c index ba48ed85..30b6b2be 100644 --- a/lib/libsystem.c +++ b/lib/libsystem.c @@ -40,8 +40,8 @@ static void -closeUninheritableFds(int const stdinFd, - int const stdoutFd) { +closeUninheritableFds(int const keepFdA, + int const keepFdB) { /*---------------------------------------------------------------------------- Close all the file descriptors that we declare uninheritable -- files Parent has open that Child has no business accessing. @@ -49,14 +49,21 @@ closeUninheritableFds(int const stdinFd, Closing an extra file descriptor is essential to allow the file to close when Parent closes it. + It is also essential to prevent the system from messing with the position of + the file as the child process exits. If the file descriptor is backing a + stream (FILE *), some process-exit code seeks the file to the current stream + position (from the readahead position), but having the file descriptor + closed defeats that. + We define uninheritable as less than 64 and not Standard Input, Output, - or Error, or 'stdinFd' or 'stdoutFd'. + or Error, or 'keepFdA' or 'keepFdB'. -----------------------------------------------------------------------------*/ int fd; for (fd = 0; fd < 64; ++fd) { - if (fd == stdinFd) { - } else if (fd == stdoutFd) { + if (false) { + } else if (fd == keepFdA) { + } else if (fd == keepFdB) { } else if (fd == STDIN_FILENO) { } else if (fd == STDOUT_FILENO) { } else if (fd == STDERR_FILENO) { @@ -148,6 +155,9 @@ createPipeFeeder(void pipeFeederRtn(int, void *), } else if (rc == 0) { /* This is the child -- the stdin feeder process */ close(pipeToFeed[0]); + + closeUninheritableFds(pipeToFeed[1], pipeToFeed[1]); + (*pipeFeederRtn)(pipeToFeed[1], feederParm); exit(0); } else { |