aboutsummaryrefslogtreecommitdiff
path: root/src/libstore
diff options
context:
space:
mode:
authorJade Lovelace <lix@jade.fyi>2024-09-17 18:27:22 -0700
committerJade Lovelace <lix@jade.fyi>2024-09-18 15:37:29 -0700
commit789b19a0cfe583586c85657e88d5933d2dbe5715 (patch)
tree6ca73c852c0f71f8ea4cc498c6b6d8790a9a3db5 /src/libstore
parent4046e019ca6be35b583820df5c3f49e284259319 (diff)
util: fix brotli decompression of empty input
This caused an infinite loop before since it would just keep asking the underlying source for more data. In practice this happened because an HTTP server served a response to a HEAD request (for which curl will not retrieve any body or call our write callback function) with Content-Encoding: br, leading to decompressing nothing at all and going into an infinite loop. This adds a test to make sure none of our compression methods do that again, as well as just patching the HTTP client to never feed empty data into a compression algorithm (since they absolutely have the right to throw CompressionError on unexpectedly-short streams!). Reported on Matrix: https://matrix.to/#/!lymvtcwDJ7ZA9Npq:lix.systems/$8BWQR_zKxCQDJ40C5NnDo4bQPId3pZ_aoDj2ANP7Itc?via=lix.systems&via=matrix.org&via=tchncs.de Change-Id: I027566e280f0f569fdb8df40e5ecbf46c211dad1
Diffstat (limited to 'src/libstore')
-rw-r--r--src/libstore/filetransfer.cc2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/libstore/filetransfer.cc b/src/libstore/filetransfer.cc
index f3e8a5312..10c810e49 100644
--- a/src/libstore/filetransfer.cc
+++ b/src/libstore/filetransfer.cc
@@ -337,7 +337,7 @@ struct curlFileTransfer : public FileTransfer
// wrapping user `callback`s instead is not possible because the
// Callback api expects std::functions, and copying Callbacks is
// not possible due the promises they hold.
- if (code == CURLE_OK && !dataCallback) {
+ if (code == CURLE_OK && !dataCallback && result.data.length() > 0) {
result.data = decompress(encoding, result.data);
}