Skip to content

Commit 100413a

Browse files
committed
Support zero sized done message
In kernel `drivers/net/team/team_core.c`, the function `team_nl_send_options_get()` is using zero sized done message: ```c nlh = nlmsg_put(skb, portid, seq, NLMSG_DONE, 0, flags | NLM_F_MULTI); ``` This patch just generate [0u8;4] as buffer when got zero sized done message received. Signed-off-by: Gris Ge <[email protected]>
1 parent 81b2d0f commit 100413a

File tree

2 files changed

+12
-4
lines changed

2 files changed

+12
-4
lines changed

src/done.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::{
99

1010
const CODE: Field = 0..4;
1111
const EXTENDED_ACK: Rest = 4..;
12-
const DONE_HEADER_LEN: usize = EXTENDED_ACK.start;
12+
pub(crate) const DONE_HEADER_LEN: usize = EXTENDED_ACK.start;
1313

1414
#[derive(Debug, PartialEq, Eq, Clone)]
1515
#[non_exhaustive]

src/message.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use std::fmt::Debug;
44

55
use crate::{
6+
done::DONE_HEADER_LEN,
67
payload::{NLMSG_DONE, NLMSG_ERROR, NLMSG_NOOP, NLMSG_OVERRUN},
78
DecodeError, DoneBuffer, DoneMessage, Emitable, ErrorBuffer, ErrorContext,
89
ErrorMessage, NetlinkBuffer, NetlinkDeserializable, NetlinkHeader,
@@ -103,9 +104,16 @@ where
103104
}
104105
NLMSG_NOOP => Noop,
105106
NLMSG_DONE => {
106-
let msg = DoneBuffer::new_checked(&bytes)
107-
.and_then(|buf| DoneMessage::parse(&buf))
108-
.context("failed parsing NLMSG_DONE")?;
107+
// Linux kernel allows zero sized of NLMSG_DONE
108+
let msg = if bytes.is_empty() {
109+
DoneBuffer::new_checked(&[0u8; DONE_HEADER_LEN])
110+
.and_then(|buf| DoneMessage::parse(&buf))
111+
.context("failed to parse NLMSG_DONE")?
112+
} else {
113+
DoneBuffer::new_checked(&bytes)
114+
.and_then(|buf| DoneMessage::parse(&buf))
115+
.context("failed to parse NLMSG_DONE")?
116+
};
109117
Done(msg)
110118
}
111119
NLMSG_OVERRUN => Overrun(bytes.to_vec()),

0 commit comments

Comments
 (0)