Fix unsafe client removal from list at timeout.
[umurmur.git] / src / client.c
index 7322aee56ba26ff4bc3c95d81a076fedc8afeb44..9f7576eff20051feb3d96ca36fa53ae8c19799c2 100644 (file)
@@ -91,9 +91,9 @@ int Client_getfds(struct pollfd *pollfds)
 
 void Client_janitor()
 {
-       struct dlist *itr;
+       struct dlist *itr, *save;
        int bwTop = maxBandwidth + maxBandwidth / 4;
-       list_iterate(itr, &clients) {
+       list_iterate_safe(itr, save, &clients) {
                client_t *c;
                c = list_get_entry(itr, client_t, node);
                Log_debug("Client %s BW available %d", c->username, c->availableBandwidth);
@@ -486,7 +486,10 @@ int Client_read(client_t *client)
                        }
                        else {
                                if (SSLi_get_error(client->ssl, rc) == SSLI_ERROR_SYSCALL) {
-                                       Log_info_client(client, "Connection closed by peer");
+                                       Log_info_client(client,"Error: %s  - Closing connection", strerror(errno));
+                               }
+                               else if (SSLi_get_error(client->ssl, rc) == SSLI_ERROR_CONNRESET) {
+                                       Log_info_client(client, "Connection reset by peer");
                                }
                                else {
                                        Log_info_client(client, "SSL error: %d - Closing connection", SSLi_get_error(client->ssl, rc));
@@ -541,10 +544,15 @@ int Client_write(client_t *client)
                        return 0;
                }
                else {
-                       if (SSLi_get_error(client->ssl, rc) == SSLI_ERROR_SYSCALL)
-                               Log_warn("Client_write: Error: %s  - Closing connection", strerror(errno));
-                       else
-                               Log_warn("Client_write: SSL error: %d - Closing connection.", SSLi_get_error(client->ssl, rc));
+                       if (SSLi_get_error(client->ssl, rc) == SSLI_ERROR_SYSCALL) {
+                               Log_info_client(client, "Error: %s  - Closing connection", strerror(errno));
+                       }
+                       else if (SSLi_get_error(client->ssl, rc) == SSLI_ERROR_CONNRESET) {
+                               Log_info_client(client, "Connection reset by peer");
+                       }
+                       else {
+                               Log_info_client(client, "SSL error: %d - Closing connection.", SSLi_get_error(client->ssl, rc));
+                       }
                        Client_free(client);
                        return -1;
                }