Fixed potential align errors for PowerPC VSX filter functions

The problem is that row and prev_row may not be aligned to the same
byte count. This situation leaded to undefined behaviour.
This commit is contained in:
Vadim Barkov 2017-01-29 18:37:53 +03:00
parent adbf1d6d1c
commit 6ddcd33daa

View File

@ -15,13 +15,21 @@
#ifdef PNG_READ_SUPPORTED #ifdef PNG_READ_SUPPORTED
/* This code requires -maltivec and -mabi=altivec on the command line: */ /* This code requires -maltivec and -mvsx on the command line: */
#if PNG_POWERPC_VSX_IMPLEMENTATION == 1 /* intrinsics code from pngpriv.h */ #if PNG_POWERPC_VSX_IMPLEMENTATION == 1 /* intrinsics code from pngpriv.h */
#include <altivec.h> #include <altivec.h>
#if PNG_POWERPC_VSX_OPT > 0 #if PNG_POWERPC_VSX_OPT > 0
#ifndef __VSX__
# error "This code requires VSX support (POWER8 and later). Please provide -mvsx compiler flag."
#endif
#define vec_ld_unaligned(vec,data) vec = vec_vsx_ld(0,pp)
#define vec_st_unaligned(vec,data) vec_vsx_st(vec,0,data)
/* Functions in this file look at most 3 pixels (a,b,c) to predict the 4th (d). /* Functions in this file look at most 3 pixels (a,b,c) to predict the 4th (d).
* They're positioned like this: * They're positioned like this:
* prev: c b * prev: c b
@ -31,7 +39,6 @@
* ( this is taken from ../intel/filter_sse2_intrinsics.c ) * ( this is taken from ../intel/filter_sse2_intrinsics.c )
*/ */
void png_read_filter_row_up_vsx(png_row_infop row_info, png_bytep row, void png_read_filter_row_up_vsx(png_row_infop row_info, png_bytep row,
png_const_bytep prev_row) png_const_bytep prev_row)
{ {
@ -58,7 +65,7 @@ void png_read_filter_row_up_vsx(png_row_infop row_info, png_bytep row,
while( istop >= 16 ) while( istop >= 16 )
{ {
rp_vec = vec_ld(0,rp); rp_vec = vec_ld(0,rp);
pp_vec = vec_ld(0,pp); vec_ld_unaligned(pp_vec,pp);
rp_vec = vec_add(rp_vec,pp_vec); rp_vec = vec_add(rp_vec,pp_vec);