shithub: dav1d

Download patch

ref: dce4e788614bf8c2e353b7157e7b59b34b177779
parent: 3f646a2182e36476634237b94bae5a0481489c34
author: Henrik Gramner <[email protected]>
date: Tue Feb 19 12:18:31 EST 2019

x86: Fix buffer overread in ipred_filter_avx2.w32

Eliminates segfault with clusterfuzz-testcase-minimized-dav1d_fuzzer-5697181166600192.

Credit to OSS-Fuzz.

--- a/src/x86/ipred.asm
+++ b/src/x86/ipred.asm
@@ -3483,13 +3483,13 @@
     sub                 rsp, stack_size_padded
     sub                  hd, 2
     lea                  r3, [dstq+16]
-    mov                 r5d, hd
+    lea                 r5d, [hq-2]
     call .w16_main
     add                 tlq, r5
     mov                dstq, r3
     lea                  r3, [strideq-4]
     lea                  r4, [r3+strideq*2]
-    movq                xm0, [tlq+19]
+    movq                xm0, [tlq+21]
     pinsrd              xm0, [dstq-4], 2
     pinsrd              xm0, [dstq+r3*1], 3
     FILTER_XMM           12, 0, 7, 14         ; a0 b0 a0 b0
@@ -3496,8 +3496,8 @@
     movq                xm7, [dstq+r3*2]
     pinsrd              xm7, [dstq+r4], 2
     palignr             xm7, xm0, 12          ; 0 _ _ _ _ _ _ _ _ _ _ 5 _ _ _ 6
-    vpbroadcastd         m0, [tlq+26]
-    vpbroadcastd         m9, [tlq+27]
+    vpbroadcastd         m0, [tlq+28]
+    vpbroadcastd         m9, [tlq+29]
     vbroadcasti128       m8, [base+filter_shuf1+16]
     vpblendd             m0, m9, 0x20
     vpblendd             m0, m7, 0x0f
@@ -3506,16 +3506,17 @@
     call .main                                ; c0 d0 a1 b1   a1 b1 c0 d0
     add                  r3, 2
     lea                  r4, [r4+strideq*2]
-    movlps              xm9, xm7, [tlq+27]    ; _ _ _ 0 1 2 3 4 _ _ _ 5 _ _ _ 6
+    movlps              xm9, xm7, [tlq+29]    ; _ _ _ 0 1 2 3 4 _ _ _ 5 _ _ _ 6
     vpblendd           xm12, xm7, 0x0c        ; a0 b0 a1 b1
     FILTER_XMM            6, 9, 10, 14
     vpbroadcastq         m6, xm6              ; a2 b2 __ __ __ __ a2 b2
-    vpbroadcastd         m9, [tlq+35]
-    vpbroadcastd        m10, [tlq+34]
+    vpbroadcastd         m9, [tlq+37]
+    vpbroadcastd        m10, [tlq+36]
     vpblendd             m6, m9, 0x20         ; top
 .w32_loop:
     movq                xm9, [dstq+r3*4]
     pinsrd              xm9, [dstq+r4], 2
+.w32_loop_last:
     palignr              m9, m0, 12
     vpblendd             m0, m9, m7, 0xe2     ; 0 _ _ _ 1 2 3 4 _ _ _ 5 _ _ _ 6
     mova               xm13, xm7              ; c0 d0
@@ -3535,6 +3536,7 @@
     lea                dstq, [dstq+strideq*2]
     sub                 r5d, 2
     jg .w32_loop
+    jz .w32_loop_last
     vpblendd            xm7, xm6, xm10, 0x04  ; _ _ _ 5 _ _ _ 6 0 _ _ _ 1 2 3 4
     pshufd              xm7, xm7, q1032       ; 0 _ _ _ 1 2 3 4 _ _ _ 5 _ _ _ 6
     FILTER_XMM            0, 7, 9, [base+filter_shuf1+16]