client: prevent further read calls after a client has been freed
[project/uhttpd.git] / client.c
index 173285a..3185b8f 100644 (file)
--- a/client.c
+++ b/client.c
@@ -24,6 +24,7 @@
 #include "tls.h"
 
 static LIST_HEAD(clients);
 #include "tls.h"
 
 static LIST_HEAD(clients);
+static bool client_done = false;
 
 int n_clients = 0;
 struct config conf = {};
 
 int n_clients = 0;
 struct config conf = {};
@@ -442,6 +443,7 @@ void uh_client_read_cb(struct client *cl)
        char *str;
        int len;
 
        char *str;
        int len;
 
+       client_done = false;
        do {
                str = ustream_get_read_buf(us, &len);
                if (!str || !len)
        do {
                str = ustream_get_read_buf(us, &len);
                if (!str || !len)
@@ -456,11 +458,12 @@ void uh_client_read_cb(struct client *cl)
                                uh_header_error(cl, 413, "Request Entity Too Large");
                        break;
                }
                                uh_header_error(cl, 413, "Request Entity Too Large");
                        break;
                }
-       } while(1);
+       } while (!client_done);
 }
 
 static void client_close(struct client *cl)
 {
 }
 
 static void client_close(struct client *cl)
 {
+       client_done = true;
        n_clients--;
        uh_dispatch_done(cl);
        uloop_timeout_cancel(&cl->timeout);
        n_clients--;
        uh_dispatch_done(cl);
        uloop_timeout_cancel(&cl->timeout);