소스 검색

LibHTTP: Handle running out of input between chunk body and ending CRLF

Fixes an issue where LibHTTP would incorrectly detect an end of stream
when it runs out of TLS application data between the chunk body and its
ending CRLF.
AnotherTest 4 년 전
부모
커밋
7c98a6be17
2개의 변경된 파일12개의 추가작업 그리고 4개의 파일을 삭제
  1. 11 4
      Userland/Libraries/LibHTTP/Job.cpp
  2. 1 0
      Userland/Libraries/LibHTTP/Job.h

+ 11 - 4
Userland/Libraries/LibHTTP/Job.cpp

@@ -242,6 +242,11 @@ void Job::on_socket_connected()
                 if (remaining == -1) {
                     // read size
                     auto size_data = read_line(PAGE_SIZE);
+                    if (m_should_read_chunk_ending_line) {
+                        VERIFY(size_data.is_empty());
+                        m_should_read_chunk_ending_line = false;
+                        return IterationDecision::Continue;
+                    }
                     auto size_lines = size_data.view().lines();
                     dbgln_if(JOB_DEBUG, "Job: Received a chunk with size '{}'", size_data);
                     if (size_lines.size() == 0) {
@@ -327,10 +332,12 @@ void Job::on_socket_connected()
 
                     // we've read everything, now let's get the next chunk
                     size = -1;
-                    [[maybe_unused]] auto line = read_line(PAGE_SIZE);
-
-                    if constexpr (JOB_DEBUG)
-                        dbgln("Line following (should be empty): '{}'", line);
+                    if (can_read_line()) {
+                        auto line = read_line(PAGE_SIZE);
+                        VERIFY(line.is_empty());
+                    } else {
+                        m_should_read_chunk_ending_line = true;
+                    }
                 }
                 m_current_chunk_remaining_size = size;
             }

+ 1 - 0
Userland/Libraries/LibHTTP/Job.h

@@ -82,6 +82,7 @@ protected:
     Optional<ssize_t> m_current_chunk_remaining_size;
     Optional<size_t> m_current_chunk_total_size;
     bool m_can_stream_response { true };
+    bool m_should_read_chunk_ending_line { false };
 };
 
 }