@@ -741,6 +741,38 @@ def test_empty_zone(self):
741741 with self .assertRaises (ValueError ):
742742 self .klass .from_file (zf )
743743
744+ def test_invalid_transition_index (self ):
745+ STD = ZoneOffset ("STD" , ZERO )
746+ DST = ZoneOffset ("DST" , ONE_H , ONE_H )
747+
748+ zf = self .construct_zone ([
749+ ZoneTransition (datetime (2026 , 3 , 1 , 2 ), STD , DST ),
750+ ZoneTransition (datetime (2026 , 11 , 1 , 2 ), DST , STD ),
751+ ], after = "" , version = 1 )
752+
753+ data = bytearray (zf .read ())
754+ timecnt = struct .unpack_from (">l" , data , 32 )[0 ]
755+ idx_offset = 44 + timecnt * 4
756+ data [idx_offset + 1 ] = 2 # typecnt is 2, so index 2 is OOB
757+ f = io .BytesIO (bytes (data ))
758+
759+ with self .assertRaises (ValueError ):
760+ self .klass .from_file (f )
761+
762+ def test_transition_lookahead_out_of_bounds (self ):
763+ STD = ZoneOffset ("STD" , ZERO )
764+ DST = ZoneOffset ("DST" , ONE_H , ONE_H )
765+ EXT = ZoneOffset ("EXT" , ONE_H )
766+
767+ zf = self .construct_zone ([
768+ ZoneTransition (datetime (2026 , 3 , 1 ), STD , DST ),
769+ ZoneTransition (datetime (2026 , 6 , 1 ), DST , EXT ),
770+ ZoneTransition (datetime (2026 , 9 , 1 ), EXT , DST ),
771+ ], after = "" )
772+
773+ zi = self .klass .from_file (zf )
774+ self .assertIsNotNone (zi )
775+
744776 def test_zone_very_large_timestamp (self ):
745777 """Test when a transition is in the far past or future.
746778
0 commit comments