[ui] Linux egui 未剥离 fc-match 可变字体集合的高 16 位实例索引导致启动崩溃
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 3/5
- Thời gian dự kiến
- 1-2 ngày
- Mức phù hợp với người mới
- 72/100
Hướng nghiên cứu
Start in openless-all/app/linux-egui/src/ui/theme.rs, especially fontconfig_match() and the handling of %{index} before it reaches egui::FontData. Check how the parsed index is used for seen deduplication and the regular_face / medium_face comparison, then look for the linux-egui unit tests. Done means composite indices such as 262146 are normalized consistently and a regression test verifies the font-loading path no longer panics.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
现象
- 触发条件:在预装 Google Noto Sans CJK 可变字体集合(
NotoSansCJK-VF.ttc,如 Fedora 44 等现代 Linux 发行版默认配置)的系统上安装并启动OpenLess-Linux-egui-2.0.2-Beta.4-150-x86_64.rpm(标签v2.0.2-Beta.4-tauri,上游beta提交c002b56c38d81bcd5044ddb22597a4e78ff2a88d)。 - 当前表现:主进程拉起 UI 窗口子进程后,UI 子进程在解析
"openless-cjk"字体时触发epaintpanic(退出码101),窗口无法打开并导致宿主进程退出。 - 证据:
- 真机运行日志(Fedora 44 KDE Plasma Wayland):
openless[218836]: [INFO] openless_linux_egui::linux_app::window: [ui-host] spawned UI window process pid=218858 socket=/run/user/1000/openless-ui.sock openless[218858]: thread 'main' (218858) panicked at epaint-0.37.0/src/text/family.rs:51:21: openless[218858]: Error parsing "openless-cjk" TTF/OTF font file: Invalid index 262146 for font collection openless[218836]: [ERROR] openless_linux_egui::linux_app: OpenLess host failed: UI window process failed: exit status: 101 - 本机
fc-match实测输出:
在 Fontconfig / FreeType 中,针对可变字体集合(Variable Font TTC),$ fc-match -f "%{file}|%{index}\n" ":lang=zh-cn" /usr/share/fonts/google-noto-sans-cjk-vf-fonts/NotoSansCJK-VF.ttc|262146FC_INDEX(%{index})采用高 16 位存放命名可变实例索引(Named Instance Index)、低 16 位存放 TTC 字面索引(Face Index):262146 == 0x00040002 == (4 << 16) | 2(即第 4 号可变实例、TTC 内第 2 号字面 Noto Sans CJK SC)。 - 源码定位:
https://github.com/Open-Less/openless/blob/c002b56c38d81bcd5044ddb22597a4e78ff2a88d/openless-all/app/linux-egui/src/ui/theme.rs#L88-L100
fontconfig_match()将%{index}原样解析为u32(262146)并直接传入egui::FontData { index, .. },而epaint/ab_glyph/ttf-parser仅接受 TTC 集合内的 16 位字面索引(index & 0xFFFF),传入含高 16 位实例号的复合值会直接越界 panic。
- 真机运行日志(Fedora 44 KDE Plasma Wayland):
影响
- 所有默认使用
NotoSansCJK-VF.ttc(或任何其他可变字体集合.ttc)的 Linux 发行版(如 Fedora 等)用户,启动 OpenLess 时 UI 进程必定 100% 崩溃退出,应用完全无法打开。
建议接受标准
-
openless-all/app/linux-egui/src/ui/theme.rs在解析fc-match返回的%{index}时剥离高 16 位可变字体实例索引(例如使用index & 0xFFFF提取 TTC face index),不再将0x00040002(262146)等复合值原样传给egui::FontData。 - 对
seen去重与regular_face/medium_face比较逻辑同步使用规范化后的 TTC face index(或明确处理可变字体同一 face index 下的去重语义)。 - 在
linux-egui单元测试中增加针对fc-match返回复合FC_INDEX(如262146/0x00040002)的解析与字体加载回归测试,确保不再触发epaint越界 panic。
TODO / 不确定项
egui当前不支持可变字体字重轴(源码注释已说明),当regular_face与medium_face指向同一可变.ttc文件的同一 face index(仅高 16 位实例索引不同)时,剥离高 16 位后两者(path, index)相同,将按既有设计跳过重复注册MEDIUM_FACE。
- Ngôn ngữ chính
- Rust
- Star
- 3.7k
- Fork
- 349
- Merge trung bình
- 1 ngày 13 giờ
- Pull request đã merge (30 ngày)
- 98
Chuẩn bị môi trường
Dự án này không cung cấp dev container, Dockerfile hay hướng dẫn đóng góp, nên bạn cần tự thiết lập môi trường: hãy bắt đầu từ README và xem hướng dẫn đóng góp lần đầu của chúng tôi để biết các bước chung.
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của Open-Less/openless
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
Maintainer thường phản hồi trong vòng 1 ngày
-
[windows] 录音快捷键还不支持设置为ScrllLock键Có thể đã có người làm @HKLHaoBin đã nhận 14 ngày trước. Đang mởbug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
Open-Less/openless#1241 · 5 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 48/100
Maintainer thường phản hồi trong vòng 1 ngày
-
area:ui bug P2
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 45/100
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của Open-Less/openless
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
RustCrypto/utils#1597 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Non-`main` default branchesĐang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
max-sixty/worktrunk#4727 · 7 bình luận · 1 reaction ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 86/100
Maintainer thường phản hồi trong vòng 1 ngày
-
follow-up
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 73/100
carrick-sh/carrick#1859 ·
Maintainer thường phản hồi trong vòng 1 ngày