Magellan Linux

Annotation of /trunk/kernel-lts/patches-3.4/0150-3.4.51-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2226 - (hide annotations) (download)
Mon Jul 1 09:56:29 2013 UTC (10 years, 10 months ago) by niro
File size: 32156 byte(s)
-linux-3.4.51
1 niro 2226 diff --git a/arch/tile/lib/exports.c b/arch/tile/lib/exports.c
2     index 2a81d32..e51e5cd 100644
3     --- a/arch/tile/lib/exports.c
4     +++ b/arch/tile/lib/exports.c
5     @@ -90,4 +90,6 @@ uint64_t __ashrdi3(uint64_t, unsigned int);
6     EXPORT_SYMBOL(__ashrdi3);
7     uint64_t __ashldi3(uint64_t, unsigned int);
8     EXPORT_SYMBOL(__ashldi3);
9     +int __ffsdi2(uint64_t);
10     +EXPORT_SYMBOL(__ffsdi2);
11     #endif
12     diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
13     index b27b452..3663e0b 100644
14     --- a/arch/x86/kvm/x86.c
15     +++ b/arch/x86/kvm/x86.c
16     @@ -555,8 +555,6 @@ int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr)
17     if (index != XCR_XFEATURE_ENABLED_MASK)
18     return 1;
19     xcr0 = xcr;
20     - if (kvm_x86_ops->get_cpl(vcpu) != 0)
21     - return 1;
22     if (!(xcr0 & XSTATE_FP))
23     return 1;
24     if ((xcr0 & XSTATE_YMM) && !(xcr0 & XSTATE_SSE))
25     @@ -570,7 +568,8 @@ int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr)
26    
27     int kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr)
28     {
29     - if (__kvm_set_xcr(vcpu, index, xcr)) {
30     + if (kvm_x86_ops->get_cpl(vcpu) != 0 ||
31     + __kvm_set_xcr(vcpu, index, xcr)) {
32     kvm_inject_gp(vcpu, 0);
33     return 1;
34     }
35     diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
36     index 7f1ea56..4c63665 100644
37     --- a/drivers/clk/clk.c
38     +++ b/drivers/clk/clk.c
39     @@ -1453,6 +1453,7 @@ int clk_notifier_unregister(struct clk *clk, struct notifier_block *nb)
40     /* XXX the notifier code should handle this better */
41     if (!cn->notifier_head.head) {
42     srcu_cleanup_notifier_head(&cn->notifier_head);
43     + list_del(&cn->node);
44     kfree(cn);
45     }
46    
47     diff --git a/drivers/input/touchscreen/cyttsp_core.c b/drivers/input/touchscreen/cyttsp_core.c
48     index f030d9e..3f505d5 100644
49     --- a/drivers/input/touchscreen/cyttsp_core.c
50     +++ b/drivers/input/touchscreen/cyttsp_core.c
51     @@ -133,7 +133,7 @@ static int cyttsp_exit_bl_mode(struct cyttsp *ts)
52     memcpy(bl_cmd, bl_command, sizeof(bl_command));
53     if (ts->pdata->bl_keys)
54     memcpy(&bl_cmd[sizeof(bl_command) - CY_NUM_BL_KEYS],
55     - ts->pdata->bl_keys, sizeof(bl_command));
56     + ts->pdata->bl_keys, CY_NUM_BL_KEYS);
57    
58     error = ttsp_write_block_data(ts, CY_REG_BASE,
59     sizeof(bl_cmd), bl_cmd);
60     diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c
61     index 2e1f806..b6ed7e9 100644
62     --- a/drivers/net/bonding/bond_alb.c
63     +++ b/drivers/net/bonding/bond_alb.c
64     @@ -704,6 +704,12 @@ static struct slave *rlb_arp_xmit(struct sk_buff *skb, struct bonding *bond)
65     struct arp_pkt *arp = arp_pkt(skb);
66     struct slave *tx_slave = NULL;
67    
68     + /* Don't modify or load balance ARPs that do not originate locally
69     + * (e.g.,arrive via a bridge).
70     + */
71     + if (!bond_slave_has_mac(bond, arp->mac_src))
72     + return NULL;
73     +
74     if (arp->op_code == htons(ARPOP_REPLY)) {
75     /* the arp must be sent on the selected
76     * rx channel
77     diff --git a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h
78     index 4581aa5..51f1766 100644
79     --- a/drivers/net/bonding/bonding.h
80     +++ b/drivers/net/bonding/bonding.h
81     @@ -18,6 +18,7 @@
82     #include <linux/timer.h>
83     #include <linux/proc_fs.h>
84     #include <linux/if_bonding.h>
85     +#include <linux/etherdevice.h>
86     #include <linux/cpumask.h>
87     #include <linux/in6.h>
88     #include <linux/netpoll.h>
89     @@ -450,6 +451,18 @@ static inline void bond_destroy_proc_dir(struct bond_net *bn)
90     }
91     #endif
92    
93     +static inline struct slave *bond_slave_has_mac(struct bonding *bond,
94     + const u8 *mac)
95     +{
96     + int i = 0;
97     + struct slave *tmp;
98     +
99     + bond_for_each_slave(bond, tmp, i)
100     + if (!compare_ether_addr_64bits(mac, tmp->dev->dev_addr))
101     + return tmp;
102     +
103     + return NULL;
104     +}
105    
106     /* exported from bond_main.c */
107     extern int bond_net_id;
108     diff --git a/drivers/net/ethernet/freescale/gianfar_ptp.c b/drivers/net/ethernet/freescale/gianfar_ptp.c
109     index ca2748a..8de54e5 100644
110     --- a/drivers/net/ethernet/freescale/gianfar_ptp.c
111     +++ b/drivers/net/ethernet/freescale/gianfar_ptp.c
112     @@ -520,6 +520,7 @@ static int gianfar_ptp_probe(struct platform_device *dev)
113     return 0;
114    
115     no_clock:
116     + iounmap(etsects->regs);
117     no_ioremap:
118     release_resource(etsects->rsrc);
119     no_resource:
120     diff --git a/drivers/net/ethernet/realtek/8139cp.c b/drivers/net/ethernet/realtek/8139cp.c
121     index b3287c0..4ce981c 100644
122     --- a/drivers/net/ethernet/realtek/8139cp.c
123     +++ b/drivers/net/ethernet/realtek/8139cp.c
124     @@ -1097,6 +1097,7 @@ static void cp_clean_rings (struct cp_private *cp)
125     cp->dev->stats.tx_dropped++;
126     }
127     }
128     + netdev_reset_queue(cp->dev);
129    
130     memset(cp->rx_ring, 0, sizeof(struct cp_desc) * CP_RX_RING_SIZE);
131     memset(cp->tx_ring, 0, sizeof(struct cp_desc) * CP_TX_RING_SIZE);
132     diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c
133     index cf20388..2a59e7a 100644
134     --- a/drivers/net/ethernet/realtek/r8169.c
135     +++ b/drivers/net/ethernet/realtek/r8169.c
136     @@ -5126,7 +5126,20 @@ err_out:
137     return -EIO;
138     }
139    
140     -static inline void rtl8169_tso_csum(struct rtl8169_private *tp,
141     +static bool rtl_skb_pad(struct sk_buff *skb)
142     +{
143     + if (skb_padto(skb, ETH_ZLEN))
144     + return false;
145     + skb_put(skb, ETH_ZLEN - skb->len);
146     + return true;
147     +}
148     +
149     +static bool rtl_test_hw_pad_bug(struct rtl8169_private *tp, struct sk_buff *skb)
150     +{
151     + return skb->len < ETH_ZLEN && tp->mac_version == RTL_GIGA_MAC_VER_34;
152     +}
153     +
154     +static inline bool rtl8169_tso_csum(struct rtl8169_private *tp,
155     struct sk_buff *skb, u32 *opts)
156     {
157     const struct rtl_tx_desc_info *info = tx_desc_info + tp->txd_version;
158     @@ -5139,13 +5152,20 @@ static inline void rtl8169_tso_csum(struct rtl8169_private *tp,
159     } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
160     const struct iphdr *ip = ip_hdr(skb);
161    
162     + if (unlikely(rtl_test_hw_pad_bug(tp, skb)))
163     + return skb_checksum_help(skb) == 0 && rtl_skb_pad(skb);
164     +
165     if (ip->protocol == IPPROTO_TCP)
166     opts[offset] |= info->checksum.tcp;
167     else if (ip->protocol == IPPROTO_UDP)
168     opts[offset] |= info->checksum.udp;
169     else
170     WARN_ON_ONCE(1);
171     + } else {
172     + if (unlikely(rtl_test_hw_pad_bug(tp, skb)))
173     + return rtl_skb_pad(skb);
174     }
175     + return true;
176     }
177    
178     static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
179     @@ -5166,17 +5186,15 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
180     goto err_stop_0;
181     }
182    
183     - /* 8168evl does not automatically pad to minimum length. */
184     - if (unlikely(tp->mac_version == RTL_GIGA_MAC_VER_34 &&
185     - skb->len < ETH_ZLEN)) {
186     - if (skb_padto(skb, ETH_ZLEN))
187     - goto err_update_stats;
188     - skb_put(skb, ETH_ZLEN - skb->len);
189     - }
190     -
191     if (unlikely(le32_to_cpu(txd->opts1) & DescOwn))
192     goto err_stop_0;
193    
194     + opts[1] = cpu_to_le32(rtl8169_tx_vlan_tag(tp, skb));
195     + opts[0] = DescOwn;
196     +
197     + if (!rtl8169_tso_csum(tp, skb, opts))
198     + goto err_update_stats;
199     +
200     len = skb_headlen(skb);
201     mapping = dma_map_single(d, skb->data, len, DMA_TO_DEVICE);
202     if (unlikely(dma_mapping_error(d, mapping))) {
203     @@ -5188,11 +5206,6 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
204     tp->tx_skb[entry].len = len;
205     txd->addr = cpu_to_le64(mapping);
206    
207     - opts[1] = cpu_to_le32(rtl8169_tx_vlan_tag(tp, skb));
208     - opts[0] = DescOwn;
209     -
210     - rtl8169_tso_csum(tp, skb, opts);
211     -
212     frags = rtl8169_xmit_frags(tp, skb, opts);
213     if (frags < 0)
214     goto err_dma_1;
215     diff --git a/drivers/net/team/team_mode_roundrobin.c b/drivers/net/team/team_mode_roundrobin.c
216     index a0e8f80..bf6a818 100644
217     --- a/drivers/net/team/team_mode_roundrobin.c
218     +++ b/drivers/net/team/team_mode_roundrobin.c
219     @@ -52,6 +52,8 @@ static bool rr_transmit(struct team *team, struct sk_buff *skb)
220    
221     port_index = rr_priv(team)->sent_packets++ % team->port_count;
222     port = team_get_port_by_index_rcu(team, port_index);
223     + if (unlikely(!port))
224     + goto drop;
225     port = __get_first_port_up(team, port);
226     if (unlikely(!port))
227     goto drop;
228     diff --git a/drivers/target/iscsi/iscsi_target_erl0.c b/drivers/target/iscsi/iscsi_target_erl0.c
229     index 1ab0560..a7c4324 100644
230     --- a/drivers/target/iscsi/iscsi_target_erl0.c
231     +++ b/drivers/target/iscsi/iscsi_target_erl0.c
232     @@ -831,11 +831,11 @@ extern int iscsit_stop_time2retain_timer(struct iscsi_session *sess)
233     return 0;
234    
235     sess->time2retain_timer_flags |= ISCSI_TF_STOP;
236     - spin_unlock_bh(&se_tpg->session_lock);
237     + spin_unlock(&se_tpg->session_lock);
238    
239     del_timer_sync(&sess->time2retain_timer);
240    
241     - spin_lock_bh(&se_tpg->session_lock);
242     + spin_lock(&se_tpg->session_lock);
243     sess->time2retain_timer_flags &= ~ISCSI_TF_RUNNING;
244     pr_debug("Stopped Time2Retain Timer for SID: %u\n",
245     sess->sid);
246     diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c
247     index 3377437..a39a08c 100644
248     --- a/drivers/usb/serial/ti_usb_3410_5052.c
249     +++ b/drivers/usb/serial/ti_usb_3410_5052.c
250     @@ -179,7 +179,8 @@ static struct usb_device_id ti_id_table_3410[15+TI_EXTRA_VID_PID_COUNT+1] = {
251     { USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) },
252     { USB_DEVICE(IBM_VENDOR_ID, IBM_454B_PRODUCT_ID) },
253     { USB_DEVICE(IBM_VENDOR_ID, IBM_454C_PRODUCT_ID) },
254     - { USB_DEVICE(ABBOTT_VENDOR_ID, ABBOTT_PRODUCT_ID) },
255     + { USB_DEVICE(ABBOTT_VENDOR_ID, ABBOTT_STEREO_PLUG_ID) },
256     + { USB_DEVICE(ABBOTT_VENDOR_ID, ABBOTT_STRIP_PORT_ID) },
257     { USB_DEVICE(TI_VENDOR_ID, FRI2_PRODUCT_ID) },
258     };
259    
260     diff --git a/drivers/usb/serial/ti_usb_3410_5052.h b/drivers/usb/serial/ti_usb_3410_5052.h
261     index b353e7e..4a2423e 100644
262     --- a/drivers/usb/serial/ti_usb_3410_5052.h
263     +++ b/drivers/usb/serial/ti_usb_3410_5052.h
264     @@ -52,7 +52,9 @@
265    
266     /* Abbott Diabetics vendor and product ids */
267     #define ABBOTT_VENDOR_ID 0x1a61
268     -#define ABBOTT_PRODUCT_ID 0x3410
269     +#define ABBOTT_STEREO_PLUG_ID 0x3410
270     +#define ABBOTT_PRODUCT_ID ABBOTT_STEREO_PLUG_ID
271     +#define ABBOTT_STRIP_PORT_ID 0x3420
272    
273     /* Commands */
274     #define TI_GET_VERSION 0x01
275     diff --git a/fs/notify/inotify/inotify_user.c b/fs/notify/inotify/inotify_user.c
276     index 6f292dd..f255d37 100644
277     --- a/fs/notify/inotify/inotify_user.c
278     +++ b/fs/notify/inotify/inotify_user.c
279     @@ -577,7 +577,6 @@ static int inotify_update_existing_watch(struct fsnotify_group *group,
280     int add = (arg & IN_MASK_ADD);
281     int ret;
282    
283     - /* don't allow invalid bits: we don't want flags set */
284     mask = inotify_arg_to_mask(arg);
285    
286     fsn_mark = fsnotify_find_inode_mark(group, inode);
287     @@ -628,7 +627,6 @@ static int inotify_new_watch(struct fsnotify_group *group,
288     struct idr *idr = &group->inotify_data.idr;
289     spinlock_t *idr_lock = &group->inotify_data.idr_lock;
290    
291     - /* don't allow invalid bits: we don't want flags set */
292     mask = inotify_arg_to_mask(arg);
293    
294     tmp_i_mark = kmem_cache_alloc(inotify_inode_mark_cachep, GFP_KERNEL);
295     @@ -757,6 +755,10 @@ SYSCALL_DEFINE3(inotify_add_watch, int, fd, const char __user *, pathname,
296     int ret, fput_needed;
297     unsigned flags = 0;
298    
299     + /* don't allow invalid bits: we don't want flags set */
300     + if (unlikely(!(mask & ALL_INOTIFY_BITS)))
301     + return -EINVAL;
302     +
303     filp = fget_light(fd, &fput_needed);
304     if (unlikely(!filp))
305     return -EBADF;
306     diff --git a/include/linux/rculist_nulls.h b/include/linux/rculist_nulls.h
307     index 2ae1371..1c33dd7 100644
308     --- a/include/linux/rculist_nulls.h
309     +++ b/include/linux/rculist_nulls.h
310     @@ -105,9 +105,14 @@ static inline void hlist_nulls_add_head_rcu(struct hlist_nulls_node *n,
311     * @head: the head for your list.
312     * @member: the name of the hlist_nulls_node within the struct.
313     *
314     + * The barrier() is needed to make sure compiler doesn't cache first element [1],
315     + * as this loop can be restarted [2]
316     + * [1] Documentation/atomic_ops.txt around line 114
317     + * [2] Documentation/RCU/rculist_nulls.txt around line 146
318     */
319     #define hlist_nulls_for_each_entry_rcu(tpos, pos, head, member) \
320     - for (pos = rcu_dereference_raw(hlist_nulls_first_rcu(head)); \
321     + for (({barrier();}), \
322     + pos = rcu_dereference_raw(hlist_nulls_first_rcu(head)); \
323     (!is_a_nulls(pos)) && \
324     ({ tpos = hlist_nulls_entry(pos, typeof(*tpos), member); 1; }); \
325     pos = rcu_dereference_raw(hlist_nulls_next_rcu(pos)))
326     diff --git a/include/linux/socket.h b/include/linux/socket.h
327     index 8f15b1d..9b54ebe 100644
328     --- a/include/linux/socket.h
329     +++ b/include/linux/socket.h
330     @@ -336,6 +336,9 @@ extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data);
331    
332     struct timespec;
333    
334     +/* The __sys_...msg variants allow MSG_CMSG_COMPAT */
335     +extern long __sys_recvmsg(int fd, struct msghdr __user *msg, unsigned flags);
336     +extern long __sys_sendmsg(int fd, struct msghdr __user *msg, unsigned flags);
337     extern int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
338     unsigned int flags, struct timespec *timeout);
339     extern int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg,
340     diff --git a/net/compat.c b/net/compat.c
341     index ae6d67a..014e1c7 100644
342     --- a/net/compat.c
343     +++ b/net/compat.c
344     @@ -743,19 +743,25 @@ static unsigned char nas[21] = {
345    
346     asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg, unsigned flags)
347     {
348     - return sys_sendmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT);
349     + if (flags & MSG_CMSG_COMPAT)
350     + return -EINVAL;
351     + return __sys_sendmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT);
352     }
353    
354     asmlinkage long compat_sys_sendmmsg(int fd, struct compat_mmsghdr __user *mmsg,
355     unsigned vlen, unsigned int flags)
356     {
357     + if (flags & MSG_CMSG_COMPAT)
358     + return -EINVAL;
359     return __sys_sendmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
360     flags | MSG_CMSG_COMPAT);
361     }
362    
363     asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg, unsigned int flags)
364     {
365     - return sys_recvmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT);
366     + if (flags & MSG_CMSG_COMPAT)
367     + return -EINVAL;
368     + return __sys_recvmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT);
369     }
370    
371     asmlinkage long compat_sys_recv(int fd, void __user *buf, size_t len, unsigned flags)
372     @@ -777,6 +783,9 @@ asmlinkage long compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,
373     int datagrams;
374     struct timespec ktspec;
375    
376     + if (flags & MSG_CMSG_COMPAT)
377     + return -EINVAL;
378     +
379     if (COMPAT_USE_64BIT_TIME)
380     return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
381     flags | MSG_CMSG_COMPAT,
382     diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
383     index b57532d..a16509c 100644
384     --- a/net/ipv4/ip_gre.c
385     +++ b/net/ipv4/ip_gre.c
386     @@ -722,6 +722,7 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev
387     tiph = &tunnel->parms.iph;
388     }
389    
390     + memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
391     if ((dst = tiph->daddr) == 0) {
392     /* NBMA tunnel */
393    
394     @@ -865,7 +866,6 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev
395     skb_reset_transport_header(skb);
396     skb_push(skb, gre_hlen);
397     skb_reset_network_header(skb);
398     - memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
399     IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED |
400     IPSKB_REROUTED);
401     skb_dst_drop(skb);
402     diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c
403     index ae1413e..d2f6348 100644
404     --- a/net/ipv4/ipip.c
405     +++ b/net/ipv4/ipip.c
406     @@ -448,6 +448,7 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
407     if (tos & 1)
408     tos = old_iph->tos;
409    
410     + memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
411     if (!dst) {
412     /* NBMA tunnel */
413     if ((rt = skb_rtable(skb)) == NULL) {
414     @@ -530,7 +531,6 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
415     skb->transport_header = skb->network_header;
416     skb_push(skb, sizeof(struct iphdr));
417     skb_reset_network_header(skb);
418     - memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
419     IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED |
420     IPSKB_REROUTED);
421     skb_dst_drop(skb);
422     diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
423     index dcb19f5..0b91c30 100644
424     --- a/net/ipv4/tcp.c
425     +++ b/net/ipv4/tcp.c
426     @@ -3055,8 +3055,11 @@ int tcp_md5_hash_skb_data(struct tcp_md5sig_pool *hp,
427    
428     for (i = 0; i < shi->nr_frags; ++i) {
429     const struct skb_frag_struct *f = &shi->frags[i];
430     - struct page *page = skb_frag_page(f);
431     - sg_set_page(&sg, page, skb_frag_size(f), f->page_offset);
432     + unsigned int offset = f->page_offset;
433     + struct page *page = skb_frag_page(f) + (offset >> PAGE_SHIFT);
434     +
435     + sg_set_page(&sg, page, skb_frag_size(f),
436     + offset_in_page(offset));
437     if (crypto_hash_update(desc, &sg, skb_frag_size(f)))
438     return 1;
439     }
440     diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
441     index 762c78f..55d96c3 100644
442     --- a/net/ipv4/tcp_input.c
443     +++ b/net/ipv4/tcp_input.c
444     @@ -3038,8 +3038,8 @@ static void tcp_update_cwnd_in_recovery(struct sock *sk, int newly_acked_sacked,
445     * tcp_xmit_retransmit_queue().
446     */
447     static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked,
448     - int prior_sacked, bool is_dupack,
449     - int flag)
450     + int prior_sacked, int prior_packets,
451     + bool is_dupack, int flag)
452     {
453     struct inet_connection_sock *icsk = inet_csk(sk);
454     struct tcp_sock *tp = tcp_sk(sk);
455     @@ -3105,7 +3105,8 @@ static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked,
456     tcp_add_reno_sack(sk);
457     } else
458     do_lost = tcp_try_undo_partial(sk, pkts_acked);
459     - newly_acked_sacked = pkts_acked + tp->sacked_out - prior_sacked;
460     + newly_acked_sacked = prior_packets - tp->packets_out +
461     + tp->sacked_out - prior_sacked;
462     break;
463     case TCP_CA_Loss:
464     if (flag & FLAG_DATA_ACKED)
465     @@ -3127,7 +3128,8 @@ static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked,
466     if (is_dupack)
467     tcp_add_reno_sack(sk);
468     }
469     - newly_acked_sacked = pkts_acked + tp->sacked_out - prior_sacked;
470     + newly_acked_sacked = prior_packets - tp->packets_out +
471     + tp->sacked_out - prior_sacked;
472    
473     if (icsk->icsk_ca_state <= TCP_CA_Disorder)
474     tcp_try_undo_dsack(sk);
475     @@ -3740,9 +3742,10 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
476     bool is_dupack = false;
477     u32 prior_in_flight;
478     u32 prior_fackets;
479     - int prior_packets;
480     + int prior_packets = tp->packets_out;
481     int prior_sacked = tp->sacked_out;
482     int pkts_acked = 0;
483     + int previous_packets_out = 0;
484     int frto_cwnd = 0;
485    
486     /* If the ack is older than previous acks
487     @@ -3819,14 +3822,14 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
488     sk->sk_err_soft = 0;
489     icsk->icsk_probes_out = 0;
490     tp->rcv_tstamp = tcp_time_stamp;
491     - prior_packets = tp->packets_out;
492     if (!prior_packets)
493     goto no_queue;
494    
495     /* See if we can take anything off of the retransmit queue. */
496     + previous_packets_out = tp->packets_out;
497     flag |= tcp_clean_rtx_queue(sk, prior_fackets, prior_snd_una);
498    
499     - pkts_acked = prior_packets - tp->packets_out;
500     + pkts_acked = previous_packets_out - tp->packets_out;
501    
502     if (tp->frto_counter)
503     frto_cwnd = tcp_process_frto(sk, flag);
504     @@ -3841,7 +3844,7 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
505     tcp_cong_avoid(sk, ack, prior_in_flight);
506     is_dupack = !(flag & (FLAG_SND_UNA_ADVANCED | FLAG_NOT_DUP));
507     tcp_fastretrans_alert(sk, pkts_acked, prior_sacked,
508     - is_dupack, flag);
509     + prior_packets, is_dupack, flag);
510     } else {
511     if ((flag & FLAG_DATA_ACKED) && !frto_cwnd)
512     tcp_cong_avoid(sk, ack, prior_in_flight);
513     @@ -3856,7 +3859,7 @@ no_queue:
514     /* If data was DSACKed, see if we can undo a cwnd reduction. */
515     if (flag & FLAG_DSACKING_ACK)
516     tcp_fastretrans_alert(sk, pkts_acked, prior_sacked,
517     - is_dupack, flag);
518     + prior_packets, is_dupack, flag);
519     /* If this ack opens up a zero window, clear backoff. It was
520     * being used to time the probes, and is probably far higher than
521     * it needs to be for normal retransmission.
522     @@ -3876,7 +3879,7 @@ old_ack:
523     if (TCP_SKB_CB(skb)->sacked) {
524     flag |= tcp_sacktag_write_queue(sk, skb, prior_snd_una);
525     tcp_fastretrans_alert(sk, pkts_acked, prior_sacked,
526     - is_dupack, flag);
527     + prior_packets, is_dupack, flag);
528     }
529    
530     SOCK_DEBUG(sk, "Ack %u before %u:%u\n", ack, tp->snd_una, tp->snd_nxt);
531     diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
532     index 9db21e3..12999a3 100644
533     --- a/net/ipv4/tcp_output.c
534     +++ b/net/ipv4/tcp_output.c
535     @@ -835,11 +835,13 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,
536     &md5);
537     tcp_header_size = tcp_options_size + sizeof(struct tcphdr);
538    
539     - if (tcp_packets_in_flight(tp) == 0) {
540     + if (tcp_packets_in_flight(tp) == 0)
541     tcp_ca_event(sk, CA_EVENT_TX_START);
542     - skb->ooo_okay = 1;
543     - } else
544     - skb->ooo_okay = 0;
545     +
546     + /* if no packet is in qdisc/device queue, then allow XPS to select
547     + * another queue.
548     + */
549     + skb->ooo_okay = sk_wmem_alloc_get(sk) == 0;
550    
551     skb_push(skb, tcp_header_size);
552     skb_reset_transport_header(skb);
553     diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
554     index 2c496d6..f4fe3c0 100644
555     --- a/net/ipv6/addrconf.c
556     +++ b/net/ipv6/addrconf.c
557     @@ -2432,8 +2432,10 @@ static void init_loopback(struct net_device *dev)
558     sp_rt = addrconf_dst_alloc(idev, &sp_ifa->addr, 0);
559    
560     /* Failure cases are ignored */
561     - if (!IS_ERR(sp_rt))
562     + if (!IS_ERR(sp_rt)) {
563     + sp_ifa->rt = sp_rt;
564     ip6_ins_rt(sp_rt);
565     + }
566     }
567     read_unlock_bh(&idev->lock);
568     }
569     diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
570     index ce661ba..bf290ce 100644
571     --- a/net/ipv6/ip6_output.c
572     +++ b/net/ipv6/ip6_output.c
573     @@ -1236,7 +1236,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
574     if (WARN_ON(np->cork.opt))
575     return -EINVAL;
576    
577     - np->cork.opt = kmalloc(opt->tot_len, sk->sk_allocation);
578     + np->cork.opt = kzalloc(opt->tot_len, sk->sk_allocation);
579     if (unlikely(np->cork.opt == NULL))
580     return -ENOBUFS;
581    
582     diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c
583     index 9728a75..c6dee80 100644
584     --- a/net/l2tp/l2tp_ppp.c
585     +++ b/net/l2tp/l2tp_ppp.c
586     @@ -350,19 +350,19 @@ static int pppol2tp_sendmsg(struct kiocb *iocb, struct socket *sock, struct msgh
587     skb_put(skb, 2);
588    
589     /* Copy user data into skb */
590     - error = memcpy_fromiovec(skb->data, m->msg_iov, total_len);
591     + error = memcpy_fromiovec(skb_put(skb, total_len), m->msg_iov,
592     + total_len);
593     if (error < 0) {
594     kfree_skb(skb);
595     goto error_put_sess_tun;
596     }
597     - skb_put(skb, total_len);
598    
599     l2tp_xmit_skb(session, skb, session->hdr_len);
600    
601     sock_put(ps->tunnel_sock);
602     sock_put(sk);
603    
604     - return error;
605     + return total_len;
606    
607     error_put_sess_tun:
608     sock_put(ps->tunnel_sock);
609     diff --git a/net/netlabel/netlabel_domainhash.c b/net/netlabel/netlabel_domainhash.c
610     index d8d4243..6bb1d42 100644
611     --- a/net/netlabel/netlabel_domainhash.c
612     +++ b/net/netlabel/netlabel_domainhash.c
613     @@ -245,6 +245,71 @@ static void netlbl_domhsh_audit_add(struct netlbl_dom_map *entry,
614     }
615     }
616    
617     +/**
618     + * netlbl_domhsh_validate - Validate a new domain mapping entry
619     + * @entry: the entry to validate
620     + *
621     + * This function validates the new domain mapping entry to ensure that it is
622     + * a valid entry. Returns zero on success, negative values on failure.
623     + *
624     + */
625     +static int netlbl_domhsh_validate(const struct netlbl_dom_map *entry)
626     +{
627     + struct netlbl_af4list *iter4;
628     + struct netlbl_domaddr4_map *map4;
629     +#if IS_ENABLED(CONFIG_IPV6)
630     + struct netlbl_af6list *iter6;
631     + struct netlbl_domaddr6_map *map6;
632     +#endif /* IPv6 */
633     +
634     + if (entry == NULL)
635     + return -EINVAL;
636     +
637     + switch (entry->type) {
638     + case NETLBL_NLTYPE_UNLABELED:
639     + if (entry->type_def.cipsov4 != NULL ||
640     + entry->type_def.addrsel != NULL)
641     + return -EINVAL;
642     + break;
643     + case NETLBL_NLTYPE_CIPSOV4:
644     + if (entry->type_def.cipsov4 == NULL)
645     + return -EINVAL;
646     + break;
647     + case NETLBL_NLTYPE_ADDRSELECT:
648     + netlbl_af4list_foreach(iter4, &entry->type_def.addrsel->list4) {
649     + map4 = netlbl_domhsh_addr4_entry(iter4);
650     + switch (map4->type) {
651     + case NETLBL_NLTYPE_UNLABELED:
652     + if (map4->type_def.cipsov4 != NULL)
653     + return -EINVAL;
654     + break;
655     + case NETLBL_NLTYPE_CIPSOV4:
656     + if (map4->type_def.cipsov4 == NULL)
657     + return -EINVAL;
658     + break;
659     + default:
660     + return -EINVAL;
661     + }
662     + }
663     +#if IS_ENABLED(CONFIG_IPV6)
664     + netlbl_af6list_foreach(iter6, &entry->type_def.addrsel->list6) {
665     + map6 = netlbl_domhsh_addr6_entry(iter6);
666     + switch (map6->type) {
667     + case NETLBL_NLTYPE_UNLABELED:
668     + break;
669     + default:
670     + return -EINVAL;
671     + }
672     + }
673     +#endif /* IPv6 */
674     + break;
675     + default:
676     + return -EINVAL;
677     + }
678     +
679     + return 0;
680     +}
681     +
682     /*
683     * Domain Hash Table Functions
684     */
685     @@ -311,6 +376,10 @@ int netlbl_domhsh_add(struct netlbl_dom_map *entry,
686     struct netlbl_af6list *tmp6;
687     #endif /* IPv6 */
688    
689     + ret_val = netlbl_domhsh_validate(entry);
690     + if (ret_val != 0)
691     + return ret_val;
692     +
693     /* XXX - we can remove this RCU read lock as the spinlock protects the
694     * entire function, but before we do we need to fixup the
695     * netlbl_af[4,6]list RCU functions to do "the right thing" with
696     diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
697     index cfcd783..8ed5d93 100644
698     --- a/net/packet/af_packet.c
699     +++ b/net/packet/af_packet.c
700     @@ -2848,12 +2848,11 @@ static int packet_getname_spkt(struct socket *sock, struct sockaddr *uaddr,
701     return -EOPNOTSUPP;
702    
703     uaddr->sa_family = AF_PACKET;
704     + memset(uaddr->sa_data, 0, sizeof(uaddr->sa_data));
705     rcu_read_lock();
706     dev = dev_get_by_index_rcu(sock_net(sk), pkt_sk(sk)->ifindex);
707     if (dev)
708     - strncpy(uaddr->sa_data, dev->name, 14);
709     - else
710     - memset(uaddr->sa_data, 0, 14);
711     + strlcpy(uaddr->sa_data, dev->name, sizeof(uaddr->sa_data));
712     rcu_read_unlock();
713     *uaddr_len = sizeof(*uaddr);
714    
715     diff --git a/net/sctp/socket.c b/net/sctp/socket.c
716     index 9fd05ed..4bc6e0b 100644
717     --- a/net/sctp/socket.c
718     +++ b/net/sctp/socket.c
719     @@ -3929,6 +3929,12 @@ SCTP_STATIC void sctp_destroy_sock(struct sock *sk)
720    
721     /* Release our hold on the endpoint. */
722     sp = sctp_sk(sk);
723     + /* This could happen during socket init, thus we bail out
724     + * early, since the rest of the below is not setup either.
725     + */
726     + if (sp->ep == NULL)
727     + return;
728     +
729     if (sp->do_auto_asconf) {
730     sp->do_auto_asconf = 0;
731     list_del(&sp->auto_asconf_list);
732     diff --git a/net/socket.c b/net/socket.c
733     index dab3176..47ce3ea 100644
734     --- a/net/socket.c
735     +++ b/net/socket.c
736     @@ -1899,9 +1899,9 @@ struct used_address {
737     unsigned int name_len;
738     };
739    
740     -static int __sys_sendmsg(struct socket *sock, struct msghdr __user *msg,
741     - struct msghdr *msg_sys, unsigned flags,
742     - struct used_address *used_address)
743     +static int ___sys_sendmsg(struct socket *sock, struct msghdr __user *msg,
744     + struct msghdr *msg_sys, unsigned flags,
745     + struct used_address *used_address)
746     {
747     struct compat_msghdr __user *msg_compat =
748     (struct compat_msghdr __user *)msg;
749     @@ -2017,22 +2017,30 @@ out:
750     * BSD sendmsg interface
751     */
752    
753     -SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned, flags)
754     +long __sys_sendmsg(int fd, struct msghdr __user *msg, unsigned flags)
755     {
756     int fput_needed, err;
757     struct msghdr msg_sys;
758     - struct socket *sock = sockfd_lookup_light(fd, &err, &fput_needed);
759     + struct socket *sock;
760    
761     + sock = sockfd_lookup_light(fd, &err, &fput_needed);
762     if (!sock)
763     goto out;
764    
765     - err = __sys_sendmsg(sock, msg, &msg_sys, flags, NULL);
766     + err = ___sys_sendmsg(sock, msg, &msg_sys, flags, NULL);
767    
768     fput_light(sock->file, fput_needed);
769     out:
770     return err;
771     }
772    
773     +SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned int, flags)
774     +{
775     + if (flags & MSG_CMSG_COMPAT)
776     + return -EINVAL;
777     + return __sys_sendmsg(fd, msg, flags);
778     +}
779     +
780     /*
781     * Linux sendmmsg interface
782     */
783     @@ -2063,15 +2071,16 @@ int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
784    
785     while (datagrams < vlen) {
786     if (MSG_CMSG_COMPAT & flags) {
787     - err = __sys_sendmsg(sock, (struct msghdr __user *)compat_entry,
788     - &msg_sys, flags, &used_address);
789     + err = ___sys_sendmsg(sock, (struct msghdr __user *)compat_entry,
790     + &msg_sys, flags, &used_address);
791     if (err < 0)
792     break;
793     err = __put_user(err, &compat_entry->msg_len);
794     ++compat_entry;
795     } else {
796     - err = __sys_sendmsg(sock, (struct msghdr __user *)entry,
797     - &msg_sys, flags, &used_address);
798     + err = ___sys_sendmsg(sock,
799     + (struct msghdr __user *)entry,
800     + &msg_sys, flags, &used_address);
801     if (err < 0)
802     break;
803     err = put_user(err, &entry->msg_len);
804     @@ -2095,11 +2104,13 @@ int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
805     SYSCALL_DEFINE4(sendmmsg, int, fd, struct mmsghdr __user *, mmsg,
806     unsigned int, vlen, unsigned int, flags)
807     {
808     + if (flags & MSG_CMSG_COMPAT)
809     + return -EINVAL;
810     return __sys_sendmmsg(fd, mmsg, vlen, flags);
811     }
812    
813     -static int __sys_recvmsg(struct socket *sock, struct msghdr __user *msg,
814     - struct msghdr *msg_sys, unsigned flags, int nosec)
815     +static int ___sys_recvmsg(struct socket *sock, struct msghdr __user *msg,
816     + struct msghdr *msg_sys, unsigned flags, int nosec)
817     {
818     struct compat_msghdr __user *msg_compat =
819     (struct compat_msghdr __user *)msg;
820     @@ -2192,23 +2203,31 @@ out:
821     * BSD recvmsg interface
822     */
823    
824     -SYSCALL_DEFINE3(recvmsg, int, fd, struct msghdr __user *, msg,
825     - unsigned int, flags)
826     +long __sys_recvmsg(int fd, struct msghdr __user *msg, unsigned flags)
827     {
828     int fput_needed, err;
829     struct msghdr msg_sys;
830     - struct socket *sock = sockfd_lookup_light(fd, &err, &fput_needed);
831     + struct socket *sock;
832    
833     + sock = sockfd_lookup_light(fd, &err, &fput_needed);
834     if (!sock)
835     goto out;
836    
837     - err = __sys_recvmsg(sock, msg, &msg_sys, flags, 0);
838     + err = ___sys_recvmsg(sock, msg, &msg_sys, flags, 0);
839    
840     fput_light(sock->file, fput_needed);
841     out:
842     return err;
843     }
844    
845     +SYSCALL_DEFINE3(recvmsg, int, fd, struct msghdr __user *, msg,
846     + unsigned int, flags)
847     +{
848     + if (flags & MSG_CMSG_COMPAT)
849     + return -EINVAL;
850     + return __sys_recvmsg(fd, msg, flags);
851     +}
852     +
853     /*
854     * Linux recvmmsg interface
855     */
856     @@ -2246,17 +2265,18 @@ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
857     * No need to ask LSM for more than the first datagram.
858     */
859     if (MSG_CMSG_COMPAT & flags) {
860     - err = __sys_recvmsg(sock, (struct msghdr __user *)compat_entry,
861     - &msg_sys, flags & ~MSG_WAITFORONE,
862     - datagrams);
863     + err = ___sys_recvmsg(sock, (struct msghdr __user *)compat_entry,
864     + &msg_sys, flags & ~MSG_WAITFORONE,
865     + datagrams);
866     if (err < 0)
867     break;
868     err = __put_user(err, &compat_entry->msg_len);
869     ++compat_entry;
870     } else {
871     - err = __sys_recvmsg(sock, (struct msghdr __user *)entry,
872     - &msg_sys, flags & ~MSG_WAITFORONE,
873     - datagrams);
874     + err = ___sys_recvmsg(sock,
875     + (struct msghdr __user *)entry,
876     + &msg_sys, flags & ~MSG_WAITFORONE,
877     + datagrams);
878     if (err < 0)
879     break;
880     err = put_user(err, &entry->msg_len);
881     @@ -2323,6 +2343,9 @@ SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg,
882     int datagrams;
883     struct timespec timeout_sys;
884    
885     + if (flags & MSG_CMSG_COMPAT)
886     + return -EINVAL;
887     +
888     if (!timeout)
889     return __sys_recvmmsg(fd, mmsg, vlen, flags, NULL);
890    
891     diff --git a/sound/usb/card.c b/sound/usb/card.c
892     index b41730d..658ea11 100644
893     --- a/sound/usb/card.c
894     +++ b/sound/usb/card.c
895     @@ -149,14 +149,32 @@ static int snd_usb_create_stream(struct snd_usb_audio *chip, int ctrlif, int int
896     return -EINVAL;
897     }
898    
899     + alts = &iface->altsetting[0];
900     + altsd = get_iface_desc(alts);
901     +
902     + /*
903     + * Android with both accessory and audio interfaces enabled gets the
904     + * interface numbers wrong.
905     + */
906     + if ((chip->usb_id == USB_ID(0x18d1, 0x2d04) ||
907     + chip->usb_id == USB_ID(0x18d1, 0x2d05)) &&
908     + interface == 0 &&
909     + altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC &&
910     + altsd->bInterfaceSubClass == USB_SUBCLASS_VENDOR_SPEC) {
911     + interface = 2;
912     + iface = usb_ifnum_to_if(dev, interface);
913     + if (!iface)
914     + return -EINVAL;
915     + alts = &iface->altsetting[0];
916     + altsd = get_iface_desc(alts);
917     + }
918     +
919     if (usb_interface_claimed(iface)) {
920     snd_printdd(KERN_INFO "%d:%d:%d: skipping, already claimed\n",
921     dev->devnum, ctrlif, interface);
922     return -EINVAL;
923     }
924    
925     - alts = &iface->altsetting[0];
926     - altsd = get_iface_desc(alts);
927     if ((altsd->bInterfaceClass == USB_CLASS_AUDIO ||
928     altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC) &&
929     altsd->bInterfaceSubClass == USB_SUBCLASS_MIDISTREAMING) {
930     diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
931     index e075a67..5ca4652 100644
932     --- a/sound/usb/mixer.c
933     +++ b/sound/usb/mixer.c
934     @@ -821,6 +821,7 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval,
935    
936     case USB_ID(0x046d, 0x0808):
937     case USB_ID(0x046d, 0x0809):
938     + case USB_ID(0x046d, 0x081b): /* HD Webcam c310 */
939     case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */
940     case USB_ID(0x046d, 0x0825): /* HD Webcam c270 */
941     case USB_ID(0x046d, 0x0991):