Skip to content

Commit fecde96

Browse files
authored
Fixed decoded issue with messages less than Padding size (lemunozm#18)
1 parent 38ea2f7 commit fecde96

File tree

2 files changed

+38
-3
lines changed

2 files changed

+38
-3
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
## Release 0.5.1
44
- Fixed a leak memory with timer events.
55
- Improved timer events accuracy.
6+
- Fixed decoding issue when the messages length was less than encoding padding.
67

78
## Release 0.5.0
89
- Renamed: `receive_event_timeout` to `receive_timeout`.

src/encoding.rs

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,9 @@ impl Decoder {
6060
self.decoded_data.extend_from_slice(&data[..pos]);
6161
&data[pos..]
6262
}
63-
// No decoded data into decoder, first time data arrives.
64-
else if data.len() >= PADDING {
63+
// No decoded data into decoder.
64+
else if self.decoded_data.len() + data.len() >= PADDING {
65+
// Deserializing the decoded data size
6566
let size_pos = std::cmp::min(PADDING - self.decoded_data.len(), PADDING);
6667
self.decoded_data.extend_from_slice(&data[..size_pos]);
6768
let expected_size =
@@ -78,7 +79,7 @@ impl Decoder {
7879
&data[expected_size..]
7980
}
8081
}
81-
// No decoded data into decoder. First time data arrives. Not enough data to know about size.
82+
// No decoded data into decoder. Not enough data to know about size.
8283
else {
8384
self.decoded_data.extend_from_slice(data);
8485
&data[data.len()..]
@@ -273,5 +274,38 @@ mod tests {
273274
assert_eq!(decoded_data.unwrap(), &MESSAGE);
274275
}
275276

277+
#[test]
278+
// Data content:
279+
// a\n -> 2 < PADDING
280+
// aa\n -> 5 > PADDING
281+
// aaa\n -> 9 > PADDING
282+
fn decode_len_less_than_padding() {
283+
let mut buffer = Vec::new();
284+
let mut decoder = Decoder::new();
285+
286+
buffer.push('a' as u8);
287+
buffer.push('\n' as u8);
288+
let (decoded_data, next_data) = decoder.decode(&buffer);
289+
assert!(decoded_data.is_none());
290+
assert_eq!(next_data.len(), 0);
291+
buffer.clear();
292+
293+
buffer.push('a' as u8);
294+
buffer.push('a' as u8);
295+
buffer.push('\n' as u8);
296+
let (decoded_data, next_data) = decoder.decode(&buffer);
297+
assert!(decoded_data.is_none());
298+
assert_eq!(next_data.len(), 0);
299+
buffer.clear();
300+
301+
buffer.push('a' as u8);
302+
buffer.push('a' as u8);
303+
buffer.push('a' as u8);
304+
buffer.push('\n' as u8);
305+
let (decoded_data, next_data) = decoder.decode(&buffer);
306+
assert!(decoded_data.is_none());
307+
assert_eq!(next_data.len(), 0);
308+
}
309+
276310
//TODO: test DecodingPool
277311
}

0 commit comments

Comments
 (0)