mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	Merged revisions 83959-83960 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r83959 | antoine.pitrou | 2010-08-12 17:11:50 +0200 (jeu., 12 août 2010) | 5 lines Issue #7467: when a file from a ZIP archive, its CRC is checked and a BadZipfile error is raised if it doesn't match (as used to be the case in Python 2.5 and earlier). ........ r83960 | antoine.pitrou | 2010-08-12 17:15:01 +0200 (jeu., 12 août 2010) | 3 lines Typo. ........
This commit is contained in:
		
							parent
							
								
									3523443f77
								
							
						
					
					
						commit
						e1436d1092
					
				
					 3 changed files with 107 additions and 2 deletions
				
			
		|  | @ -493,6 +493,12 @@ def __init__(self, fileobj, mode, zipinfo, decrypter=None): | |||
|         self.mode = mode | ||||
|         self.name = zipinfo.filename | ||||
| 
 | ||||
|         if hasattr(zipinfo, 'CRC'): | ||||
|             self._expected_crc = zipinfo.CRC | ||||
|             self._running_crc = crc32(b'') & 0xffffffff | ||||
|         else: | ||||
|             self._expected_crc = None | ||||
| 
 | ||||
|     def readline(self, limit=-1): | ||||
|         """Read and return a line from the stream. | ||||
| 
 | ||||
|  | @ -570,6 +576,16 @@ def read(self, n=-1): | |||
| 
 | ||||
|         return buf | ||||
| 
 | ||||
|     def _update_crc(self, newdata, eof): | ||||
|         # Update the CRC using the given data. | ||||
|         if self._expected_crc is None: | ||||
|             # No need to compute the CRC if we don't have a reference value | ||||
|             return | ||||
|         self._running_crc = crc32(newdata, self._running_crc) & 0xffffffff | ||||
|         # Check the CRC if we're at the end of the file | ||||
|         if eof and self._running_crc != self._expected_crc: | ||||
|             raise BadZipfile("Bad CRC-32 for file %r" % self.name) | ||||
| 
 | ||||
|     def read1(self, n): | ||||
|         """Read up to n bytes with at most one read() system call.""" | ||||
| 
 | ||||
|  | @ -593,6 +609,7 @@ def read1(self, n): | |||
|                 data = ''.join(map(self._decrypter, data)) | ||||
| 
 | ||||
|             if self._compress_type == ZIP_STORED: | ||||
|                 self._update_crc(data, eof=(self._compress_left==0)) | ||||
|                 self._readbuffer = self._readbuffer[self._offset:] + data | ||||
|                 self._offset = 0 | ||||
|             else: | ||||
|  | @ -608,9 +625,11 @@ def read1(self, n): | |||
|             ) | ||||
| 
 | ||||
|             self._unconsumed = self._decompressor.unconsumed_tail | ||||
|             if len(self._unconsumed) == 0 and self._compress_left == 0: | ||||
|             eof = len(self._unconsumed) == 0 and self._compress_left == 0 | ||||
|             if eof: | ||||
|                 data += self._decompressor.flush() | ||||
| 
 | ||||
|             self._update_crc(data, eof=eof) | ||||
|             self._readbuffer = self._readbuffer[self._offset:] + data | ||||
|             self._offset = 0 | ||||
| 
 | ||||
|  | @ -1349,7 +1368,9 @@ def main(args = None): | |||
|             print USAGE | ||||
|             sys.exit(1) | ||||
|         zf = ZipFile(args[1], 'r') | ||||
|         zf.testzip() | ||||
|         badfile = zf.testzip() | ||||
|         if badfile: | ||||
|             print("The following enclosed file is corrupted: {!r}".format(badfile)) | ||||
|         print "Done testing" | ||||
| 
 | ||||
|     elif args[0] == '-e': | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Antoine Pitrou
						Antoine Pitrou