Skip to content

Commit 5f9ea33

Browse files
chrisryugjclaude
andcommitted
fix: OCR DLL을 설치본 경로에서 직접 로드 — EDR 격리 기동 실패 해소 (v3.4.4, 이슈 #35 후속)
v3.4.3에서 pdfium 런타임 다운로드는 없앴으나, OCR 엔진이 처음 onnxruntime.dll을 로드하는 시점에 기동이 다시 멈췄다. 앱이 런타임에 AppData로 복사한 DLL을 로드하는 동작을 내부망 EDR(ZombieZERO 등)이 "이 프로세스가 쓴 PE를 로드"하는 dropper 패턴으로 오탐해 프로세스를 격리한 것이 원인. - ORT_DYLIB_PATH / PDFIUM_DYLIB_PATH를 설치 프로그램이 놓은 서명된 번들 (resources/onnxruntime, resources/pdfium) 경로가 있으면 거기서 직접 로드. 없으면 기존 AppData 경로로 fallback → 무회귀. - resume_watchers를 부팅 스레드에서 백그라운드로 분리 — OCR 엔진(ONNX 세션) 초기화 지연·hang이 창 표시를 막지 못하게. 키워드 검색은 즉시 동작. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent 41df3fd commit 5f9ea33

6 files changed

Lines changed: 70 additions & 15 deletions

File tree

CHANGELOG.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,26 @@
11
# Changelog
22

3+
## [3.4.4] - 2026-07-23
4+
5+
**OCR 활성 시 기동 실패 잔여 해소 — DLL을 설치본 경로에서 직접 로드 (이슈 #35 후속)**
6+
7+
### 🐛 수정
8+
9+
- **OCR을 켜면 앱이 여전히 기동하지 않던 문제 해소 (이슈 #35 후속)** — v3.4.3에서
10+
pdfium 다운로드는 없앴으나, OCR 엔진이 처음 `onnxruntime.dll`을 로드하는 시점에서
11+
기동이 다시 멈췄다. 원인은 앱이 런타임에 AppData로 복사한 DLL을 로드하는 동작을
12+
내부망 보안솔루션(ZombieZERO 등 APT 대응 제품)이 "이 프로세스가 쓴 실행 파일을 로드"
13+
하는 dropper 패턴으로 오인해 프로세스를 격리한 것. 이제 `onnxruntime.dll`·`pdfium.dll`
14+
**설치 프로그램이 놓은 서명된 번들 경로에서 직접 로드**해 그 오탐을 없앴다. 번들이 없는
15+
환경에서는 기존 AppData 경로로 자연 fallback한다. (`DOCUFINDER_OFFLINE`은 네트워크
16+
다운로드만 차단하므로 이 로컬 로드 문제에는 영향이 없었다.)
17+
18+
### 🔧 내부
19+
20+
- **감시 폴더 자동 복원을 부팅 스레드에서 분리** — 시작 시 OCR 엔진(ONNX 세션) 초기화가
21+
창 표시를 막지 못하도록 백그라운드로 이동. OCR 초기화가 지연·실패해도 창은 뜨고 키워드
22+
검색은 동작한다.
23+
324
## [3.4.3] - 2026-07-22
425

526
**망분리 환경 기동 실패 + 보안솔루션 오탐 해소 (pdfium 오프라인 번들화)**

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "anything",
3-
"version": "3.4.3",
3+
"version": "3.4.4",
44
"description": "로컬 문서 검색 앱 - Everything 대항마",
55
"type": "module",
66
"scripts": {

src-tauri/Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src-tauri/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "docufinder"
3-
version = "3.4.3"
3+
version = "3.4.4"
44
description = "로컬 문서 검색 앱 - HWPX, Office, PDF 지원"
55
authors = ["Chris"]
66
edition = "2021"

src-tauri/src/lib.rs

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -924,22 +924,39 @@ pub fn run() {
924924
// container.rs OnceCell 내부(멀티스레드 가능)에서 호출하던 것을 여기로 이동
925925
// SAFETY: setup()은 main 스레드에서 실행되며, ort 라이브러리 초기화 전임.
926926
// Rust 1.81+ deprecated이나 프로세스 초기화 시점이므로 안전함.
927+
// DLL(onnxruntime·pdfium) 은 **번들(설치본) 경로가 있으면 거기서 직접 로드**한다.
928+
// AppData 복사본을 로드하면 내부망 EDR(ZombieZERO 등) 이 "이 프로세스가 런타임에 쓴
929+
// PE 를 로드" 하는 상관을 dropper 로 오탐해 프로세스를 격리한다(이슈 #35). 설치
930+
// 프로그램이 놓은 서명된 번들 파일에서 로드하면 그 상관이 끊겨 오탐이 사라진다.
931+
// 번들이 없으면(dev·미번들 플랫폼) 기존 AppData seed/다운로드 경로로 fallback.
927932
{
928-
let dll_path = models_dir
929-
.join("kosimcse-roberta-multitask")
930-
.join(model_downloader::dylib_filename());
933+
let ort_lib = model_downloader::dylib_filename();
934+
let bundled_ort = resource_dir
935+
.as_ref()
936+
.map(|r| r.join("resources").join("onnxruntime").join(ort_lib));
937+
let dll_path = match bundled_ort {
938+
Some(p) if p.exists() => p,
939+
_ => models_dir
940+
.join("kosimcse-roberta-multitask")
941+
.join(ort_lib),
942+
};
931943
unsafe { std::env::set_var("ORT_DYLIB_PATH", &dll_path) };
932944
tracing::info!("ORT_DYLIB_PATH set to {:?}", dll_path);
933945
}
934946

935947
// PDFIUM_DYLIB_PATH 설정: 스캔/이미지 PDF 페이지 래스터화 fallback 용 (parsers/pdf.rs).
936-
// ORT_DYLIB_PATH 와 동일하게 models/pdfium/<lib> 를 가리키게 하되, 외부에서 이미
937-
// 명시 설정돼 있으면 그 값을 존중한다. 파일이 없으면 pdf.rs 가 조용히 기능 비활성한다
938-
// (크래시 없음 — 기존 born-digital/JPEG 스캔 경로는 그대로 동작).
948+
// ORT_DYLIB_PATH 와 동일하게 번들 경로 우선, 없으면 models/pdfium/<lib> fallback.
949+
// 외부에서 이미 명시 설정돼 있으면 그 값을 존중한다. 파일이 없으면 pdf.rs 가 조용히
950+
// 기능 비활성한다(크래시 없음 — 기존 born-digital/JPEG 스캔 경로는 그대로 동작).
939951
if std::env::var_os("PDFIUM_DYLIB_PATH").is_none() {
940-
let pdfium_path = models_dir
941-
.join("pdfium")
942-
.join(model_downloader::pdfium_lib_filename());
952+
let pdfium_lib = model_downloader::pdfium_lib_filename();
953+
let bundled_pdfium = resource_dir
954+
.as_ref()
955+
.map(|r| r.join("resources").join("pdfium").join(pdfium_lib));
956+
let pdfium_path = match bundled_pdfium {
957+
Some(p) if p.exists() => p,
958+
_ => models_dir.join("pdfium").join(pdfium_lib),
959+
};
943960
unsafe { std::env::set_var("PDFIUM_DYLIB_PATH", &pdfium_path) };
944961
tracing::info!("PDFIUM_DYLIB_PATH set to {:?}", pdfium_path);
945962
}
@@ -1147,8 +1164,11 @@ pub fn run() {
11471164
}));
11481165
}
11491166

1150-
// 기존 감시 폴더들 자동 감시 복원
1151-
resume_watchers(&container);
1167+
// 기존 감시 폴더들 자동 감시 복원 — app.manage 이후 백그라운드 스레드로 실행한다.
1168+
// resume_watchers 는 get_watch_manager 를 통해 OCR 엔진(ort 세션)을 즉시 빌드하는데,
1169+
// 내부망 EDR 이 그 로드를 격리하거나(프로세스 kill) ort 로드가 지연되면, setup 메인
1170+
// 스레드에서 동기 실행 시 창 표시 자체가 막힌다(이슈 #35). 백그라운드로 빼면 OCR
1171+
// 초기화가 늦거나 실패해도 창은 뜨고 키워드 검색은 동작한다. (아래 이동됨)
11521172

11531173
// ⚡ 디스크 타입 사전 감지 (C:, D: — PowerShell 호출 1-3초를 앱 시작 시 흡수)
11541174
tauri::async_runtime::spawn(async {
@@ -1202,6 +1222,20 @@ pub fn run() {
12021222
// Store app container
12031223
app.manage(RwLock::new(container));
12041224

1225+
// 감시 폴더 자동 복원 (위에서 이동) — OCR 엔진 빌드가 창 표시를 막지 않도록 분리.
1226+
{
1227+
let app_handle = app.handle().clone();
1228+
std::thread::spawn(move || {
1229+
if let Some(container_state) =
1230+
app_handle.try_state::<RwLock<AppContainer>>()
1231+
{
1232+
if let Ok(container) = container_state.read() {
1233+
resume_watchers(&container);
1234+
}
1235+
}
1236+
});
1237+
}
1238+
12051239
// 🔄 주기 sync task 시작 (v2.5.2) — watcher 이벤트 누락 보완.
12061240
// lib.rs setup 에서 1회만 spawn. AtomicBool shutdown 신호는
12071241
// cleanup_vector_resources / 앱 종료 시 세팅되어 루프가 탈출한다.

src-tauri/tauri.conf.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"$schema": "https://schema.tauri.app/config/2",
33
"productName": "Anything",
4-
"version": "3.4.3",
4+
"version": "3.4.4",
55
"identifier": "com.anything.app",
66
"build": {
77
"beforeDevCommand": "pnpm dev",

0 commit comments

Comments
 (0)