x25: Handle undersized/fragmented skbs
There are multiple locations in the X.25 packet layer where a skb is assumed to be of at least a certain size and that all its data is currently available at skb->data. These assumptions are not checked, hence buffer overreads may occur. Use pskb_may_pull to check these minimal size assumptions and ensure that data is available at skb->data when necessary, as well as use skb_copy_bits where needed. Signed-off-by: Matthew Daley <mattjd@gmail.com> Cc: Eric Dumazet <eric.dumazet@gmail.com> Cc: Andrew Hendry <andrew.hendry@gmail.com> Cc: stable <stable@kernel.org> Acked-by: Andrew Hendry <andrew.hendry@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
c7fd0d48bd
commit
cb101ed2c3
@@ -269,7 +269,11 @@ int x25_decode(struct sock *sk, struct sk_buff *skb, int *ns, int *nr, int *q,
|
||||
int *d, int *m)
|
||||
{
|
||||
struct x25_sock *x25 = x25_sk(sk);
|
||||
unsigned char *frame = skb->data;
|
||||
unsigned char *frame;
|
||||
|
||||
if (!pskb_may_pull(skb, X25_STD_MIN_LEN))
|
||||
return X25_ILLEGAL;
|
||||
frame = skb->data;
|
||||
|
||||
*ns = *nr = *q = *d = *m = 0;
|
||||
|
||||
@@ -294,6 +298,10 @@ int x25_decode(struct sock *sk, struct sk_buff *skb, int *ns, int *nr, int *q,
|
||||
if (frame[2] == X25_RR ||
|
||||
frame[2] == X25_RNR ||
|
||||
frame[2] == X25_REJ) {
|
||||
if (!pskb_may_pull(skb, X25_EXT_MIN_LEN))
|
||||
return X25_ILLEGAL;
|
||||
frame = skb->data;
|
||||
|
||||
*nr = (frame[3] >> 1) & 0x7F;
|
||||
return frame[2];
|
||||
}
|
||||
@@ -308,6 +316,10 @@ int x25_decode(struct sock *sk, struct sk_buff *skb, int *ns, int *nr, int *q,
|
||||
|
||||
if (x25->neighbour->extended) {
|
||||
if ((frame[2] & 0x01) == X25_DATA) {
|
||||
if (!pskb_may_pull(skb, X25_EXT_MIN_LEN))
|
||||
return X25_ILLEGAL;
|
||||
frame = skb->data;
|
||||
|
||||
*q = (frame[0] & X25_Q_BIT) == X25_Q_BIT;
|
||||
*d = (frame[0] & X25_D_BIT) == X25_D_BIT;
|
||||
*m = (frame[3] & X25_EXT_M_BIT) == X25_EXT_M_BIT;
|
||||
|
Reference in New Issue
Block a user