Skip to content

Commit 551eeb9

Browse files
committed
Remove the use of anyhow in netlink-packet-core
1 parent 63effb9 commit 551eeb9

File tree

6 files changed

+91
-55
lines changed

6 files changed

+91
-55
lines changed

src/buffer.rs

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
// SPDX-License-Identifier: MIT
22

33
use byteorder::{ByteOrder, NativeEndian};
4-
use netlink_packet_utils::DecodeError;
54

6-
use crate::{Field, Rest};
5+
use crate::{CoreError, Field, Rest};
76

87
const LENGTH: Field = 0..4;
98
const MESSAGE_TYPE: Field = 4..6;
@@ -156,33 +155,20 @@ impl<T: AsRef<[u8]>> NetlinkBuffer<T> {
156155
/// 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00];
157156
/// assert!(NetlinkBuffer::new_checked(&BYTES[..]).is_err());
158157
/// ```
159-
pub fn new_checked(buffer: T) -> Result<NetlinkBuffer<T>, DecodeError> {
158+
pub fn new_checked(buffer: T) -> Result<NetlinkBuffer<T>, CoreError> {
160159
let packet = Self::new(buffer);
161160
packet.check_buffer_length()?;
162161
Ok(packet)
163162
}
164163

165-
fn check_buffer_length(&self) -> Result<(), DecodeError> {
164+
fn check_buffer_length(&self) -> Result<(), CoreError> {
166165
let len = self.buffer.as_ref().len();
167166
if len < PORT_NUMBER.end {
168-
Err(format!(
169-
"invalid netlink buffer: length is {} but netlink packets are at least {} bytes",
170-
len, PORT_NUMBER.end
171-
)
172-
.into())
167+
Err(CoreError::PacketTooShort { received: len, expected: PORT_NUMBER.end })
173168
} else if len < self.length() as usize {
174-
Err(format!(
175-
"invalid netlink buffer: length field says {} the buffer is {} bytes long",
176-
self.length(),
177-
len
178-
)
179-
.into())
169+
Err(CoreError::NonmatchingLength { expected: self.length(), actual: len })
180170
} else if (self.length() as usize) < PORT_NUMBER.end {
181-
Err(format!(
182-
"invalid netlink buffer: length field says {} but netlink packets are at least {} bytes",
183-
self.length(),
184-
len
185-
).into())
171+
Err(CoreError::InvalidLength { given: self.length(), at_least: len })
186172
} else {
187173
Ok(())
188174
}

src/done.rs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@
33
use std::mem::size_of;
44

55
use byteorder::{ByteOrder, NativeEndian};
6-
use netlink_packet_utils::DecodeError;
76

8-
use crate::{Emitable, Field, Parseable, Rest};
7+
use crate::{CoreError, Emitable, Field, Parseable, Rest};
98

109
const CODE: Field = 0..4;
1110
const EXTENDED_ACK: Rest = 4..;
@@ -27,20 +26,16 @@ impl<T: AsRef<[u8]>> DoneBuffer<T> {
2726
self.buffer
2827
}
2928

30-
pub fn new_checked(buffer: T) -> Result<Self, DecodeError> {
29+
pub fn new_checked(buffer: T) -> Result<Self, CoreError> {
3130
let packet = Self::new(buffer);
3231
packet.check_buffer_length()?;
3332
Ok(packet)
3433
}
3534

36-
fn check_buffer_length(&self) -> Result<(), DecodeError> {
35+
fn check_buffer_length(&self) -> Result<(), CoreError> {
3736
let len = self.buffer.as_ref().len();
3837
if len < DONE_HEADER_LEN {
39-
Err(format!(
40-
"invalid DoneBuffer: length is {len} but DoneBuffer are \
41-
at least {DONE_HEADER_LEN} bytes"
42-
)
43-
.into())
38+
Err(CoreError::InvalidDoneBuffer { received: len })
4439
} else {
4540
Ok(())
4641
}
@@ -100,7 +95,9 @@ impl Emitable for DoneMessage {
10095
impl<'buffer, T: AsRef<[u8]> + 'buffer> Parseable<DoneBuffer<&'buffer T>>
10196
for DoneMessage
10297
{
103-
fn parse(buf: &DoneBuffer<&'buffer T>) -> Result<DoneMessage, DecodeError> {
98+
type Error = CoreError;
99+
100+
fn parse(buf: &DoneBuffer<&'buffer T>) -> Result<DoneMessage, Self::Error> {
104101
Ok(DoneMessage {
105102
code: buf.code(),
106103
extended_ack: buf.extended_ack().to_vec(),

src/error.rs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@
33
use std::{fmt, io, mem::size_of, num::NonZeroI32};
44

55
use byteorder::{ByteOrder, NativeEndian};
6-
use netlink_packet_utils::DecodeError;
76

8-
use crate::{Emitable, Field, Parseable, Rest};
7+
use crate::{CoreError, Emitable, Field, Parseable, Rest};
98

109
const CODE: Field = 0..4;
1110
const PAYLOAD: Rest = 4..;
@@ -27,20 +26,16 @@ impl<T: AsRef<[u8]>> ErrorBuffer<T> {
2726
self.buffer
2827
}
2928

30-
pub fn new_checked(buffer: T) -> Result<Self, DecodeError> {
29+
pub fn new_checked(buffer: T) -> Result<Self, CoreError> {
3130
let packet = Self::new(buffer);
3231
packet.check_buffer_length()?;
3332
Ok(packet)
3433
}
3534

36-
fn check_buffer_length(&self) -> Result<(), DecodeError> {
35+
fn check_buffer_length(&self) -> Result<(), CoreError> {
3736
let len = self.buffer.as_ref().len();
3837
if len < ERROR_HEADER_LEN {
39-
Err(format!(
40-
"invalid ErrorBuffer: length is {len} but ErrorBuffer are \
41-
at least {ERROR_HEADER_LEN} bytes"
42-
)
43-
.into())
38+
Err(CoreError::InvalidErrorBuffer { received: len })
4439
} else {
4540
Ok(())
4641
}
@@ -118,9 +113,11 @@ impl Emitable for ErrorMessage {
118113
impl<'buffer, T: AsRef<[u8]> + 'buffer> Parseable<ErrorBuffer<&'buffer T>>
119114
for ErrorMessage
120115
{
116+
type Error = CoreError;
117+
121118
fn parse(
122119
buf: &ErrorBuffer<&'buffer T>,
123-
) -> Result<ErrorMessage, DecodeError> {
120+
) -> Result<ErrorMessage, Self::Error> {
124121
// FIXME: The payload of an error is basically a truncated packet, which
125122
// requires custom logic to parse correctly. For now we just
126123
// return it as a Vec<u8> let header: NetlinkHeader = {

src/header.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// SPDX-License-Identifier: MIT
22

3-
use netlink_packet_utils::DecodeError;
4-
3+
use crate::CoreError;
54
use crate::{buffer::NETLINK_HEADER_LEN, Emitable, NetlinkBuffer, Parseable};
65

76
/// A Netlink header representation. A netlink header has the following
@@ -57,7 +56,9 @@ impl Emitable for NetlinkHeader {
5756
impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NetlinkBuffer<&'a T>>
5857
for NetlinkHeader
5958
{
60-
fn parse(buf: &NetlinkBuffer<&'a T>) -> Result<NetlinkHeader, DecodeError> {
59+
type Error = CoreError;
60+
61+
fn parse(buf: &NetlinkBuffer<&'a T>) -> Result<NetlinkHeader, Self::Error> {
6162
Ok(NetlinkHeader {
6263
length: buf.length(),
6364
message_type: buf.message_type(),

src/lib.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,3 +270,51 @@ pub use self::constants::*;
270270

271271
pub(crate) use self::utils::traits::*;
272272
pub(crate) use netlink_packet_utils as utils;
273+
use thiserror::Error;
274+
275+
#[derive(Debug, Error)]
276+
pub enum CoreError {
277+
#[error("invalid netlink buffer: length is {received} but netlink packets are at least {expected} bytes")]
278+
PacketTooShort { received: usize, expected: usize },
279+
280+
#[error("invalid netlink buffer: length field says {expected} the buffer is {actual} bytes long")]
281+
NonmatchingLength { expected: u32, actual: usize },
282+
283+
#[error("invalid netlink buffer: length field says {given} but netlink packets are at least {at_least} bytes")]
284+
InvalidLength { given: u32, at_least: usize },
285+
286+
#[error(
287+
"invalid ErrorBuffer: length is {received}, expected at least 4 bytes"
288+
)]
289+
InvalidErrorBuffer { received: usize },
290+
291+
#[error(
292+
"invalid DoneBuffer: length is {received}, expected at least 4 bytes"
293+
)]
294+
InvalidDoneBuffer { received: usize },
295+
296+
#[error("invalid Netlink header")]
297+
InvalidHeader {
298+
#[source]
299+
due_to: Box<Self>,
300+
},
301+
302+
#[error("invalid Netlink message of type NLMSG_ERROR")]
303+
InvalidErrorMsg {
304+
#[source]
305+
due_to: Box<Self>,
306+
},
307+
308+
#[error("invalid Netlink message of type NLMSG_DONE")]
309+
InvalidDoneMsg {
310+
#[source]
311+
due_to: Box<Self>,
312+
},
313+
314+
#[error("failed to parse the netlink message, of type {message_type}")]
315+
ParseFailure {
316+
message_type: u16,
317+
#[source]
318+
due_to: Box<dyn std::error::Error>,
319+
},
320+
}

src/message.rs

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,9 @@
22

33
use std::fmt::Debug;
44

5-
use anyhow::Context;
6-
use netlink_packet_utils::DecodeError;
7-
85
use crate::{
96
payload::{NLMSG_DONE, NLMSG_ERROR, NLMSG_NOOP, NLMSG_OVERRUN},
10-
DoneBuffer, DoneMessage, Emitable, ErrorBuffer, ErrorMessage,
7+
CoreError, DoneBuffer, DoneMessage, Emitable, ErrorBuffer, ErrorMessage,
118
NetlinkBuffer, NetlinkDeserializable, NetlinkHeader, NetlinkPayload,
129
NetlinkSerializable, Parseable,
1310
};
@@ -39,7 +36,7 @@ where
3936
I: NetlinkDeserializable,
4037
{
4138
/// Parse the given buffer as a netlink message
42-
pub fn deserialize(buffer: &[u8]) -> Result<Self, DecodeError> {
39+
pub fn deserialize(buffer: &[u8]) -> Result<Self, CoreError> {
4340
let netlink_buffer = NetlinkBuffer::new_checked(&buffer)?;
4441
<Self as Parseable<NetlinkBuffer<&&[u8]>>>::parse(&netlink_buffer)
4542
}
@@ -88,33 +85,43 @@ where
8885
B: AsRef<[u8]> + 'buffer,
8986
I: NetlinkDeserializable,
9087
{
91-
fn parse(buf: &NetlinkBuffer<&'buffer B>) -> Result<Self, DecodeError> {
88+
type Error = CoreError;
89+
90+
fn parse(buf: &NetlinkBuffer<&'buffer B>) -> Result<Self, Self::Error> {
9291
use self::NetlinkPayload::*;
9392

9493
let header =
9594
<NetlinkHeader as Parseable<NetlinkBuffer<&'buffer B>>>::parse(buf)
96-
.context("failed to parse netlink header")?;
95+
.map_err(|e| CoreError::InvalidHeader { due_to: e.into() })?;
9796

9897
let bytes = buf.payload();
9998
let payload = match header.message_type {
10099
NLMSG_ERROR => {
101100
let msg = ErrorBuffer::new_checked(&bytes)
102101
.and_then(|buf| ErrorMessage::parse(&buf))
103-
.context("failed to parse NLMSG_ERROR")?;
102+
.map_err(|e| CoreError::InvalidErrorMsg {
103+
due_to: e.into(),
104+
})?;
104105
Error(msg)
105106
}
106107
NLMSG_NOOP => Noop,
107108
NLMSG_DONE => {
108109
let msg = DoneBuffer::new_checked(&bytes)
109110
.and_then(|buf| DoneMessage::parse(&buf))
110-
.context("failed to parse NLMSG_DONE")?;
111+
.map_err(|e| CoreError::InvalidDoneMsg {
112+
due_to: e.into(),
113+
})?;
111114
Done(msg)
112115
}
113116
NLMSG_OVERRUN => Overrun(bytes.to_vec()),
114117
message_type => {
115-
let inner_msg = I::deserialize(&header, bytes).context(
116-
format!("Failed to parse message with type {message_type}"),
117-
)?;
118+
let inner_msg =
119+
I::deserialize(&header, bytes).map_err(|e| {
120+
CoreError::ParseFailure {
121+
message_type,
122+
due_to: e.into(),
123+
}
124+
})?;
118125
InnerMessage(inner_msg)
119126
}
120127
};

0 commit comments

Comments
 (0)