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:
Ulrich Drepper 2006-11-27 21:58:18 +00:00
parent 854d11248e
commit b1a758f32b
2 changed files with 32 additions and 10 deletions

View File

@ -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> 2006-10-21 Jakub Jelinek <jakub@redhat.com>
* resolv/mapv4v6addr.h (map_v4v6_address): Fix last change. * resolv/mapv4v6addr.h (map_v4v6_address): Fix last change.

View File

@ -51,36 +51,51 @@ void
svc_run (void) svc_run (void)
{ {
int i; int i;
struct pollfd *my_pollfd = NULL;
int last_max_pollfd = 0;
for (;;) 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) if (last_max_pollfd != max_pollfd)
return; {
struct pollfd *new_pollfd
= realloc (my_pollfd, sizeof (struct pollfd) * max_pollfd);
my_pollfd = malloc (sizeof (struct pollfd) * svc_max_pollfd); if (new_pollfd == NULL)
for (i = 0; i < svc_max_pollfd; ++i) {
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].fd = svc_pollfd[i].fd;
my_pollfd[i].events = svc_pollfd[i].events; my_pollfd[i].events = svc_pollfd[i].events;
my_pollfd[i].revents = 0; my_pollfd[i].revents = 0;
} }
switch (i = __poll (my_pollfd, svc_max_pollfd, -1)) switch (i = __poll (my_pollfd, max_pollfd, -1))
{ {
case -1: case -1:
free (my_pollfd);
if (errno == EINTR) if (errno == EINTR)
continue; continue;
perror (_("svc_run: - poll failed")); perror (_("svc_run: - poll failed"));
return; break;
case 0: case 0:
free (my_pollfd);
continue; continue;
default: default:
INTUSE(svc_getreq_poll) (my_pollfd, i); INTUSE(svc_getreq_poll) (my_pollfd, i);
free (my_pollfd); continue;
} }
break;
} }
free (my_pollfd);
} }