mirror of
				https://github.com/python-pillow/Pillow.git
				synced 2025-10-30 23:47:27 +03:00 
			
		
		
		
	Handle PCX images with an odd stride
This commit is contained in:
		
							parent
							
								
									97b57e118e
								
							
						
					
					
						commit
						ac31061f22
					
				
							
								
								
									
										
											BIN
										
									
								
								Tests/images/odd_stride.pcx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Tests/images/odd_stride.pcx
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							|  | @ -44,6 +44,14 @@ def test_odd(tmp_path): | |||
|         _roundtrip(tmp_path, hopper(mode).resize((511, 511))) | ||||
| 
 | ||||
| 
 | ||||
| def test_odd_read(): | ||||
|     # Reading an image with an odd stride, making it malformed | ||||
|     with Image.open("Tests/images/odd_stride.pcx") as im: | ||||
|         im.load() | ||||
| 
 | ||||
|         assert im.size == (371, 150) | ||||
| 
 | ||||
| 
 | ||||
| def test_pil184(): | ||||
|     # Check reading of files where xmin/xmax is not zero. | ||||
| 
 | ||||
|  |  | |||
|  | @ -66,13 +66,13 @@ class PcxImageFile(ImageFile.ImageFile): | |||
|         version = s[1] | ||||
|         bits = s[3] | ||||
|         planes = s[65] | ||||
|         ignored_stride = i16(s, 66) | ||||
|         provided_stride = i16(s, 66) | ||||
|         logger.debug( | ||||
|             "PCX version %s, bits %s, planes %s, stride %s", | ||||
|             version, | ||||
|             bits, | ||||
|             planes, | ||||
|             ignored_stride, | ||||
|             provided_stride, | ||||
|         ) | ||||
| 
 | ||||
|         self.info["dpi"] = i16(s, 12), i16(s, 14) | ||||
|  | @ -110,10 +110,15 @@ class PcxImageFile(ImageFile.ImageFile): | |||
|         self.mode = mode | ||||
|         self._size = bbox[2] - bbox[0], bbox[3] - bbox[1] | ||||
| 
 | ||||
|         # don't trust the passed in stride. Calculate for ourselves. | ||||
|         # Don't trust the passed in stride. | ||||
|         # Calculate the approximate position for ourselves. | ||||
|         # CVE-2020-35653 | ||||
|         stride = (self._size[0] * bits + 7) // 8 | ||||
|         stride += stride % 2 | ||||
| 
 | ||||
|         # While the specification states that this must be even, | ||||
|         # not all images follow this | ||||
|         if provided_stride != stride: | ||||
|             stride += stride % 2 | ||||
| 
 | ||||
|         bbox = (0, 0) + self.size | ||||
|         logger.debug("size: %sx%s", *self.size) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user