Don't dup fd when calculate sha1

Signed-off-by: GG Bond <whatever@tagkong.com>
This commit is contained in:
GG Bond authored and Vladimir Dostoyevskiy committed 2024-02-27 12:50:32 +08:00
1 parent 11e9faef7c
commit 27e02ad642
1 file changed
+10 -7
+10 -7
View File
@@ -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())
})
}