libuuid, uuidd: Avoid infinite loop while reading from the socket fd
If for some reason the uuidd daemon or the process calling uuidd exited unexpectely, the read_all() function would end up looping forever, either in uuidd or in libuuid. Fix this terminating the loop if no data can be read after five tries to read from the file descriptor. Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
This commit is contained in:
parent
fdb3e93ce9
commit
3b90c50066
|
@ -84,19 +84,23 @@ static void create_daemon(void)
|
|||
die("setreuid");
|
||||
}
|
||||
|
||||
static int read_all(int fd, char *buf, size_t count)
|
||||
static ssize_t read_all(int fd, char *buf, size_t count)
|
||||
{
|
||||
ssize_t ret;
|
||||
int c = 0;
|
||||
ssize_t c = 0;
|
||||
int tries = 0;
|
||||
|
||||
memset(buf, 0, count);
|
||||
while (count > 0) {
|
||||
ret = read(fd, buf, count);
|
||||
if (ret < 0) {
|
||||
if ((errno == EAGAIN) || (errno == EINTR))
|
||||
if (ret <= 0) {
|
||||
if ((errno == EAGAIN || errno == EINTR || ret == 0) &&
|
||||
(tries++ < 5))
|
||||
continue;
|
||||
return -1;
|
||||
return c ? c : -1;
|
||||
}
|
||||
if (ret > 0)
|
||||
tries = 0;
|
||||
count -= ret;
|
||||
buf += ret;
|
||||
c += ret;
|
||||
|
|
|
@ -425,15 +425,19 @@ static ssize_t read_all(int fd, char *buf, size_t count)
|
|||
{
|
||||
ssize_t ret;
|
||||
ssize_t c = 0;
|
||||
int tries = 0;
|
||||
|
||||
memset(buf, 0, count);
|
||||
while (count > 0) {
|
||||
ret = read(fd, buf, count);
|
||||
if (ret < 0) {
|
||||
if ((errno == EAGAIN) || (errno == EINTR))
|
||||
if (ret <= 0) {
|
||||
if ((errno == EAGAIN || errno == EINTR || ret == 0) &&
|
||||
(tries++ < 5))
|
||||
continue;
|
||||
return -1;
|
||||
return c ? c : -1;
|
||||
}
|
||||
if (ret > 0)
|
||||
tries = 0;
|
||||
count -= ret;
|
||||
buf += ret;
|
||||
c += ret;
|
||||
|
|
Loading…
Reference in New Issue