Commit 64758bd7 authored by David S. Miller's avatar David S. Miller

Merge branch 'pending' of master.kernel.org:/pub/scm/linux/kernel/git/vxy/lksctp-dev

parents 16e297b3 7e8616d8
...@@ -411,6 +411,7 @@ struct sctp_event_subscribe { ...@@ -411,6 +411,7 @@ struct sctp_event_subscribe {
__u8 sctp_shutdown_event; __u8 sctp_shutdown_event;
__u8 sctp_partial_delivery_event; __u8 sctp_partial_delivery_event;
__u8 sctp_adaptation_layer_event; __u8 sctp_adaptation_layer_event;
__u8 sctp_authentication_event;
}; };
/* /*
...@@ -587,7 +588,7 @@ struct sctp_authchunk { ...@@ -587,7 +588,7 @@ struct sctp_authchunk {
* endpoint requires the peer to use. * endpoint requires the peer to use.
*/ */
struct sctp_hmacalgo { struct sctp_hmacalgo {
__u16 shmac_num_idents; __u32 shmac_num_idents;
__u16 shmac_idents[]; __u16 shmac_idents[];
}; };
...@@ -600,7 +601,7 @@ struct sctp_hmacalgo { ...@@ -600,7 +601,7 @@ struct sctp_hmacalgo {
struct sctp_authkey { struct sctp_authkey {
sctp_assoc_t sca_assoc_id; sctp_assoc_t sca_assoc_id;
__u16 sca_keynumber; __u16 sca_keynumber;
__u16 sca_keylen; __u16 sca_keylength;
__u8 sca_key[]; __u8 sca_key[];
}; };
...@@ -694,6 +695,7 @@ struct sctp_status { ...@@ -694,6 +695,7 @@ struct sctp_status {
*/ */
struct sctp_authchunks { struct sctp_authchunks {
sctp_assoc_t gauth_assoc_id; sctp_assoc_t gauth_assoc_id;
__u32 gauth_number_of_chunks;
uint8_t gauth_chunks[]; uint8_t gauth_chunks[];
}; };
......
...@@ -838,11 +838,11 @@ int sctp_auth_set_key(struct sctp_endpoint *ep, ...@@ -838,11 +838,11 @@ int sctp_auth_set_key(struct sctp_endpoint *ep,
} }
/* Create a new key data based on the info passed in */ /* Create a new key data based on the info passed in */
key = sctp_auth_create_key(auth_key->sca_keylen, GFP_KERNEL); key = sctp_auth_create_key(auth_key->sca_keylength, GFP_KERNEL);
if (!key) if (!key)
goto nomem; goto nomem;
memcpy(key->data, &auth_key->sca_key[0], auth_key->sca_keylen); memcpy(key->data, &auth_key->sca_key[0], auth_key->sca_keylength);
/* If we are replacing, remove the old keys data from the /* If we are replacing, remove the old keys data from the
* key id. If we are adding new key id, add it to the * key id. If we are adding new key id, add it to the
......
...@@ -966,7 +966,7 @@ static struct inet6_protocol sctpv6_protocol = { ...@@ -966,7 +966,7 @@ static struct inet6_protocol sctpv6_protocol = {
.flags = INET6_PROTO_NOPOLICY | INET6_PROTO_FINAL, .flags = INET6_PROTO_NOPOLICY | INET6_PROTO_FINAL,
}; };
static struct sctp_af sctp_ipv6_specific = { static struct sctp_af sctp_af_inet6 = {
.sa_family = AF_INET6, .sa_family = AF_INET6,
.sctp_xmit = sctp_v6_xmit, .sctp_xmit = sctp_v6_xmit,
.setsockopt = ipv6_setsockopt, .setsockopt = ipv6_setsockopt,
...@@ -998,7 +998,7 @@ static struct sctp_af sctp_ipv6_specific = { ...@@ -998,7 +998,7 @@ static struct sctp_af sctp_ipv6_specific = {
#endif #endif
}; };
static struct sctp_pf sctp_pf_inet6_specific = { static struct sctp_pf sctp_pf_inet6 = {
.event_msgname = sctp_inet6_event_msgname, .event_msgname = sctp_inet6_event_msgname,
.skb_msgname = sctp_inet6_skb_msgname, .skb_msgname = sctp_inet6_skb_msgname,
.af_supported = sctp_inet6_af_supported, .af_supported = sctp_inet6_af_supported,
...@@ -1008,7 +1008,7 @@ static struct sctp_pf sctp_pf_inet6_specific = { ...@@ -1008,7 +1008,7 @@ static struct sctp_pf sctp_pf_inet6_specific = {
.supported_addrs = sctp_inet6_supported_addrs, .supported_addrs = sctp_inet6_supported_addrs,
.create_accept_sk = sctp_v6_create_accept_sk, .create_accept_sk = sctp_v6_create_accept_sk,
.addr_v4map = sctp_v6_addr_v4map, .addr_v4map = sctp_v6_addr_v4map,
.af = &sctp_ipv6_specific, .af = &sctp_af_inet6,
}; };
/* Initialize IPv6 support and register with socket layer. */ /* Initialize IPv6 support and register with socket layer. */
...@@ -1017,10 +1017,10 @@ int sctp_v6_init(void) ...@@ -1017,10 +1017,10 @@ int sctp_v6_init(void)
int rc; int rc;
/* Register the SCTP specific PF_INET6 functions. */ /* Register the SCTP specific PF_INET6 functions. */
sctp_register_pf(&sctp_pf_inet6_specific, PF_INET6); sctp_register_pf(&sctp_pf_inet6, PF_INET6);
/* Register the SCTP specific AF_INET6 functions. */ /* Register the SCTP specific AF_INET6 functions. */
sctp_register_af(&sctp_ipv6_specific); sctp_register_af(&sctp_af_inet6);
rc = proto_register(&sctpv6_prot, 1); rc = proto_register(&sctpv6_prot, 1);
if (rc) if (rc)
...@@ -1051,7 +1051,7 @@ void sctp_v6_exit(void) ...@@ -1051,7 +1051,7 @@ void sctp_v6_exit(void)
inet6_unregister_protosw(&sctpv6_seqpacket_protosw); inet6_unregister_protosw(&sctpv6_seqpacket_protosw);
inet6_unregister_protosw(&sctpv6_stream_protosw); inet6_unregister_protosw(&sctpv6_stream_protosw);
proto_unregister(&sctpv6_prot); proto_unregister(&sctpv6_prot);
list_del(&sctp_ipv6_specific.list); list_del(&sctp_af_inet6.list);
} }
/* Unregister with inet6 layer. */ /* Unregister with inet6 layer. */
......
...@@ -832,7 +832,7 @@ static inline int sctp_v4_xmit(struct sk_buff *skb, ...@@ -832,7 +832,7 @@ static inline int sctp_v4_xmit(struct sk_buff *skb,
return ip_queue_xmit(skb, ipfragok); return ip_queue_xmit(skb, ipfragok);
} }
static struct sctp_af sctp_ipv4_specific; static struct sctp_af sctp_af_inet;
static struct sctp_pf sctp_pf_inet = { static struct sctp_pf sctp_pf_inet = {
.event_msgname = sctp_inet_event_msgname, .event_msgname = sctp_inet_event_msgname,
...@@ -844,7 +844,7 @@ static struct sctp_pf sctp_pf_inet = { ...@@ -844,7 +844,7 @@ static struct sctp_pf sctp_pf_inet = {
.supported_addrs = sctp_inet_supported_addrs, .supported_addrs = sctp_inet_supported_addrs,
.create_accept_sk = sctp_v4_create_accept_sk, .create_accept_sk = sctp_v4_create_accept_sk,
.addr_v4map = sctp_v4_addr_v4map, .addr_v4map = sctp_v4_addr_v4map,
.af = &sctp_ipv4_specific, .af = &sctp_af_inet
}; };
/* Notifier for inetaddr addition/deletion events. */ /* Notifier for inetaddr addition/deletion events. */
...@@ -906,7 +906,7 @@ static struct net_protocol sctp_protocol = { ...@@ -906,7 +906,7 @@ static struct net_protocol sctp_protocol = {
}; };
/* IPv4 address related functions. */ /* IPv4 address related functions. */
static struct sctp_af sctp_ipv4_specific = { static struct sctp_af sctp_af_inet = {
.sa_family = AF_INET, .sa_family = AF_INET,
.sctp_xmit = sctp_v4_xmit, .sctp_xmit = sctp_v4_xmit,
.setsockopt = ip_setsockopt, .setsockopt = ip_setsockopt,
...@@ -1192,7 +1192,7 @@ SCTP_STATIC __init int sctp_init(void) ...@@ -1192,7 +1192,7 @@ SCTP_STATIC __init int sctp_init(void)
sctp_sysctl_register(); sctp_sysctl_register();
INIT_LIST_HEAD(&sctp_address_families); INIT_LIST_HEAD(&sctp_address_families);
sctp_register_af(&sctp_ipv4_specific); sctp_register_af(&sctp_af_inet);
status = proto_register(&sctp_prot, 1); status = proto_register(&sctp_prot, 1);
if (status) if (status)
...@@ -1249,7 +1249,7 @@ SCTP_STATIC __init int sctp_init(void) ...@@ -1249,7 +1249,7 @@ SCTP_STATIC __init int sctp_init(void)
proto_unregister(&sctp_prot); proto_unregister(&sctp_prot);
err_proto_register: err_proto_register:
sctp_sysctl_unregister(); sctp_sysctl_unregister();
list_del(&sctp_ipv4_specific.list); list_del(&sctp_af_inet.list);
free_pages((unsigned long)sctp_port_hashtable, free_pages((unsigned long)sctp_port_hashtable,
get_order(sctp_port_hashsize * get_order(sctp_port_hashsize *
sizeof(struct sctp_bind_hashbucket))); sizeof(struct sctp_bind_hashbucket)));
...@@ -1299,7 +1299,7 @@ SCTP_STATIC __exit void sctp_exit(void) ...@@ -1299,7 +1299,7 @@ SCTP_STATIC __exit void sctp_exit(void)
inet_unregister_protosw(&sctp_seqpacket_protosw); inet_unregister_protosw(&sctp_seqpacket_protosw);
sctp_sysctl_unregister(); sctp_sysctl_unregister();
list_del(&sctp_ipv4_specific.list); list_del(&sctp_af_inet.list);
free_pages((unsigned long)sctp_assoc_hashtable, free_pages((unsigned long)sctp_assoc_hashtable,
get_order(sctp_assoc_hashsize * get_order(sctp_assoc_hashsize *
......
...@@ -1964,7 +1964,7 @@ static int sctp_setsockopt_disable_fragments(struct sock *sk, ...@@ -1964,7 +1964,7 @@ static int sctp_setsockopt_disable_fragments(struct sock *sk,
static int sctp_setsockopt_events(struct sock *sk, char __user *optval, static int sctp_setsockopt_events(struct sock *sk, char __user *optval,
int optlen) int optlen)
{ {
if (optlen != sizeof(struct sctp_event_subscribe)) if (optlen > sizeof(struct sctp_event_subscribe))
return -EINVAL; return -EINVAL;
if (copy_from_user(&sctp_sk(sk)->subscribe, optval, optlen)) if (copy_from_user(&sctp_sk(sk)->subscribe, optval, optlen))
return -EFAULT; return -EFAULT;
...@@ -5070,6 +5070,7 @@ static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len, ...@@ -5070,6 +5070,7 @@ static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len,
struct sctp_authchunks val; struct sctp_authchunks val;
struct sctp_association *asoc; struct sctp_association *asoc;
struct sctp_chunks_param *ch; struct sctp_chunks_param *ch;
u32 num_chunks;
char __user *to; char __user *to;
if (len <= sizeof(struct sctp_authchunks)) if (len <= sizeof(struct sctp_authchunks))
...@@ -5086,12 +5087,15 @@ static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len, ...@@ -5086,12 +5087,15 @@ static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len,
ch = asoc->peer.peer_chunks; ch = asoc->peer.peer_chunks;
/* See if the user provided enough room for all the data */ /* See if the user provided enough room for all the data */
if (len < ntohs(ch->param_hdr.length)) num_chunks = ntohs(ch->param_hdr.length) - sizeof(sctp_paramhdr_t);
if (len < num_chunks)
return -EINVAL; return -EINVAL;
len = ntohs(ch->param_hdr.length); len = num_chunks;
if (put_user(len, optlen)) if (put_user(len, optlen))
return -EFAULT; return -EFAULT;
if (put_user(num_chunks, &p->gauth_number_of_chunks))
return -EFAULT;
if (copy_to_user(to, ch->chunks, len)) if (copy_to_user(to, ch->chunks, len))
return -EFAULT; return -EFAULT;
...@@ -5105,6 +5109,7 @@ static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len, ...@@ -5105,6 +5109,7 @@ static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len,
struct sctp_authchunks val; struct sctp_authchunks val;
struct sctp_association *asoc; struct sctp_association *asoc;
struct sctp_chunks_param *ch; struct sctp_chunks_param *ch;
u32 num_chunks;
char __user *to; char __user *to;
if (len <= sizeof(struct sctp_authchunks)) if (len <= sizeof(struct sctp_authchunks))
...@@ -5123,12 +5128,15 @@ static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len, ...@@ -5123,12 +5128,15 @@ static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len,
else else
ch = sctp_sk(sk)->ep->auth_chunk_list; ch = sctp_sk(sk)->ep->auth_chunk_list;
if (len < ntohs(ch->param_hdr.length)) num_chunks = ntohs(ch->param_hdr.length) - sizeof(sctp_paramhdr_t);
if (len < num_chunks)
return -EINVAL; return -EINVAL;
len = ntohs(ch->param_hdr.length); len = num_chunks;
if (put_user(len, optlen)) if (put_user(len, optlen))
return -EFAULT; return -EFAULT;
if (put_user(num_chunks, &p->gauth_number_of_chunks))
return -EFAULT;
if (copy_to_user(to, ch->chunks, len)) if (copy_to_user(to, ch->chunks, len))
return -EFAULT; return -EFAULT;
......
...@@ -206,7 +206,7 @@ struct sctp_ulpevent *sctp_ulpevent_make_assoc_change( ...@@ -206,7 +206,7 @@ struct sctp_ulpevent *sctp_ulpevent_make_assoc_change(
* This field is the total length of the notification data, including * This field is the total length of the notification data, including
* the notification header. * the notification header.
*/ */
sac->sac_length = sizeof(struct sctp_assoc_change); sac->sac_length = skb->len;
/* Socket Extensions for SCTP /* Socket Extensions for SCTP
* 5.3.1.1 SCTP_ASSOC_CHANGE * 5.3.1.1 SCTP_ASSOC_CHANGE
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment