mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	Issue #28449: tarfile.open() with mode "r" or "r:" now tries to open a tar
file with compression before trying to open it without compression. Otherwise it had 50% chance failed with ignore_zeros=True.
This commit is contained in:
		
							parent
							
								
									d1af5effc2
								
							
						
					
					
						commit
						a89d22aff3
					
				
					 3 changed files with 14 additions and 2 deletions
				
			
		| 
						 | 
					@ -1549,7 +1549,9 @@ def open(cls, name=None, mode="r", fileobj=None, bufsize=RECORDSIZE, **kwargs):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if mode in ("r", "r:*"):
 | 
					        if mode in ("r", "r:*"):
 | 
				
			||||||
            # Find out which *open() is appropriate for opening the file.
 | 
					            # Find out which *open() is appropriate for opening the file.
 | 
				
			||||||
            for comptype in cls.OPEN_METH:
 | 
					            def not_compressed(comptype):
 | 
				
			||||||
 | 
					                return cls.OPEN_METH[comptype] == 'taropen'
 | 
				
			||||||
 | 
					            for comptype in sorted(cls.OPEN_METH, key=not_compressed):
 | 
				
			||||||
                func = getattr(cls, cls.OPEN_METH[comptype])
 | 
					                func = getattr(cls, cls.OPEN_METH[comptype])
 | 
				
			||||||
                if fileobj is not None:
 | 
					                if fileobj is not None:
 | 
				
			||||||
                    saved_pos = fileobj.tell()
 | 
					                    saved_pos = fileobj.tell()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,6 +3,7 @@
 | 
				
			||||||
import io
 | 
					import io
 | 
				
			||||||
from hashlib import md5
 | 
					from hashlib import md5
 | 
				
			||||||
from contextlib import contextmanager
 | 
					from contextlib import contextmanager
 | 
				
			||||||
 | 
					from random import Random
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import unittest
 | 
					import unittest
 | 
				
			||||||
import unittest.mock
 | 
					import unittest.mock
 | 
				
			||||||
| 
						 | 
					@ -349,12 +350,17 @@ def test_null_tarfile(self):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_ignore_zeros(self):
 | 
					    def test_ignore_zeros(self):
 | 
				
			||||||
        # Test TarFile's ignore_zeros option.
 | 
					        # Test TarFile's ignore_zeros option.
 | 
				
			||||||
 | 
					        # generate 512 pseudorandom bytes
 | 
				
			||||||
 | 
					        data = Random(0).getrandbits(512*8).to_bytes(512, 'big')
 | 
				
			||||||
        for char in (b'\0', b'a'):
 | 
					        for char in (b'\0', b'a'):
 | 
				
			||||||
            # Test if EOFHeaderError ('\0') and InvalidHeaderError ('a')
 | 
					            # Test if EOFHeaderError ('\0') and InvalidHeaderError ('a')
 | 
				
			||||||
            # are ignored correctly.
 | 
					            # are ignored correctly.
 | 
				
			||||||
            with self.open(tmpname, "w") as fobj:
 | 
					            with self.open(tmpname, "w") as fobj:
 | 
				
			||||||
                fobj.write(char * 1024)
 | 
					                fobj.write(char * 1024)
 | 
				
			||||||
                fobj.write(tarfile.TarInfo("foo").tobuf())
 | 
					                tarinfo = tarfile.TarInfo("foo")
 | 
				
			||||||
 | 
					                tarinfo.size = len(data)
 | 
				
			||||||
 | 
					                fobj.write(tarinfo.tobuf())
 | 
				
			||||||
 | 
					                fobj.write(data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            tar = tarfile.open(tmpname, mode="r", ignore_zeros=True)
 | 
					            tar = tarfile.open(tmpname, mode="r", ignore_zeros=True)
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -113,6 +113,10 @@ Core and Builtins
 | 
				
			||||||
Library
 | 
					Library
 | 
				
			||||||
-------
 | 
					-------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Issue #28449: tarfile.open() with mode "r" or "r:" now tries to open a tar
 | 
				
			||||||
 | 
					  file with compression before trying to open it without compression.  Otherwise
 | 
				
			||||||
 | 
					  it had 50% chance failed with ignore_zeros=True.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Issue #23262: The webbrowser module now supports Firefox 36+ and derived
 | 
					- Issue #23262: The webbrowser module now supports Firefox 36+ and derived
 | 
				
			||||||
  browsers.  Based on patch by Oleg Broytman.
 | 
					  browsers.  Based on patch by Oleg Broytman.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue