Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a825884e5e |
+19
-1
@@ -594,7 +594,7 @@ fn hex_to_unicode_string(hex: &str) -> Option<String> {
|
|||||||
|
|
||||||
let bytes: Option<Vec<u8>> = (0..hex.len())
|
let bytes: Option<Vec<u8>> = (0..hex.len())
|
||||||
.step_by(2)
|
.step_by(2)
|
||||||
.map(|i| u8::from_str_radix(&hex[i..i + 2], 16).ok())
|
.map(|i| u8::from_str_radix(hex.get(i..i + 2)?, 16).ok())
|
||||||
.collect();
|
.collect();
|
||||||
let bytes = bytes?;
|
let bytes = bytes?;
|
||||||
|
|
||||||
@@ -2606,6 +2606,24 @@ endcmap
|
|||||||
assert_eq!(cmap.lookup(0x0025), Some("B".to_string()));
|
assert_eq!(cmap.lookup(0x0025), Some("B".to_string()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_hex_to_unicode_non_ascii_no_panic() {
|
||||||
|
// A destination containing a multi-byte char makes the byte length even
|
||||||
|
// while a byte offset can land inside a char. Slicing must not panic;
|
||||||
|
// it should be rejected gracefully.
|
||||||
|
assert_eq!(hex_to_unicode_string("XéY"), None);
|
||||||
|
assert_eq!(hex_to_unicode_string("\u{fffd}0"), None);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_parse_bfchar_non_ascii_destination_no_panic() {
|
||||||
|
// Crafted /ToUnicode CMap: a non-hex, non-ASCII destination previously
|
||||||
|
// triggered a char-boundary panic in hex_to_unicode_string.
|
||||||
|
let cmap_content = "beginbfchar <0041> <XéY> endbfchar";
|
||||||
|
// Must not panic; the malformed entry is simply skipped.
|
||||||
|
let _ = ToUnicodeCMap::parse(cmap_content.as_bytes());
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_parse_bfchar_1byte() {
|
fn test_parse_bfchar_1byte() {
|
||||||
// This is the pattern that caused the CJK bug: codespace is <0000><FFFF>
|
// This is the pattern that caused the CJK bug: codespace is <0000><FFFF>
|
||||||
|
|||||||
Reference in New Issue
Block a user