Address review comments

This commit is contained in:
Reuben Morais 2019-11-04 12:55:55 +01:00
parent 34314767f7
commit b8ebf9011b
2 changed files with 11 additions and 32 deletions

View File

@ -47,25 +47,25 @@ public:
int deserialize(const char* buffer, const int buffer_size) {
int offset = 0;
if (buffer_size - offset < sizeof(int16_t)) {
if (buffer_size - offset < sizeof(uint16_t)) {
return 1;
}
int16_t size = *(int16_t*)(buffer + offset);
offset += sizeof(int16_t);
uint16_t size = *(uint16_t*)(buffer + offset);
offset += sizeof(uint16_t);
size_ = size;
for (int i = 0; i < size; ++i) {
if (buffer_size - offset < sizeof(int16_t)) {
if (buffer_size - offset < sizeof(uint16_t)) {
return 1;
}
int16_t label = *(int16_t*)(buffer + offset);
offset += sizeof(int16_t);
uint16_t label = *(uint16_t*)(buffer + offset);
offset += sizeof(uint16_t);
if (buffer_size - offset < sizeof(int16_t)) {
if (buffer_size - offset < sizeof(uint16_t)) {
return 1;
}
int16_t val_len = *(int16_t*)(buffer + offset);
offset += sizeof(int16_t);
uint16_t val_len = *(uint16_t*)(buffer + offset);
offset += sizeof(uint16_t);
if (buffer_size - offset < val_len) {
return 1;

View File

@ -55,33 +55,12 @@ class Alphabet(object):
def serialize(self):
res = bytearray()
res += struct.pack('<h', self._size)
res += struct.pack('<H', self._size)
for key, value in self._label_to_str.items():
value = value.encode('utf-8')
res += struct.pack('<hh{}s'.format(len(value)), key, len(value), value)
res += struct.pack('<HH{}s'.format(len(value)), key, len(value), value)
return bytes(res)
@staticmethod
def deserialize(buf):
#pylint: disable=protected-access
res = Alphabet(config_file=None)
offset = 0
def unpack_and_fwd(fmt, buf):
nonlocal offset
result = struct.unpack_from(fmt, buf, offset)
offset += struct.calcsize(fmt)
return result
res.size = unpack_and_fwd('<h', buf)[0]
for _ in range(res.size):
label, val_len = unpack_and_fwd('<hh', buf)
val = unpack_and_fwd('<{}s'.format(val_len), buf)[0].decode('utf-8')
res._label_to_str[label] = val
res._str_to_label[val] = label
return res
def size(self):
return self._size