diff options
Diffstat (limited to 'apt-pkg/contrib')
-rw-r--r-- | apt-pkg/contrib/fileutl.cc | 5 | ||||
-rw-r--r-- | apt-pkg/contrib/fileutl.h | 2 | ||||
-rw-r--r-- | apt-pkg/contrib/sha1.cc | 11 |
3 files changed, 12 insertions, 6 deletions
diff --git a/apt-pkg/contrib/fileutl.cc b/apt-pkg/contrib/fileutl.cc index 7c9f5c0dd..92181472c 100644 --- a/apt-pkg/contrib/fileutl.cc +++ b/apt-pkg/contrib/fileutl.cc @@ -306,7 +306,7 @@ bool WaitFd(int Fd,bool write,unsigned long timeout) /* This is used if you want to cleanse the environment for the forked child, it fixes up the important signals and nukes all of the fds, otherwise acts like normal fork. */ -pid_t ExecFork() +pid_t ExecFork(int dontCloseThisFd) { // Fork off the process pid_t Process = fork(); @@ -329,7 +329,8 @@ pid_t ExecFork() // Close all of our FDs - just in case for (int K = 3; K != 40; K++) - fcntl(K,F_SETFD,FD_CLOEXEC); + if(K != dontCloseThisFd) + fcntl(K,F_SETFD,FD_CLOEXEC); } return Process; diff --git a/apt-pkg/contrib/fileutl.h b/apt-pkg/contrib/fileutl.h index 041aa3309..4716e261e 100644 --- a/apt-pkg/contrib/fileutl.h +++ b/apt-pkg/contrib/fileutl.h @@ -87,7 +87,7 @@ string SafeGetCWD(); void SetCloseExec(int Fd,bool Close); void SetNonBlock(int Fd,bool Block); bool WaitFd(int Fd,bool write = false,unsigned long timeout = 0); -pid_t ExecFork(); +pid_t ExecFork(int dontCloseThisFd=-1); bool ExecWait(pid_t Pid,const char *Name,bool Reap = false); // File string manipulators diff --git a/apt-pkg/contrib/sha1.cc b/apt-pkg/contrib/sha1.cc index a22b4d2b2..9b402c523 100644 --- a/apt-pkg/contrib/sha1.cc +++ b/apt-pkg/contrib/sha1.cc @@ -343,11 +343,16 @@ bool SHA1Summation::AddFD(int Fd,unsigned long Size) { unsigned char Buf[64 * 64]; int Res = 0; - while (Size != 0) + int ToEOF = (Size == 0); + while (Size != 0 || ToEOF) { - Res = read(Fd,Buf,MIN(Size,sizeof(Buf))); - if (Res < 0 || (unsigned) Res != MIN(Size,sizeof(Buf))) + unsigned n = sizeof(Buf); + if (!ToEOF) n = MIN(Size,n); + Res = read(Fd,Buf,n); + if (Res < 0 || (!ToEOF && (unsigned) Res != n)) // error, or short read return false; + if (ToEOF && Res == 0) // EOF + break; Size -= Res; Add(Buf,Res); } |