Panic: u16 overflow in name.rs when a name record's offset + length exceeds 65535
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 2/5
- Thời gian dự kiến
- 1-3 giờ
- Mức phù hợp với người mới
- 75/100
Hướng nghiên cứu
Đọc src/name.rs, đặc biệt là subset_table quanh hai phần bổ sung được xác định trong issue. Chạy cách tái hiện được cung cấp hoặc cargo test để quan sát lỗi tràn; sau đó kiểm tra rằng các offset không hợp lệ trả về lỗi thay vì gây panic và các offset chuỗi được cộng dồn không bị tràn vòng.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
subset panics with attempt to add with overflow when a name record's offset + length exceeds 65535, in any build with overflow checks (debug builds, cargo test, fuzzing):
thread 'main' panicked at subsetter-0.2.6/src/name.rs:48:20:
attempt to add with overflow
subset_table in src/name.rs adds record.string_offset + record.length as u16 (line 48), and cur_storage_offset += record.length (line 53) can overflow the same way when the kept strings add up to more than 64 KiB. In release builds the first sum wraps, storage.get(..) returns None and the call ends in Err(SubsetError); the second can wrap silently and write wrong string offsets.
To reproduce with subsetter 0.2.6 (default-features = false) and the font below (696 bytes, a minimal TrueType font whose name table has a single record: platform 3, encoding 1, language 0x409, name ID 1, length 4, offset 0xFFFE):
fn main() {
let data = std::fs::read("name-overflow.ttf").unwrap();
let remapper = subsetter::GlyphRemapper::new();
println!("{:?}", subsetter::subset(&data, 0, &remapper).map(|font| font.len()));
}
cargo run panics as above; cargo run --release prints Err(SubsetError).
name-overflow.ttf, base64 (decode with base64 -d > name-overflow.ttf)
AAEAAAAKAIAAAwAgT1MvMmKwXBUAAAEoAAAAYGNtYXABSgEcAAABnAAAAExnbHlmC4EjVwAAAgAA
AACAaGVhZMSNyOUAAACsAAAANmhoZWEF1AGWAAAA5AAAACRobXR4CMoAlgAAAYgAAAAUbG9jYQAA
AXAAAAHoAAAAGG1heHAACwANAAABCAAAACBuYW1lAFQEUgAAAoAAAAAWcG9zdP+fADIAAAKYAAAA
IAABAAAAAQAAIE34C18PPPUACwPoAAAAAHwlncAAAAAA5vHm7QAAAAACWANSAAAACAACAAEAAAAA
AAEAAAMg/zgAWgJYAAAAAAJYAAEAAAAAAAAAAAAAAAAAAAAFAAEAAAAFAAQAAQAGAAIAAgAAAAAA
AAAAAAAAAAACAAEABAHCAZAABQAAAooCWAAAAEsCigJYAAABXgAyAPoAAAAAAAAAAAAAAAAAAAAD
AAAAAAAAAAAAAAAAT1dSVABAACAAwQMg/zgAWgOEAPoAAAABAAAAAAH0ArwAAAAgAAAB9AAyAPoA
AAJYAAABLABkAlgAAAAAAAIAAAADAAAAFAADAAEAAAAUAAQAOAAAAAoACAACAAIAIABBALQAwf//
AAAAIABBALQAwf///+H/wf9P/0MAAQAAAAAAAAAAAAAAAAAAAAAAJAAAACQAAABEAAAAZAAAAIAA
AQAyAAABwgK8AAMAAAEBAQEAMgAAAZAAAAAAArwAAP1EAAAAAQAAAAACWAK8AAIAAAEBAQAAASwB
LAAAArz9RAAAAAABAGQCWAD6Au4AAgAAAQEBAGQAZAAyAlgAlv/OAAAA//8AAAAAAlgDUgAjAAIA
AAAAAAMAAwBkAGQAAAAAAAEAEgADAAEECQABAAT//gBBAEIAAAADAAAAAAAA/5wAMgAAAAAAAAAA
AAAAAAAAAAAAAAAA
Doing the arithmetic in usize or with checked_add, and returning MalformedFont when it does not fit, would make this an error. Found by fuzzing subsetter through the font crate of officewright; until it is fixed we call subset inside catch_unwind.
- Ngôn ngữ chính
- Rust
- Star
- 61
- Fork
- 16
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
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 typst/subsetter
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 74/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 83/100
-
head table bounding box is not recalculated for variable font instancesCó thể đã có người làm @khaledhosny đã nhận 16 ngày trước. Đang mở
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 56/100
-
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 45/100
-
Độ khó 3/5 Nửa ngày Mức phù hợp với người mới 67/100
Tất cả issue của typst/subsetter
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Input: placeholder drawn in the text colour when the empty Input is focused but not yet editedĐang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
pierreaubert/gpui-toolkit#114 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
BibLaTeX `type` keys like `phdthesis`, `mathesis`, `techreport` are printed raw instead of localizedĐang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
-
remove the use of `forget`Đang mởgood first issue help wanted
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 80/100
Maintainer thường phản hồi trong vòng 1 ngày
-
compiler
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
HerringtonDarkholme/hd-lang#1853 ·
Maintainer thường phản hồi trong vòng 1 ngày