mirror of
				https://git.code.sf.net/p/libpng/code.git
				synced 2025-07-10 18:04:09 +02:00 
			
		
		
		
	[libpng17] Do not read invalid sBIT chunks. Previously libpng only checked sBIT
values on write, so a malicious PNG writer could therefore cause the read code to return an invalid sBIT chunk, which might lead to application errors or crashes. Such chunks are now skipped (with chunk_benign_error).
This commit is contained in:
		
							parent
							
								
									dc63b03da1
								
							
						
					
					
						commit
						d29413a2a9
					
				
							
								
								
									
										5
									
								
								ANNOUNCE
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								ANNOUNCE
									
									
									
									
									
								
							@ -515,6 +515,11 @@ Version 1.7.0beta31 [February 5, 2014]
 | 
				
			|||||||
    outside the range that should be produced by the shift. Reversing the
 | 
					    outside the range that should be produced by the shift. Reversing the
 | 
				
			||||||
    order on read makes the two transforms work together correctly and mirrors
 | 
					    order on read makes the two transforms work together correctly and mirrors
 | 
				
			||||||
    the order used on write.
 | 
					    the order used on write.
 | 
				
			||||||
 | 
					  Do not read invalid sBIT chunks. Previously libpng only checked sBIT
 | 
				
			||||||
 | 
					    values on write, so a malicious PNG writer could therefore cause
 | 
				
			||||||
 | 
					    the read code to return an invalid sBIT chunk, which might lead to
 | 
				
			||||||
 | 
					    application errors or crashes.  Such chunks are now skipped (with
 | 
				
			||||||
 | 
					    chunk_benign_error).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
 | 
					Send comments/corrections/commendations to png-mng-implement at lists.sf.net
 | 
				
			||||||
(subscription required; visit
 | 
					(subscription required; visit
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										5
									
								
								CHANGES
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								CHANGES
									
									
									
									
									
								
							@ -4804,6 +4804,11 @@ Version 1.7.0beta31 [February 5, 2014]
 | 
				
			|||||||
    outside the range that should be produced by the shift. Reversing the
 | 
					    outside the range that should be produced by the shift. Reversing the
 | 
				
			||||||
    order on read makes the two transforms work together correctly and mirrors
 | 
					    order on read makes the two transforms work together correctly and mirrors
 | 
				
			||||||
    the order used on write.
 | 
					    the order used on write.
 | 
				
			||||||
 | 
					  Do not read invalid sBIT chunks. Previously libpng only checked sBIT
 | 
				
			||||||
 | 
					    values on write, so a malicious PNG writer could therefore cause
 | 
				
			||||||
 | 
					    the read code to return an invalid sBIT chunk, which might lead to
 | 
				
			||||||
 | 
					    application errors or crashes.  Such chunks are now skipped (with
 | 
				
			||||||
 | 
					    chunk_benign_error).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
 | 
					Send comments/corrections/commendations to png-mng-implement at lists.sf.net
 | 
				
			||||||
(subscription required; visit
 | 
					(subscription required; visit
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										19
									
								
								pngrutil.c
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								pngrutil.c
									
									
									
									
									
								
							@ -1091,13 +1091,12 @@ png_handle_gAMA(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
 | 
				
			|||||||
void /* PRIVATE */
 | 
					void /* PRIVATE */
 | 
				
			||||||
png_handle_sBIT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
 | 
					png_handle_sBIT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   unsigned int truelen;
 | 
					   unsigned int truelen, i;
 | 
				
			||||||
 | 
					   png_byte sample_depth;
 | 
				
			||||||
   png_byte buf[4];
 | 
					   png_byte buf[4];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   png_debug(1, "in png_handle_sBIT");
 | 
					   png_debug(1, "in png_handle_sBIT");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   buf[0] = buf[1] = buf[2] = buf[3] = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   if (!(png_ptr->mode & PNG_HAVE_IHDR))
 | 
					   if (!(png_ptr->mode & PNG_HAVE_IHDR))
 | 
				
			||||||
      png_chunk_error(png_ptr, "missing IHDR");
 | 
					      png_chunk_error(png_ptr, "missing IHDR");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1116,10 +1115,16 @@ png_handle_sBIT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
 | 
				
			|||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
 | 
					   if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
      truelen = 3;
 | 
					      truelen = 3;
 | 
				
			||||||
 | 
					      sample_depth = 8;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   else
 | 
					   else
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
      truelen = png_ptr->channels;
 | 
					      truelen = png_ptr->channels;
 | 
				
			||||||
 | 
					      sample_depth = png_ptr->bit_depth;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   if (length != truelen || length > 4)
 | 
					   if (length != truelen || length > 4)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
@ -1128,11 +1133,19 @@ png_handle_sBIT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
 | 
				
			|||||||
      return;
 | 
					      return;
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   buf[0] = buf[1] = buf[2] = buf[3] = sample_depth;
 | 
				
			||||||
   png_crc_read(png_ptr, buf, truelen);
 | 
					   png_crc_read(png_ptr, buf, truelen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   if (png_crc_finish(png_ptr, 0))
 | 
					   if (png_crc_finish(png_ptr, 0))
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   for (i=0; i<truelen; ++i)
 | 
				
			||||||
 | 
					      if (buf[i] == 0 || buf[i] > sample_depth)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					         png_chunk_benign_error(png_ptr, "invalid");
 | 
				
			||||||
 | 
					         return;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   if (png_ptr->color_type & PNG_COLOR_MASK_COLOR)
 | 
					   if (png_ptr->color_type & PNG_COLOR_MASK_COLOR)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
      png_ptr->sig_bit.red = buf[0];
 | 
					      png_ptr->sig_bit.red = buf[0];
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user