fix(vpsdk): WINBUF_MAX_BYTES 改单字面量 4194304,避免最小宽度算术回绕成 0(三重故障诱因)

- `1024 * 1024 * 4` 按最小宽度(i16)做算术:1024×1024 先回绕成 0 ⇒ 缓冲只剩几字节 ⇒ flush 时内核 memcpy(dst, src, 240KB) 从 app 的几字节缓冲后狂读 ⇒ 内核越界读 → 异常路径再出事即三重故障

- 改成单字面量 4194304(不依赖任何算术)。与 V3_POOL 同属“最小宽度算术”坑:静态求值侧已在 61f23d9 按结果值加宽,这处是表达式侧,先按单字面量规避
This commit is contained in:
TermiNexus committed 2026-10-14 19:35:37 +08:00
1 parent c977caec91
commit 11ad0de988
1 file changed
+3 -1
+3 -1
View File
@@ -60,7 +60,9 @@ def draw_text(win_id: int, x: int, y: int, text: const str, color: uint32) -> in
# 每窗口一份**用户态**后备缓冲(stdlib.malloc → MMAP → 0x20000000 用户堆)。
# 旧实现用 GET_WINBUF 把内核窗口缓冲地址直接交给 app,那片页 U=0 → app 一画就 #PF(err=0x7);
# 现在 app 画在自己的用户缓冲里,flush(win_id) 交给内核拷进窗口缓冲(WIN_FLUSH(win_id, src))。
define WINBUF_MAX_BYTES = 1024 * 1024 * 4
# 注意:这里必须写成**单个字面量** —— `1024*1024*4` 会按最小宽度(i16)做算术而回绕成 0,
# 让缓冲只有几字节,随后内核 memcpy 240KB 就会越界读(三重故障的根)。4MB。
define WINBUF_MAX_BYTES = 4194304
_winbufs: t.CArray[uint64, 64]