2daacc5cee
Prior to this patch, the size of the buffer given to pack_into() was checked for being too small by using the count of the arguments, not their actual size. For example, a format spec of '4I' would only check that there was 4 bytes available, not 16; and 'I' would check for 1 byte, not 4. The pack() function is ok because its buffer is created to be exactly the correct size. The fix in this patch calculates the total size of the format spec at the start of pack_into() and verifies that the buffer is large enough. This adds some computational overhead, to iterate through the whole format spec. The alternative is to check during the packing, but that requires extra code to handle alignment, and the check is anyway not needed for pack(). So to maintain minimal code size the check is done using struct_calcsize.
80 lines
1.5 KiB
Python
80 lines
1.5 KiB
Python
# test ustruct with a count specified before the type
|
|
|
|
try:
|
|
import ustruct as struct
|
|
except:
|
|
try:
|
|
import struct
|
|
except ImportError:
|
|
print("SKIP")
|
|
raise SystemExit
|
|
|
|
print(struct.calcsize('0s'))
|
|
print(struct.unpack('0s', b''))
|
|
print(struct.pack('0s', b'123'))
|
|
|
|
print(struct.calcsize('2s'))
|
|
print(struct.unpack('2s', b'12'))
|
|
print(struct.pack('2s', b'123'))
|
|
|
|
print(struct.calcsize('2H'))
|
|
print(struct.unpack('<2H', b'1234'))
|
|
print(struct.pack('<2H', 258, 515))
|
|
|
|
print(struct.calcsize('0s1s0H2H'))
|
|
print(struct.unpack('<0s1s0H2H', b'01234'))
|
|
print(struct.pack('<0s1s0H2H', b'abc', b'abc', 258, 515))
|
|
|
|
# check that we get an error if the buffer is too small
|
|
try:
|
|
struct.unpack('2H', b'\x00\x00')
|
|
except:
|
|
print('Exception')
|
|
try:
|
|
struct.pack_into('2I', bytearray(4), 0, 0)
|
|
except:
|
|
print('Exception')
|
|
|
|
# check that unknown types raise an exception
|
|
try:
|
|
struct.unpack('z', b'1')
|
|
except:
|
|
print('Exception')
|
|
|
|
try:
|
|
struct.pack('z', (b'1',))
|
|
except:
|
|
print('Exception')
|
|
|
|
try:
|
|
struct.calcsize('0z')
|
|
except:
|
|
print('Exception')
|
|
|
|
# check that a count without a type specifier raises an exception
|
|
|
|
try:
|
|
struct.calcsize('1')
|
|
except:
|
|
print('Exception')
|
|
|
|
try:
|
|
struct.pack('1')
|
|
except:
|
|
print('Exception')
|
|
|
|
try:
|
|
struct.pack_into('1', bytearray(4), 0, 'xx')
|
|
except:
|
|
print('Exception')
|
|
|
|
try:
|
|
struct.unpack('1', 'xx')
|
|
except:
|
|
print('Exception')
|
|
|
|
try:
|
|
struct.unpack_from('1', 'xx')
|
|
except:
|
|
print('Exception')
|