Skip to content

Commit d9ed1f9

Browse files
committed
[201_72] 修复导言区调用未定义颜色变量导致软件崩溃
1 parent c26a81d commit d9ed1f9

File tree

3 files changed

+75
-1
lines changed

3 files changed

+75
-1
lines changed

TeXmacs/tests/tmu/201_72.tmu

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<TMU|<tuple|1.1.0|2026.1.2>>
2+
3+
<style|<tuple|generic|chinese|table-captions-above|number-europe|preview-ref>>
4+
5+
<\body>
6+
<\show-preamble>
7+
<assign|theorem|<with|color|<value|backcolor>|>>
8+
9+
\;
10+
11+
\;
12+
13+
\;
14+
15+
\;
16+
17+
\;
18+
19+
\;
20+
21+
\;
22+
23+
\;
24+
</show-preamble>
25+
26+
<\ignore>
27+
\;
28+
</ignore>
29+
</body>
30+
31+
<\initial>
32+
<\collection>
33+
<associate|page-medium|paper>
34+
<associate|page-screen-margin|false>
35+
</collection>
36+
</initial>

devel/201_72.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# 201_72 修复导言区调用未定义颜色变量导致软件崩溃
2+
3+
## 如何测试
4+
1. 打开 TeXmacs/tests/tmu/201_72.tmu 文件
5+
2. `Ctrl+Shift+p`进入导言区
6+
3. 鼠标光标移动到`backcolor`后回车应该不会导致软件闪退问题
7+
8+
## 2026/2/4
9+
### What
10+
1.`src/Graphics/Renderer/brush.cpp``make_brush(tree p, int a)` 中增加非法 pattern 输入校验,遇到异常复合树时回退为 `no_brush`
11+
2.`src/Graphics/Renderer/brush.cpp``get_pattern_data(...)` 中增加结构和 URL 健壮性检查,非法输入回退到安全默认值,避免继续解包。
12+
13+
### Why
14+
`<value|backcolor>` 在变量未定义时会产生异常值,该值进入颜色渲染链路后被误当作 pattern 解包。
15+
MuPDF 路径中会继续读取非法 pattern 图像信息(日志可见 `bad image size for '{}'`),最终触发 SIGSEGV。
16+
17+

src/Graphics/Renderer/brush.cpp

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,11 @@ make_brush (tree p, int a) {
146146
else return make_brush (named_color (s, a));
147147
}
148148
else {
149+
// 防御性处理:非法复合树(例如未定义变量展开后的 UNINIT)
150+
// 不能当作 pattern 继续解包,否则后续访问 pattern[1]/pattern[2] 可能崩溃。
151+
if (N (p) != 4 || !is_atomic (p[0])) return tm_new<no_brush_rep> ();
152+
if (as_string (p[0]) == "" || as_string (p[0]) == "{}")
153+
return tm_new<no_brush_rep> ();
149154
color c= white;
150155
if (N (p) == 4) c= named_color (as_string (p[3]), a);
151156
return tm_new<pattern_brush_rep> (c, p, a);
@@ -176,7 +181,23 @@ void
176181
get_pattern_data (url& u, SI& w, SI& h, tree& eff, brush br, SI pixel) {
177182
// FIXME << what's about ratio and percentages wrt paper lengths?
178183
tree pattern= br->get_pattern ();
179-
u = br->get_pattern_url ();
184+
// 防御性处理:如果 pattern 结构不完整,直接回退到安全默认值,
185+
// 避免访问 pattern[1]/pattern[2] 时越界导致崩溃。
186+
if (is_atomic (pattern) || N (pattern) < 3 || !is_atomic (pattern[0])) {
187+
u = url ();
188+
w = 35;
189+
h = 35;
190+
eff= tree ("");
191+
return;
192+
}
193+
u= br->get_pattern_url ();
194+
if (is_none (u) || as_string (u) == "" || as_string (u) == "{}") {
195+
u = url ();
196+
w = 35;
197+
h = 35;
198+
eff= tree ("");
199+
return;
200+
}
180201
int imw_pt, imh_pt;
181202
image_size (u, imw_pt, imh_pt);
182203
double pt = ((double) 600 * PIXEL) / 72.0;

0 commit comments

Comments
 (0)