(svc_run): Fail instead of segfaulting if malloc crashed. Don't allocate
authordrepper <drepper>
Mon, 27 Nov 2006 21:58:11 +0000 (21:58 +0000)
committerdrepper <drepper>
Mon, 27 Nov 2006 21:58:11 +0000 (21:58 +0000)
memory unnecessarily in each loop.

sunrpc/svc_run.c

index 017910b..feb1bf9 100644 (file)
@@ -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);
 }