fix(core,protocol): simplify store_protocol and add download size cap

- store_protocol: always write to shared Arc<Mutex<Option<ProtocolClient>>>;
  the FileTransferService holds the same Arc so it sees updates automatically
- read_download_bytes: reject downloads exceeding 10 MB to prevent
  malicious servers from causing OOM
This commit is contained in:
Edison Jwa
2026-06-10 09:36:27 +09:00
parent f0e1621fdf
commit 4faaabb5b3
2 changed files with 12 additions and 6 deletions
+4 -6
View File
@@ -285,12 +285,10 @@ impl ChanoraSession {
}
async fn store_protocol(&self, client: Option<chanora_protocol::ProtocolClient>) {
let service = { self.file_transfer.lock().await.clone() };
if let Some(service) = service {
service.set_protocol(client).await;
} else {
*self.protocol.lock().await = client;
}
// Always update the shared Arc. The FileTransferService holds
// the same Arc, so it sees the new client automatically — no
// separate set_protocol call needed.
*self.protocol.lock().await = client;
}
async fn take_protocol(&self) -> Option<chanora_protocol::ProtocolClient> {
+8
View File
@@ -1093,7 +1093,15 @@ fn handle_download_failure(
}
}
const MAX_DOWNLOAD_SIZE: u64 = 10 * 1024 * 1024;
async fn read_download_bytes(result: FileDownloadResult) -> Result<Vec<u8>, ProtocolError> {
if result.size > MAX_DOWNLOAD_SIZE {
return Err(ProtocolError::FileTransfer(format!(
"download too large: {} bytes (max {})",
result.size, MAX_DOWNLOAD_SIZE
)));
}
let size = usize::try_from(result.size).map_err(|_| {
ProtocolError::FileTransfer(format!("download too large to buffer: {} bytes", result.size))
})?;