aboutsummaryrefslogtreecommitdiff
path: root/nitrocli/src/main.rs
diff options
context:
space:
mode:
authorDaniel Mueller <deso@posteo.net>2017-04-09 21:24:38 -0700
committerDaniel Mueller <deso@posteo.net>2017-04-09 21:24:38 -0700
commit5744889d0d3a9c033913bdce499064a4760a1249 (patch)
treedd5744f2a25fddb15882483e8fb07de8bbc62a06 /nitrocli/src/main.rs
parent3ce72e0ce1a0442786bc2600a7f276ae1994d90e (diff)
downloadnitrocli-5744889d0d3a9c033913bdce499064a4760a1249.tar.gz
nitrocli-5744889d0d3a9c033913bdce499064a4760a1249.tar.bz2
Flush filesystem caches before closing encrypted volume
When closing the encrypted volume we could potentially cause the volume to be in an inconsistent state if writes to it were cached by the operating system. To mitigate this case this patch causes an invocation to the sync(2) system call to flush outstanding writes to disk.
Diffstat (limited to 'nitrocli/src/main.rs')
-rw-r--r--nitrocli/src/main.rs11
1 files changed, 11 insertions, 0 deletions
diff --git a/nitrocli/src/main.rs b/nitrocli/src/main.rs
index f3f7d7f..5c8856e 100644
--- a/nitrocli/src/main.rs
+++ b/nitrocli/src/main.rs
@@ -288,11 +288,22 @@ fn open() -> Result<()> {
}
+#[link(name = "c")]
+extern "C" {
+ fn sync();
+}
+
/// Close the previously opened encrypted volume.
fn close() -> Result<()> {
type Response = nitrokey::Response<nitrokey::StorageResponse>;
return nitrokey_do(&|handle| {
+ // Flush all filesystem caches to disk. We are mostly interested in
+ // making sure that the encrypted volume on the nitrokey we are
+ // about to close is not closed while not all data was written to
+ // it.
+ unsafe { sync() };
+
let payload = nitrokey::DisableEncryptedVolumeCommand::new();
let report = nitrokey::Report::from(payload);