File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -535,6 +535,8 @@ cdef class Unpacker:
535535 raise RuntimeError (" Unpacker.read_bytes() cannot be called while unpacking is in progress" )
536536 if self .ctx.execute != NULL :
537537 raise ValueError (" Cannot switch unpacking methods while an object is incomplete" )
538+ if nbytes < 0 :
539+ raise ValueError (" nbytes must be non-negative" )
538540 nread = min (self .buf_tail - self .buf_head, nbytes)
539541 ret = PyBytes_FromStringAndSize(self .buf + self .buf_head, nread)
540542 self .buf_head += nread
Original file line number Diff line number Diff line change @@ -354,6 +354,8 @@ def _get_extradata(self):
354354 return self ._buffer [self ._buff_i :]
355355
356356 def read_bytes (self , n ):
357+ if n < 0 :
358+ raise ValueError ("nbytes must be non-negative" )
357359 ret = self ._read (n , raise_outofdata = False )
358360 self ._consume ()
359361 # The C extension returns bytes. A bytearray slice cannot be a dict key.
Original file line number Diff line number Diff line change @@ -99,6 +99,24 @@ def test_unpacker_tell_read_bytes():
9999 assert unpacker .read_bytes (n ) == raw
100100
101101
102+ @mark .parametrize ("from_file" , [False , True ])
103+ @mark .parametrize ("nbytes" , [- 1 , - (2 ** 31 )])
104+ def test_unpacker_read_bytes_negative (from_file , nbytes ):
105+ packed = packb ([1 , 2 ])
106+ unpacker = Unpacker (BytesIO (packed )) if from_file else Unpacker ()
107+ if not from_file :
108+ unpacker .feed (packed )
109+ assert unpacker .read_array_header () == 2
110+
111+ with raises (ValueError , match = "non-negative" ):
112+ unpacker .read_bytes (nbytes )
113+
114+ assert unpacker .tell () == 1
115+ assert unpacker .read_bytes (0 ) == b""
116+ assert unpacker .read_bytes (1 ) == b"\x01 "
117+ assert unpacker .unpack () == 2
118+
119+
102120@mark .skipif (
103121 Unpacker .__module__ == "msgpack.fallback" ,
104122 reason = "specific to C extension reinit leak" ,
You can’t perform that action at this time.
0 commit comments