diff --git a/mongoose.c b/mongoose.c
index 8b60b340a80d88518868141fde4ecb97e3898927..b230f0220e20e987327d4eb516d545d7ea031e11 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -1625,7 +1625,7 @@ static void walkchunks(struct mg_connection *c, struct mg_http_message *hm,
         char *buf2 = (char *) &c->recv.buf[reqlen];
         size_t memo2 = c->recv.len;
         size_t cl2 = get_chunk_length(&buf2[off], memo2 - reqlen - off, &ll);
-        size_t n = cl < ll + 2 ? 0 : cl2 - ll - 2;
+        size_t n = cl2 < ll + 2 ? 0 : cl2 - ll - 2;
         memmove(buf2 + bl, buf2 + off + ll, n);
         bl += n;
         off += cl2;
diff --git a/src/http.c b/src/http.c
index 3aa784bb3d50d682cda83118c03fe4b8413c0cea..32a3e60d491b1645cf8956ea4387c19e4ec08438 100644
--- a/src/http.c
+++ b/src/http.c
@@ -854,7 +854,7 @@ static void walkchunks(struct mg_connection *c, struct mg_http_message *hm,
         char *buf2 = (char *) &c->recv.buf[reqlen];
         size_t memo2 = c->recv.len;
         size_t cl2 = get_chunk_length(&buf2[off], memo2 - reqlen - off, &ll);
-        size_t n = cl < ll + 2 ? 0 : cl2 - ll - 2;
+        size_t n = cl2 < ll + 2 ? 0 : cl2 - ll - 2;
         memmove(buf2 + bl, buf2 + off + ll, n);
         bl += n;
         off += cl2;
diff --git a/test/unit_test.c b/test/unit_test.c
index e179851e7a7545298d66ef9202be4f0212102d6d..0340de8f5d34c1705b7181ca59b478795e65eb34 100644
--- a/test/unit_test.c
+++ b/test/unit_test.c
@@ -1244,12 +1244,14 @@ static void test_crc32(void) {
   ASSERT(mg_crc32(mg_crc32(0, "ab", 2), "c", 1) == 891568578);
 }
 
+#define LONG_CHUNK "chunk with length taking up more than two hex digits"
+
 // Streaming server event handler.
 // Send one chunk immediately, then drain, then send two chunks in one go
 static void eh2(struct mg_connection *c, int ev, void *ev_data, void *fn_data) {
   if (ev == MG_EV_HTTP_MSG) {
     mg_printf(c, "HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n");
-    mg_http_printf_chunk(c, "chunk 0");
+    mg_http_printf_chunk(c, LONG_CHUNK);
     c->label[0] = 1;
   } else if (ev == MG_EV_POLL) {
     if (c->label[0] > 0 && c->send.len == 0) c->label[0]++;
@@ -1324,25 +1326,27 @@ static void test_http_chunked(void) {
   mg_http_connect(&mgr, url, eh3, &done);
   for (i = 0; i < 50 && done == 0; i++) mg_mgr_poll(&mgr, 1);
   ASSERT(i < 50);
-  data = "chunk 0chunk 1chunk 2";
+  data = LONG_CHUNK "chunk 1chunk 2";
   ASSERT(done == mg_crc32(0, data, strlen(data)));
 
   done = 0;
   mg_http_connect(&mgr, url, eh4, &done);
   for (i = 0; i < 50 && done == 0; i++) mg_mgr_poll(&mgr, 1);
-  data = "chunk 0chunk 0chunk 1chunk 2chunk 0chunk 1chunk 2";
+  data = LONG_CHUNK LONG_CHUNK "chunk 1chunk 2" LONG_CHUNK "chunk 1chunk 2";
   ASSERT(done == mg_crc32(0, data, strlen(data)));
 
   done = 0;
   mg_http_connect(&mgr, url, eh5, &done);
   for (i = 0; i < 50 && done == 0; i++) mg_mgr_poll(&mgr, 1);
-  data = "chunk 0chunk 1chunk 2";
+  data = LONG_CHUNK "chunk 1chunk 2";
   ASSERT(done == mg_crc32(0, data, strlen(data)));
 
   mg_mgr_free(&mgr);
   ASSERT(mgr.conns == NULL);
 }
 
+#undef LONG_CHUNK
+
 static void test_multipart(void) {
   struct mg_http_part part;
   size_t ofs;