Read Merkle tree once per file
EagerChunkReader is added to read the wrapper Merkle tree reader. Also
add a function to calculate the tree size, in order to know how much
bytes to read.
Separately, add a check in fd_server to prevent crash when the read size
is 0.
Bug: 182827266
Test: atest AuthFsHostTest authfs_device_test_src_lib
Change-Id: Ibff8c9ac091f1449aec8f4a52cd148e6f41d7b33
diff --git a/authfs/src/main.rs b/authfs/src/main.rs
index 0fa3db7..3561b8f 100644
--- a/authfs/src/main.rs
+++ b/authfs/src/main.rs
@@ -45,10 +45,11 @@
use auth::FakeAuthenticator;
use file::{
- Attr, InMemoryDir, RemoteDirEditor, RemoteFileEditor, RemoteFileReader, RemoteMerkleTreeReader,
+ Attr, EagerChunkReader, InMemoryDir, RemoteDirEditor, RemoteFileEditor, RemoteFileReader,
+ RemoteMerkleTreeReader,
};
use fsstat::RemoteFsStatsReader;
-use fsverity::{VerifiedFileEditor, VerifiedFileReader};
+use fsverity::{merkle_tree_size, VerifiedFileEditor, VerifiedFileReader};
use fsverity_digests_proto::fsverity_digests::FSVerityDigests;
use fusefs::{AuthFs, AuthFsEntry};
@@ -176,7 +177,10 @@
RemoteFileReader::new(service.clone(), remote_fd),
file_size,
signature.as_deref(),
- RemoteMerkleTreeReader::new(service.clone(), remote_fd),
+ EagerChunkReader::new(
+ RemoteMerkleTreeReader::new(service.clone(), remote_fd),
+ merkle_tree_size(file_size),
+ )?,
)?,
file_size,
})