mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-23 17:53:37 +08:00
[BZ #3559]
2006-11-27 Jakub Jelinek <jakub@redhat.com> [BZ #3559] * sunrpc/svc_run.c (svc_run): Fail instead of segfaulting if malloc crashed. Don't allocate memory unnecessarily in each loop.
This commit is contained in:
parent
854d11248e
commit
b1a758f32b
@ -1,3 +1,10 @@
|
||||
2006-11-27 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
[BZ #3559]
|
||||
* sunrpc/svc_run.c (svc_run): Fail instead of segfaulting if
|
||||
malloc crashed. Don't allocate memory unnecessarily in each
|
||||
loop.
|
||||
|
||||
2006-10-21 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* resolv/mapv4v6addr.h (map_v4v6_address): Fix last change.
|
||||
|
@ -51,36 +51,51 @@ void
|
||||
svc_run (void)
|
||||
{
|
||||
int i;
|
||||
struct pollfd *my_pollfd = NULL;
|
||||
int last_max_pollfd = 0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
struct pollfd *my_pollfd;
|
||||
int max_pollfd = svc_max_pollfd;
|
||||
if (max_pollfd == 0 && svc_pollfd == NULL)
|
||||
break;
|
||||
|
||||
if (svc_max_pollfd == 0 && svc_pollfd == NULL)
|
||||
return;
|
||||
if (last_max_pollfd != max_pollfd)
|
||||
{
|
||||
struct pollfd *new_pollfd
|
||||
= realloc (my_pollfd, sizeof (struct pollfd) * max_pollfd);
|
||||
|
||||
my_pollfd = malloc (sizeof (struct pollfd) * svc_max_pollfd);
|
||||
for (i = 0; i < svc_max_pollfd; ++i)
|
||||
if (new_pollfd == NULL)
|
||||
{
|
||||
perror (_("svc_run: - out of memory"));
|
||||
break;
|
||||
}
|
||||
|
||||
last_max_pollfd = max_pollfd;
|
||||
}
|
||||
|
||||
for (i = 0; i < max_pollfd; ++i)
|
||||
{
|
||||
my_pollfd[i].fd = svc_pollfd[i].fd;
|
||||
my_pollfd[i].events = svc_pollfd[i].events;
|
||||
my_pollfd[i].revents = 0;
|
||||
}
|
||||
|
||||
switch (i = __poll (my_pollfd, svc_max_pollfd, -1))
|
||||
switch (i = __poll (my_pollfd, max_pollfd, -1))
|
||||
{
|
||||
case -1:
|
||||
free (my_pollfd);
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
perror (_("svc_run: - poll failed"));
|
||||
return;
|
||||
break;
|
||||
case 0:
|
||||
free (my_pollfd);
|
||||
continue;
|
||||
default:
|
||||
INTUSE(svc_getreq_poll) (my_pollfd, i);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
free (my_pollfd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user