On Mon, 04 Jul 2016 12:43:12 +0200, Jeremie Courreges-Anglas wrote:

> This was initially prompted by a diff to replace calloc with
> reallocarray.  As noted by guenther, there is a problem with the
> comparisons between width, rpcsock and pingsock; this, plus the fd_set
> allocation inconvenience would be easily fixed by moving from select to
> poll.

There were two problems with this diff:

1) wrong size given to memcpy()
2) svc_getreq_poll() takes the return value of poll(), not svc_max_pollfd

This should fix people's YP setup.

 - todd

Index: usr.sbin/ypbind/ypbind.c
===================================================================
RCS file: /cvs/src/usr.sbin/ypbind/ypbind.c,v
retrieving revision 1.67
diff -u -p -u -r1.67 ypbind.c
--- usr.sbin/ypbind/ypbind.c    5 Jul 2016 16:41:40 -0000       1.67
+++ usr.sbin/ypbind/ypbind.c    8 Jul 2016 19:23:30 -0000
@@ -338,7 +338,7 @@ main(int argc, char *argv[])
        char path[PATH_MAX];
        struct sockaddr_in sin;
        struct pollfd *pfd = NULL;
-       int width = 0, lockfd, lsock;
+       int width = 0, nready, lockfd, lsock;
        socklen_t len;
        int evil = 0, one = 1;
        DIR *dirp;
@@ -540,9 +540,10 @@ main(int argc, char *argv[])
                pfd[0].events = POLLIN;
                pfd[1].fd = pingsock;
                pfd[1].events = POLLIN;
-               memcpy(pfd + 2, svc_pollfd, svc_max_pollfd);
+               memcpy(pfd + 2, svc_pollfd, sizeof(*pfd) * svc_max_pollfd);
 
-               switch (poll(pfd, width, 1000)) {
+               nready = poll(pfd, width, 1000);
+               switch (nready) {
                case 0:
                        checkwork();
                        break;
@@ -552,11 +553,15 @@ main(int argc, char *argv[])
                        break;
                default:
                        /* No need to check for POLLHUP on UDP sockets. */
-                       if (pfd[0].revents & POLLIN)
+                       if (pfd[0].revents & POLLIN) {
                                handle_replies();
-                       if (pfd[1].revents & POLLIN)
+                               nready--;
+                       }
+                       if (pfd[1].revents & POLLIN) {
                                handle_ping();
-                       svc_getreq_poll(pfd + 2, svc_max_pollfd);
+                               nready--;
+                       }
+                       svc_getreq_poll(pfd + 2, nready);
                        if (check)
                                checkwork();
                        break;

Reply via email to