struct poll_list {
        struct poll_list *next;
-       int len;
+       unsigned int len;
        struct pollfd entries[];
 };
 
                struct timespec64 *end_time)
 {
        struct poll_wqueues table;
-       int err = -EFAULT, fdcount, len;
+       int err = -EFAULT, fdcount;
        /* Allocate small arguments on the stack to save memory and be
           faster - use long to make sure the buffer is aligned properly
           on 64 bit archs to avoid unaligned access */
        long stack_pps[POLL_STACK_ALLOC/sizeof(long)];
        struct poll_list *const head = (struct poll_list *)stack_pps;
        struct poll_list *walk = head;
-       unsigned long todo = nfds;
+       unsigned int todo = nfds;
+       unsigned int len;
 
        if (nfds > rlimit(RLIMIT_NOFILE))
                return -EINVAL;
                                        sizeof(struct pollfd) * walk->len))
                        goto out_fds;
 
-               todo -= walk->len;
-               if (!todo)
+               if (walk->len >= todo)
                        break;
+               todo -= walk->len;
 
                len = min(todo, POLLFD_PER_PAGE);
                walk = walk->next = kmalloc(struct_size(walk, entries, len),
 
        for (walk = head; walk; walk = walk->next) {
                struct pollfd *fds = walk->entries;
-               int j;
+               unsigned int j;
 
                for (j = walk->len; j; fds++, ufds++, j--)
                        unsafe_put_user(fds->revents, &ufds->revents, Efault);