mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 17:32:44 +00:00 
			
		
		
		
	LibGfx/ILBMLoader: Don't throw too early when decoding bitplanes
We were (again) throwing even though the image could be decoded.
This commit is contained in:
		
							parent
							
								
									25eb903a8f
								
							
						
					
					
						commit
						1593ff2d4c
					
				
					 1 changed files with 9 additions and 7 deletions
				
			
		|  | @ -220,18 +220,20 @@ static ErrorOr<ByteBuffer> planar_to_chunky(ReadonlyBytes bitplanes, ILBMLoading | ||||||
|                 u8 bit = bitplanes[offset_base + i]; |                 u8 bit = bitplanes[offset_base + i]; | ||||||
|                 u8 rgb_shift = p / 8; |                 u8 rgb_shift = p / 8; | ||||||
| 
 | 
 | ||||||
|                 // Only throw an error if we would actually attempt to write
 |  | ||||||
|                 // outside of the chunky buffer. Some apps like PPaint produce
 |  | ||||||
|                 // malformed bitplane data but files are still accepted by most readers.
 |  | ||||||
|                 if (bit && scanline + ((pitch - 1) * 8) + 7 >= chunky.size()) |  | ||||||
|                     return Error::from_string_literal("Malformed bitplane data"); |  | ||||||
| 
 |  | ||||||
|                 for (u8 b = 0; b < 8; b++) { |                 for (u8 b = 0; b < 8; b++) { | ||||||
|                     u8 mask = 1 << (7 - b); |                     u8 mask = 1 << (7 - b); | ||||||
|                     // get current plane
 |                     // get current plane
 | ||||||
|                     if (bit & mask) { |                     if (bit & mask) { | ||||||
|                         u16 x = (i * 8) + b; |                         u16 x = (i * 8) + b; | ||||||
|                         chunky[(scanline * pixel_size) + (x * pixel_size) + rgb_shift] |= plane_mask; |                         size_t offset = (scanline * pixel_size) + (x * pixel_size) + rgb_shift; | ||||||
|  |                         // Only throw an error if we would actually attempt to write
 | ||||||
|  |                         // outside of the chunky buffer. Some apps like PPaint produce
 | ||||||
|  |                         // malformed bitplane data but files are still accepted by most readers
 | ||||||
|  |                         // since they do not cause writing past the chunky buffer.
 | ||||||
|  |                         if (offset >= chunky.size()) { | ||||||
|  |                             return Error::from_string_literal("Malformed bitplane data"); | ||||||
|  |                         } | ||||||
|  |                         chunky[offset] |= plane_mask; | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Nicolas Ramz
						Nicolas Ramz