fix(base64): 因取消整数提升,b64decode 移位左操作数显式加宽为 uint32(修移位计数越界与静默截断)

This commit is contained in:
TermiNexus committed 2026-10-13 16:34:37 +08:00
1 parent e0bb791119
commit 40fd9d8cf7
1 file changed
+5 -3
+5 -3
View File
@@ -56,11 +56,13 @@ def b64decode(s: str, out: uint8*) -> sizet:
val = 0 val = 0
# Parse 6-bit values sequentially # Parse 6-bit values sequentially
c = s[i] - 43 c = s[i] - 43
val |= (b64_dec_tab[c] & 0x3F) << 18 # 整数提升取消后,`& 0x3F` 的无损常量适配会把左操作数留成 i8(位宽仅 8),<< 18 / << 12 越界报错;
# 显式 uint32() 把左操作数加宽到 32 位后再移位(与上方编码段 uint32(...) << 16 的先例一致)。
val |= uint32(b64_dec_tab[c] & 0x3F) << 18
c = s[i+1] - 43 c = s[i+1] - 43
val |= (b64_dec_tab[c] & 0x3F) << 12 val |= uint32(b64_dec_tab[c] & 0x3F) << 12
c = s[i+2] - 43 c = s[i+2] - 43
if s[i+2] != '=': val |= (b64_dec_tab[c] & 0x3F) << 6 if s[i+2] != '=': val |= uint32(b64_dec_tab[c] & 0x3F) << 6 # 同上:i8 左操作数左移 6 位会截断高位(静默回绕)
c = s[i+3] - 43 c = s[i+3] - 43
if s[i+3] != '=': val |= (b64_dec_tab[c] & 0x3F) if s[i+3] != '=': val |= (b64_dec_tab[c] & 0x3F)
# Write recovered bytes # Write recovered bytes