]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 4.14
authorSasha Levin <sashal@kernel.org>
Tue, 10 Jan 2023 01:55:39 +0000 (20:55 -0500)
committerSasha Levin <sashal@kernel.org>
Tue, 10 Jan 2023 01:55:39 +0000 (20:55 -0500)
Signed-off-by: Sasha Levin <sashal@kernel.org>
queue-4.14/bpf-pull-before-calling-skb_postpull_rcsum.patch [new file with mode: 0644]
queue-4.14/caif-fix-memory-leak-in-cfctrl_linkup_request.patch [new file with mode: 0644]
queue-4.14/net-amd-xgbe-add-missed-tasklet_kill.patch [new file with mode: 0644]
queue-4.14/net-phy-xgmiitorgmii-fix-refcount-leak-in-xgmiitorgm.patch [new file with mode: 0644]
queue-4.14/net-sched-atm-dont-intepret-cls-results-when-asked-t.patch [new file with mode: 0644]
queue-4.14/nfc-fix-potential-resource-leaks.patch [new file with mode: 0644]
queue-4.14/qlcnic-prevent-dcb-use-after-free-on-qlcnic_dcb_enab.patch [new file with mode: 0644]
queue-4.14/series
queue-4.14/sunrpc-ensure-the-matching-upcall-is-in-flight-upon-.patch [new file with mode: 0644]
queue-4.14/udf-fix-extension-of-the-last-extent-in-the-file.patch [new file with mode: 0644]
queue-4.14/usb-rndis_host-secure-rndis_query-check-against-int-.patch [new file with mode: 0644]

