diff options
author | Andrew Gregory <andrew.gregory.8@gmail.com> | 2018-10-12 19:16:53 -0700 |
---|---|---|
committer | Allan McRae <allan@archlinux.org> | 2018-10-21 19:19:48 +1000 |
commit | ac959bb9c6ce549047a954109ae825158855e386 (patch) | |
tree | c498dff0d2256e6decb9b2a835c7f55959fd9630 /lib | |
parent | 9886566abb375043740167ce5066f1a186c71176 (diff) | |
download | pacman-ac959bb9c6ce549047a954109ae825158855e386.tar.xz |
handle EINTR while polling scripts/hooks
If poll() is interrupted by a signal, alpm was closing the socket it
uses for listening to script/hook output. This would drop script output
at the least and kill the script at the worst.
Fixes FS#60396
Signed-off-by: Andrew Gregory <andrew.gregory.8@gmail.com>
Signed-off-by: Allan McRae <allan@archlinux.org>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libalpm/util.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c index eaf85e93..d33eef2a 100644 --- a/lib/libalpm/util.c +++ b/lib/libalpm/util.c @@ -665,6 +665,7 @@ int _alpm_run_chroot(alpm_handle_t *handle, const char *cmd, char *const argv[], ssize_t olen = 0, ilen = 0; nfds_t nfds = 2; struct pollfd fds[2], *child2parent = &(fds[0]), *parent2child = &(fds[1]); + int poll_ret; child2parent->fd = child2parent_pipefd[TAIL]; child2parent->events = POLLIN; @@ -685,7 +686,14 @@ int _alpm_run_chroot(alpm_handle_t *handle, const char *cmd, char *const argv[], #define STOP_POLLING(p) do { close(p->fd); p->fd = -1; } while(0) while((child2parent->fd != -1 || parent2child->fd != -1) - && poll(fds, nfds, -1) > 0) { + && (poll_ret = poll(fds, nfds, -1)) != 0) { + if(poll_ret == -1) { + if(errno == EINTR) { + continue; + } else { + break; + } + } if(child2parent->revents & POLLIN) { if(_alpm_chroot_read_from_child(handle, child2parent->fd, ibuf, &ilen, sizeof(ibuf)) != 0) { |