1 |
commit: 75ba3c6239bfacd09cd82d8a68806d26364b51d4 |
2 |
Author: Mike Pagano <mpagano <AT> gentoo <DOT> org> |
3 |
AuthorDate: Sat Mar 31 22:16:08 2018 +0000 |
4 |
Commit: Mike Pagano <mpagano <AT> gentoo <DOT> org> |
5 |
CommitDate: Sat Mar 31 22:16:08 2018 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=75ba3c62 |
7 |
|
8 |
Linux patch 4.4.126 |
9 |
|
10 |
0000_README | 4 + |
11 |
1125_linux-4.4.126.patch | 455 +++++++++++++++++++++++++++++++++++++++++++++++ |
12 |
2 files changed, 459 insertions(+) |
13 |
|
14 |
diff --git a/0000_README b/0000_README |
15 |
index d9d85f6..fd31be4 100644 |
16 |
--- a/0000_README |
17 |
+++ b/0000_README |
18 |
@@ -539,6 +539,10 @@ Patch: 1123_linux-4.4.124.patch |
19 |
From: http://www.kernel.org |
20 |
Desc: Linux 4.4.124 |
21 |
|
22 |
+Patch: 1125_linux-4.4.125.patch |
23 |
+From: http://www.kernel.org |
24 |
+Desc: Linux 4.4.125 |
25 |
+ |
26 |
Patch: 1500_XATTR_USER_PREFIX.patch |
27 |
From: https://bugs.gentoo.org/show_bug.cgi?id=470644 |
28 |
Desc: Support for namespace user.pax.* on tmpfs. |
29 |
|
30 |
diff --git a/1125_linux-4.4.126.patch b/1125_linux-4.4.126.patch |
31 |
new file mode 100644 |
32 |
index 0000000..caede2f |
33 |
--- /dev/null |
34 |
+++ b/1125_linux-4.4.126.patch |
35 |
@@ -0,0 +1,455 @@ |
36 |
+diff --git a/Makefile b/Makefile |
37 |
+index 7dcafa5dcd34..2b699c5f6de4 100644 |
38 |
+--- a/Makefile |
39 |
++++ b/Makefile |
40 |
+@@ -1,6 +1,6 @@ |
41 |
+ VERSION = 4 |
42 |
+ PATCHLEVEL = 4 |
43 |
+-SUBLEVEL = 125 |
44 |
++SUBLEVEL = 126 |
45 |
+ EXTRAVERSION = |
46 |
+ NAME = Blurry Fish Butt |
47 |
+ |
48 |
+diff --git a/drivers/net/ethernet/arc/emac_rockchip.c b/drivers/net/ethernet/arc/emac_rockchip.c |
49 |
+index c31c7407b753..425dae560322 100644 |
50 |
+--- a/drivers/net/ethernet/arc/emac_rockchip.c |
51 |
++++ b/drivers/net/ethernet/arc/emac_rockchip.c |
52 |
+@@ -150,8 +150,10 @@ static int emac_rockchip_probe(struct platform_device *pdev) |
53 |
+ /* Optional regulator for PHY */ |
54 |
+ priv->regulator = devm_regulator_get_optional(dev, "phy"); |
55 |
+ if (IS_ERR(priv->regulator)) { |
56 |
+- if (PTR_ERR(priv->regulator) == -EPROBE_DEFER) |
57 |
+- return -EPROBE_DEFER; |
58 |
++ if (PTR_ERR(priv->regulator) == -EPROBE_DEFER) { |
59 |
++ err = -EPROBE_DEFER; |
60 |
++ goto out_clk_disable; |
61 |
++ } |
62 |
+ dev_err(dev, "no regulator found\n"); |
63 |
+ priv->regulator = NULL; |
64 |
+ } |
65 |
+diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c |
66 |
+index 027705117086..af9ec57bbebf 100644 |
67 |
+--- a/drivers/net/ethernet/broadcom/bcmsysport.c |
68 |
++++ b/drivers/net/ethernet/broadcom/bcmsysport.c |
69 |
+@@ -729,37 +729,33 @@ static unsigned int __bcm_sysport_tx_reclaim(struct bcm_sysport_priv *priv, |
70 |
+ struct bcm_sysport_tx_ring *ring) |
71 |
+ { |
72 |
+ struct net_device *ndev = priv->netdev; |
73 |
+- unsigned int c_index, last_c_index, last_tx_cn, num_tx_cbs; |
74 |
+ unsigned int pkts_compl = 0, bytes_compl = 0; |
75 |
++ unsigned int txbds_processed = 0; |
76 |
+ struct bcm_sysport_cb *cb; |
77 |
++ unsigned int txbds_ready; |
78 |
++ unsigned int c_index; |
79 |
+ u32 hw_ind; |
80 |
+ |
81 |
+ /* Compute how many descriptors have been processed since last call */ |
82 |
+ hw_ind = tdma_readl(priv, TDMA_DESC_RING_PROD_CONS_INDEX(ring->index)); |
83 |
+ c_index = (hw_ind >> RING_CONS_INDEX_SHIFT) & RING_CONS_INDEX_MASK; |
84 |
+- ring->p_index = (hw_ind & RING_PROD_INDEX_MASK); |
85 |
+- |
86 |
+- last_c_index = ring->c_index; |
87 |
+- num_tx_cbs = ring->size; |
88 |
+- |
89 |
+- c_index &= (num_tx_cbs - 1); |
90 |
+- |
91 |
+- if (c_index >= last_c_index) |
92 |
+- last_tx_cn = c_index - last_c_index; |
93 |
+- else |
94 |
+- last_tx_cn = num_tx_cbs - last_c_index + c_index; |
95 |
++ txbds_ready = (c_index - ring->c_index) & RING_CONS_INDEX_MASK; |
96 |
+ |
97 |
+ netif_dbg(priv, tx_done, ndev, |
98 |
+- "ring=%d c_index=%d last_tx_cn=%d last_c_index=%d\n", |
99 |
+- ring->index, c_index, last_tx_cn, last_c_index); |
100 |
++ "ring=%d old_c_index=%u c_index=%u txbds_ready=%u\n", |
101 |
++ ring->index, ring->c_index, c_index, txbds_ready); |
102 |
+ |
103 |
+- while (last_tx_cn-- > 0) { |
104 |
+- cb = ring->cbs + last_c_index; |
105 |
++ while (txbds_processed < txbds_ready) { |
106 |
++ cb = &ring->cbs[ring->clean_index]; |
107 |
+ bcm_sysport_tx_reclaim_one(priv, cb, &bytes_compl, &pkts_compl); |
108 |
+ |
109 |
+ ring->desc_count++; |
110 |
+- last_c_index++; |
111 |
+- last_c_index &= (num_tx_cbs - 1); |
112 |
++ txbds_processed++; |
113 |
++ |
114 |
++ if (likely(ring->clean_index < ring->size - 1)) |
115 |
++ ring->clean_index++; |
116 |
++ else |
117 |
++ ring->clean_index = 0; |
118 |
+ } |
119 |
+ |
120 |
+ ring->c_index = c_index; |
121 |
+@@ -1229,6 +1225,7 @@ static int bcm_sysport_init_tx_ring(struct bcm_sysport_priv *priv, |
122 |
+ netif_napi_add(priv->netdev, &ring->napi, bcm_sysport_tx_poll, 64); |
123 |
+ ring->index = index; |
124 |
+ ring->size = size; |
125 |
++ ring->clean_index = 0; |
126 |
+ ring->alloc_size = ring->size; |
127 |
+ ring->desc_cpu = p; |
128 |
+ ring->desc_count = ring->size; |
129 |
+diff --git a/drivers/net/ethernet/broadcom/bcmsysport.h b/drivers/net/ethernet/broadcom/bcmsysport.h |
130 |
+index f28bf545d7f4..8ace6ecb5f79 100644 |
131 |
+--- a/drivers/net/ethernet/broadcom/bcmsysport.h |
132 |
++++ b/drivers/net/ethernet/broadcom/bcmsysport.h |
133 |
+@@ -638,7 +638,7 @@ struct bcm_sysport_tx_ring { |
134 |
+ unsigned int desc_count; /* Number of descriptors */ |
135 |
+ unsigned int curr_desc; /* Current descriptor */ |
136 |
+ unsigned int c_index; /* Last consumer index */ |
137 |
+- unsigned int p_index; /* Current producer index */ |
138 |
++ unsigned int clean_index; /* Current clean index */ |
139 |
+ struct bcm_sysport_cb *cbs; /* Transmit control blocks */ |
140 |
+ struct dma_desc *desc_cpu; /* CPU view of the descriptor */ |
141 |
+ struct bcm_sysport_priv *priv; /* private context backpointer */ |
142 |
+diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c |
143 |
+index 458e2d97d096..ae8e4fc22e7b 100644 |
144 |
+--- a/drivers/net/ethernet/freescale/fec_main.c |
145 |
++++ b/drivers/net/ethernet/freescale/fec_main.c |
146 |
+@@ -3539,6 +3539,8 @@ fec_drv_remove(struct platform_device *pdev) |
147 |
+ fec_enet_mii_remove(fep); |
148 |
+ if (fep->reg_phy) |
149 |
+ regulator_disable(fep->reg_phy); |
150 |
++ pm_runtime_put(&pdev->dev); |
151 |
++ pm_runtime_disable(&pdev->dev); |
152 |
+ of_node_put(fep->phy_node); |
153 |
+ free_netdev(ndev); |
154 |
+ |
155 |
+diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c |
156 |
+index fc958067d10a..435466c17852 100644 |
157 |
+--- a/drivers/net/ethernet/ti/cpsw.c |
158 |
++++ b/drivers/net/ethernet/ti/cpsw.c |
159 |
+@@ -878,7 +878,8 @@ static void _cpsw_adjust_link(struct cpsw_slave *slave, |
160 |
+ /* set speed_in input in case RMII mode is used in 100Mbps */ |
161 |
+ if (phy->speed == 100) |
162 |
+ mac_control |= BIT(15); |
163 |
+- else if (phy->speed == 10) |
164 |
++ /* in band mode only works in 10Mbps RGMII mode */ |
165 |
++ else if ((phy->speed == 10) && phy_interface_is_rgmii(phy)) |
166 |
+ mac_control |= BIT(18); /* In Band mode */ |
167 |
+ |
168 |
+ if (priv->rx_pause) |
169 |
+diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c |
170 |
+index 61cd53838360..9bca36e1fefd 100644 |
171 |
+--- a/drivers/net/team/team.c |
172 |
++++ b/drivers/net/team/team.c |
173 |
+@@ -2380,7 +2380,7 @@ send_done: |
174 |
+ if (!nlh) { |
175 |
+ err = __send_and_alloc_skb(&skb, team, portid, send_func); |
176 |
+ if (err) |
177 |
+- goto errout; |
178 |
++ return err; |
179 |
+ goto send_done; |
180 |
+ } |
181 |
+ |
182 |
+@@ -2660,7 +2660,7 @@ send_done: |
183 |
+ if (!nlh) { |
184 |
+ err = __send_and_alloc_skb(&skb, team, portid, send_func); |
185 |
+ if (err) |
186 |
+- goto errout; |
187 |
++ return err; |
188 |
+ goto send_done; |
189 |
+ } |
190 |
+ |
191 |
+diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c |
192 |
+index 75d37148c8cd..95c631125a20 100644 |
193 |
+--- a/drivers/s390/net/qeth_core_main.c |
194 |
++++ b/drivers/s390/net/qeth_core_main.c |
195 |
+@@ -517,8 +517,7 @@ static inline int qeth_is_cq(struct qeth_card *card, unsigned int queue) |
196 |
+ queue == card->qdio.no_in_queues - 1; |
197 |
+ } |
198 |
+ |
199 |
+- |
200 |
+-static int qeth_issue_next_read(struct qeth_card *card) |
201 |
++static int __qeth_issue_next_read(struct qeth_card *card) |
202 |
+ { |
203 |
+ int rc; |
204 |
+ struct qeth_cmd_buffer *iob; |
205 |
+@@ -549,6 +548,17 @@ static int qeth_issue_next_read(struct qeth_card *card) |
206 |
+ return rc; |
207 |
+ } |
208 |
+ |
209 |
++static int qeth_issue_next_read(struct qeth_card *card) |
210 |
++{ |
211 |
++ int ret; |
212 |
++ |
213 |
++ spin_lock_irq(get_ccwdev_lock(CARD_RDEV(card))); |
214 |
++ ret = __qeth_issue_next_read(card); |
215 |
++ spin_unlock_irq(get_ccwdev_lock(CARD_RDEV(card))); |
216 |
++ |
217 |
++ return ret; |
218 |
++} |
219 |
++ |
220 |
+ static struct qeth_reply *qeth_alloc_reply(struct qeth_card *card) |
221 |
+ { |
222 |
+ struct qeth_reply *reply; |
223 |
+@@ -952,7 +962,7 @@ void qeth_clear_thread_running_bit(struct qeth_card *card, unsigned long thread) |
224 |
+ spin_lock_irqsave(&card->thread_mask_lock, flags); |
225 |
+ card->thread_running_mask &= ~thread; |
226 |
+ spin_unlock_irqrestore(&card->thread_mask_lock, flags); |
227 |
+- wake_up(&card->wait_q); |
228 |
++ wake_up_all(&card->wait_q); |
229 |
+ } |
230 |
+ EXPORT_SYMBOL_GPL(qeth_clear_thread_running_bit); |
231 |
+ |
232 |
+@@ -1156,6 +1166,7 @@ static void qeth_irq(struct ccw_device *cdev, unsigned long intparm, |
233 |
+ } |
234 |
+ rc = qeth_get_problem(cdev, irb); |
235 |
+ if (rc) { |
236 |
++ card->read_or_write_problem = 1; |
237 |
+ qeth_clear_ipacmd_list(card); |
238 |
+ qeth_schedule_recovery(card); |
239 |
+ goto out; |
240 |
+@@ -1174,7 +1185,7 @@ static void qeth_irq(struct ccw_device *cdev, unsigned long intparm, |
241 |
+ return; |
242 |
+ if (channel == &card->read && |
243 |
+ channel->state == CH_STATE_UP) |
244 |
+- qeth_issue_next_read(card); |
245 |
++ __qeth_issue_next_read(card); |
246 |
+ |
247 |
+ iob = channel->iob; |
248 |
+ index = channel->buf_no; |
249 |
+@@ -4969,8 +4980,6 @@ static void qeth_core_free_card(struct qeth_card *card) |
250 |
+ QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); |
251 |
+ qeth_clean_channel(&card->read); |
252 |
+ qeth_clean_channel(&card->write); |
253 |
+- if (card->dev) |
254 |
+- free_netdev(card->dev); |
255 |
+ kfree(card->ip_tbd_list); |
256 |
+ qeth_free_qdio_buffers(card); |
257 |
+ unregister_service_level(&card->qeth_service_level); |
258 |
+diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c |
259 |
+index 58bcb3c9a86a..acdb5ccb0ab9 100644 |
260 |
+--- a/drivers/s390/net/qeth_l2_main.c |
261 |
++++ b/drivers/s390/net/qeth_l2_main.c |
262 |
+@@ -1062,8 +1062,8 @@ static void qeth_l2_remove_device(struct ccwgroup_device *cgdev) |
263 |
+ qeth_l2_set_offline(cgdev); |
264 |
+ |
265 |
+ if (card->dev) { |
266 |
+- netif_napi_del(&card->napi); |
267 |
+ unregister_netdev(card->dev); |
268 |
++ free_netdev(card->dev); |
269 |
+ card->dev = NULL; |
270 |
+ } |
271 |
+ return; |
272 |
+diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c |
273 |
+index 0d6888cbd96e..bbdb3b6c54bb 100644 |
274 |
+--- a/drivers/s390/net/qeth_l3_main.c |
275 |
++++ b/drivers/s390/net/qeth_l3_main.c |
276 |
+@@ -3243,8 +3243,8 @@ static void qeth_l3_remove_device(struct ccwgroup_device *cgdev) |
277 |
+ qeth_l3_set_offline(cgdev); |
278 |
+ |
279 |
+ if (card->dev) { |
280 |
+- netif_napi_del(&card->napi); |
281 |
+ unregister_netdev(card->dev); |
282 |
++ free_netdev(card->dev); |
283 |
+ card->dev = NULL; |
284 |
+ } |
285 |
+ |
286 |
+diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c |
287 |
+index 4b43effbf4fc..cb19c9ad1b57 100644 |
288 |
+--- a/drivers/scsi/sg.c |
289 |
++++ b/drivers/scsi/sg.c |
290 |
+@@ -2074,11 +2074,12 @@ sg_get_rq_mark(Sg_fd * sfp, int pack_id) |
291 |
+ if ((1 == resp->done) && (!resp->sg_io_owned) && |
292 |
+ ((-1 == pack_id) || (resp->header.pack_id == pack_id))) { |
293 |
+ resp->done = 2; /* guard against other readers */ |
294 |
+- break; |
295 |
++ write_unlock_irqrestore(&sfp->rq_list_lock, iflags); |
296 |
++ return resp; |
297 |
+ } |
298 |
+ } |
299 |
+ write_unlock_irqrestore(&sfp->rq_list_lock, iflags); |
300 |
+- return resp; |
301 |
++ return NULL; |
302 |
+ } |
303 |
+ |
304 |
+ /* always adds to end of list */ |
305 |
+diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c |
306 |
+index 4889a8ab77ce..a079ed14f230 100644 |
307 |
+--- a/kernel/irq/manage.c |
308 |
++++ b/kernel/irq/manage.c |
309 |
+@@ -1189,10 +1189,8 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) |
310 |
+ * set the trigger type must match. Also all must |
311 |
+ * agree on ONESHOT. |
312 |
+ */ |
313 |
+- unsigned int oldtype = irqd_get_trigger_type(&desc->irq_data); |
314 |
+- |
315 |
+ if (!((old->flags & new->flags) & IRQF_SHARED) || |
316 |
+- (oldtype != (new->flags & IRQF_TRIGGER_MASK)) || |
317 |
++ ((old->flags ^ new->flags) & IRQF_TRIGGER_MASK) || |
318 |
+ ((old->flags ^ new->flags) & IRQF_ONESHOT)) |
319 |
+ goto mismatch; |
320 |
+ |
321 |
+diff --git a/net/core/skbuff.c b/net/core/skbuff.c |
322 |
+index 86b619501350..284370b61b8c 100644 |
323 |
+--- a/net/core/skbuff.c |
324 |
++++ b/net/core/skbuff.c |
325 |
+@@ -3571,7 +3571,7 @@ int sock_queue_err_skb(struct sock *sk, struct sk_buff *skb) |
326 |
+ |
327 |
+ skb_queue_tail(&sk->sk_error_queue, skb); |
328 |
+ if (!sock_flag(sk, SOCK_DEAD)) |
329 |
+- sk->sk_data_ready(sk); |
330 |
++ sk->sk_error_report(sk); |
331 |
+ return 0; |
332 |
+ } |
333 |
+ EXPORT_SYMBOL(sock_queue_err_skb); |
334 |
+diff --git a/net/dccp/proto.c b/net/dccp/proto.c |
335 |
+index 9d43c1f40274..ff3b058cf58c 100644 |
336 |
+--- a/net/dccp/proto.c |
337 |
++++ b/net/dccp/proto.c |
338 |
+@@ -789,6 +789,11 @@ int dccp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) |
339 |
+ if (skb == NULL) |
340 |
+ goto out_release; |
341 |
+ |
342 |
++ if (sk->sk_state == DCCP_CLOSED) { |
343 |
++ rc = -ENOTCONN; |
344 |
++ goto out_discard; |
345 |
++ } |
346 |
++ |
347 |
+ skb_reserve(skb, sk->sk_prot->max_header); |
348 |
+ rc = memcpy_from_msg(skb_put(skb, len), msg, len); |
349 |
+ if (rc != 0) |
350 |
+diff --git a/net/ieee802154/6lowpan/core.c b/net/ieee802154/6lowpan/core.c |
351 |
+index 20c49c724ba0..e8b279443d37 100644 |
352 |
+--- a/net/ieee802154/6lowpan/core.c |
353 |
++++ b/net/ieee802154/6lowpan/core.c |
354 |
+@@ -206,9 +206,13 @@ static inline void lowpan_netlink_fini(void) |
355 |
+ static int lowpan_device_event(struct notifier_block *unused, |
356 |
+ unsigned long event, void *ptr) |
357 |
+ { |
358 |
+- struct net_device *wdev = netdev_notifier_info_to_dev(ptr); |
359 |
++ struct net_device *ndev = netdev_notifier_info_to_dev(ptr); |
360 |
++ struct wpan_dev *wpan_dev; |
361 |
+ |
362 |
+- if (wdev->type != ARPHRD_IEEE802154) |
363 |
++ if (ndev->type != ARPHRD_IEEE802154) |
364 |
++ return NOTIFY_DONE; |
365 |
++ wpan_dev = ndev->ieee802154_ptr; |
366 |
++ if (!wpan_dev) |
367 |
+ goto out; |
368 |
+ |
369 |
+ switch (event) { |
370 |
+@@ -217,8 +221,8 @@ static int lowpan_device_event(struct notifier_block *unused, |
371 |
+ * also delete possible lowpan interfaces which belongs |
372 |
+ * to the wpan interface. |
373 |
+ */ |
374 |
+- if (wdev->ieee802154_ptr->lowpan_dev) |
375 |
+- lowpan_dellink(wdev->ieee802154_ptr->lowpan_dev, NULL); |
376 |
++ if (wpan_dev->lowpan_dev) |
377 |
++ lowpan_dellink(wpan_dev->lowpan_dev, NULL); |
378 |
+ break; |
379 |
+ default: |
380 |
+ break; |
381 |
+diff --git a/net/ipv4/inet_fragment.c b/net/ipv4/inet_fragment.c |
382 |
+index c5fb2f694ed0..b34fa1bb278f 100644 |
383 |
+--- a/net/ipv4/inet_fragment.c |
384 |
++++ b/net/ipv4/inet_fragment.c |
385 |
+@@ -119,6 +119,9 @@ out: |
386 |
+ |
387 |
+ static bool inet_fragq_should_evict(const struct inet_frag_queue *q) |
388 |
+ { |
389 |
++ if (!hlist_unhashed(&q->list_evictor)) |
390 |
++ return false; |
391 |
++ |
392 |
+ return q->net->low_thresh == 0 || |
393 |
+ frag_mem_limit(q->net) >= q->net->low_thresh; |
394 |
+ } |
395 |
+diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c |
396 |
+index d35509212013..1b93ea766916 100644 |
397 |
+--- a/net/ipv4/ip_sockglue.c |
398 |
++++ b/net/ipv4/ip_sockglue.c |
399 |
+@@ -241,7 +241,8 @@ int ip_cmsg_send(struct net *net, struct msghdr *msg, struct ipcm_cookie *ipc, |
400 |
+ src_info = (struct in6_pktinfo *)CMSG_DATA(cmsg); |
401 |
+ if (!ipv6_addr_v4mapped(&src_info->ipi6_addr)) |
402 |
+ return -EINVAL; |
403 |
+- ipc->oif = src_info->ipi6_ifindex; |
404 |
++ if (src_info->ipi6_ifindex) |
405 |
++ ipc->oif = src_info->ipi6_ifindex; |
406 |
+ ipc->addr = src_info->ipi6_addr.s6_addr32[3]; |
407 |
+ continue; |
408 |
+ } |
409 |
+@@ -264,7 +265,8 @@ int ip_cmsg_send(struct net *net, struct msghdr *msg, struct ipcm_cookie *ipc, |
410 |
+ if (cmsg->cmsg_len != CMSG_LEN(sizeof(struct in_pktinfo))) |
411 |
+ return -EINVAL; |
412 |
+ info = (struct in_pktinfo *)CMSG_DATA(cmsg); |
413 |
+- ipc->oif = info->ipi_ifindex; |
414 |
++ if (info->ipi_ifindex) |
415 |
++ ipc->oif = info->ipi_ifindex; |
416 |
+ ipc->addr = info->ipi_spec_dst.s_addr; |
417 |
+ break; |
418 |
+ } |
419 |
+diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c |
420 |
+index 55810e4899f1..3db8d7d1a986 100644 |
421 |
+--- a/net/ipv6/ndisc.c |
422 |
++++ b/net/ipv6/ndisc.c |
423 |
+@@ -1478,7 +1478,8 @@ static void ndisc_fill_redirect_hdr_option(struct sk_buff *skb, |
424 |
+ *(opt++) = (rd_len >> 3); |
425 |
+ opt += 6; |
426 |
+ |
427 |
+- memcpy(opt, ipv6_hdr(orig_skb), rd_len - 8); |
428 |
++ skb_copy_bits(orig_skb, skb_network_offset(orig_skb), opt, |
429 |
++ rd_len - 8); |
430 |
+ } |
431 |
+ |
432 |
+ void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target) |
433 |
+diff --git a/net/iucv/af_iucv.c b/net/iucv/af_iucv.c |
434 |
+index 20ab7b2ec463..aeffb65181f5 100644 |
435 |
+--- a/net/iucv/af_iucv.c |
436 |
++++ b/net/iucv/af_iucv.c |
437 |
+@@ -2381,9 +2381,11 @@ static int afiucv_iucv_init(void) |
438 |
+ af_iucv_dev->driver = &af_iucv_driver; |
439 |
+ err = device_register(af_iucv_dev); |
440 |
+ if (err) |
441 |
+- goto out_driver; |
442 |
++ goto out_iucv_dev; |
443 |
+ return 0; |
444 |
+ |
445 |
++out_iucv_dev: |
446 |
++ put_device(af_iucv_dev); |
447 |
+ out_driver: |
448 |
+ driver_unregister(&af_iucv_driver); |
449 |
+ out_iucv: |
450 |
+diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c |
451 |
+index ec8f6a6485e3..92df832a1896 100644 |
452 |
+--- a/net/l2tp/l2tp_core.c |
453 |
++++ b/net/l2tp/l2tp_core.c |
454 |
+@@ -1518,9 +1518,14 @@ int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id, u32 |
455 |
+ encap = cfg->encap; |
456 |
+ |
457 |
+ /* Quick sanity checks */ |
458 |
++ err = -EPROTONOSUPPORT; |
459 |
++ if (sk->sk_type != SOCK_DGRAM) { |
460 |
++ pr_debug("tunl %hu: fd %d wrong socket type\n", |
461 |
++ tunnel_id, fd); |
462 |
++ goto err; |
463 |
++ } |
464 |
+ switch (encap) { |
465 |
+ case L2TP_ENCAPTYPE_UDP: |
466 |
+- err = -EPROTONOSUPPORT; |
467 |
+ if (sk->sk_protocol != IPPROTO_UDP) { |
468 |
+ pr_err("tunl %hu: fd %d wrong protocol, got %d, expected %d\n", |
469 |
+ tunnel_id, fd, sk->sk_protocol, IPPROTO_UDP); |
470 |
+@@ -1528,7 +1533,6 @@ int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id, u32 |
471 |
+ } |
472 |
+ break; |
473 |
+ case L2TP_ENCAPTYPE_IP: |
474 |
+- err = -EPROTONOSUPPORT; |
475 |
+ if (sk->sk_protocol != IPPROTO_L2TP) { |
476 |
+ pr_err("tunl %hu: fd %d wrong protocol, got %d, expected %d\n", |
477 |
+ tunnel_id, fd, sk->sk_protocol, IPPROTO_L2TP); |
478 |
+diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c |
479 |
+index 30c46aaf4575..d681dbaf00c1 100644 |
480 |
+--- a/net/netlink/genetlink.c |
481 |
++++ b/net/netlink/genetlink.c |
482 |
+@@ -1143,7 +1143,7 @@ static int genlmsg_mcast(struct sk_buff *skb, u32 portid, unsigned long group, |
483 |
+ if (!err) |
484 |
+ delivered = true; |
485 |
+ else if (err != -ESRCH) |
486 |
+- goto error; |
487 |
++ return err; |
488 |
+ return delivered ? 0 : -ESRCH; |
489 |
+ error: |
490 |
+ kfree_skb(skb); |