Skip to content

Commit 27777da

Browse files
Jon Paul Maloydavem330
authored andcommitted
tipc: unclone unbundled buffers before forwarding
When extracting an individual message from a received "bundle" buffer, we just create a clone of the base buffer, and adjust it to point into the right position of the linearized data area of the latter. This works well for regular message reception, but during periods of extremely high load it may happen that an extracted buffer, e.g, a connection probe, is reversed and forwarded through an external interface while the preceding extracted message is still unhandled. When this happens, the header or data area of the preceding message will be partially overwritten by a MAC header, leading to unpredicatable consequences, such as a link reset. We now fix this by ensuring that the msg_reverse() function never returns a cloned buffer, and that the returned buffer always contains sufficient valid head and tail room to be forwarded. Reported-by: Erik Hugne <[email protected]> Acked-by: Ying Xue <[email protected]> Signed-off-by: Jon Maloy <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent d19af0a commit 27777da

File tree

2 files changed

+6
-11
lines changed

2 files changed

+6
-11
lines changed

net/tipc/msg.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141
#include "name_table.h"
4242

4343
#define MAX_FORWARD_SIZE 1024
44+
#define BUF_HEADROOM (LL_MAX_HEADER + 48)
45+
#define BUF_TAILROOM 16
4446

4547
static unsigned int align(unsigned int i)
4648
{
@@ -505,6 +507,10 @@ bool tipc_msg_reverse(u32 own_node, struct sk_buff **skb, int err)
505507
msg_set_hdr_sz(hdr, BASIC_H_SIZE);
506508
}
507509

510+
if (skb_cloned(_skb) &&
511+
pskb_expand_head(_skb, BUF_HEADROOM, BUF_TAILROOM, GFP_KERNEL))
512+
goto exit;
513+
508514
/* Now reverse the concerned fields */
509515
msg_set_errcode(hdr, err);
510516
msg_set_origport(hdr, msg_destport(&ohdr));

net/tipc/msg.h

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -94,17 +94,6 @@ struct plist;
9494

9595
#define TIPC_MEDIA_INFO_OFFSET 5
9696

97-
/**
98-
* TIPC message buffer code
99-
*
100-
* TIPC message buffer headroom reserves space for the worst-case
101-
* link-level device header (in case the message is sent off-node).
102-
*
103-
* Note: Headroom should be a multiple of 4 to ensure the TIPC header fields
104-
* are word aligned for quicker access
105-
*/
106-
#define BUF_HEADROOM (LL_MAX_HEADER + 48)
107-
10897
struct tipc_skb_cb {
10998
void *handle;
11099
struct sk_buff *tail;

0 commit comments

Comments
 (0)