Don't dup fd when calculate sha1
Signed-off-by: GG Bond <whatever@tagkong.com>
This commit is contained in:
1 parent
11e9faef7c
commit
27e02ad642
1 file changed
+10
-7
@@ -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())
|
||||
})
|
||||
}
|
||||
Reference in new issue
Block a user