[Lldb-commits] [lldb] [lldb][SymStore] Abort cached file stream if request failed (PR #232848)

via lldb-commits lldb-commits at lists.llvm.org
Sun Oct 18 11:16:11 PDT 2026


https://github.com/Nerixyz updated https://github.com/llvm/llvm-project/pull/232848

>From 75d2e7325a5ba3d754f0232e4a83d912e20bbe52 Mon Sep 17 00:00:00 2001
From: Nerixyz <nerixdev at outlook.de>
Date: Fri, 16 Oct 2026 18:50:54 +0200
Subject: [PATCH 1/2] [lldb][SymStore] Abort cached file stream if request
 failed

---
 .../SymStore/SymbolLocatorSymStore.cpp        |  1 +
 lldb/test/API/symstore/TestSymStore.py        | 44 +++++++++++++++++++
 2 files changed, 45 insertions(+)

diff --git a/lldb/source/Plugins/SymbolLocator/SymStore/SymbolLocatorSymStore.cpp b/lldb/source/Plugins/SymbolLocator/SymStore/SymbolLocatorSymStore.cpp
index a4103aa5b2a54f..536c8917f309f3 100644
--- a/lldb/source/Plugins/SymbolLocator/SymStore/SymbolLocatorSymStore.cpp
+++ b/lldb/source/Plugins/SymbolLocator/SymStore/SymbolLocatorSymStore.cpp
@@ -314,6 +314,7 @@ RequestFileFromSymStoreServerHTTP(llvm::StringRef base_url, llvm::StringRef key,
   request.PinnedCertFingerprint =
       GetGlobalPluginProperties().GetTLSCertFingerprint();
   if (llvm::Error Err = client.perform(request, Handler)) {
+    Err = llvm::joinErrors(std::move(Err), Handler.abort());
     Debugger::ReportWarning(
         llvm::formatv("failed to download from SymStore '{0}': {1}", source_url,
                       llvm::toString(std::move(Err))));
diff --git a/lldb/test/API/symstore/TestSymStore.py b/lldb/test/API/symstore/TestSymStore.py
index 0e59ed6b91dca7..b0a9add80d08fe 100644
--- a/lldb/test/API/symstore/TestSymStore.py
+++ b/lldb/test/API/symstore/TestSymStore.py
@@ -246,6 +246,24 @@ def log_message(self, *args):
         pass  # suppress server-side output
 
 
+class PartialResponseHTTPHandler(http.server.BaseHTTPRequestHandler):
+    can_finish = threading.Event()
+
+    def do_GET(self):
+        self.send_response(200)
+        self.send_header("Content-Type", "application/octet-stream")
+        self.send_header("Content-Length", "1000000")
+        self.end_headers()
+        for _ in range(10):
+            self.wfile.write(b"a" * 4096)
+            self.wfile.flush()
+        # Wait until the client has finished running.
+        self.can_finish.wait()
+
+    def log_message(self, *args):
+        pass  # suppress server-side output
+
+
 class SymStoreTests(TestBase):
     # Build artifacts can't be shared across test functions because
     # MockedSymStore moves the built PDB out of the build directory to simulate
@@ -467,6 +485,32 @@ def test_http_timeout(self):
                 finally:
                     NeverRespondsHTTPHandler.can_finish.set()
 
+    def test_http_partial_response(self):
+        """
+        Check that a warning is emitted and no symbol is found when the server
+        sends a partial response but it ultimately times out.
+        """
+
+        exe, sym = self.build_inferior()
+        with MockedSymStore(self, exe, sym) as dir:
+            PartialResponseHTTPHandler.can_finish.clear()
+            self.runCmd("settings set plugin.symbol-locator.symstore.timeout 1")
+
+            with HTTPServer(dir, PartialResponseHTTPHandler) as url:
+                try:
+                    self.runCmd(
+                        f"settings set plugin.symbol-locator.symstore.urls {url}"
+                    )
+                    with open(self.getBuildArtifact("stderr.txt"), "w+b") as err_file:
+                        self.dbg.SetErrorFileHandle(err_file, False)
+                        self.try_breakpoint(exe, should_have_loc=False)
+                        self.dbg.SetErrorFileHandle(sys.stderr, False)
+                        err_file.seek(0)
+                        warnings = err_file.read().decode()
+                    self.assertIn("failed to download", warnings)
+                finally:
+                    PartialResponseHTTPHandler.can_finish.set()
+
     @skipUnlessPackageAvailable("cryptography")
     def test_https(self):
         """

>From 38d843e2fc0887ce28c01afca95ca71ec38f8b70 Mon Sep 17 00:00:00 2001
From: Nerixyz <nerixdev at outlook.de>
Date: Sun, 18 Oct 2026 20:15:44 +0200
Subject: [PATCH 2/2] fix: check for any files

---
 lldb/test/API/symstore/TestSymStore.py | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/lldb/test/API/symstore/TestSymStore.py b/lldb/test/API/symstore/TestSymStore.py
index b0a9add80d08fe..03c3a84493a88c 100644
--- a/lldb/test/API/symstore/TestSymStore.py
+++ b/lldb/test/API/symstore/TestSymStore.py
@@ -27,7 +27,7 @@ class MockedSymStore:
     Context Manager to populate a file structure equivalent to SymStore.exe
     """
 
-    def __init__(self, test, exe, pdb):
+    def __init__(self, test: TestBase, exe, pdb):
         self._test = test
         self._exe = exe
         self._pdb = pdb
@@ -492,7 +492,8 @@ def test_http_partial_response(self):
         """
 
         exe, sym = self.build_inferior()
-        with MockedSymStore(self, exe, sym) as dir:
+        store = MockedSymStore(self, exe, sym)
+        with store as dir:
             PartialResponseHTTPHandler.can_finish.clear()
             self.runCmd("settings set plugin.symbol-locator.symstore.timeout 1")
 
@@ -508,6 +509,7 @@ def test_http_partial_response(self):
                         err_file.seek(0)
                         warnings = err_file.read().decode()
                     self.assertIn("failed to download", warnings)
+                    self.assertFiles(store.cache_dir, 0)
                 finally:
                     PartialResponseHTTPHandler.can_finish.set()
 



More information about the lldb-commits mailing list