mirror of
				https://github.com/msgpack/msgpack-python.git
				synced 2025-10-31 17:40:54 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			41 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/env python
 | |
| 
 | |
| import io
 | |
| import msgpack
 | |
| 
 | |
| 
 | |
| binarydata = bytes(bytearray(range(256)))
 | |
| 
 | |
| 
 | |
| def gen_binary_data(idx):
 | |
|     return binarydata[: idx % 300]
 | |
| 
 | |
| 
 | |
| def test_exceeding_unpacker_read_size():
 | |
|     dumpf = io.BytesIO()
 | |
| 
 | |
|     packer = msgpack.Packer()
 | |
| 
 | |
|     NUMBER_OF_STRINGS = 6
 | |
|     read_size = 16
 | |
|     # 5 ok for read_size=16, while 6 glibc detected *** python: double free or corruption (fasttop):
 | |
|     # 20 ok for read_size=256, while 25 segfaults / glibc detected *** python: double free or corruption (!prev)
 | |
|     # 40 ok for read_size=1024, while 50 introduces errors
 | |
|     # 7000 ok for read_size=1024*1024, while 8000 leads to  glibc detected *** python: double free or corruption (!prev):
 | |
| 
 | |
|     for idx in range(NUMBER_OF_STRINGS):
 | |
|         data = gen_binary_data(idx)
 | |
|         dumpf.write(packer.pack(data))
 | |
| 
 | |
|     f = io.BytesIO(dumpf.getvalue())
 | |
|     dumpf.close()
 | |
| 
 | |
|     unpacker = msgpack.Unpacker(f, read_size=read_size, use_list=1)
 | |
| 
 | |
|     read_count = 0
 | |
|     for idx, o in enumerate(unpacker):
 | |
|         assert isinstance(o, bytes)
 | |
|         assert o == gen_binary_data(idx)
 | |
|         read_count += 1
 | |
| 
 | |
|     assert read_count == NUMBER_OF_STRINGS
 | 
