diff options
author | Ulrich Drepper <drepper@redhat.com> | 2006-11-27 21:58:18 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2006-11-27 21:58:18 +0000 |
commit | b1a758f32b630104e68823604d2e0e9738fe2849 (patch) | |
tree | d5147123f8a8c18d2289247ff2a39ad0695a7529 /sunrpc | |
parent | 854d11248e195d7f880c50dec439d71ad9095fae (diff) | |
download | glibc-b1a758f32b630104e68823604d2e0e9738fe2849.zip glibc-b1a758f32b630104e68823604d2e0e9738fe2849.tar.gz glibc-b1a758f32b630104e68823604d2e0e9738fe2849.tar.bz2 |
[BZ #3559]cvs/fedora-glibc-20061128T1037
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.
Diffstat (limited to 'sunrpc')
-rw-r--r-- | sunrpc/svc_run.c | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/sunrpc/svc_run.c b/sunrpc/svc_run.c index 017910b..feb1bf9 100644 --- a/sunrpc/svc_run.c +++ b/sunrpc/svc_run.c @@ -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); + + if (new_pollfd == NULL) + { + perror (_("svc_run: - out of memory")); + break; + } + + last_max_pollfd = max_pollfd; + } - my_pollfd = malloc (sizeof (struct pollfd) * svc_max_pollfd); - for (i = 0; i < svc_max_pollfd; ++i) + 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); - free (my_pollfd); + continue; } + break; } + + free (my_pollfd); } |