Skip to content

Commit e727515

Browse files
anissecathay4t
authored andcommitted
diag: add support for SOCK_DESTROY
It is implemented on top of SockDiagMessage, and allows using Linux's CONFIG_INET_DIAG_DESTROY feature to close an arbitrary socket. A long running, but buggy process might have hanging sockets kept alive by error. Using SOCK_DESTROY allows closing arbitrary sockets as root; an example tool that uses this feature and this crate is at: https://github.com/anisse/tcpkill
1 parent f14c57f commit e727515

1 file changed

Lines changed: 42 additions & 1 deletion

File tree

src/message.rs

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use netlink_packet_core::{
55
NetlinkPayload, NetlinkSerializable, ParseableParametrized,
66
};
77

8-
use crate::{inet, unix, SockDiagBuffer, SOCK_DIAG_BY_FAMILY};
8+
use crate::{inet, unix, SockDiagBuffer, SOCK_DESTROY, SOCK_DIAG_BY_FAMILY};
99

1010
#[derive(Debug, PartialEq, Eq, Clone)]
1111
pub enum SockDiagMessage {
@@ -90,3 +90,44 @@ impl From<SockDiagMessage> for NetlinkPayload<SockDiagMessage> {
9090
NetlinkPayload::InnerMessage(message)
9191
}
9292
}
93+
94+
#[derive(Debug, PartialEq, Eq, Clone)]
95+
pub struct SockDiagDestroy(SockDiagMessage);
96+
97+
impl SockDiagDestroy {
98+
pub fn new(message: SockDiagMessage) -> SockDiagDestroy {
99+
SockDiagDestroy(message)
100+
}
101+
}
102+
103+
impl NetlinkSerializable for SockDiagDestroy {
104+
fn message_type(&self) -> u16 {
105+
SOCK_DESTROY
106+
}
107+
108+
fn buffer_len(&self) -> usize {
109+
NetlinkSerializable::buffer_len(&self.0)
110+
}
111+
112+
fn serialize(&self, buffer: &mut [u8]) {
113+
self.0.serialize(buffer)
114+
}
115+
}
116+
117+
impl NetlinkDeserializable for SockDiagDestroy {
118+
type Error = DecodeError;
119+
fn deserialize(
120+
header: &NetlinkHeader,
121+
payload: &[u8],
122+
) -> Result<Self, Self::Error> {
123+
Ok(SockDiagDestroy::new(SockDiagMessage::deserialize(
124+
header, payload,
125+
)?))
126+
}
127+
}
128+
129+
impl From<SockDiagDestroy> for NetlinkPayload<SockDiagDestroy> {
130+
fn from(message: SockDiagDestroy) -> Self {
131+
NetlinkPayload::InnerMessage(message)
132+
}
133+
}

0 commit comments

Comments
 (0)