--- /dev/null
+ o Major bugfix
+ - Possibility of an infinite loop if the returned value of the read/recv
+ was 0. A returned value of 0 means that we've reached the EOF thus the
+ pipe/sock is drained so return success not an error.
{
char buf[32];
ssize_t r;
- while ((r = read_ni(fd, buf, sizeof(buf))) >= 0)
- ;
- if (r == 0 || errno != EAGAIN)
+ do {
+ r = read_ni(fd, buf, sizeof(buf));
+ } while (r > 0);
+ if (errno != EAGAIN)
return -1;
+ /* A value of r = 0 means EOF on the fd so successfully drained. */
return 0;
}
#endif
{
char buf[32];
ssize_t r;
- while ((r = recv_ni(fd, buf, sizeof(buf), 0)) >= 0)
- ;
- if (r == 0 || !ERRNO_IS_EAGAIN(tor_socket_errno(fd)))
+ do {
+ r = recv_ni(fd, buf, sizeof(buf), 0);
+ } while (r > 0);
+ if (!ERRNO_IS_EAGAIN(tor_socket_errno(fd)))
return -1;
+ /* A value of r = 0 means EOF on the fd so successfully drained. */
return 0;
}