Skip to content

Commit 4101682

Browse files
committed
feat(nom5): change (String, ErrorKind) to (Vec<u8>, ErrorKind) of Deserialize error kind
1 parent f23689e commit 4101682

22 files changed

+75
-104
lines changed

src/toxcore/binary_io.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,6 @@ impl ToBytes for Ipv6Addr {
7272
}
7373
}
7474

75-
/// Parser that returns the length of the remaining input.
76-
pub fn rest_len(input: &[u8]) -> IResult<&[u8], usize> {
77-
Ok((input, input.len()))
78-
}
79-
8075
/// Generator that ensures that length of serialized data does not exceed specified limit.
8176
pub fn gen_len_limit(buf: (&mut [u8], usize), limit: usize) -> Result<(&mut [u8], usize), GenError> {
8277
if buf.1 <= limit {

src/toxcore/dht/codec.rs

Lines changed: 16 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,7 @@ use crate::toxcore::stats::*;
1010
use bytes::BytesMut;
1111
use cookie_factory::GenError;
1212
use failure::Fail;
13-
use nom::{error::ErrorKind, Err,
14-
Needed
15-
};
13+
use nom::{error::ErrorKind, Err};
1614
use tokio::codec::{Decoder, Encoder};
1715

1816
/// A serialized `Packet` should be not longer than 2048 bytes.
@@ -23,27 +21,19 @@ error_kind! {
2321
#[derive(Debug)]
2422
DecodeError,
2523
#[doc = "Error that can happen when decoding `Packet` from bytes."]
26-
#[derive(Clone, Debug, Eq, PartialEq, Fail)]
24+
#[derive(Clone, Debug, PartialEq, Fail)]
2725
DecodeErrorKind {
2826
#[doc = "Error indicates that we received too big packet."]
2927
#[fail(display = "Packet should not be longer than 2048 bytes: {} bytes", len)]
3028
TooBigPacket {
3129
#[doc = "Length of received packet."]
3230
len: usize
3331
},
34-
#[doc = "Error indicates that more data is needed to parse received packet."]
35-
#[fail(display = "Packet should not be incomplete: {:?}, packet: {:?}", needed, packet)]
36-
IncompletePacket {
37-
#[doc = "Required data size to be parsed."]
38-
needed: Needed,
39-
#[doc = "Received packet."]
40-
packet: Vec<u8>,
41-
},
4232
#[doc = "Error indicates that received packet can't be parsed."]
4333
#[fail(display = "Deserialize Packet error: {:?}, packet: {:?}", error, packet)]
4434
Deserialize {
4535
#[doc = "Parsing error."]
46-
error: ErrorKind,
36+
error: nom::Err<(Vec<u8>, ErrorKind)>,
4737
#[doc = "Received packet."]
4838
packet: Vec<u8>,
4939
},
@@ -58,11 +48,13 @@ impl DecodeError {
5848
DecodeError::from(DecodeErrorKind::TooBigPacket { len })
5949
}
6050

61-
pub(crate) fn incomplete_packet(needed: Needed, packet: Vec<u8>) -> DecodeError {
62-
DecodeError::from(DecodeErrorKind::IncompletePacket { needed, packet })
63-
}
51+
pub(crate) fn deserialize(e: Err<(&[u8], ErrorKind)>, packet: Vec<u8>) -> DecodeError {
52+
let error = match e {
53+
Err::Error(e) => Err::Error((e.0.to_vec(), e.1)),
54+
Err::Failure(e) => Err::Failure((e.0.to_vec(), e.1)),
55+
Err::Incomplete(needed) => Err::Incomplete(needed),
56+
};
6457

65-
pub(crate) fn deserialize(error: ErrorKind, packet: Vec<u8>) -> DecodeError {
6658
DecodeError::from(DecodeErrorKind::Deserialize { error, packet })
6759
}
6860
}
@@ -134,14 +126,8 @@ impl Decoder for DhtCodec {
134126
}
135127

136128
match Packet::from_bytes(buf) {
137-
Err(Err::Incomplete(needed)) => Err(DecodeError::incomplete_packet(needed, buf.to_vec())),
138-
Err(Err::Error(error)) => {
139-
let (_, kind) = error;
140-
Err(DecodeError::deserialize(kind, buf.to_vec()))
141-
},
142-
Err(Err::Failure(error)) => {
143-
let (_, kind) = error;
144-
Err(DecodeError::deserialize(kind, buf.to_vec()))
129+
Err(error) => {
130+
Err(DecodeError::deserialize(error, buf.to_vec()))
145131
},
146132
Ok((_, packet)) => {
147133
// Add 1 to incoming counter
@@ -175,6 +161,7 @@ impl Encoder for DhtCodec {
175161
#[cfg(test)]
176162
mod tests {
177163
use super::*;
164+
use nom::Needed;
178165
use crate::toxcore::onion::packet::*;
179166
use crate::toxcore::crypto_core::*;
180167

@@ -356,8 +343,8 @@ mod tests {
356343

357344
let res = codec.decode(&mut buf);
358345
// not enought bytes to decode EncryptedPacket
359-
assert!(res.is_err());
360-
assert_eq!(*res.err().unwrap().kind(), DecodeErrorKind::Deserialize { error: ErrorKind::Alt, packet: vec![0xff] });
346+
let error = res.err().unwrap();
347+
assert_eq!(*error.kind(), DecodeErrorKind::Deserialize { error: Err::Error((vec![255], ErrorKind::Alt)) , packet: vec![0xff] });
361348
}
362349

363350
#[test]
@@ -369,8 +356,8 @@ mod tests {
369356

370357
// not enought bytes to decode EncryptedPacket
371358
let res = codec.decode(&mut buf);
372-
assert!(res.is_err());
373-
assert_eq!(*res.err().unwrap().kind(), DecodeErrorKind::IncompletePacket { needed: Needed::Size(1), packet: Vec::new() });
359+
let error = res.err().unwrap();
360+
assert_eq!(*error.kind(), DecodeErrorKind::Deserialize { error: Err::Incomplete(Needed::Size(1)), packet: Vec::new() });
374361
}
375362

376363
#[test]

src/toxcore/dht/daemon_state.rs

Lines changed: 14 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -15,42 +15,34 @@ use crate::toxcore::dht::kbucket::*;
1515
use crate::toxcore::dht::ktree::*;
1616

1717
use failure::Fail;
18-
use nom::{Needed, Err,
19-
error::ErrorKind as NomErrorKind
20-
};
18+
use nom::{Err, error::ErrorKind as NomErrorKind};
2119

2220
error_kind! {
2321
#[doc = "An error that can occur while serializing/deserializing object."]
2422
#[derive(Debug)]
2523
DeserializeError,
2624
#[doc = "The specific kind of error that can occur."]
27-
#[derive(Clone, Debug, Eq, PartialEq, Fail)]
25+
#[derive(Clone, Debug, PartialEq, Fail)]
2826
DeserializeErrorKind {
2927
#[doc = "Error indicates that object can't be parsed."]
3028
#[fail(display = "Deserialize object error: {:?}, data: {:?}", error, data)]
3129
Deserialize {
3230
#[doc = "Parsing error."]
33-
error: NomErrorKind,
34-
#[doc = "Object serialized data."]
35-
data: Vec<u8>,
36-
},
37-
#[doc = "Error indicates that more data is needed to parse serialized object."]
38-
#[fail(display = "Bytes of object should not be incomplete: {:?}, data: {:?}", needed, data)]
39-
IncompleteData {
40-
#[doc = "Required data size to be parsed."]
41-
needed: Needed,
31+
error: nom::Err<(Vec<u8>, NomErrorKind)>,
4232
#[doc = "Object serialized data."]
4333
data: Vec<u8>,
4434
},
4535
}
4636
}
4737

4838
impl DeserializeError {
49-
pub(crate) fn incomplete(needed: Needed, data: Vec<u8>) -> DeserializeError {
50-
DeserializeError::from(DeserializeErrorKind::IncompleteData { needed, data })
51-
}
39+
pub(crate) fn deserialize(e: Err<(&[u8], NomErrorKind)>, data: Vec<u8>) -> DeserializeError {
40+
let error = match e {
41+
Err::Error(e) => Err::Error((e.0.to_vec(), e.1)),
42+
Err::Failure(e) => Err::Failure((e.0.to_vec(), e.1)),
43+
Err::Incomplete(needed) => Err::Incomplete(needed),
44+
};
5245

53-
pub(crate) fn deserialize(error: NomErrorKind, data: Vec<u8>) -> DeserializeError {
5446
DeserializeError::from(DeserializeErrorKind::Deserialize { error, data })
5547
}
5648
}
@@ -88,16 +80,8 @@ impl DaemonState {
8880
/// Deserialize DHT close list and then re-setup close list, old means that the format of deserialization is old version
8981
pub fn deserialize_old(server: &Server, serialized_data: &[u8]) -> impl Future<Item=(), Error=DeserializeError> + Send {
9082
let nodes = match DhtState::from_bytes(serialized_data) {
91-
Err(Err::Incomplete(needed)) => {
92-
return Either::A(future::err(DeserializeError::incomplete(needed, serialized_data.to_vec())))
93-
},
94-
Err(Err::Error(error)) => {
95-
let (_, kind) = error;
96-
return Either::A(future::err(DeserializeError::deserialize(kind, serialized_data.to_vec())))
97-
},
98-
Err(Err::Failure(error)) => {
99-
let (_, kind) = error;
100-
return Either::A(future::err(DeserializeError::deserialize(kind, serialized_data.to_vec())))
83+
Err(error) => {
84+
return Either::A(future::err(DeserializeError::deserialize(error, serialized_data.to_vec())))
10185
},
10286
Ok((_, DhtState(nodes))) => {
10387
nodes
@@ -158,14 +142,14 @@ mod tests {
158142
let serialized_vec = DaemonState::serialize_old(&alice);
159143
let serialized_len = serialized_vec.len();
160144
let res = DaemonState::deserialize_old(&alice, &serialized_vec[..serialized_len - 1]).wait();
161-
let error = res.err().unwrap();
162-
assert_eq!(*error.kind(), DeserializeErrorKind::Deserialize { error: NomErrorKind::Eof, data: serialized_vec[..serialized_len - 1].to_vec() });
145+
res.err().unwrap();
163146

164147
// test with serialized data corrupted
165148
let serialized_vec = [42; 10];
166149
let res = DaemonState::deserialize_old(&alice, &serialized_vec).wait();
167150
let error = res.err().unwrap();
168-
assert_eq!(*error.kind(), DeserializeErrorKind::Deserialize { error: NomErrorKind::Tag, data: serialized_vec.to_vec() });
151+
assert_eq!(*error.kind(), DeserializeErrorKind::Deserialize { error: Err::Error((
152+
vec![42, 42, 42, 42, 42, 42, 42, 42, 42, 42], NomErrorKind::Tag)), data: serialized_vec.to_vec() });
169153

170154
// test with empty close list
171155
alice.close_nodes.write().remove(&pk_org);

src/toxcore/dht/packet/cookie.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,10 @@ mod tests {
234234
let decoded_payload = invalid_encrypted_cookie.get_payload(&symmetric_key);
235235
let error = decoded_payload.err().unwrap();
236236
assert_eq!(*error.kind(), GetPayloadErrorKind::Deserialize {
237-
error: Err::Error(("***************************************************".to_owned(), ErrorKind::Eof)),
237+
error: Err::Error((vec![42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
238+
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
239+
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
240+
42, 42, 42], ErrorKind::Eof)),
238241
payload: invalid_payload.to_vec()
239242
});
240243
// Try short incomplete array
@@ -247,7 +250,7 @@ mod tests {
247250
let decoded_payload = invalid_encrypted_cookie.get_payload(&symmetric_key);
248251
let error = decoded_payload.err().unwrap();
249252
assert_eq!(*error.kind(), GetPayloadErrorKind::Deserialize {
250-
error: Err::Error(("**".to_owned(), ErrorKind::Eof)),
253+
error: Err::Error((vec![42, 42], ErrorKind::Eof)),
251254
payload: invalid_payload.to_vec()
252255
});
253256
}

src/toxcore/dht/packet/cookie_response.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ mod tests {
213213
let decoded_payload = invalid_packet.get_payload(&shared_secret);
214214
let error = decoded_payload.err().unwrap();
215215
assert_eq!(*error.kind(), GetPayloadErrorKind::Deserialize {
216-
error: Err::Error(("***".to_owned(), ErrorKind::Eof)),
216+
error: Err::Error((vec![42, 42, 42], ErrorKind::Eof)),
217217
payload: invalid_payload.to_vec()
218218
});
219219
// Try short incomplete array

src/toxcore/dht/packet/crypto_data.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
use byteorder::{ByteOrder, BigEndian};
55
use nom::{number::complete::{be_u16, be_u32},
6-
combinator::rest,
6+
combinator::{rest, rest_len},
77
};
88

99
use crate::toxcore::binary_io::*;
@@ -236,6 +236,6 @@ mod tests {
236236
};
237237
let decoded_payload = invalid_packet.get_payload(&shared_secret, &nonce);
238238
let error = decoded_payload.err().unwrap();
239-
assert_eq!(*error.kind(), GetPayloadErrorKind::Deserialize { error: Err::Error(("".to_owned(), ErrorKind::Eof)), payload: invalid_payload.to_vec() });
239+
assert_eq!(*error.kind(), GetPayloadErrorKind::Deserialize { error: Err::Error((vec![], ErrorKind::Eof)), payload: invalid_payload.to_vec() });
240240
}
241241
}

src/toxcore/dht/packet/dht_request.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -591,7 +591,7 @@ mod tests {
591591
let decoded_payload = invalid_packet.get_payload(&precomputed_key);
592592
let error = decoded_payload.err().unwrap();
593593
assert_eq!(*error.kind(), GetPayloadErrorKind::Deserialize {
594-
error: Err::Error(("***************************************************************************************************************************".to_owned(), ErrorKind::Alt)),
594+
error: Err::Error((invalid_payload.to_vec(), ErrorKind::Alt)),
595595
payload: invalid_payload.to_vec()
596596
});
597597
// Try short incomplete

src/toxcore/dht/packet/errors.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ impl GetPayloadError {
2929

3030
pub(crate) fn deserialize(e: Err<(&[u8], ErrorKind)>, payload: Vec<u8>) -> GetPayloadError {
3131
let error = match e {
32-
Err::Error(e) => Err::Error((String::from_utf8_lossy(e.0).to_string(), e.1)),
33-
Err::Failure(e) => Err::Failure((String::from_utf8_lossy(e.0).to_string(), e.1)),
32+
Err::Error(e) => Err::Error((e.0.to_vec(), e.1)),
33+
Err::Failure(e) => Err::Failure((e.0.to_vec(), e.1)),
3434
Err::Incomplete(needed) => Err::Incomplete(needed),
3535
};
3636

@@ -64,7 +64,7 @@ pub enum GetPayloadErrorKind {
6464
#[fail(display = "Deserialize payload error: {:?}, data: {:?}", error, payload)]
6565
Deserialize {
6666
/// Parsing error
67-
error: nom::Err<(String, ErrorKind)>,
67+
error: nom::Err<(Vec<u8>, ErrorKind)>,
6868
/// Received payload of packet
6969
payload: Vec<u8>,
7070
}
@@ -99,7 +99,7 @@ mod tests {
9999
let error = GetPayloadError::deserialize(Err::Error((&[], ErrorKind::Eof)), vec![1, 2, 3, 4]);
100100
assert!(error.cause().is_none());
101101
assert!(error.backtrace().is_some());
102-
assert_eq!(format!("{}", error), "Deserialize payload error: Error((\"\", Eof)), data: [1, 2, 3, 4]".to_owned());
102+
assert_eq!(format!("{}", error), "Deserialize payload error: Error(([], Eof)), data: [1, 2, 3, 4]".to_owned());
103103
}
104104

105105
#[test]
@@ -110,7 +110,7 @@ mod tests {
110110
let incomplete = GetPayloadErrorKind::Deserialize { error: Err::Incomplete(Needed::Size(5)), payload: vec![1, 2, 3, 4] };
111111
assert_eq!(format!("{}", incomplete), "Deserialize payload error: Incomplete(Size(5)), data: [1, 2, 3, 4]".to_owned());
112112

113-
let deserialize = GetPayloadErrorKind::Deserialize { error: Err::Error(("".to_owned(), ErrorKind::Eof)), payload: vec![1, 2, 3, 4] };
114-
assert_eq!(format!("{}", deserialize), "Deserialize payload error: Error((\"\", Eof)), data: [1, 2, 3, 4]".to_owned());
113+
let deserialize = GetPayloadErrorKind::Deserialize { error: Err::Error((vec![], ErrorKind::Eof)), payload: vec![1, 2, 3, 4] };
114+
assert_eq!(format!("{}", deserialize), "Deserialize payload error: Error(([], Eof)), data: [1, 2, 3, 4]".to_owned());
115115
}
116116
}

src/toxcore/dht/packet/nodes_response.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -141,11 +141,8 @@ impl ToBytes for NodesResponsePayload {
141141

142142
impl FromBytes for NodesResponsePayload {
143143
named!(from_bytes<NodesResponsePayload>, do_parse!(
144-
nodes_number: le_u8 >>
145-
nodes: map_opt!(cond!(
146-
nodes_number <= 4,
147-
count!(PackedNode::from_bytes, nodes_number as usize)
148-
), |nodes| nodes) >>
144+
nodes_number: verify!(le_u8, |len| *len <= 4) >>
145+
nodes: count!(PackedNode::from_bytes, nodes_number as usize) >>
149146
id: be_u64 >>
150147
eof!() >>
151148
(NodesResponsePayload { nodes, id })

src/toxcore/messenger/file_transfer/packet/file_data.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ It is used to transfer chunk of file data to a friend.
33
*/
44

55
use nom::{AsBytes,
6-
combinator::rest,
6+
combinator::{rest, rest_len},
77
number::complete::le_u8,
88
};
99

0 commit comments

Comments
 (0)