* [PATCH net] net: rtnetlink: prevent underflows in do_setvfinfo()
@ 2019-11-20 12:34 ` Dan Carpenter
0 siblings, 0 replies; 10+ messages in thread
From: Dan Carpenter @ 2019-11-20 12:34 UTC (permalink / raw)
To: David S. Miller
Cc: Jiri Pirko, David Ahern, Ido Schimmel, Petr Machata,
Jakub Kicinski, Nikolay Aleksandrov, Parav Pandit, Roopa Prabhu,
Johannes Berg, Michal Kubecek, netdev, linux-rdma,
kernel-janitors
The "ivm->vf" variable is a u32, but the problem is that a number of
drivers cast it to an int and then forget to check for negatives. An
example of this is in the cxgb4 driver.
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
2890 static int cxgb4_mgmt_get_vf_config(struct net_device *dev,
2891 int vf, struct ifla_vf_info *ivi)
^^^^^^
2892 {
2893 struct port_info *pi = netdev_priv(dev);
2894 struct adapter *adap = pi->adapter;
2895 struct vf_info *vfinfo;
2896
2897 if (vf >= adap->num_vfs)
^^^^^^^^^^^^^^^^^^^
2898 return -EINVAL;
2899 vfinfo = &adap->vfinfo[vf];
^^^^^^^^^^^^^^^^^^^^^^^^^^
There are 48 functions affected.
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c:8435 hclge_set_vf_vlan_filter() warn: can 'vfid' underflow 's32min-2147483646'
drivers/net/ethernet/freescale/enetc/enetc_pf.c:377 enetc_pf_set_vf_mac() warn: can 'vf' underflow 's32min-2147483646'
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c:2899 cxgb4_mgmt_get_vf_config() warn: can 'vf' underflow 's32min-254'
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c:2960 cxgb4_mgmt_set_vf_rate() warn: can 'vf' underflow 's32min-254'
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c:3019 cxgb4_mgmt_set_vf_rate() warn: can 'vf' underflow 's32min-254'
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c:3038 cxgb4_mgmt_set_vf_vlan() warn: can 'vf' underflow 's32min-254'
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c:3086 cxgb4_mgmt_set_vf_link_state() warn: can 'vf' underflow 's32min-254'
drivers/net/ethernet/chelsio/cxgb/cxgb2.c:791 get_eeprom() warn: can 'i' underflow 's32min-(-4),0,4-s32max'
drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c:82 bnxt_set_vf_spoofchk() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c:164 bnxt_set_vf_trust() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c:186 bnxt_get_vf_config() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c:228 bnxt_set_vf_mac() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c:264 bnxt_set_vf_vlan() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c:293 bnxt_set_vf_bw() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c:333 bnxt_set_vf_link_state() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c:2595 bnx2x_vf_op_prep() warn: can 'vfidx' underflow 's32min-63'
drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c:2595 bnx2x_vf_op_prep() warn: can 'vfidx' underflow 's32min-63'
drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c:2281 bnx2x_post_vf_bulletin() warn: can 'vf' underflow 's32min-63'
drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c:2285 bnx2x_post_vf_bulletin() warn: can 'vf' underflow 's32min-63'
drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c:2286 bnx2x_post_vf_bulletin() warn: can 'vf' underflow 's32min-63'
drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c:2292 bnx2x_post_vf_bulletin() warn: can 'vf' underflow 's32min-63'
drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c:2297 bnx2x_post_vf_bulletin() warn: can 'vf' underflow 's32min-63'
drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c:1832 qlcnic_sriov_set_vf_mac() warn: can 'vf' underflow 's32min-254'
drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c:1864 qlcnic_sriov_set_vf_tx_rate() warn: can 'vf' underflow 's32min-254'
drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c:1937 qlcnic_sriov_set_vf_vlan() warn: can 'vf' underflow 's32min-254'
drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c:2005 qlcnic_sriov_get_vf_config() warn: can 'vf' underflow 's32min-254'
drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c:2036 qlcnic_sriov_set_vf_spoofchk() warn: can 'vf' underflow 's32min-254'
drivers/net/ethernet/emulex/benet/be_main.c:1914 be_get_vf_config() warn: can 'vf' underflow 's32min-65534'
drivers/net/ethernet/emulex/benet/be_main.c:1915 be_get_vf_config() warn: can 'vf' underflow 's32min-65534'
drivers/net/ethernet/emulex/benet/be_main.c:1922 be_set_vf_tvt() warn: can 'vf' underflow 's32min-65534'
drivers/net/ethernet/emulex/benet/be_main.c:1951 be_clear_vf_tvt() warn: can 'vf' underflow 's32min-65534'
drivers/net/ethernet/emulex/benet/be_main.c:2063 be_set_vf_tx_rate() warn: can 'vf' underflow 's32min-65534'
drivers/net/ethernet/emulex/benet/be_main.c:2091 be_set_vf_link_state() warn: can 'vf' underflow 's32min-65534'
drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c:2609 ice_set_vf_port_vlan() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c:3050 ice_get_vf_cfg() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c:3103 ice_set_vf_spoofchk() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c:3181 ice_set_vf_mac() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c:3237 ice_set_vf_trust() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c:3286 ice_set_vf_link_state() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c:3919 i40e_validate_vf() warn: can 'vf_id' underflow 's32min-2147483646'
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c:3957 i40e_ndo_set_vf_mac() warn: can 'vf_id' underflow 's32min-2147483646'
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c:4104 i40e_ndo_set_vf_port_vlan() warn: can 'vf_id' underflow 's32min-2147483646'
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c:4263 i40e_ndo_set_vf_bw() warn: can 'vf_id' underflow 's32min-2147483646'
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c:4309 i40e_ndo_get_vf_config() warn: can 'vf_id' underflow 's32min-2147483646'
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c:4371 i40e_ndo_set_vf_link_state() warn: can 'vf_id' underflow 's32min-2147483646'
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c:4441 i40e_ndo_set_vf_spoofchk() warn: can 'vf_id' underflow 's32min-2147483646'
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c:4441 i40e_ndo_set_vf_spoofchk() warn: can 'vf_id' underflow 's32min-2147483646'
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c:4504 i40e_ndo_set_vf_trust() warn: can 'vf_id' underflow 's32min-2147483646'
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
---
I reported this bug to the linux-rdma mailing list in April and this
patch wasn't considered very elegant. I can see how that's true. The
developer offered to write a fix which would update all the drivers to
use u32 throughout. I reminded him in September that this bug still
needs to be fixed.
I think there may be security implications and this patch is easy to
backport to stable kernels so in that sense, it might be a better
approach. Also this patch might prevent underflows in future drivers.
net/core/rtnetlink.c | 23 ++++++++++++++++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 000eddb1207d..9f7aa448bd11 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -2251,6 +2251,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
if (tb[IFLA_VF_MAC]) {
struct ifla_vf_mac *ivm = nla_data(tb[IFLA_VF_MAC]);
+ if (ivm->vf >= INT_MAX)
+ return -EINVAL;
err = -EOPNOTSUPP;
if (ops->ndo_set_vf_mac)
err = ops->ndo_set_vf_mac(dev, ivm->vf,
@@ -2262,6 +2264,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
if (tb[IFLA_VF_VLAN]) {
struct ifla_vf_vlan *ivv = nla_data(tb[IFLA_VF_VLAN]);
+ if (ivv->vf >= INT_MAX)
+ return -EINVAL;
err = -EOPNOTSUPP;
if (ops->ndo_set_vf_vlan)
err = ops->ndo_set_vf_vlan(dev, ivv->vf, ivv->vlan,
@@ -2294,6 +2298,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
if (len == 0)
return -EINVAL;
+ if (ivvl[0]->vf >= INT_MAX)
+ return -EINVAL;
err = ops->ndo_set_vf_vlan(dev, ivvl[0]->vf, ivvl[0]->vlan,
ivvl[0]->qos, ivvl[0]->vlan_proto);
if (err < 0)
@@ -2304,6 +2310,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
struct ifla_vf_tx_rate *ivt = nla_data(tb[IFLA_VF_TX_RATE]);
struct ifla_vf_info ivf;
+ if (ivt->vf >= INT_MAX)
+ return -EINVAL;
err = -EOPNOTSUPP;
if (ops->ndo_get_vf_config)
err = ops->ndo_get_vf_config(dev, ivt->vf, &ivf);
@@ -2322,6 +2330,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
if (tb[IFLA_VF_RATE]) {
struct ifla_vf_rate *ivt = nla_data(tb[IFLA_VF_RATE]);
+ if (ivt->vf >= INT_MAX)
+ return -EINVAL;
err = -EOPNOTSUPP;
if (ops->ndo_set_vf_rate)
err = ops->ndo_set_vf_rate(dev, ivt->vf,
@@ -2334,6 +2344,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
if (tb[IFLA_VF_SPOOFCHK]) {
struct ifla_vf_spoofchk *ivs = nla_data(tb[IFLA_VF_SPOOFCHK]);
+ if (ivs->vf >= INT_MAX)
+ return -EINVAL;
err = -EOPNOTSUPP;
if (ops->ndo_set_vf_spoofchk)
err = ops->ndo_set_vf_spoofchk(dev, ivs->vf,
@@ -2345,6 +2357,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
if (tb[IFLA_VF_LINK_STATE]) {
struct ifla_vf_link_state *ivl = nla_data(tb[IFLA_VF_LINK_STATE]);
+ if (ivl->vf >= INT_MAX)
+ return -EINVAL;
err = -EOPNOTSUPP;
if (ops->ndo_set_vf_link_state)
err = ops->ndo_set_vf_link_state(dev, ivl->vf,
@@ -2358,6 +2372,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
err = -EOPNOTSUPP;
ivrssq_en = nla_data(tb[IFLA_VF_RSS_QUERY_EN]);
+ if (ivrssq_en->vf >= INT_MAX)
+ return -EINVAL;
if (ops->ndo_set_vf_rss_query_en)
err = ops->ndo_set_vf_rss_query_en(dev, ivrssq_en->vf,
ivrssq_en->setting);
@@ -2368,6 +2384,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
if (tb[IFLA_VF_TRUST]) {
struct ifla_vf_trust *ivt = nla_data(tb[IFLA_VF_TRUST]);
+ if (ivt->vf >= INT_MAX)
+ return -EINVAL;
err = -EOPNOTSUPP;
if (ops->ndo_set_vf_trust)
err = ops->ndo_set_vf_trust(dev, ivt->vf, ivt->setting);
@@ -2378,15 +2396,18 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
if (tb[IFLA_VF_IB_NODE_GUID]) {
struct ifla_vf_guid *ivt = nla_data(tb[IFLA_VF_IB_NODE_GUID]);
+ if (ivt->vf >= INT_MAX)
+ return -EINVAL;
if (!ops->ndo_set_vf_guid)
return -EOPNOTSUPP;
-
return handle_vf_guid(dev, ivt, IFLA_VF_IB_NODE_GUID);
}
if (tb[IFLA_VF_IB_PORT_GUID]) {
struct ifla_vf_guid *ivt = nla_data(tb[IFLA_VF_IB_PORT_GUID]);
+ if (ivt->vf >= INT_MAX)
+ return -EINVAL;
if (!ops->ndo_set_vf_guid)
return -EOPNOTSUPP;
--
2.11.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH net] net: rtnetlink: prevent underflows in do_setvfinfo()
@ 2019-11-20 12:34 ` Dan Carpenter
0 siblings, 0 replies; 10+ messages in thread
From: Dan Carpenter @ 2019-11-20 12:34 UTC (permalink / raw)
To: David S. Miller
Cc: Jiri Pirko, David Ahern, Ido Schimmel, Petr Machata,
Jakub Kicinski, Nikolay Aleksandrov, Parav Pandit, Roopa Prabhu,
Johannes Berg, Michal Kubecek, netdev, linux-rdma,
kernel-janitors
The "ivm->vf" variable is a u32, but the problem is that a number of
drivers cast it to an int and then forget to check for negatives. An
example of this is in the cxgb4 driver.
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
2890 static int cxgb4_mgmt_get_vf_config(struct net_device *dev,
2891 int vf, struct ifla_vf_info *ivi)
^^^^^^
2892 {
2893 struct port_info *pi = netdev_priv(dev);
2894 struct adapter *adap = pi->adapter;
2895 struct vf_info *vfinfo;
2896
2897 if (vf >= adap->num_vfs)
^^^^^^^^^^^^^^^^^^^
2898 return -EINVAL;
2899 vfinfo = &adap->vfinfo[vf];
^^^^^^^^^^^^^^^^^^^^^^^^^^
There are 48 functions affected.
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c:8435 hclge_set_vf_vlan_filter() warn: can 'vfid' underflow 's32min-2147483646'
drivers/net/ethernet/freescale/enetc/enetc_pf.c:377 enetc_pf_set_vf_mac() warn: can 'vf' underflow 's32min-2147483646'
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c:2899 cxgb4_mgmt_get_vf_config() warn: can 'vf' underflow 's32min-254'
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c:2960 cxgb4_mgmt_set_vf_rate() warn: can 'vf' underflow 's32min-254'
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c:3019 cxgb4_mgmt_set_vf_rate() warn: can 'vf' underflow 's32min-254'
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c:3038 cxgb4_mgmt_set_vf_vlan() warn: can 'vf' underflow 's32min-254'
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c:3086 cxgb4_mgmt_set_vf_link_state() warn: can 'vf' underflow 's32min-254'
drivers/net/ethernet/chelsio/cxgb/cxgb2.c:791 get_eeprom() warn: can 'i' underflow 's32min-(-4),0,4-s32max'
drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c:82 bnxt_set_vf_spoofchk() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c:164 bnxt_set_vf_trust() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c:186 bnxt_get_vf_config() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c:228 bnxt_set_vf_mac() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c:264 bnxt_set_vf_vlan() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c:293 bnxt_set_vf_bw() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c:333 bnxt_set_vf_link_state() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c:2595 bnx2x_vf_op_prep() warn: can 'vfidx' underflow 's32min-63'
drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c:2595 bnx2x_vf_op_prep() warn: can 'vfidx' underflow 's32min-63'
drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c:2281 bnx2x_post_vf_bulletin() warn: can 'vf' underflow 's32min-63'
drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c:2285 bnx2x_post_vf_bulletin() warn: can 'vf' underflow 's32min-63'
drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c:2286 bnx2x_post_vf_bulletin() warn: can 'vf' underflow 's32min-63'
drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c:2292 bnx2x_post_vf_bulletin() warn: can 'vf' underflow 's32min-63'
drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c:2297 bnx2x_post_vf_bulletin() warn: can 'vf' underflow 's32min-63'
drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c:1832 qlcnic_sriov_set_vf_mac() warn: can 'vf' underflow 's32min-254'
drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c:1864 qlcnic_sriov_set_vf_tx_rate() warn: can 'vf' underflow 's32min-254'
drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c:1937 qlcnic_sriov_set_vf_vlan() warn: can 'vf' underflow 's32min-254'
drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c:2005 qlcnic_sriov_get_vf_config() warn: can 'vf' underflow 's32min-254'
drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c:2036 qlcnic_sriov_set_vf_spoofchk() warn: can 'vf' underflow 's32min-254'
drivers/net/ethernet/emulex/benet/be_main.c:1914 be_get_vf_config() warn: can 'vf' underflow 's32min-65534'
drivers/net/ethernet/emulex/benet/be_main.c:1915 be_get_vf_config() warn: can 'vf' underflow 's32min-65534'
drivers/net/ethernet/emulex/benet/be_main.c:1922 be_set_vf_tvt() warn: can 'vf' underflow 's32min-65534'
drivers/net/ethernet/emulex/benet/be_main.c:1951 be_clear_vf_tvt() warn: can 'vf' underflow 's32min-65534'
drivers/net/ethernet/emulex/benet/be_main.c:2063 be_set_vf_tx_rate() warn: can 'vf' underflow 's32min-65534'
drivers/net/ethernet/emulex/benet/be_main.c:2091 be_set_vf_link_state() warn: can 'vf' underflow 's32min-65534'
drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c:2609 ice_set_vf_port_vlan() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c:3050 ice_get_vf_cfg() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c:3103 ice_set_vf_spoofchk() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c:3181 ice_set_vf_mac() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c:3237 ice_set_vf_trust() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c:3286 ice_set_vf_link_state() warn: can 'vf_id' underflow 's32min-65534'
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c:3919 i40e_validate_vf() warn: can 'vf_id' underflow 's32min-2147483646'
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c:3957 i40e_ndo_set_vf_mac() warn: can 'vf_id' underflow 's32min-2147483646'
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c:4104 i40e_ndo_set_vf_port_vlan() warn: can 'vf_id' underflow 's32min-2147483646'
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c:4263 i40e_ndo_set_vf_bw() warn: can 'vf_id' underflow 's32min-2147483646'
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c:4309 i40e_ndo_get_vf_config() warn: can 'vf_id' underflow 's32min-2147483646'
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c:4371 i40e_ndo_set_vf_link_state() warn: can 'vf_id' underflow 's32min-2147483646'
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c:4441 i40e_ndo_set_vf_spoofchk() warn: can 'vf_id' underflow 's32min-2147483646'
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c:4441 i40e_ndo_set_vf_spoofchk() warn: can 'vf_id' underflow 's32min-2147483646'
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c:4504 i40e_ndo_set_vf_trust() warn: can 'vf_id' underflow 's32min-2147483646'
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
---
I reported this bug to the linux-rdma mailing list in April and this
patch wasn't considered very elegant. I can see how that's true. The
developer offered to write a fix which would update all the drivers to
use u32 throughout. I reminded him in September that this bug still
needs to be fixed.
I think there may be security implications and this patch is easy to
backport to stable kernels so in that sense, it might be a better
approach. Also this patch might prevent underflows in future drivers.
net/core/rtnetlink.c | 23 ++++++++++++++++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 000eddb1207d..9f7aa448bd11 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -2251,6 +2251,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
if (tb[IFLA_VF_MAC]) {
struct ifla_vf_mac *ivm = nla_data(tb[IFLA_VF_MAC]);
+ if (ivm->vf >= INT_MAX)
+ return -EINVAL;
err = -EOPNOTSUPP;
if (ops->ndo_set_vf_mac)
err = ops->ndo_set_vf_mac(dev, ivm->vf,
@@ -2262,6 +2264,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
if (tb[IFLA_VF_VLAN]) {
struct ifla_vf_vlan *ivv = nla_data(tb[IFLA_VF_VLAN]);
+ if (ivv->vf >= INT_MAX)
+ return -EINVAL;
err = -EOPNOTSUPP;
if (ops->ndo_set_vf_vlan)
err = ops->ndo_set_vf_vlan(dev, ivv->vf, ivv->vlan,
@@ -2294,6 +2298,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
if (len = 0)
return -EINVAL;
+ if (ivvl[0]->vf >= INT_MAX)
+ return -EINVAL;
err = ops->ndo_set_vf_vlan(dev, ivvl[0]->vf, ivvl[0]->vlan,
ivvl[0]->qos, ivvl[0]->vlan_proto);
if (err < 0)
@@ -2304,6 +2310,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
struct ifla_vf_tx_rate *ivt = nla_data(tb[IFLA_VF_TX_RATE]);
struct ifla_vf_info ivf;
+ if (ivt->vf >= INT_MAX)
+ return -EINVAL;
err = -EOPNOTSUPP;
if (ops->ndo_get_vf_config)
err = ops->ndo_get_vf_config(dev, ivt->vf, &ivf);
@@ -2322,6 +2330,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
if (tb[IFLA_VF_RATE]) {
struct ifla_vf_rate *ivt = nla_data(tb[IFLA_VF_RATE]);
+ if (ivt->vf >= INT_MAX)
+ return -EINVAL;
err = -EOPNOTSUPP;
if (ops->ndo_set_vf_rate)
err = ops->ndo_set_vf_rate(dev, ivt->vf,
@@ -2334,6 +2344,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
if (tb[IFLA_VF_SPOOFCHK]) {
struct ifla_vf_spoofchk *ivs = nla_data(tb[IFLA_VF_SPOOFCHK]);
+ if (ivs->vf >= INT_MAX)
+ return -EINVAL;
err = -EOPNOTSUPP;
if (ops->ndo_set_vf_spoofchk)
err = ops->ndo_set_vf_spoofchk(dev, ivs->vf,
@@ -2345,6 +2357,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
if (tb[IFLA_VF_LINK_STATE]) {
struct ifla_vf_link_state *ivl = nla_data(tb[IFLA_VF_LINK_STATE]);
+ if (ivl->vf >= INT_MAX)
+ return -EINVAL;
err = -EOPNOTSUPP;
if (ops->ndo_set_vf_link_state)
err = ops->ndo_set_vf_link_state(dev, ivl->vf,
@@ -2358,6 +2372,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
err = -EOPNOTSUPP;
ivrssq_en = nla_data(tb[IFLA_VF_RSS_QUERY_EN]);
+ if (ivrssq_en->vf >= INT_MAX)
+ return -EINVAL;
if (ops->ndo_set_vf_rss_query_en)
err = ops->ndo_set_vf_rss_query_en(dev, ivrssq_en->vf,
ivrssq_en->setting);
@@ -2368,6 +2384,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
if (tb[IFLA_VF_TRUST]) {
struct ifla_vf_trust *ivt = nla_data(tb[IFLA_VF_TRUST]);
+ if (ivt->vf >= INT_MAX)
+ return -EINVAL;
err = -EOPNOTSUPP;
if (ops->ndo_set_vf_trust)
err = ops->ndo_set_vf_trust(dev, ivt->vf, ivt->setting);
@@ -2378,15 +2396,18 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)
if (tb[IFLA_VF_IB_NODE_GUID]) {
struct ifla_vf_guid *ivt = nla_data(tb[IFLA_VF_IB_NODE_GUID]);
+ if (ivt->vf >= INT_MAX)
+ return -EINVAL;
if (!ops->ndo_set_vf_guid)
return -EOPNOTSUPP;
-
return handle_vf_guid(dev, ivt, IFLA_VF_IB_NODE_GUID);
}
if (tb[IFLA_VF_IB_PORT_GUID]) {
struct ifla_vf_guid *ivt = nla_data(tb[IFLA_VF_IB_PORT_GUID]);
+ if (ivt->vf >= INT_MAX)
+ return -EINVAL;
if (!ops->ndo_set_vf_guid)
return -EOPNOTSUPP;
--
2.11.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH net] net: rtnetlink: prevent underflows in do_setvfinfo()
2019-11-20 12:34 ` Dan Carpenter
@ 2019-11-20 16:41 ` David Ahern
-1 siblings, 0 replies; 10+ messages in thread
From: David Ahern @ 2019-11-20 16:41 UTC (permalink / raw)
To: Dan Carpenter, David S. Miller
Cc: Jiri Pirko, Ido Schimmel, Petr Machata, Jakub Kicinski,
Nikolay Aleksandrov, Parav Pandit, Roopa Prabhu, Johannes Berg,
Michal Kubecek, netdev, linux-rdma, kernel-janitors
On 11/20/19 5:34 AM, Dan Carpenter wrote:
> I reported this bug to the linux-rdma mailing list in April and this
> patch wasn't considered very elegant. I can see how that's true. The
> developer offered to write a fix which would update all the drivers to
> use u32 throughout. I reminded him in September that this bug still
> needs to be fixed.
Since the uapi (ifla_vf_mac, ifla_vf_vlan, ...) all have u32, I agree
with that comment -- it seems like the ndo functions should be changed
from 'int vf' to 'u32 vf'.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net] net: rtnetlink: prevent underflows in do_setvfinfo()
@ 2019-11-20 16:41 ` David Ahern
0 siblings, 0 replies; 10+ messages in thread
From: David Ahern @ 2019-11-20 16:41 UTC (permalink / raw)
To: Dan Carpenter, David S. Miller
Cc: Jiri Pirko, Ido Schimmel, Petr Machata, Jakub Kicinski,
Nikolay Aleksandrov, Parav Pandit, Roopa Prabhu, Johannes Berg,
Michal Kubecek, netdev, linux-rdma, kernel-janitors
On 11/20/19 5:34 AM, Dan Carpenter wrote:
> I reported this bug to the linux-rdma mailing list in April and this
> patch wasn't considered very elegant. I can see how that's true. The
> developer offered to write a fix which would update all the drivers to
> use u32 throughout. I reminded him in September that this bug still
> needs to be fixed.
Since the uapi (ifla_vf_mac, ifla_vf_vlan, ...) all have u32, I agree
with that comment -- it seems like the ndo functions should be changed
from 'int vf' to 'u32 vf'.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net] net: rtnetlink: prevent underflows in do_setvfinfo()
2019-11-20 16:41 ` David Ahern
@ 2019-11-20 18:07 ` Dan Carpenter
-1 siblings, 0 replies; 10+ messages in thread
From: Dan Carpenter @ 2019-11-20 18:07 UTC (permalink / raw)
To: David Ahern
Cc: David S. Miller, Jiri Pirko, Ido Schimmel, Petr Machata,
Jakub Kicinski, Nikolay Aleksandrov, Parav Pandit, Roopa Prabhu,
Johannes Berg, Michal Kubecek, netdev, linux-rdma,
kernel-janitors
On Wed, Nov 20, 2019 at 09:41:01AM -0700, David Ahern wrote:
> On 11/20/19 5:34 AM, Dan Carpenter wrote:
> > I reported this bug to the linux-rdma mailing list in April and this
> > patch wasn't considered very elegant. I can see how that's true. The
> > developer offered to write a fix which would update all the drivers to
> > use u32 throughout. I reminded him in September that this bug still
> > needs to be fixed.
>
> Since the uapi (ifla_vf_mac, ifla_vf_vlan, ...) all have u32, I agree
> with that comment -- it seems like the ndo functions should be changed
> from 'int vf' to 'u32 vf'.
It's a lot of changes and there is no way to be sure the static checker
isn't missing any bugs.
regards,
dan carpenter
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net] net: rtnetlink: prevent underflows in do_setvfinfo()
@ 2019-11-20 18:07 ` Dan Carpenter
0 siblings, 0 replies; 10+ messages in thread
From: Dan Carpenter @ 2019-11-20 18:07 UTC (permalink / raw)
To: David Ahern
Cc: David S. Miller, Jiri Pirko, Ido Schimmel, Petr Machata,
Jakub Kicinski, Nikolay Aleksandrov, Parav Pandit, Roopa Prabhu,
Johannes Berg, Michal Kubecek, netdev, linux-rdma,
kernel-janitors
On Wed, Nov 20, 2019 at 09:41:01AM -0700, David Ahern wrote:
> On 11/20/19 5:34 AM, Dan Carpenter wrote:
> > I reported this bug to the linux-rdma mailing list in April and this
> > patch wasn't considered very elegant. I can see how that's true. The
> > developer offered to write a fix which would update all the drivers to
> > use u32 throughout. I reminded him in September that this bug still
> > needs to be fixed.
>
> Since the uapi (ifla_vf_mac, ifla_vf_vlan, ...) all have u32, I agree
> with that comment -- it seems like the ndo functions should be changed
> from 'int vf' to 'u32 vf'.
It's a lot of changes and there is no way to be sure the static checker
isn't missing any bugs.
regards,
dan carpenter
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net] net: rtnetlink: prevent underflows in do_setvfinfo()
2019-11-20 12:34 ` Dan Carpenter
@ 2019-11-21 22:44 ` David Miller
-1 siblings, 0 replies; 10+ messages in thread
From: David Miller @ 2019-11-21 22:44 UTC (permalink / raw)
To: dan.carpenter
Cc: jiri, dsahern, idosch, petrm, jakub.kicinski, nikolay, parav,
roopa, johannes.berg, mkubecek, netdev, linux-rdma,
kernel-janitors
From: Dan Carpenter <dan.carpenter@oracle.com>
Date: Wed, 20 Nov 2019 15:34:38 +0300
> The "ivm->vf" variable is a u32, but the problem is that a number of
> drivers cast it to an int and then forget to check for negatives. An
> example of this is in the cxgb4 driver.
>
> drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
> 2890 static int cxgb4_mgmt_get_vf_config(struct net_device *dev,
> 2891 int vf, struct ifla_vf_info *ivi)
> ^^^^^^
> 2892 {
> 2893 struct port_info *pi = netdev_priv(dev);
> 2894 struct adapter *adap = pi->adapter;
> 2895 struct vf_info *vfinfo;
> 2896
> 2897 if (vf >= adap->num_vfs)
> ^^^^^^^^^^^^^^^^^^^
> 2898 return -EINVAL;
> 2899 vfinfo = &adap->vfinfo[vf];
> ^^^^^^^^^^^^^^^^^^^^^^^^^^
>
> There are 48 functions affected.
...
> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
I'm going to apply this and queue it up for -stable.
The u32 conversion should happen in next.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net] net: rtnetlink: prevent underflows in do_setvfinfo()
@ 2019-11-21 22:44 ` David Miller
0 siblings, 0 replies; 10+ messages in thread
From: David Miller @ 2019-11-21 22:44 UTC (permalink / raw)
To: dan.carpenter
Cc: jiri, dsahern, idosch, petrm, jakub.kicinski, nikolay, parav,
roopa, johannes.berg, mkubecek, netdev, linux-rdma,
kernel-janitors
From: Dan Carpenter <dan.carpenter@oracle.com>
Date: Wed, 20 Nov 2019 15:34:38 +0300
> The "ivm->vf" variable is a u32, but the problem is that a number of
> drivers cast it to an int and then forget to check for negatives. An
> example of this is in the cxgb4 driver.
>
> drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
> 2890 static int cxgb4_mgmt_get_vf_config(struct net_device *dev,
> 2891 int vf, struct ifla_vf_info *ivi)
> ^^^^^^
> 2892 {
> 2893 struct port_info *pi = netdev_priv(dev);
> 2894 struct adapter *adap = pi->adapter;
> 2895 struct vf_info *vfinfo;
> 2896
> 2897 if (vf >= adap->num_vfs)
> ^^^^^^^^^^^^^^^^^^^
> 2898 return -EINVAL;
> 2899 vfinfo = &adap->vfinfo[vf];
> ^^^^^^^^^^^^^^^^^^^^^^^^^^
>
> There are 48 functions affected.
...
> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
I'm going to apply this and queue it up for -stable.
The u32 conversion should happen in next.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net] net: rtnetlink: prevent underflows in do_setvfinfo()
2019-11-21 22:44 ` David Miller
@ 2019-11-22 7:21 ` Parav Pandit
-1 siblings, 0 replies; 10+ messages in thread
From: Parav Pandit @ 2019-11-22 7:21 UTC (permalink / raw)
To: David Miller, dan.carpenter
Cc: Jiri Pirko, dsahern, Ido Schimmel, Petr Machata, jakub.kicinski,
nikolay, roopa, johannes.berg, mkubecek, netdev, linux-rdma,
kernel-janitors
On 11/21/2019 4:44 PM, David Miller wrote:
> From: Dan Carpenter <dan.carpenter@oracle.com>
> Date: Wed, 20 Nov 2019 15:34:38 +0300
>
>> The "ivm->vf" variable is a u32, but the problem is that a number of
>> drivers cast it to an int and then forget to check for negatives. An
>> example of this is in the cxgb4 driver.
>>
>> drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
>> 2890 static int cxgb4_mgmt_get_vf_config(struct net_device *dev,
>> 2891 int vf, struct ifla_vf_info *ivi)
>> ^^^^^^
>> 2892 {
>> 2893 struct port_info *pi = netdev_priv(dev);
>> 2894 struct adapter *adap = pi->adapter;
>> 2895 struct vf_info *vfinfo;
>> 2896
>> 2897 if (vf >= adap->num_vfs)
>> ^^^^^^^^^^^^^^^^^^^
>> 2898 return -EINVAL;
>> 2899 vfinfo = &adap->vfinfo[vf];
>> ^^^^^^^^^^^^^^^^^^^^^^^^^^
>>
>> There are 48 functions affected.
> ...
>> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
> I'm going to apply this and queue it up for -stable.
>
> The u32 conversion should happen in next.
okay.
When Dan reported, I reviewed and wrote the patch for u32, and some more
code consolidation with it.
But hit the block with u32 leading to overflow to 0 which modifies the
first VF incorrectly.
Checking num_vfs of pci dev, without device_lock() is equally buggy as
it stands today.
Creating a lock in each vendor driver(s) doesn't make sense.
Haven't had chance yet after that.
Let me know if someone has a suggestion that I should incorporate.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net] net: rtnetlink: prevent underflows in do_setvfinfo()
@ 2019-11-22 7:21 ` Parav Pandit
0 siblings, 0 replies; 10+ messages in thread
From: Parav Pandit @ 2019-11-22 7:21 UTC (permalink / raw)
To: David Miller, dan.carpenter
Cc: Jiri Pirko, dsahern, Ido Schimmel, Petr Machata, jakub.kicinski,
nikolay, roopa, johannes.berg, mkubecek, netdev, linux-rdma,
kernel-janitors
T24gMTEvMjEvMjAxOSA0OjQ0IFBNLCBEYXZpZCBNaWxsZXIgd3JvdGU6DQo+IEZyb206IERhbiBD
YXJwZW50ZXIgPGRhbi5jYXJwZW50ZXJAb3JhY2xlLmNvbT4NCj4gRGF0ZTogV2VkLCAyMCBOb3Yg
MjAxOSAxNTozNDozOCArMDMwMA0KPg0KPj4gVGhlICJpdm0tPnZmIiB2YXJpYWJsZSBpcyBhIHUz
MiwgYnV0IHRoZSBwcm9ibGVtIGlzIHRoYXQgYSBudW1iZXIgb2YNCj4+IGRyaXZlcnMgY2FzdCBp
dCB0byBhbiBpbnQgYW5kIHRoZW4gZm9yZ2V0IHRvIGNoZWNrIGZvciBuZWdhdGl2ZXMuICBBbg0K
Pj4gZXhhbXBsZSBvZiB0aGlzIGlzIGluIHRoZSBjeGdiNCBkcml2ZXIuDQo+Pg0KPj4gZHJpdmVy
cy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF9tYWluLmMNCj4+ICAgMjg5MCAgc3Rh
dGljIGludCBjeGdiNF9tZ210X2dldF92Zl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwN
Cj4+ICAgMjg5MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZmLCBz
dHJ1Y3QgaWZsYV92Zl9pbmZvICppdmkpDQo+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIF5eXl5eXg0KPj4gICAyODkyICB7DQo+PiAgIDI4OTMgICAgICAgICAg
c3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOw0KPj4gICAyODk0ICAgICAg
ICAgIHN0cnVjdCBhZGFwdGVyICphZGFwID0gcGktPmFkYXB0ZXI7DQo+PiAgIDI4OTUgICAgICAg
ICAgc3RydWN0IHZmX2luZm8gKnZmaW5mbzsNCj4+ICAgMjg5NiAgDQo+PiAgIDI4OTcgICAgICAg
ICAgaWYgKHZmID49IGFkYXAtPm51bV92ZnMpDQo+PiAgICAgICAgICAgICAgICAgICAgIF5eXl5e
Xl5eXl5eXl5eXl5eXl4NCj4+ICAgMjg5OCAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFM
Ow0KPj4gICAyODk5ICAgICAgICAgIHZmaW5mbyA9ICZhZGFwLT52ZmluZm9bdmZdOw0KPj4gICAg
ICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eDQo+Pg0KPj4gVGhlcmUgYXJl
IDQ4IGZ1bmN0aW9ucyBhZmZlY3RlZC4NCj4gIC4uLg0KPj4gU2lnbmVkLW9mZi1ieTogRGFuIENh
cnBlbnRlciA8ZGFuLmNhcnBlbnRlckBvcmFjbGUuY29tPg0KPiBJJ20gZ29pbmcgdG8gYXBwbHkg
dGhpcyBhbmQgcXVldWUgaXQgdXAgZm9yIC1zdGFibGUuDQo+DQo+IFRoZSB1MzIgY29udmVyc2lv
biBzaG91bGQgaGFwcGVuIGluIG5leHQuDQpva2F5Lg0KV2hlbiBEYW4gcmVwb3J0ZWQsIEkgcmV2
aWV3ZWQgYW5kIHdyb3RlIHRoZSBwYXRjaCBmb3IgdTMyLCBhbmQgc29tZSBtb3JlDQpjb2RlIGNv
bnNvbGlkYXRpb24gd2l0aCBpdC4NCkJ1dCBoaXQgdGhlIGJsb2NrIHdpdGggdTMyIGxlYWRpbmcg
dG8gb3ZlcmZsb3cgdG8gMCB3aGljaCBtb2RpZmllcyB0aGUNCmZpcnN0IFZGIGluY29ycmVjdGx5
Lg0KQ2hlY2tpbmcgbnVtX3ZmcyBvZiBwY2kgZGV2LCB3aXRob3V0IGRldmljZV9sb2NrKCkgaXMg
ZXF1YWxseSBidWdneSBhcw0KaXQgc3RhbmRzIHRvZGF5Lg0KQ3JlYXRpbmcgYSBsb2NrIGluIGVh
Y2ggdmVuZG9yIGRyaXZlcihzKSBkb2Vzbid0IG1ha2Ugc2Vuc2UuDQpIYXZlbid0IGhhZCBjaGFu
Y2UgeWV0IGFmdGVyIHRoYXQuDQpMZXQgbWUga25vdyBpZiBzb21lb25lIGhhcyBhIHN1Z2dlc3Rp
b24gdGhhdCBJIHNob3VsZCBpbmNvcnBvcmF0ZS4NCg0K
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2019-11-22 7:21 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-11-20 12:34 [PATCH net] net: rtnetlink: prevent underflows in do_setvfinfo() Dan Carpenter
2019-11-20 12:34 ` Dan Carpenter
2019-11-20 16:41 ` David Ahern
2019-11-20 16:41 ` David Ahern
2019-11-20 18:07 ` Dan Carpenter
2019-11-20 18:07 ` Dan Carpenter
2019-11-21 22:44 ` David Miller
2019-11-21 22:44 ` David Miller
2019-11-22 7:21 ` Parav Pandit
2019-11-22 7:21 ` Parav Pandit
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.