@@ -2560,6 +2560,43 @@ def test_dereference_hardlink(self):
25602560
25612561class PaxWriteTest (GNUWriteTest ):
25622562
2563+ def test_100_byte_names (self ):
2564+ for field , offset in (("name" , 0 ), ("linkname" , 157 )):
2565+ with self .subTest (field = field ):
2566+ name = "a" * 100
2567+ tarinfo = tarfile .TarInfo ("test" )
2568+ if field == "linkname" :
2569+ tarinfo .type = tarfile .SYMTYPE
2570+ setattr (tarinfo , field , name )
2571+ header = tarinfo .tobuf (format = tarfile .PAX_FORMAT )
2572+ self .assertEqual (len (header ), tarfile .BLOCKSIZE )
2573+ self .assertEqual (header [offset :offset + 100 ],
2574+ name .encode ("ascii" ))
2575+ with tarfile .open (fileobj = io .BytesIO (header )) as tar :
2576+ member = tar .next ()
2577+ self .assertEqual (getattr (member , field ), name )
2578+ self .assertEqual (member .pax_headers , {})
2579+
2580+ def test_owner_names (self ):
2581+ for field , offset in (("uname" , 265 ), ("gname" , 297 )):
2582+ for length in (0 , 31 , 32 , 33 , 40 ):
2583+ with self .subTest (field = field , length = length ):
2584+ name = "a" * length
2585+ tarinfo = tarfile .TarInfo ("test" )
2586+ setattr (tarinfo , field , name )
2587+ header = tarinfo .tobuf (format = tarfile .PAX_FORMAT )
2588+ # The base header must leave room for a NUL terminator.
2589+ base_header = header [- tarfile .BLOCKSIZE :]
2590+ self .assertEqual (base_header [offset :offset + 32 ],
2591+ name [:31 ].encode ().ljust (32 , b"\0 " ))
2592+ with tarfile .open (fileobj = io .BytesIO (header )) as tar :
2593+ member = tar .next ()
2594+ self .assertEqual (getattr (member , field ), name )
2595+ if length > 31 :
2596+ self .assertEqual (member .pax_headers [field ], name )
2597+ else :
2598+ self .assertNotIn (field , member .pax_headers )
2599+
25632600 def _test (self , name , link = None ):
25642601 # See GNUWriteTest.
25652602 tarinfo = tarfile .TarInfo (name )
0 commit comments