]> git.sesse.net Git - betaftpd/blobdiff - ftpd.c
process_all_clients(): Fixed a bug (reporting and much tracing by Sean MacLennan...
[betaftpd] / ftpd.c
diff --git a/ftpd.c b/ftpd.c
index 1e2752c670401ecb96c5fb2a6a6e70fb8823b623..757c109e677d88091e8b513e9f16124f27d1e695 100644 (file)
--- a/ftpd.c
+++ b/ftpd.c
@@ -579,11 +579,7 @@ int process_all_clients(const fd_set * const active_clients, const int num_ac)
                c = next;
                next = c->next_conn;
 #if HAVE_POLL
-               if (fds[c->sock].revents & (POLLERR|POLLHUP|POLLNVAL)) {
-                       destroy_conn(c);
-                       continue;
-               }
-               if (!fds[c->sock].revents & POLLIN) {
+               if (!fds[c->sock].revents & (POLLIN|POLLERR|POLLHUP|POLLNVAL)) {
                        continue;
                }
 #else
@@ -603,8 +599,10 @@ int process_all_clients(const fd_set * const active_clients, const int num_ac)
                         * client has closed the socket. If we get a return value
                         * of -1 (error), we close the socket ourselves.
                         *
-                        * Just to be safe, we include this code for poll() as
-                        * well.
+                        * We do the same for poll(), even though we actually have
+                        * bits that tell us what is happening (in case of new 
+                        * input AND error/hangup at the same time, we do an
+                        * explicit check at the bottom of the loop as well).
                         */
                        destroy_conn(c);
                        continue;
@@ -619,6 +617,11 @@ int process_all_clients(const fd_set * const active_clients, const int num_ac)
 
                c->buf_len += bytes_avail;
                parse_command(c);
+
+               if (fds[c->sock].revents & (POLLERR|POLLHUP|POLLNVAL)) {
+                        destroy_conn(c);
+                        continue;
+                }
        }
        return checked_through;
 }
@@ -725,7 +728,7 @@ int process_all_sendfiles(fd_set * const active_clients, const int num_ac)
 int do_upload(struct ftran *f)
 {
        char upload_buf[16384];
-       int avail, size;
+       int size;
 #if WANT_ASCII
        /* keep buffer size small in ascii transfers 
           to prevent process stalling while filtering