File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -520,7 +520,9 @@ def seek(self, pos=0):
520520 if pos - self .pos >= 0 :
521521 blocks , remainder = divmod (pos - self .pos , self .bufsize )
522522 for i in range (blocks ):
523- self .read (self .bufsize )
523+ size = self .read (self .bufsize )
524+ if not size :
525+ break
524526 self .read (remainder )
525527 else :
526528 raise StreamError ("seeking backwards is not allowed" )
Original file line number Diff line number Diff line change @@ -4831,6 +4831,22 @@ def valueerror_filter(tarinfo, path):
48314831 with self .check_context (arc .open (errorlevel = 'boo!' ), filtererror_filter ):
48324832 self .expect_exception (TypeError ) # errorlevel is not int
48334833
4834+ @support .subTests ('format' , [tarfile .GNU_FORMAT , tarfile .PAX_FORMAT ])
4835+ def test_getmembers_big_size (self , format ):
4836+ # gh-NNNNN: A loop in seek() for streaming files tried to read the
4837+ # declared number of blocks even at EOF
4838+ tinfo = tarfile .TarInfo ("huge-file" )
4839+ tinfo .size = 1 << 64
4840+ bio = io .BytesIO ()
4841+ # Write header without data
4842+ bio .write (tinfo .tobuf (format ))
4843+
4844+ # Reset & try to get contents
4845+ bio .seek (0 )
4846+ with tarfile .open (fileobj = bio , mode = "r|" ) as tar :
4847+ with self .assertRaises (tarfile .ReadError ):
4848+ tar .getmembers ()
4849+
48344850
48354851class OverwriteTests (archiver_tests .OverwriteTests , unittest .TestCase ):
48364852 testdir = os .path .join (TEMPDIR , "testoverwrite" )
You can’t perform that action at this time.
0 commit comments