Linux 3.0.84
Greg KH
maintainerI'm announcing the release of the 3.0.84 kernel.
All users of the 3.0 kernel series must upgrade.
The updated 3.0.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-3.0.y
and can be browsed at the normal kernel.org git web browser:
http://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/tile/lib/exports.c | 2 arch/x86/kvm/x86.c | 5 -- drivers/net/gianfar_ptp.c | 1 drivers/usb/serial/ti_usb_3410_5052.c | 3 - drivers/usb/serial/ti_usb_3410_5052.h | 4 + include/linux/rculist_nulls.h | 7 ++- include/linux/socket.h | 3 + net/compat.c | 13 +++++- net/ipv4/ip_gre.c | 2 net/ipv4/ipip.c | 2 net/ipv4/tcp.c | 6 ++ net/ipv4/tcp_output.c | 10 ++-- net/ipv6/addrconf.c | 4 + net/ipv6/ip6_output.c | 2 net/l2tp/l2tp_ppp.c | 6 +- net/netlabel/netlabel_domainhash.c | 69 ++++++++++++++++++++++++++++++++++ net/packet/af_packet.c | 5 -- net/sctp/socket.c | 6 ++ net/socket.c | 67 ++++++++++++++++++++++----------- sound/usb/card.c | 22 +++++++++- 21 files changed, 193 insertions(+), 48 deletions(-)
Anders Hammarquist (1):
USB: serial: ti_usb_3410_5052: new device id for Abbot strip port cable
Andy Lutomirski (1):
net: Block MSG_CMSG_COMPAT in send(m)msg and recv(m)msg
Chris Metcalf (1):
tilepro: work around module link error with gcc 4.7
Clemens Ladisch (1):
ALSA: usb-audio: work around Android accessory firmware bug
Daniel Borkmann (2):
net: sctp: fix NULL pointer dereference in socket destruction
packet: packet_getname_spkt: make sure string is always 0-terminated
Eric Dumazet (5):
tcp: fix tcp_md5_hash_skb_data()
ipv6: fix possible crashes in ip6_cork_release()
tcp: xps: fix reordering issues
ip_tunnel: fix kernel panic with icmp_dest_unreach
net: force a reload of first item in hlist_nulls_for_each_entry_rcu
Gao feng (1):
ipv6: assign rt6_info to inet6_ifaddr in init_loopback
Greg Kroah-Hartman (1):
Linux 3.0.84
Guillaume Nault (2):
l2tp: Fix PPP header erasure and memory leak
l2tp: Fix sendmsg() return value
Paul Moore (1):
netlabel: improve domain mapping validation
Wei Yongjun (1):
gianfar: add missing iounmap() on error in gianfar_ptp_probe()
Zhanghaoyu (A) (1):
KVM: x86: remove vcpu's CPL check in host-invoked XCR set
Greg KH
maintainerMakefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 3 PATCHLEVEL = 0 -SUBLEVEL = 83 +SUBLEVEL = 84 EXTRAVERSION = NAME = Sneaky Weasel
arch/tile/lib/exports.c +2 -0
@@ -89,4 +89,6 @@ uint64_t __ashrdi3(uint64_t, unsigned int);EXPORT_SYMBOL (__ashrdi3);uint64_t __ashldi3 (uint64_t ,unsigned int );EXPORT_SYMBOL (__ashldi3); +int __ffsdi2 (uint64_t ); +EXPORT_SYMBOL (__ffsdi2);#endif
arch/x86/kvm/x86.c +2 -3
@@ -548,8 +548,6 @@ int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr)if (index !=XCR_XFEATURE_ENABLED_MASK )return 1 ; xcr0 = xcr; -if (kvm_x86_ops->get_cpl (vcpu) !=0 ) -return 1 ;if (!(xcr0 &XSTATE_FP ))return 1 ;if ((xcr0 &XSTATE_YMM ) && !(xcr0 &XSTATE_SSE ))
@@ -563,7 +561,8 @@ int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr)int kvm_set_xcr (struct kvm_vcpu *vcpu,u32 index,u64 xcr) { -if (__kvm_set_xcr (vcpu, index, xcr)) { +if (kvm_x86_ops->get_cpl (vcpu) !=0 || +__kvm_set_xcr (vcpu, index, xcr)) {kvm_inject_gp (vcpu,0 );return 1 ; }
drivers/net/gianfar_ptp.c +1 -0
@@ -521,6 +521,7 @@ static int gianfar_ptp_probe(struct platform_device *dev)return 0 ; no_clock: +iounmap (etsects->regs); no_ioremap:release_resource (etsects->rsrc); no_resource:
drivers/usb/serial/ti_usb_3410_5052.c +2 -1
@@ -179,7 +179,8 @@ static struct usb_device_id ti_id_table_3410[15+TI_EXTRA_VID_PID_COUNT+1] = { { USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) }, { USB_DEVICE(IBM_VENDOR_ID, IBM_454B_PRODUCT_ID) }, { USB_DEVICE(IBM_VENDOR_ID, IBM_454C_PRODUCT_ID) }, - { USB_DEVICE(ABBOTT_VENDOR_ID, ABBOTT_PRODUCT_ID) }, + { USB_DEVICE(ABBOTT_VENDOR_ID, ABBOTT_STEREO_PLUG_ID) }, + { USB_DEVICE(ABBOTT_VENDOR_ID, ABBOTT_STRIP_PORT_ID) }, { USB_DEVICE(TI_VENDOR_ID, FRI2_PRODUCT_ID) }, };
drivers/usb/serial/ti_usb_3410_5052.h +3 -1
@@ -52,7 +52,9 @@/* Abbott Diabetics vendor and product ids */ #define ABBOTT_VENDOR_ID 0x1a61 -#define ABBOTT_PRODUCT_ID 0x3410 +#define ABBOTT_STEREO_PLUG_ID 0x3410 +#define ABBOTT_PRODUCT_ID ABBOTT_STEREO_PLUG_ID +#define ABBOTT_STRIP_PORT_ID 0x3420/* Commands */ #define TI_GET_VERSION 0x01
include/linux/rculist_nulls.h +6 -1
@@ -105,9 +105,14 @@ static inline void hlist_nulls_add_head_rcu(struct hlist_nulls_node *n,* @head: the head for your list. * @member: the name of the hlist_nulls_node within the struct. * +* The barrier() is needed to make sure compiler doesn't cache first element [1], +* as this loop can be restarted [2] +* [1] Documentation/atomic_ops.txt around line 114 +* [2] Documentation/RCU/rculist_nulls.txt around line 146 */ #define hlist_nulls_for_each_entry_rcu (tpos, pos, head, member) \ - for (pos = rcu_dereference_raw(hlist_nulls_first_rcu(head)); \ + for (({barrier();}), \ + pos = rcu_dereference_raw(hlist_nulls_first_rcu(head)); \ (!is_a_nulls(pos)) && \ ({ tpos = hlist_nulls_entry(pos, typeof(*tpos), member); 1; }); \ pos = rcu_dereference_raw(hlist_nulls_next_rcu(pos)))
include/linux/socket.h +3 -0
@@ -332,6 +332,9 @@ extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data);struct timespec ; +/* The __sys_...msg variants allow MSG_CMSG_COMPAT */ +extern long __sys_recvmsg (int fd,struct msghdr __user *msg,unsigned flags); +extern long __sys_sendmsg (int fd,struct msghdr __user *msg,unsigned flags);extern int __sys_recvmmsg (int fd,struct mmsghdr __user *mmsg,unsigned int vlen,unsigned int flags,struct timespec *timeout); extern int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg,
net/compat.c +11 -2
@@ -732,19 +732,25 @@ static unsigned char nas[21] = {asmlinkage long compat_sys_sendmsg (int fd,struct compat_msghdr __user *msg,unsigned flags) { -return sys_sendmsg (fd, (struct msghdr __user *)msg, flags |MSG_CMSG_COMPAT ); +if (flags &MSG_CMSG_COMPAT ) +return -EINVAL ; +return __sys_sendmsg (fd, (struct msghdr __user *)msg, flags |MSG_CMSG_COMPAT ); }asmlinkage long compat_sys_sendmmsg (int fd,struct compat_mmsghdr __user *mmsg,unsigned vlen,unsigned int flags) { +if (flags &MSG_CMSG_COMPAT ) +return -EINVAL ;return __sys_sendmmsg (fd, (struct mmsghdr __user *)mmsg, vlen, flags |MSG_CMSG_COMPAT ); }asmlinkage long compat_sys_recvmsg (int fd,struct compat_msghdr __user *msg,unsigned int flags) { -return sys_recvmsg (fd, (struct msghdr __user *)msg, flags |MSG_CMSG_COMPAT ); +if (flags &MSG_CMSG_COMPAT ) +return -EINVAL ; +return __sys_recvmsg (fd, (struct msghdr __user *)msg, flags |MSG_CMSG_COMPAT ); }asmlinkage long compat_sys_recv (int fd,void __user *buf,size_t len,unsigned flags)
@@ -766,6 +772,9 @@ asmlinkage long compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,int datagrams;struct timespec ktspec; +if (flags &MSG_CMSG_COMPAT ) +return -EINVAL ; +if (timeout ==NULL )return __sys_recvmmsg (fd, (struct mmsghdr __user *)mmsg, vlen, flags |MSG_CMSG_COMPAT ,NULL );
net/ipv4/ip_gre.c +1 -1
@@ -716,6 +716,7 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev tiph = &tunnel->parms.iph; } +memset (&(IPCB (skb)->opt),0 ,sizeof (IPCB (skb)->opt));if ((dst = tiph->daddr) ==0 ) {/* NBMA tunnel */
@@ -853,7 +854,6 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *devskb_reset_transport_header (skb);skb_push (skb, gre_hlen);skb_reset_network_header (skb); -memset (&(IPCB (skb)->opt),0 ,sizeof (IPCB (skb)->opt));IPCB (skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE |IPSKB_XFRM_TRANSFORMED |IPSKB_REROUTED );skb_dst_drop (skb);
net/ipv4/ipip.c +1 -1
@@ -448,6 +448,7 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)if (tos &1 ) tos = old_iph->tos; +memset (&(IPCB (skb)->opt),0 ,sizeof (IPCB (skb)->opt));if (!dst) {/* NBMA tunnel */ if ((rt =skb_rtable (skb)) ==NULL ) {
@@ -531,7 +532,6 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) skb->transport_header = skb->network_header;skb_push (skb,sizeof (struct iphdr ));skb_reset_network_header (skb); -memset (&(IPCB (skb)->opt),0 ,sizeof (IPCB (skb)->opt));IPCB (skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE |IPSKB_XFRM_TRANSFORMED |IPSKB_REROUTED );skb_dst_drop (skb);
net/ipv4/tcp.c +5 -1
@@ -3043,7 +3043,11 @@ int tcp_md5_hash_skb_data(struct tcp_md5sig_pool *hp,for (i =0 ; i < shi->nr_frags; ++i) {const struct skb_frag_struct *f = &shi->frags[i]; -sg_set_page (&sg, f->page, f->size, f->page_offset); +unsigned int offset = f->page_offset; +struct page *page = f->page + (offset >>PAGE_SHIFT ); + +sg_set_page (&sg, page, f->size, +offset_in_page (offset));if (crypto_hash_update (desc, &sg, f->size))return 1 ; }
net/ipv4/tcp_output.c +6 -4
@@ -833,11 +833,13 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it, &md5); tcp_header_size = tcp_options_size +sizeof (struct tcphdr ); -if (tcp_packets_in_flight (tp) ==0 ) { +if (tcp_packets_in_flight (tp) ==0 )tcp_ca_event (sk,CA_EVENT_TX_START ); - skb->ooo_okay =1 ; - }else - skb->ooo_okay =0 ; + +/* if no packet is in qdisc/device queue, then allow XPS to select +* another queue. +*/ + skb->ooo_okay =sk_wmem_alloc_get (sk) ==0 ;skb_push (skb, tcp_header_size);skb_reset_transport_header (skb);
net/ipv6/addrconf.c +3 -1
@@ -2360,8 +2360,10 @@ static void init_loopback(struct net_device *dev) sp_rt =addrconf_dst_alloc (idev, &sp_ifa->addr,0 );/* Failure cases are ignored */ -if (!IS_ERR (sp_rt)) +if (!IS_ERR (sp_rt)) { + sp_ifa->rt = sp_rt;ip6_ins_rt (sp_rt); + } }read_unlock_bh (&idev->lock); }
net/ipv6/ip6_output.c +1 -1
@@ -1248,7 +1248,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,if (WARN_ON (np->cork.opt))return -EINVAL ; - np->cork.opt =kmalloc (opt->tot_len, sk->sk_allocation); + np->cork.opt =kzalloc (opt->tot_len, sk->sk_allocation);if (unlikely (np->cork.opt ==NULL ))return -ENOBUFS ;
net/l2tp/l2tp_ppp.c +3 -3
@@ -350,19 +350,19 @@ static int pppol2tp_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghskb_put (skb,2 );/* Copy user data into skb */ - error =memcpy_fromiovec (skb->data, m->msg_iov, total_len); + error =memcpy_fromiovec (skb_put (skb, total_len), m->msg_iov, + total_len);if (error <0 ) {kfree_skb (skb); goto error_put_sess_tun; } -skb_put (skb, total_len);l2tp_xmit_skb (session, skb, session->hdr_len);sock_put (ps->tunnel_sock);sock_put (sk); -return error; +return total_len; error_put_sess_tun:sock_put (ps->tunnel_sock);
net/netlabel/netlabel_domainhash.c +69 -0
81 lines not on this page · raw message
net/packet/af_packet.c +2 -3
@@ -1767,12 +1767,11 @@ static int packet_getname_spkt(struct socket *sock, struct sockaddr *uaddr,return -EOPNOTSUPP ; uaddr->sa_family =AF_PACKET ; +memset (uaddr->sa_data,0 ,sizeof (uaddr->sa_data));rcu_read_lock (); dev =dev_get_by_index_rcu (sock_net (sk),pkt_sk (sk)->ifindex);if (dev) -strncpy (uaddr->sa_data, dev->name,14 ); -else -memset (uaddr->sa_data,0 ,14 ); +strlcpy (uaddr->sa_data, dev->name,sizeof (uaddr->sa_data));rcu_read_unlock (); *uaddr_len =sizeof (*uaddr);
net/sctp/socket.c +6 -0
@@ -3809,6 +3809,12 @@ SCTP_STATIC void sctp_destroy_sock(struct sock *sk)/* Release our hold on the endpoint. */ ep =sctp_sk (sk)->ep; +/* This could happen during socket init, thus we bail out +* early, since the rest of the below is not setup either. +*/ +if (ep ==NULL ) +return ; +sctp_endpoint_free (ep);local_bh_disable ();percpu_counter_dec (&sctp_sockets_allocated);
net/socket.c +45 -22
148 lines not on this page · raw message
sound/usb/card.c +20 -2
@@ -148,14 +148,32 @@ static int snd_usb_create_stream(struct snd_usb_audio *chip, int ctrlif, int intreturn -EINVAL ; } + alts = &iface->altsetting[0 ]; + altsd =get_iface_desc (alts); + +/* +* Android with both accessory and audio interfaces enabled gets the +* interface numbers wrong. +*/ +if ((chip->usb_id ==USB_ID (0x18d1 ,0x2d04 ) || + chip->usb_id ==USB_ID (0x18d1 ,0x2d05 )) && + interface ==0 && + altsd->bInterfaceClass ==USB_CLASS_VENDOR_SPEC && + altsd->bInterfaceSubClass ==USB_SUBCLASS_VENDOR_SPEC ) { + interface =2 ; + iface =usb_ifnum_to_if (dev, interface); +if (!iface) +return -EINVAL ; + alts = &iface->altsetting[0 ]; + altsd =get_iface_desc (alts); + } +if (usb_interface_claimed (iface)) {snd_printdd (KERN_INFO "%d:%d:%d: skipping, already claimed\n" , dev->devnum, ctrlif, interface);return -EINVAL ; } - alts = &iface->altsetting[0 ]; - altsd =get_iface_desc (alts);if ((altsd->bInterfaceClass ==USB_CLASS_AUDIO || altsd->bInterfaceClass ==USB_CLASS_VENDOR_SPEC ) && altsd->bInterfaceSubClass ==USB_SUBCLASS_MIDISTREAMING ) {