From 94a180f601e05cab0eae2bf55b297600b205a30c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= <ondra@ondrovo.com>
Date: Sun, 29 Jan 2023 19:41:32 +0100
Subject: [PATCH] fix queued header bug when reusing a socket

---
 spritehttpd/src/httpd.c | 41 ++++++++++++++++++++++++++---------------
 1 file changed, 26 insertions(+), 15 deletions(-)

diff --git a/spritehttpd/src/httpd.c b/spritehttpd/src/httpd.c
index 5a796a6..769d1fb 100644
--- a/spritehttpd/src/httpd.c
+++ b/spritehttpd/src/httpd.c
@@ -223,12 +223,16 @@ void httpdQueueHeader(HttpdConnData *conn, const char *header, const char *value
     strcat(queEntry->headerLine, value);
     strcat(queEntry->headerLine, "\r\n");
 
-    // Attach it to the linked list
-    HttpdQueuedHeader **ph = &conn->priv->headersToSend;
-    while (*ph) {
-        ph = &(*ph)->next;
+    if (!conn->priv->headersToSend) {
+        conn->priv->headersToSend = queEntry;
+    } else {
+        HttpdQueuedHeader *ph = conn->priv->headersToSend;
+        // Go to the end of the linked list
+        while (ph->next) {
+            ph = ph->next;
+        }
+        ph->next = queEntry;
     }
-    *ph = queEntry;
 }
 
 void httdSetTransferMode(HttpdConnData *conn, httpd_transfer_opt mode)
@@ -292,8 +296,9 @@ void httpdHeader(HttpdConnData *conn, const char *field, const char *val)
 //Finish the headers.
 void httpdEndHeaders(HttpdConnData *conn)
 {
-    // Add queued headers
+    // Add queued headers & dealloc the struct
     HttpdQueuedHeader *qh = conn->priv->headersToSend;
+    conn->priv->headersToSend = NULL;
     while (qh) {
         httpdSendStr(conn, qh->headerLine);
         HttpdQueuedHeader *next = qh->next;
@@ -473,7 +478,7 @@ bool httpdFlushSendBuffer(HttpdConnData *conn)
     return true;
 }
 
-void httpdCgiIsDone(HttpdConnData *conn)
+static void httpdCgiIsDone(HttpdConnData *conn)
 {
     conn->cgi = NULL; //no need to call this anymore
     if (conn->priv->flags & HFL_CHUNKED) {
@@ -723,7 +728,7 @@ static void httpdParseHeader(char *h, HttpdConnData *conn)
         http_dbg("Mallocced buffer for %d + 1 bytes of post data.", (int) conn->post->buffSize);
         conn->post->buff = (char *) httpdPlatMalloc(conn->post->buffSize + 1);
         if (conn->post->buff == NULL) {
-            http_error("...failed!");
+            http_error("post buf alloc failed");
             return;
         }
         conn->post->buffLen = 0;
@@ -937,10 +942,15 @@ int httpdConnectCb(ConnTypePtr conn, const uint8_t *remIp, uint16_t remPort)
     }
     memset(s_connData[i], 0, sizeof(HttpdConnData));
     s_connData[i]->priv = httpdPlatMalloc(sizeof(HttpdPriv));
+    if (s_connData[i]->priv == NULL) {
+        http_error("Out of memory allocating connData priv struct!");
+        httpdPlatUnlock();
+        return 0;
+    }
     memset(s_connData[i]->priv, 0, sizeof(HttpdPriv));
     s_connData[i]->conn = conn;
     s_connData[i]->slot = i;
-    s_connData[i]->priv->headPos = 0;
+//    s_connData[i]->priv->headPos = 0;
     s_connData[i]->post = httpdPlatMalloc(sizeof(HttpdPostData));
     if (s_connData[i]->post == NULL) {
         http_error("Out of memory allocating connData post struct!");
@@ -948,14 +958,15 @@ int httpdConnectCb(ConnTypePtr conn, const uint8_t *remIp, uint16_t remPort)
         return 0;
     }
     memset(s_connData[i]->post, 0, sizeof(HttpdPostData));
-    s_connData[i]->post->buff = NULL;
-    s_connData[i]->post->buffLen = 0;
-    s_connData[i]->post->received = 0;
+//    s_connData[i]->post->buff = NULL;
+//    s_connData[i]->post->buffLen = 0;
+//    s_connData[i]->post->received = 0;
     s_connData[i]->post->len = -1;
-    s_connData[i]->hostName = NULL;
+//    s_connData[i]->hostName = NULL;
     s_connData[i]->remote_port = remPort;
-    s_connData[i]->priv->sendBacklog = NULL;
-    s_connData[i]->priv->sendBacklogSize = 0;
+//    s_connData[i]->priv->sendBacklog = NULL;
+//    s_connData[i]->priv->headersToSend = NULL;
+//    s_connData[i]->priv->sendBacklogSize = 0;
     memcpy(s_connData[i]->remote_ip, remIp, 4);
 
     httpdPlatUnlock();