Skip to content

Commit e67f5ec

Browse files
committed
blake2b: use proper Go frame sizes
Similar to the previous commit, blake2b's assembly routines claim they have a zero byte frame and manually subtract a frame from the SP, which can fail to grow the stack when necessary, leading to memory corruption. Fix this by using the correct stack frame sizes so the generated stack growth prologue is correct, and aligning the SP up instead of down. Change-Id: Ic426338c45c94a2c01d549860c2295a0ee9200be Reviewed-on: https://go-review.googlesource.com/31585 Reviewed-by: Adam Langley <[email protected]> Reviewed-by: Andreas Auernhammer <[email protected]>
1 parent 5953a47 commit e67f5ec

File tree

2 files changed

+10
-6
lines changed

2 files changed

+10
-6
lines changed

blake2b/blake2bAVX2_amd64.s

+5-3
Original file line numberDiff line numberDiff line change
@@ -95,16 +95,18 @@ GLOBL ·AVX_c48<>(SB), (NOPTR+RODATA), $32
9595
VINSERTI128 $1, X11, Y15, Y15
9696

9797
// func hashBlocksAVX2(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte)
98-
TEXT ·hashBlocksAVX2(SB), 4, $0-48
98+
TEXT ·hashBlocksAVX2(SB), 4, $320-48 // frame size = 288 + 32 byte alignment
9999
MOVQ h+0(FP), AX
100100
MOVQ c+8(FP), BX
101101
MOVQ flag+16(FP), CX
102102
MOVQ blocks_base+24(FP), SI
103103
MOVQ blocks_len+32(FP), DI
104104

105105
MOVQ SP, DX
106-
ANDQ $0xFFFFFFFFFFFFFFE0, SP
107-
SUBQ $(32+32+256), SP
106+
MOVQ SP, R9
107+
ADDQ $31, R9
108+
ANDQ $~31, R9
109+
MOVQ R9, SP
108110

109111
MOVQ CX, 16(SP)
110112
XORQ CX, CX

blake2b/blake2b_amd64.s

+5-3
Original file line numberDiff line numberDiff line change
@@ -111,16 +111,18 @@ GLOBL ·c48<>(SB), (NOPTR+RODATA), $16
111111
PINSRQ $1, i7*8(src), m3
112112

113113
// func hashBlocksSSE4(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte)
114-
TEXT ·hashBlocksSSE4(SB), 4, $0-48
114+
TEXT ·hashBlocksSSE4(SB), 4, $32-48 // frame size = 16 + 16 byte alignment
115115
MOVQ h+0(FP), AX
116116
MOVQ c+8(FP), BX
117117
MOVQ flag+16(FP), CX
118118
MOVQ blocks_base+24(FP), SI
119119
MOVQ blocks_len+32(FP), DI
120120

121121
MOVQ SP, BP
122-
ANDQ $0xFFFFFFFFFFFFFFF0, SP
123-
SUBQ $(16+16), SP
122+
MOVQ SP, R9
123+
ADDQ $15, R9
124+
ANDQ $~15, R9
125+
MOVQ R9, SP
124126

125127
MOVOU ·iv3<>(SB), X0
126128
MOVO X0, 0(SP)

0 commit comments

Comments
 (0)