On 04/14/2016 08:11 AM, Richard W.M. Jones wrote:
On Thu, Apr 14, 2016 at 08:04:39AM -0600, Eric Blake wrote:
> On 04/14/2016 07:57 AM, Richard W.M. Jones wrote:
>> On Thu, Apr 14, 2016 at 07:38:23AM -0600, Eric Blake wrote:
>>>> + /* Read the umask. */
>>>> + if (read (fd[0], &mask, sizeof mask) != sizeof mask) {
>>>> + perrorf (g, "read");
>>>> + close (fd[0]);
>>>> + return -1;
>>>
>>> Oops - this strands a child process. You have to reap the child, even
>>> if the read() failed.
>>
>> Bleah that was stupid. Try attached version - the only difference is
>> I added a waitpid call to the error path above.
>
> But without looping on EINTR...
Thanks - I pushed it with your suggested loop added.
BTW we don't loop in waitpid/EINTR anywhere else in libguestfs, but I
guess this is something we should be doing. Can you tell us why it's
necessary?
Depending on what else the program linking with your library has done,
waitpid() has some scenarios where it is allowed to fail with EINTR (off
the top of my head, it has to do with whether a SIGCHLD handler was
installed with SA_RESTART or not). When you are not in a library
context, you can control things so that system calls never fail with
EINTR (the OS does the retry for you); but in a library, you can't
assume that context.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library
http://libvirt.org