Skip to content

Commit c42ea73

Browse files
committed
fix: prevent BOF Tencent#5734 in the last channel handling
Signed-off-by: Junwha Hong <[email protected]>
1 parent 1c7af00 commit c42ea73

File tree

2 files changed

+96
-6
lines changed

2 files changed

+96
-6
lines changed

src/layer/arm/shufflechannel_arm.cpp

+48-3
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ int ShuffleChannel_arm::forward(const Mat& bottom_blob, Mat& top_blob, const Opt
117117

118118
ptr1 += 2;
119119

120-
for (int i = 0; i < size; i++)
120+
for (int i = 0; i < size - 1; i++)
121121
{
122122
float32x4_t _p0 = vld1q_f32(ptr0);
123123
float32x4_t _p1 = vld1q_f32(ptr1);
@@ -130,6 +130,21 @@ int ShuffleChannel_arm::forward(const Mat& bottom_blob, Mat& top_blob, const Opt
130130
ptr1 += 4;
131131
outptr0 += 4;
132132
}
133+
134+
for (int i = 0; i < 4; i++)
135+
{
136+
if (i % 2)
137+
{
138+
*outptr0 = *ptr1;
139+
ptr1 += 1;
140+
}
141+
else
142+
{
143+
*outptr0 = *ptr0;
144+
ptr0 += 1;
145+
}
146+
outptr0 += 1;
147+
}
133148
}
134149

135150
return 0;
@@ -364,7 +379,7 @@ int ShuffleChannel_arm::forward_bf16s_fp16s(const Mat& bottom_blob, Mat& top_blo
364379

365380
ptr1 += 4;
366381

367-
for (int i = 0; i < size; i++)
382+
for (int i = 0; i < size - 1; i++)
368383
{
369384
uint16x4_t _p0 = vld1_u16(ptr0);
370385
uint16x4_t _p1 = vld1_u16(ptr1);
@@ -378,6 +393,21 @@ int ShuffleChannel_arm::forward_bf16s_fp16s(const Mat& bottom_blob, Mat& top_blo
378393
ptr1 += 8;
379394
outptr0 += 8;
380395
}
396+
397+
for (int i = 0; i < 8; i++)
398+
{
399+
if (i % 2)
400+
{
401+
*outptr0 = *ptr1;
402+
ptr1 += 1;
403+
}
404+
else
405+
{
406+
*outptr0 = *ptr0;
407+
ptr0 += 1;
408+
}
409+
outptr0 += 1;
410+
}
381411
}
382412

383413
return 0;
@@ -598,7 +628,7 @@ int ShuffleChannel_arm::forward_bf16s_fp16s(const Mat& bottom_blob, Mat& top_blo
598628

599629
ptr1 += 2;
600630

601-
for (int i = 0; i < size; i++)
631+
for (int i = 0; i < size - 1; i++)
602632
{
603633
uint16x4_t _p0 = vld1_u16(ptr0);
604634
uint16x4_t _p1 = vld1_u16(ptr1);
@@ -611,6 +641,21 @@ int ShuffleChannel_arm::forward_bf16s_fp16s(const Mat& bottom_blob, Mat& top_blo
611641
ptr1 += 4;
612642
outptr0 += 4;
613643
}
644+
645+
for (int i = 0; i < 4; i++)
646+
{
647+
if (i % 2)
648+
{
649+
*outptr0 = *ptr1;
650+
ptr1 += 1;
651+
}
652+
else
653+
{
654+
*outptr0 = *ptr0;
655+
ptr0 += 1;
656+
}
657+
outptr0 += 1;
658+
}
614659
}
615660

616661
return 0;

src/layer/x86/shufflechannel_x86.cpp

+48-3
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ int ShuffleChannel_x86::forward(const Mat& bottom_blob, Mat& top_blob, const Opt
116116

117117
ptr1 += 8;
118118

119-
for (int i = 0; i < size; i++)
119+
for (int i = 0; i < size - 1; i++)
120120
{
121121
__m256 _p0 = _mm256_loadu_ps(ptr0);
122122
__m256 _p1 = _mm256_loadu_ps(ptr1);
@@ -134,6 +134,21 @@ int ShuffleChannel_x86::forward(const Mat& bottom_blob, Mat& top_blob, const Opt
134134
ptr1 += 16;
135135
outptr += 16;
136136
}
137+
138+
for (int i = 0; i < 16; i++)
139+
{
140+
if (i % 2)
141+
{
142+
*outptr = *ptr1;
143+
ptr1 += 1;
144+
}
145+
else
146+
{
147+
*outptr = *ptr0;
148+
ptr0 += 1;
149+
}
150+
outptr += 1;
151+
}
137152
}
138153

139154
return 0;
@@ -372,7 +387,7 @@ int ShuffleChannel_x86::forward(const Mat& bottom_blob, Mat& top_blob, const Opt
372387

373388
ptr1 += 4;
374389

375-
for (int i = 0; i < size; i++)
390+
for (int i = 0; i < size - 1; i++)
376391
{
377392
__m128 _p0 = _mm_loadu_ps(ptr0);
378393
__m128 _p1 = _mm_loadu_ps(ptr1);
@@ -387,6 +402,21 @@ int ShuffleChannel_x86::forward(const Mat& bottom_blob, Mat& top_blob, const Opt
387402
ptr1 += 8;
388403
outptr += 8;
389404
}
405+
406+
for (int i = 0; i < 8; i++)
407+
{
408+
if (i % 2)
409+
{
410+
*outptr = *ptr1;
411+
ptr1 += 1;
412+
}
413+
else
414+
{
415+
*outptr = *ptr0;
416+
ptr0 += 1;
417+
}
418+
outptr += 1;
419+
}
390420
}
391421

392422
return 0;
@@ -607,7 +637,7 @@ int ShuffleChannel_x86::forward(const Mat& bottom_blob, Mat& top_blob, const Opt
607637

608638
ptr1 += 2;
609639

610-
for (int i = 0; i < size; i++)
640+
for (int i = 0; i < size - 1; i++)
611641
{
612642
__m128 _p0 = _mm_loadu_ps(ptr0);
613643
__m128 _p1 = _mm_loadu_ps(ptr1);
@@ -620,6 +650,21 @@ int ShuffleChannel_x86::forward(const Mat& bottom_blob, Mat& top_blob, const Opt
620650
ptr1 += 4;
621651
outptr += 4;
622652
}
653+
654+
for (int i = 0; i < 4; i++)
655+
{
656+
if (i % 2)
657+
{
658+
*outptr = *ptr1;
659+
ptr1 += 1;
660+
}
661+
else
662+
{
663+
*outptr = *ptr0;
664+
ptr0 += 1;
665+
}
666+
outptr += 1;
667+
}
623668
}
624669

625670
return 0;

0 commit comments

Comments
 (0)