hc
2024-09-20 a36159eec6ca17402b0e146b86efaf76568dc353
kernel/drivers/net/wan/hdlc_fr.c
....@@ -1,12 +1,9 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Generic HDLC support routines for Linux
34 * Frame Relay support
45 *
56 * Copyright (C) 1999 - 2006 Krzysztof Halasa <khc@pm.waw.pl>
6
- *
7
- * This program is free software; you can redistribute it and/or modify it
8
- * under the terms of version 2 of the GNU General Public License
9
- * as published by the Free Software Foundation.
107 *
118
129 Theory of PVC state
....@@ -274,10 +271,8 @@
274271 }
275272
276273
277
-static int fr_hard_header(struct sk_buff **skb_p, u16 dlci)
274
+static int fr_hard_header(struct sk_buff *skb, u16 dlci)
278275 {
279
- struct sk_buff *skb = *skb_p;
280
-
281276 if (!skb->dev) { /* Control packets */
282277 switch (dlci) {
283278 case LMI_CCITT_ANSI_DLCI:
....@@ -319,13 +314,6 @@
319314 }
320315
321316 } else if (skb->dev->type == ARPHRD_ETHER) {
322
- if (skb_headroom(skb) < 10) {
323
- struct sk_buff *skb2 = skb_realloc_headroom(skb, 10);
324
- if (!skb2)
325
- return -ENOBUFS;
326
- dev_kfree_skb(skb);
327
- skb = *skb_p = skb2;
328
- }
329317 skb_push(skb, 10);
330318 skb->data[3] = FR_PAD;
331319 skb->data[4] = NLPID_SNAP;
....@@ -419,38 +407,49 @@
419407 {
420408 struct pvc_device *pvc = dev->ml_priv;
421409
422
- if (pvc->state.active) {
423
- if (dev->type == ARPHRD_ETHER) {
424
- int pad = ETH_ZLEN - skb->len;
425
- if (pad > 0) { /* Pad the frame with zeros */
426
- int len = skb->len;
427
- if (skb_tailroom(skb) < pad)
428
- if (pskb_expand_head(skb, 0, pad,
429
- GFP_ATOMIC)) {
430
- dev->stats.tx_dropped++;
431
- dev_kfree_skb(skb);
432
- return NETDEV_TX_OK;
433
- }
434
- skb_put(skb, pad);
435
- memset(skb->data + len, 0, pad);
436
- }
437
- }
438
- skb->dev = dev;
439
- if (!fr_hard_header(&skb, pvc->dlci)) {
440
- dev->stats.tx_bytes += skb->len;
441
- dev->stats.tx_packets++;
442
- if (pvc->state.fecn) /* TX Congestion counter */
443
- dev->stats.tx_compressed++;
444
- skb->dev = pvc->frad;
445
- skb->protocol = htons(ETH_P_HDLC);
446
- skb_reset_network_header(skb);
447
- dev_queue_xmit(skb);
448
- return NETDEV_TX_OK;
410
+ if (!pvc->state.active)
411
+ goto drop;
412
+
413
+ if (dev->type == ARPHRD_ETHER) {
414
+ int pad = ETH_ZLEN - skb->len;
415
+
416
+ if (pad > 0) { /* Pad the frame with zeros */
417
+ if (__skb_pad(skb, pad, false))
418
+ goto drop;
419
+ skb_put(skb, pad);
449420 }
450421 }
451422
423
+ /* We already requested the header space with dev->needed_headroom.
424
+ * So this is just a protection in case the upper layer didn't take
425
+ * dev->needed_headroom into consideration.
426
+ */
427
+ if (skb_headroom(skb) < 10) {
428
+ struct sk_buff *skb2 = skb_realloc_headroom(skb, 10);
429
+
430
+ if (!skb2)
431
+ goto drop;
432
+ dev_kfree_skb(skb);
433
+ skb = skb2;
434
+ }
435
+
436
+ skb->dev = dev;
437
+ if (fr_hard_header(skb, pvc->dlci))
438
+ goto drop;
439
+
440
+ dev->stats.tx_bytes += skb->len;
441
+ dev->stats.tx_packets++;
442
+ if (pvc->state.fecn) /* TX Congestion counter */
443
+ dev->stats.tx_compressed++;
444
+ skb->dev = pvc->frad;
445
+ skb->protocol = htons(ETH_P_HDLC);
446
+ skb_reset_network_header(skb);
447
+ dev_queue_xmit(skb);
448
+ return NETDEV_TX_OK;
449
+
450
+drop:
452451 dev->stats.tx_dropped++;
453
- dev_kfree_skb(skb);
452
+ kfree_skb(skb);
454453 return NETDEV_TX_OK;
455454 }
456455
....@@ -503,9 +502,9 @@
503502 memset(skb->data, 0, len);
504503 skb_reserve(skb, 4);
505504 if (lmi == LMI_CISCO) {
506
- fr_hard_header(&skb, LMI_CISCO_DLCI);
505
+ fr_hard_header(skb, LMI_CISCO_DLCI);
507506 } else {
508
- fr_hard_header(&skb, LMI_CCITT_ANSI_DLCI);
507
+ fr_hard_header(skb, LMI_CCITT_ANSI_DLCI);
509508 }
510509 data = skb_tail_pointer(skb);
511510 data[i++] = LMI_CALLREF;