fix(base64): 因取消整数提升,b64decode 移位左操作数显式加宽为 uint32(修移位计数越界与静默截断)
This commit is contained in:
1 parent
e0bb791119
commit
40fd9d8cf7
1 file changed
+5
-3
@@ -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
|
||||||
|
|||||||
Reference in new issue
Block a user