From 27e02ad6429b8b5937171dda2ebdf19e6ecca35c Mon Sep 17 00:00:00 2001 From: GG Bond Date: Tue, 27 Feb 2024 12:36:46 +0800 Subject: [PATCH] Don't dup fd when calculate sha1 Signed-off-by: GG Bond --- app/src/main/rust/src/hash/sha1.rs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/app/src/main/rust/src/hash/sha1.rs b/app/src/main/rust/src/hash/sha1.rs index 9f590d36a..19882ee47 100644 --- a/app/src/main/rust/src/hash/sha1.rs +++ b/app/src/main/rust/src/hash/sha1.rs @@ -6,11 +6,13 @@ use jni::JNIEnv; use jni_fn::jni_fn; use jni_throwing; use sha1::{Digest, Sha1}; -use std::{fs::File, io::copy, os::fd::BorrowedFd}; +use std::mem::forget; +use std::os::fd::FromRawFd; +use std::{fs::File, io::copy}; -fn file_sha1(mut file: File, digest: &mut [u8; 40]) -> Result<&str> { +fn file_sha1<'a>(file: &mut File, digest: &'a mut [u8; 40]) -> Result<&'a str> { let mut sha = Sha1::new(); - copy(&mut file, &mut sha)?; + copy(file, &mut sha)?; Ok(encode_str(&sha.finalize(), digest)?) } @@ -19,10 +21,11 @@ fn file_sha1(mut file: File, digest: &mut [u8; 40]) -> Result<&str> { #[jni_fn("com.hippo.ehviewer.jni.HashKt")] pub fn sha1(mut env: JNIEnv, _class: JClass, fd: jint) -> jstring { jni_throwing(&mut env, |env| { - let borrowed_fd = unsafe { BorrowedFd::borrow_raw(fd) }; - let owned_fd = borrowed_fd.try_clone_to_owned()?; let mut hex_digest = [0u8; 40]; - let hex = file_sha1(File::from(owned_fd), &mut hex_digest)?; - Ok(env.new_string(hex)?.into_raw()) + let mut file = unsafe { File::from_raw_fd(fd) }; + let hex = file_sha1(&mut file, &mut hex_digest); + // Avoid double close, we close it on Java side + forget(file); + Ok(env.new_string(hex?)?.into_raw()) }) }