Crash with the ordinal indicators `º`/`ª` in `mi`

Đang mở Phù hợp với người mới
#959 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

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ó
2/5
Thời gian dự kiến
1-3 giờ
Mức phù hợp với người mới
88/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
rust
Lĩnh vực
accessibility

Hướng nghiên cứu

Bắt đầu với split_apart_pseudo_scripts trong src/canonicalize.rs và các ví dụ MathML được báo cáo là gây lỗi. Issue có đề xuất một cơ chế bảo vệ cho các định danh chỉ có một ký tự và một bài kiểm thử hồi quy tên là pseudo_script_single_char_mi; chạy cargo test để kiểm tra bản sửa lỗi. Công việc hoàn tất khi các ví dụ không còn gây lỗi và bài kiểm thử hồi quy thành công.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

In Spanish, ordinals are written with a period and the ordinal indicator: 1.º, 2.ª (U+00BA, U+00AA; not the degree sign). When the indicator comes as an mi on its own, MathCAT crashes, in any language:

<math><mn>1</mn><mo>.</mo><mi>º</mi></math>
<math><mn>1.</mn><mi>º</mi></math>
<math><mn>2</mn><mo>.</mo><mi>ª</mi></math>

All give index out of bounds at src/canonicalize.rs:404.

Cause and proposed patch: split_apart_pseudo_scripts pairs each char with the next one, so a single char gives no pairs and replace_children is called with an empty list. Tested: cargo test passes; adds the test pseudo_script_single_char_mi.

diff --git a/src/canonicalize.rs b/src/canonicalize.rs
index 1e3936f8..00a5165b 100644
--- a/src/canonicalize.rs
+++ b/src/canonicalize.rs
@@ -1520,7 +1520,8 @@ impl CanonicalizeContext {
 
 			let text = as_text(mi);
 			// debug!("split_apart_pseudo_scripts: start text=\"{text}\"");
-			if !text.chars().any(is_pseudo_script_char) || IS_DEGREES_C_OR_F.is_match(as_str!(text)) {
+			if !text.chars().any(is_pseudo_script_char) || IS_DEGREES_C_OR_F.is_match(as_str!(text)) ||
+			   text.chars().nth(1).is_none() {		// a single char (e.g., "º") has nothing to split
 				return None;
 			}
 
@@ -7085,6 +7086,14 @@ mod canonicalize_tests {
         are_strs_canonically_equal_result(test_str, target_str, &[])
 	}
 
+	#[test]
+    fn pseudo_script_single_char_mi() -> Result<()> {
+        // used to crash (index out of bounds in replace_children)
+        let test_str = "<math><mn>1</mn><mi>º</mi></math>";
+        let target_str = "<math><mrow data-changed='added'><mn>1</mn><mo data-changed='added'>&#x2062;</mo><mi>º</mi></mrow></math>";
+        are_strs_canonically_equal_result(test_str, target_str, &[])
+	}
+
 	#[test]
     fn prescript_only() -> Result<()> {
         let test_str = "<math><msub><mtext/><mn>92</mn></msub><mi>U</mi></math>";
Ngôn ngữ chính
Rust
Star
130
Fork
96
Merge trung bình
1 ngày 1 giờ
Pull request đã merge (30 ngày)
84

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. 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.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của daisy/MathCAT

Tất cả issue của daisy/MathCAT

Issue tương tự

Thêm issue về Rust

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.