Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Mostly simple overlapping changes. For example, David Ahern's adjacency list revamp in 'net-next' conflicted with an adjacency list traversal bug fix in 'net'. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -418,6 +418,7 @@ int sctp_packet_transmit(struct sctp_packet *packet, gfp_t gfp)
|
||||
__u8 has_data = 0;
|
||||
int gso = 0;
|
||||
int pktcount = 0;
|
||||
int auth_len = 0;
|
||||
struct dst_entry *dst;
|
||||
unsigned char *auth = NULL; /* pointer to auth in skb data */
|
||||
|
||||
@@ -510,7 +511,12 @@ int sctp_packet_transmit(struct sctp_packet *packet, gfp_t gfp)
|
||||
list_for_each_entry(chunk, &packet->chunk_list, list) {
|
||||
int padded = SCTP_PAD4(chunk->skb->len);
|
||||
|
||||
if (pkt_size + padded > tp->pathmtu)
|
||||
if (chunk == packet->auth)
|
||||
auth_len = padded;
|
||||
else if (auth_len + padded + packet->overhead >
|
||||
tp->pathmtu)
|
||||
goto nomem;
|
||||
else if (pkt_size + padded > tp->pathmtu)
|
||||
break;
|
||||
pkt_size += padded;
|
||||
}
|
||||
|
@@ -3422,6 +3422,12 @@ sctp_disposition_t sctp_sf_ootb(struct net *net,
|
||||
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
||||
commands);
|
||||
|
||||
/* Report violation if chunk len overflows */
|
||||
ch_end = ((__u8 *)ch) + SCTP_PAD4(ntohs(ch->length));
|
||||
if (ch_end > skb_tail_pointer(skb))
|
||||
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
||||
commands);
|
||||
|
||||
/* Now that we know we at least have a chunk header,
|
||||
* do things that are type appropriate.
|
||||
*/
|
||||
@@ -3453,12 +3459,6 @@ sctp_disposition_t sctp_sf_ootb(struct net *net,
|
||||
}
|
||||
}
|
||||
|
||||
/* Report violation if chunk len overflows */
|
||||
ch_end = ((__u8 *)ch) + SCTP_PAD4(ntohs(ch->length));
|
||||
if (ch_end > skb_tail_pointer(skb))
|
||||
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
||||
commands);
|
||||
|
||||
ch = (sctp_chunkhdr_t *) ch_end;
|
||||
} while (ch_end < skb_tail_pointer(skb));
|
||||
|
||||
|
@@ -4687,7 +4687,7 @@ static int sctp_getsockopt_disable_fragments(struct sock *sk, int len,
|
||||
static int sctp_getsockopt_events(struct sock *sk, int len, char __user *optval,
|
||||
int __user *optlen)
|
||||
{
|
||||
if (len <= 0)
|
||||
if (len == 0)
|
||||
return -EINVAL;
|
||||
if (len > sizeof(struct sctp_event_subscribe))
|
||||
len = sizeof(struct sctp_event_subscribe);
|
||||
@@ -6430,6 +6430,9 @@ static int sctp_getsockopt(struct sock *sk, int level, int optname,
|
||||
if (get_user(len, optlen))
|
||||
return -EFAULT;
|
||||
|
||||
if (len < 0)
|
||||
return -EINVAL;
|
||||
|
||||
lock_sock(sk);
|
||||
|
||||
switch (optname) {
|
||||
|
Reference in New Issue
Block a user