@ -2777,6 +2777,28 @@ static int stbi__process_scan_header(stbi__jpeg *z)
return 1 ;
}
static int stbi__free_jpeg_components ( stbi__jpeg * z , int ncomp , int why )
{
int i ;
for ( i = 0 ; i < ncomp ; + + i ) {
if ( z - > img_comp [ i ] . raw_data ) {
STBI_FREE ( z - > img_comp [ i ] . raw_data ) ;
z - > img_comp [ i ] . raw_data = NULL ;
z - > img_comp [ i ] . data = NULL ;
}
if ( z - > img_comp [ i ] . raw_coeff ) {
STBI_FREE ( z - > img_comp [ i ] . raw_coeff ) ;
z - > img_comp [ i ] . raw_coeff = 0 ;
z - > img_comp [ i ] . coeff = 0 ;
}
if ( z - > img_comp [ i ] . linebuf ) {
STBI_FREE ( z - > img_comp [ i ] . linebuf ) ;
z - > img_comp [ i ] . linebuf = NULL ;
}
}
return why ;
}
static int stbi__process_frame_header ( stbi__jpeg * z , int scan )
{
stbi__context * s = z - > s ;
@ -2843,27 +2865,22 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan)
// so these muls can't overflow with 32-bit ints (which we require)
z - > img_comp [ i ] . w2 = z - > img_mcu_x * z - > img_comp [ i ] . h * 8 ;
z - > img_comp [ i ] . h2 = z - > img_mcu_y * z - > img_comp [ i ] . v * 8 ;
z - > img_comp [ i ] . coeff = 0 ;
z - > img_comp [ i ] . raw_coeff = 0 ;
z - > img_comp [ i ] . linebuf = NULL ;
z - > img_comp [ i ] . raw_data = stbi__malloc_mad2 ( z - > img_comp [ i ] . w2 , z - > img_comp [ i ] . h2 , 15 ) ;
if ( z - > img_comp [ i ] . raw_data = = NULL ) {
for ( - - i ; i > = 0 ; - - i ) {
STBI_FREE ( z - > img_comp [ i ] . raw_data ) ;
z - > img_comp [ i ] . raw_data = NULL ;
}
return stbi__err ( " outofmem " , " Out of memory " ) ;
}
if ( z - > img_comp [ i ] . raw_data = = NULL )
return stbi__free_jpeg_components ( z , i + 1 , stbi__err ( " outofmem " , " Out of memory " ) ) ;
// align blocks for idct using mmx/sse
z - > img_comp [ i ] . data = ( stbi_uc * ) ( ( ( size_t ) z - > img_comp [ i ] . raw_data + 15 ) & ~ 15 ) ;
z - > img_comp [ i ] . linebuf = NULL ;
if ( z - > progressive ) {
// w2, h2 are multiples of 8 (see above)
z - > img_comp [ i ] . coeff_w = z - > img_comp [ i ] . w2 / 8 ;
z - > img_comp [ i ] . coeff_h = z - > img_comp [ i ] . h2 / 8 ;
z - > img_comp [ i ] . raw_coeff = stbi__malloc_mad3 ( z - > img_comp [ i ] . w2 , z - > img_comp [ i ] . h2 , sizeof ( short ) , 15 ) ;
if ( z - > img_comp [ i ] . raw_coeff = = NULL )
return stbi__free_jpeg_components ( z , i + 1 , stbi__err ( " outofmem " , " Out of memory " ) ) ;
z - > img_comp [ i ] . coeff = ( short * ) ( ( ( size_t ) z - > img_comp [ i ] . raw_coeff + 15 ) & ~ 15 ) ;
} else {
z - > img_comp [ i ] . coeff = 0 ;
z - > img_comp [ i ] . raw_coeff = 0 ;
}
}
@ -3369,23 +3386,7 @@ static void stbi__setup_jpeg(stbi__jpeg *j)
// clean up the temporary component buffers
static void stbi__cleanup_jpeg ( stbi__jpeg * j )
{
int i ;
for ( i = 0 ; i < j - > s - > img_n ; + + i ) {
if ( j - > img_comp [ i ] . raw_data ) {
STBI_FREE ( j - > img_comp [ i ] . raw_data ) ;
j - > img_comp [ i ] . raw_data = NULL ;
j - > img_comp [ i ] . data = NULL ;
}
if ( j - > img_comp [ i ] . raw_coeff ) {
STBI_FREE ( j - > img_comp [ i ] . raw_coeff ) ;
j - > img_comp [ i ] . raw_coeff = 0 ;
j - > img_comp [ i ] . coeff = 0 ;
}
if ( j - > img_comp [ i ] . linebuf ) {
STBI_FREE ( j - > img_comp [ i ] . linebuf ) ;
j - > img_comp [ i ] . linebuf = NULL ;
}
}
stbi__free_jpeg_components ( j , j - > s - > img_n , 0 ) ;
}
typedef struct