diff --git a/queue-4.14/bpf-pull-before-calling-skb_postpull_rcsum.patch b/queue-4.14/bpf-pull-before-calling-skb_postpull_rcsum.patch
new file mode 100644 (file)
index 0000000..b942435
--- /dev/null
@@ -0,0 +1,61 @@
+From 0608dfcd81ad75d965201808396c1cc971e026eb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 19 Dec 2022 16:47:00 -0800
+Subject: bpf: pull before calling skb_postpull_rcsum()
+
+From: Jakub Kicinski <kuba@kernel.org>
+
+[ Upstream commit 54c3f1a81421f85e60ae2eaae7be3727a09916ee ]
+
+Anand hit a BUG() when pulling off headers on egress to a SW tunnel.
+We get to skb_checksum_help() with an invalid checksum offset
+(commit d7ea0d9df2a6 ("net: remove two BUG() from skb_checksum_help()")
+converted those BUGs to WARN_ONs()).
+He points out oddness in how skb_postpull_rcsum() gets used.
+Indeed looks like we should pull before "postpull", otherwise
+the CHECKSUM_PARTIAL fixup from skb_postpull_rcsum() will not
+be able to do its job:
+
+       if (skb->ip_summed == CHECKSUM_PARTIAL &&
+           skb_checksum_start_offset(skb) < 0)
+               skb->ip_summed = CHECKSUM_NONE;
+
+Reported-by: Anand Parthasarathy <anpartha@meta.com>
+Fixes: 6578171a7ff0 ("bpf: add bpf_skb_change_proto helper")
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Acked-by: Stanislav Fomichev <sdf@google.com>
+Link: https://lore.kernel.org/r/20221220004701.402165-1-kuba@kernel.org
+Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/core/filter.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/net/core/filter.c b/net/core/filter.c
+index 0613aa7b0966..29d85a20f4fc 100644
+--- a/net/core/filter.c
++++ b/net/core/filter.c
+@@ -2035,15 +2035,18 @@ static int bpf_skb_generic_push(struct sk_buff *skb, u32 off, u32 len)
+ static int bpf_skb_generic_pop(struct sk_buff *skb, u32 off, u32 len)
+ {
++      void *old_data;
++
+       /* skb_ensure_writable() is not needed here, as we're
+        * already working on an uncloned skb.
+        */
+       if (unlikely(!pskb_may_pull(skb, off + len)))
+               return -ENOMEM;
+-      skb_postpull_rcsum(skb, skb->data + off, len);
+-      memmove(skb->data + len, skb->data, off);
++      old_data = skb->data;
+       __skb_pull(skb, len);
++      skb_postpull_rcsum(skb, old_data + off, len);
++      memmove(skb->data, old_data, off);
+       return 0;
+ }
+-- 
+2.35.1
+
diff --git a/queue-4.14/caif-fix-memory-leak-in-cfctrl_linkup_request.patch b/queue-4.14/caif-fix-memory-leak-in-cfctrl_linkup_request.patch
new file mode 100644 (file)
index 0000000..70199bf
--- /dev/null
@@ -0,0 +1,47 @@
+From 1f83d41cf83a494f730551e16999928b53d0288b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 4 Jan 2023 14:51:46 +0800
+Subject: caif: fix memory leak in cfctrl_linkup_request()
+
+From: Zhengchao Shao <shaozhengchao@huawei.com>
+
+[ Upstream commit fe69230f05897b3de758427b574fc98025dfc907 ]
+
+When linktype is unknown or kzalloc failed in cfctrl_linkup_request(),
+pkt is not released. Add release process to error path.
+
+Fixes: b482cd2053e3 ("net-caif: add CAIF core protocol stack")
+Fixes: 8d545c8f958f ("caif: Disconnect without waiting for response")
+Signed-off-by: Zhengchao Shao <shaozhengchao@huawei.com>
+Reviewed-by: Jiri Pirko <jiri@nvidia.com>
+Link: https://lore.kernel.org/r/20230104065146.1153009-1-shaozhengchao@huawei.com
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/caif/cfctrl.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/net/caif/cfctrl.c b/net/caif/cfctrl.c
+index 4dc82e9a855d..7af9439a08c3 100644
+--- a/net/caif/cfctrl.c
++++ b/net/caif/cfctrl.c
+@@ -269,11 +269,15 @@ int cfctrl_linkup_request(struct cflayer *layer,
+       default:
+               pr_warn("Request setup of bad link type = %d\n",
+                       param->linktype);
++              cfpkt_destroy(pkt);
+               return -EINVAL;
+       }
+       req = kzalloc(sizeof(*req), GFP_KERNEL);
+-      if (!req)
++      if (!req) {
++              cfpkt_destroy(pkt);
+               return -ENOMEM;
++      }
++
+       req->client_layer = user_layer;
+       req->cmd = CFCTRL_CMD_LINK_SETUP;
+       req->param = *param;
+-- 
+2.35.1
+
diff --git a/queue-4.14/net-amd-xgbe-add-missed-tasklet_kill.patch b/queue-4.14/net-amd-xgbe-add-missed-tasklet_kill.patch
new file mode 100644 (file)
index 0000000..f125efb
--- /dev/null
@@ -0,0 +1,71 @@
+From 6147185573737db7c4264950daac1e31b8a17bbf Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 28 Dec 2022 16:14:47 +0800
+Subject: net: amd-xgbe: add missed tasklet_kill
+
+From: Jiguang Xiao <jiguang.xiao@windriver.com>
+
+[ Upstream commit d530ece70f16f912e1d1bfeea694246ab78b0a4b ]
+
+The driver does not call tasklet_kill in several places.
+Add the calls to fix it.
+
+Fixes: 85b85c853401 ("amd-xgbe: Re-issue interrupt if interrupt status not cleared")
+Signed-off-by: Jiguang Xiao <jiguang.xiao@windriver.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/amd/xgbe/xgbe-drv.c  | 3 +++
+ drivers/net/ethernet/amd/xgbe/xgbe-i2c.c  | 4 +++-
+ drivers/net/ethernet/amd/xgbe/xgbe-mdio.c | 4 +++-
+ 3 files changed, 9 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
+index 78412d6024aa..ad6f193fac95 100644
+--- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
++++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
+@@ -1142,6 +1142,9 @@ static void xgbe_free_irqs(struct xgbe_prv_data *pdata)
+       devm_free_irq(pdata->dev, pdata->dev_irq, pdata);
++      tasklet_kill(&pdata->tasklet_dev);
++      tasklet_kill(&pdata->tasklet_ecc);
++
+       if (pdata->vdata->ecc_support && (pdata->dev_irq != pdata->ecc_irq))
+               devm_free_irq(pdata->dev, pdata->ecc_irq, pdata);
+diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-i2c.c b/drivers/net/ethernet/amd/xgbe/xgbe-i2c.c
+index 4d9062d35930..530043742a07 100644
+--- a/drivers/net/ethernet/amd/xgbe/xgbe-i2c.c
++++ b/drivers/net/ethernet/amd/xgbe/xgbe-i2c.c
+@@ -447,8 +447,10 @@ static void xgbe_i2c_stop(struct xgbe_prv_data *pdata)
+       xgbe_i2c_disable(pdata);
+       xgbe_i2c_clear_all_interrupts(pdata);
+-      if (pdata->dev_irq != pdata->i2c_irq)
++      if (pdata->dev_irq != pdata->i2c_irq) {
+               devm_free_irq(pdata->dev, pdata->i2c_irq, pdata);
++              tasklet_kill(&pdata->tasklet_i2c);
++      }
+ }
+ static int xgbe_i2c_start(struct xgbe_prv_data *pdata)
+diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
+index 20ac6db6437b..bbb93c2637f3 100644
+--- a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
++++ b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
+@@ -1400,8 +1400,10 @@ static void xgbe_phy_stop(struct xgbe_prv_data *pdata)
+       /* Disable auto-negotiation */
+       xgbe_an_disable_all(pdata);
+-      if (pdata->dev_irq != pdata->an_irq)
++      if (pdata->dev_irq != pdata->an_irq) {
+               devm_free_irq(pdata->dev, pdata->an_irq, pdata);
++              tasklet_kill(&pdata->tasklet_an);
++      }
+       pdata->phy_if.phy_impl.stop(pdata);
+-- 
+2.35.1
+
diff --git a/queue-4.14/net-phy-xgmiitorgmii-fix-refcount-leak-in-xgmiitorgm.patch b/queue-4.14/net-phy-xgmiitorgmii-fix-refcount-leak-in-xgmiitorgm.patch
new file mode 100644 (file)
index 0000000..507c718
--- /dev/null
@@ -0,0 +1,35 @@
+From daa1462ea1d6e5e0ced274b59524b42d05c5f355 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 29 Dec 2022 10:29:25 +0400
+Subject: net: phy: xgmiitorgmii: Fix refcount leak in xgmiitorgmii_probe
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+[ Upstream commit d039535850ee47079d59527e96be18d8e0daa84b ]
+
+of_phy_find_device() return device node with refcount incremented.
+Call put_device() to relese it when not needed anymore.
+
+Fixes: ab4e6ee578e8 ("net: phy: xgmiitorgmii: Check phy_driver ready before accessing")
+Signed-off-by: Miaoqian Lin <linmq006@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/phy/xilinx_gmii2rgmii.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/net/phy/xilinx_gmii2rgmii.c b/drivers/net/phy/xilinx_gmii2rgmii.c
+index aef525467af0..55157c3197bd 100644
+--- a/drivers/net/phy/xilinx_gmii2rgmii.c
++++ b/drivers/net/phy/xilinx_gmii2rgmii.c
+@@ -89,6 +89,7 @@ static int xgmiitorgmii_probe(struct mdio_device *mdiodev)
+       if (!priv->phy_dev->drv) {
+               dev_info(dev, "Attached phy not ready\n");
++              put_device(&priv->phy_dev->mdio.dev);
+               return -EPROBE_DEFER;
+       }
+-- 
+2.35.1
+
diff --git a/queue-4.14/net-sched-atm-dont-intepret-cls-results-when-asked-t.patch b/queue-4.14/net-sched-atm-dont-intepret-cls-results-when-asked-t.patch
new file mode 100644 (file)
index 0000000..bcc9f15
--- /dev/null
@@ -0,0 +1,42 @@
+From 33dcde944a1215c8688379ea2a4276a7faf25528 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 1 Jan 2023 16:57:43 -0500
+Subject: net: sched: atm: dont intepret cls results when asked to drop
+
+From: Jamal Hadi Salim <jhs@mojatatu.com>
+
+[ Upstream commit a2965c7be0522eaa18808684b7b82b248515511b ]
+
+If asked to drop a packet via TC_ACT_SHOT it is unsafe to assume
+res.class contains a valid pointer
+Fixes: b0188d4dbe5f ("[NET_SCHED]: sch_atm: Lindent")
+
+Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/sched/sch_atm.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/net/sched/sch_atm.c b/net/sched/sch_atm.c
+index 9198c9983b83..184ce9050457 100644
+--- a/net/sched/sch_atm.c
++++ b/net/sched/sch_atm.c
+@@ -389,10 +389,13 @@ static int atm_tc_enqueue(struct sk_buff *skb, struct Qdisc *sch,
+                               result = tcf_classify(skb, fl, &res, true);
+                               if (result < 0)
+                                       continue;
++                              if (result == TC_ACT_SHOT)
++                                      goto done;
++
+                               flow = (struct atm_flow_data *)res.class;
+                               if (!flow)
+                                       flow = lookup_flow(sch, res.classid);
+-                              goto done;
++                              goto drop;
+                       }
+               }
+               flow = NULL;
+-- 
+2.35.1
+
diff --git a/queue-4.14/nfc-fix-potential-resource-leaks.patch b/queue-4.14/nfc-fix-potential-resource-leaks.patch
new file mode 100644 (file)
index 0000000..7f232eb
--- /dev/null
@@ -0,0 +1,127 @@
+From ac171d82d45d348435dfa37065c0c1884db8aa1d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 23 Dec 2022 11:37:18 +0400
+Subject: nfc: Fix potential resource leaks
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+[ Upstream commit df49908f3c52d211aea5e2a14a93bbe67a2cb3af ]
+
+nfc_get_device() take reference for the device, add missing
+nfc_put_device() to release it when not need anymore.
+Also fix the style warnning by use error EOPNOTSUPP instead of
+ENOTSUPP.
+
+Fixes: 5ce3f32b5264 ("NFC: netlink: SE API implementation")
+Fixes: 29e76924cf08 ("nfc: netlink: Add capability to reply to vendor_cmd with data")
+Signed-off-by: Miaoqian Lin <linmq006@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/nfc/netlink.c | 52 ++++++++++++++++++++++++++++++++++-------------
+ 1 file changed, 38 insertions(+), 14 deletions(-)
+
+diff --git a/net/nfc/netlink.c b/net/nfc/netlink.c
+index 0320ae7560ad..be06f4e37c43 100644
+--- a/net/nfc/netlink.c
++++ b/net/nfc/netlink.c
+@@ -1506,6 +1506,7 @@ static int nfc_genl_se_io(struct sk_buff *skb, struct genl_info *info)
+       u32 dev_idx, se_idx;
+       u8 *apdu;
+       size_t apdu_len;
++      int rc;
+       if (!info->attrs[NFC_ATTR_DEVICE_INDEX] ||
+           !info->attrs[NFC_ATTR_SE_INDEX] ||
+@@ -1519,25 +1520,37 @@ static int nfc_genl_se_io(struct sk_buff *skb, struct genl_info *info)
+       if (!dev)
+               return -ENODEV;
+-      if (!dev->ops || !dev->ops->se_io)
+-              return -ENOTSUPP;
++      if (!dev->ops || !dev->ops->se_io) {
++              rc = -EOPNOTSUPP;
++              goto put_dev;
++      }
+       apdu_len = nla_len(info->attrs[NFC_ATTR_SE_APDU]);
+-      if (apdu_len == 0)
+-              return -EINVAL;
++      if (apdu_len == 0) {
++              rc = -EINVAL;
++              goto put_dev;
++      }
+       apdu = nla_data(info->attrs[NFC_ATTR_SE_APDU]);
+-      if (!apdu)
+-              return -EINVAL;
++      if (!apdu) {
++              rc = -EINVAL;
++              goto put_dev;
++      }
+       ctx = kzalloc(sizeof(struct se_io_ctx), GFP_KERNEL);
+-      if (!ctx)
+-              return -ENOMEM;
++      if (!ctx) {
++              rc = -ENOMEM;
++              goto put_dev;
++      }
+       ctx->dev_idx = dev_idx;
+       ctx->se_idx = se_idx;
+-      return nfc_se_io(dev, se_idx, apdu, apdu_len, se_io_cb, ctx);
++      rc = nfc_se_io(dev, se_idx, apdu, apdu_len, se_io_cb, ctx);
++
++put_dev:
++      nfc_put_device(dev);
++      return rc;
+ }
+ static int nfc_genl_vendor_cmd(struct sk_buff *skb,
+@@ -1560,14 +1573,21 @@ static int nfc_genl_vendor_cmd(struct sk_buff *skb,
+       subcmd = nla_get_u32(info->attrs[NFC_ATTR_VENDOR_SUBCMD]);
+       dev = nfc_get_device(dev_idx);
+-      if (!dev || !dev->vendor_cmds || !dev->n_vendor_cmds)
++      if (!dev)
+               return -ENODEV;
++      if (!dev->vendor_cmds || !dev->n_vendor_cmds) {
++              err = -ENODEV;
++              goto put_dev;
++      }
++
+       if (info->attrs[NFC_ATTR_VENDOR_DATA]) {
+               data = nla_data(info->attrs[NFC_ATTR_VENDOR_DATA]);
+               data_len = nla_len(info->attrs[NFC_ATTR_VENDOR_DATA]);
+-              if (data_len == 0)
+-                      return -EINVAL;
++              if (data_len == 0) {
++                      err = -EINVAL;
++                      goto put_dev;
++              }
+       } else {
+               data = NULL;
+               data_len = 0;
+@@ -1582,10 +1602,14 @@ static int nfc_genl_vendor_cmd(struct sk_buff *skb,
+               dev->cur_cmd_info = info;
+               err = cmd->doit(dev, data, data_len);
+               dev->cur_cmd_info = NULL;
+-              return err;
++              goto put_dev;
+       }
+-      return -EOPNOTSUPP;
++      err = -EOPNOTSUPP;
++
++put_dev:
++      nfc_put_device(dev);
++      return err;
+ }
+ /* message building helper */
+-- 
+2.35.1
+
diff --git a/queue-4.14/qlcnic-prevent-dcb-use-after-free-on-qlcnic_dcb_enab.patch b/queue-4.14/qlcnic-prevent-dcb-use-after-free-on-qlcnic_dcb_enab.patch
new file mode 100644 (file)
index 0000000..4ccf4f5
--- /dev/null
@@ -0,0 +1,103 @@
+From e4d87d9bb4581121944021c83695ff529837b556 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 22 Dec 2022 14:52:28 +0300
+Subject: qlcnic: prevent ->dcb use-after-free on qlcnic_dcb_enable() failure
+
+From: Daniil Tatianin <d-tatianin@yandex-team.ru>
+
+[ Upstream commit 13a7c8964afcd8ca43c0b6001ebb0127baa95362 ]
+
+adapter->dcb would get silently freed inside qlcnic_dcb_enable() in
+case qlcnic_dcb_attach() would return an error, which always happens
+under OOM conditions. This would lead to use-after-free because both
+of the existing callers invoke qlcnic_dcb_get_info() on the obtained
+pointer, which is potentially freed at that point.
+
+Propagate errors from qlcnic_dcb_enable(), and instead free the dcb
+pointer at callsite using qlcnic_dcb_free(). This also removes the now
+unused qlcnic_clear_dcb_ops() helper, which was a simple wrapper around
+kfree() also causing memory leaks for partially initialized dcb.
+
+Found by Linux Verification Center (linuxtesting.org) with the SVACE
+static analysis tool.
+
+Fixes: 3c44bba1d270 ("qlcnic: Disable DCB operations from SR-IOV VFs")
+Reviewed-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
+Signed-off-by: Daniil Tatianin <d-tatianin@yandex-team.ru>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c |  8 +++++++-
+ drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.h       | 10 ++--------
+ drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c      |  8 +++++++-
+ 3 files changed, 16 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
+index 10286215092f..85419b8258b5 100644
+--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
++++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
+@@ -2525,7 +2525,13 @@ int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac)
+               goto disable_mbx_intr;
+       qlcnic_83xx_clear_function_resources(adapter);
+-      qlcnic_dcb_enable(adapter->dcb);
++
++      err = qlcnic_dcb_enable(adapter->dcb);
++      if (err) {
++              qlcnic_dcb_free(adapter->dcb);
++              goto disable_mbx_intr;
++      }
++
+       qlcnic_83xx_initialize_nic(adapter, 1);
+       qlcnic_dcb_get_info(adapter->dcb);
+diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.h
+index 0a9d24e86715..eb8000d9b6d0 100644
+--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.h
++++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.h
+@@ -42,11 +42,6 @@ struct qlcnic_dcb {
+       unsigned long                   state;
+ };
+-static inline void qlcnic_clear_dcb_ops(struct qlcnic_dcb *dcb)
+-{
+-      kfree(dcb);
+-}
+-
+ static inline int qlcnic_dcb_get_hw_capability(struct qlcnic_dcb *dcb)
+ {
+       if (dcb && dcb->ops->get_hw_capability)
+@@ -113,9 +108,8 @@ static inline void qlcnic_dcb_init_dcbnl_ops(struct qlcnic_dcb *dcb)
+               dcb->ops->init_dcbnl_ops(dcb);
+ }
+-static inline void qlcnic_dcb_enable(struct qlcnic_dcb *dcb)
++static inline int qlcnic_dcb_enable(struct qlcnic_dcb *dcb)
+ {
+-      if (dcb && qlcnic_dcb_attach(dcb))
+-              qlcnic_clear_dcb_ops(dcb);
++      return dcb ? qlcnic_dcb_attach(dcb) : 0;
+ }
+ #endif
+diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+index 45361310eea0..fe879e212b7a 100644
+--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
++++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+@@ -2641,7 +2641,13 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+                        "Device does not support MSI interrupts\n");
+       if (qlcnic_82xx_check(adapter)) {
+-              qlcnic_dcb_enable(adapter->dcb);
++              err = qlcnic_dcb_enable(adapter->dcb);
++              if (err) {
++                      qlcnic_dcb_free(adapter->dcb);
++                      dev_err(&pdev->dev, "Failed to enable DCB\n");
++                      goto err_out_free_hw;
++              }
++
+               qlcnic_dcb_get_info(adapter->dcb);
+               err = qlcnic_setup_intr(adapter);
+-- 
+2.35.1
+
index e2165ff7d387b763adaa7aec4511b5b0d58f2f73..09bf52ba0b382cfd92821dbe95879a78ae8a8687 100644 (file)
@@ -304,3 +304,13 @@ ext4-fix-inode-leak-in-ext4_xattr_inode_create-on-an-error-path.patch
 ext4-initialize-quota-before-expanding-inode-in-setproject-ioctl.patch
 ext4-avoid-unaccounted-block-allocation-when-expanding-inode.patch
 ext4-allocate-extended-attribute-value-in-vmalloc-area.patch
+sunrpc-ensure-the-matching-upcall-is-in-flight-upon-.patch
+bpf-pull-before-calling-skb_postpull_rcsum.patch
+qlcnic-prevent-dcb-use-after-free-on-qlcnic_dcb_enab.patch
+nfc-fix-potential-resource-leaks.patch
+net-amd-xgbe-add-missed-tasklet_kill.patch
+net-phy-xgmiitorgmii-fix-refcount-leak-in-xgmiitorgm.patch
+net-sched-atm-dont-intepret-cls-results-when-asked-t.patch
+usb-rndis_host-secure-rndis_query-check-against-int-.patch
+caif-fix-memory-leak-in-cfctrl_linkup_request.patch
+udf-fix-extension-of-the-last-extent-in-the-file.patch
diff --git a/queue-4.14/sunrpc-ensure-the-matching-upcall-is-in-flight-upon-.patch b/queue-4.14/sunrpc-ensure-the-matching-upcall-is-in-flight-upon-.patch
new file mode 100644 (file)
index 0000000..996fa80
--- /dev/null
@@ -0,0 +1,133 @@
+From a6bbda189928f55f7b309072bc5ca395b14c0b50 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 13 Dec 2022 13:14:31 +0900
+Subject: SUNRPC: ensure the matching upcall is in-flight upon downcall
+
+From: minoura makoto <minoura@valinux.co.jp>
+
+[ Upstream commit b18cba09e374637a0a3759d856a6bca94c133952 ]
+
+Commit 9130b8dbc6ac ("SUNRPC: allow for upcalls for the same uid
+but different gss service") introduced `auth` argument to
+__gss_find_upcall(), but in gss_pipe_downcall() it was left as NULL
+since it (and auth->service) was not (yet) determined.
+
+When multiple upcalls with the same uid and different service are
+ongoing, it could happen that __gss_find_upcall(), which returns the
+first match found in the pipe->in_downcall list, could not find the
+correct gss_msg corresponding to the downcall we are looking for.
+Moreover, it might return a msg which is not sent to rpc.gssd yet.
+
+We could see mount.nfs process hung in D state with multiple mount.nfs
+are executed in parallel.  The call trace below is of CentOS 7.9
+kernel-3.10.0-1160.24.1.el7.x86_64 but we observed the same hang w/
+elrepo kernel-ml-6.0.7-1.el7.
+
+PID: 71258  TASK: ffff91ebd4be0000  CPU: 36  COMMAND: "mount.nfs"
+ #0 [ffff9203ca3234f8] __schedule at ffffffffa3b8899f
+ #1 [ffff9203ca323580] schedule at ffffffffa3b88eb9
+ #2 [ffff9203ca323590] gss_cred_init at ffffffffc0355818 [auth_rpcgss]
+ #3 [ffff9203ca323658] rpcauth_lookup_credcache at ffffffffc0421ebc
+[sunrpc]
+ #4 [ffff9203ca3236d8] gss_lookup_cred at ffffffffc0353633 [auth_rpcgss]
+ #5 [ffff9203ca3236e8] rpcauth_lookupcred at ffffffffc0421581 [sunrpc]
+ #6 [ffff9203ca323740] rpcauth_refreshcred at ffffffffc04223d3 [sunrpc]
+ #7 [ffff9203ca3237a0] call_refresh at ffffffffc04103dc [sunrpc]
+ #8 [ffff9203ca3237b8] __rpc_execute at ffffffffc041e1c9 [sunrpc]
+ #9 [ffff9203ca323820] rpc_execute at ffffffffc0420a48 [sunrpc]
+
+The scenario is like this. Let's say there are two upcalls for
+services A and B, A -> B in pipe->in_downcall, B -> A in pipe->pipe.
+
+When rpc.gssd reads pipe to get the upcall msg corresponding to
+service B from pipe->pipe and then writes the response, in
+gss_pipe_downcall the msg corresponding to service A will be picked
+because only uid is used to find the msg and it is before the one for
+B in pipe->in_downcall.  And the process waiting for the msg
+corresponding to service A will be woken up.
+
+Actual scheduing of that process might be after rpc.gssd processes the
+next msg.  In rpc_pipe_generic_upcall it clears msg->errno (for A).
+The process is scheduled to see gss_msg->ctx == NULL and
+gss_msg->msg.errno == 0, therefore it cannot break the loop in
+gss_create_upcall and is never woken up after that.
+
+This patch adds a simple check to ensure that a msg which is not
+sent to rpc.gssd yet is not chosen as the matching upcall upon
+receiving a downcall.
+
+Signed-off-by: minoura makoto <minoura@valinux.co.jp>
+Signed-off-by: Hiroshi Shimamoto <h-shimamoto@nec.com>
+Tested-by: Hiroshi Shimamoto <h-shimamoto@nec.com>
+Cc: Trond Myklebust <trondmy@hammerspace.com>
+Fixes: 9130b8dbc6ac ("SUNRPC: allow for upcalls for same uid but different gss service")
+Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/linux/sunrpc/rpc_pipe_fs.h |  5 +++++
+ net/sunrpc/auth_gss/auth_gss.c     | 19 +++++++++++++++++--
+ 2 files changed, 22 insertions(+), 2 deletions(-)
+
+diff --git a/include/linux/sunrpc/rpc_pipe_fs.h b/include/linux/sunrpc/rpc_pipe_fs.h
+index a5704daf5df9..a444ddc946fa 100644
+--- a/include/linux/sunrpc/rpc_pipe_fs.h
++++ b/include/linux/sunrpc/rpc_pipe_fs.h
+@@ -94,6 +94,11 @@ extern ssize_t rpc_pipe_generic_upcall(struct file *, struct rpc_pipe_msg *,
+                                      char __user *, size_t);
+ extern int rpc_queue_upcall(struct rpc_pipe *, struct rpc_pipe_msg *);
++/* returns true if the msg is in-flight, i.e., already eaten by the peer */
++static inline bool rpc_msg_is_inflight(const struct rpc_pipe_msg *msg) {
++      return (msg->copied != 0 && list_empty(&msg->list));
++}
++
+ struct rpc_clnt;
+ extern struct dentry *rpc_create_client_dir(struct dentry *, const char *, struct rpc_clnt *);
+ extern int rpc_remove_client_dir(struct rpc_clnt *);
+diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c
+index dc1eae4c206b..bb669f7f550e 100644
+--- a/net/sunrpc/auth_gss/auth_gss.c
++++ b/net/sunrpc/auth_gss/auth_gss.c
+@@ -318,7 +318,7 @@ __gss_find_upcall(struct rpc_pipe *pipe, kuid_t uid, const struct gss_auth *auth
+       list_for_each_entry(pos, &pipe->in_downcall, list) {
+               if (!uid_eq(pos->uid, uid))
+                       continue;
+-              if (auth && pos->auth->service != auth->service)
++              if (pos->auth->service != auth->service)
+                       continue;
+               refcount_inc(&pos->count);
+               dprintk("RPC:       %s found msg %p\n", __func__, pos);
+@@ -646,6 +646,21 @@ gss_create_upcall(struct gss_auth *gss_auth, struct gss_cred *gss_cred)
+       return err;
+ }
++static struct gss_upcall_msg *
++gss_find_downcall(struct rpc_pipe *pipe, kuid_t uid)
++{
++      struct gss_upcall_msg *pos;
++      list_for_each_entry(pos, &pipe->in_downcall, list) {
++              if (!uid_eq(pos->uid, uid))
++                      continue;
++              if (!rpc_msg_is_inflight(&pos->msg))
++                      continue;
++              refcount_inc(&pos->count);
++              return pos;
++      }
++      return NULL;
++}
++
+ #define MSG_BUF_MAXSIZE 1024
+ static ssize_t
+@@ -692,7 +707,7 @@ gss_pipe_downcall(struct file *filp, const char __user *src, size_t mlen)
+       err = -ENOENT;
+       /* Find a matching upcall */
+       spin_lock(&pipe->lock);
+-      gss_msg = __gss_find_upcall(pipe, uid, NULL);
++      gss_msg = gss_find_downcall(pipe, uid);
+       if (gss_msg == NULL) {
+               spin_unlock(&pipe->lock);
+               goto err_put_ctx;
+-- 
+2.35.1
+
diff --git a/queue-4.14/udf-fix-extension-of-the-last-extent-in-the-file.patch b/queue-4.14/udf-fix-extension-of-the-last-extent-in-the-file.patch
new file mode 100644 (file)
index 0000000..fc39cbb
--- /dev/null
@@ -0,0 +1,37 @@
+From 2d08958036c813eccd7c9b1becb688a448b8c560 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 21 Dec 2022 17:45:51 +0100
+Subject: udf: Fix extension of the last extent in the file
+
+From: Jan Kara <jack@suse.cz>
+
+[ Upstream commit 83c7423d1eb6806d13c521d1002cc1a012111719 ]
+
+When extending the last extent in the file within the last block, we
+wrongly computed the length of the last extent. This is mostly a
+cosmetical problem since the extent does not contain any data and the
+length will be fixed up by following operations but still.
+
+Fixes: 1f3868f06855 ("udf: Fix extending file within last block")
+Signed-off-by: Jan Kara <jack@suse.cz>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/udf/inode.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/fs/udf/inode.c b/fs/udf/inode.c
+index 0c80788cc429..2da65989ae5d 100644
+--- a/fs/udf/inode.c
++++ b/fs/udf/inode.c
+@@ -595,7 +595,7 @@ static void udf_do_extend_final_block(struct inode *inode,
+        */
+       if (new_elen <= (last_ext->extLength & UDF_EXTENT_LENGTH_MASK))
+               return;
+-      added_bytes = (last_ext->extLength & UDF_EXTENT_LENGTH_MASK) - new_elen;
++      added_bytes = new_elen - (last_ext->extLength & UDF_EXTENT_LENGTH_MASK);
+       last_ext->extLength += added_bytes;
+       UDF_I(inode)->i_lenExtents += added_bytes;
+-- 
+2.35.1
+
diff --git a/queue-4.14/usb-rndis_host-secure-rndis_query-check-against-int-.patch b/queue-4.14/usb-rndis_host-secure-rndis_query-check-against-int-.patch
new file mode 100644 (file)
index 0000000..9686bc9
--- /dev/null
@@ -0,0 +1,43 @@
+From 0f1f1a5647918ba04dab551e8245b35594b980a3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 3 Jan 2023 10:17:09 +0100
+Subject: usb: rndis_host: Secure rndis_query check against int overflow
+
+From: Szymon Heidrich <szymon.heidrich@gmail.com>
+
+[ Upstream commit c7dd13805f8b8fc1ce3b6d40f6aff47e66b72ad2 ]
+
+Variables off and len typed as uint32 in rndis_query function
+are controlled by incoming RNDIS response message thus their
+value may be manipulated. Setting off to a unexpectetly large
+value will cause the sum with len and 8 to overflow and pass
+the implemented validation step. Consequently the response
+pointer will be referring to a location past the expected
+buffer boundaries allowing information leakage e.g. via
+RNDIS_OID_802_3_PERMANENT_ADDRESS OID.
+
+Fixes: ddda08624013 ("USB: rndis_host, various cleanups")
+Signed-off-by: Szymon Heidrich <szymon.heidrich@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/usb/rndis_host.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c
+index ab41a63aa4aa..497d6bcdc276 100644
+--- a/drivers/net/usb/rndis_host.c
++++ b/drivers/net/usb/rndis_host.c
+@@ -267,7 +267,8 @@ static int rndis_query(struct usbnet *dev, struct usb_interface *intf,
+       off = le32_to_cpu(u.get_c->offset);
+       len = le32_to_cpu(u.get_c->len);
+-      if (unlikely((8 + off + len) > CONTROL_BUFFER_SIZE))
++      if (unlikely((off > CONTROL_BUFFER_SIZE - 8) ||
++                   (len > CONTROL_BUFFER_SIZE - 8 - off)))
+               goto response_error;
+       if (*reply_len != -1 && len != *reply_len)
+-- 
+2.35.1
+