[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