Skip to content

Commit f006229

Browse files
can: kvaser_usb: hydra: help gcc-13 to figure out cmd_len
Debian's gcc-13 [1] throws the following error in kvaser_usb_hydra_cmd_size(): [1] gcc version 13.0.0 20221214 (experimental) [master r13-4693-g512098a3316] (Debian 13-20221214-1) | drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c:502:65: error: | array subscript ‘struct kvaser_cmd_ext[0]’ is partly outside array | bounds of ‘unsigned char[32]’ [-Werror=array-bounds=] | 502 | ret = le16_to_cpu(((struct kvaser_cmd_ext *)cmd)->len); kvaser_usb_hydra_cmd_size() returns the size of given command. It depends on the command number (cmd->header.cmd_no). For extended commands (cmd->header.cmd_no == CMD_EXTENDED) the above shown code is executed. Help gcc to recognize that this code path is not taken in all cases, by calling kvaser_usb_hydra_cmd_size() directly after assigning the command number. Fixes: aec5fb2 ("can: kvaser_usb: Add support for Kvaser USB hydra family") Cc: Jimmy Assarsson <[email protected]> Cc: Anssi Hannula <[email protected]> Link: https://lore.kernel.org/all/[email protected] Tested-by: Jimmy Assarsson <[email protected]> Signed-off-by: Marc Kleine-Budde <[email protected]>
1 parent 3bc2afc commit f006229

File tree

1 file changed

+24
-9
lines changed

1 file changed

+24
-9
lines changed

drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -545,13 +545,15 @@ static int kvaser_usb_hydra_send_simple_cmd(struct kvaser_usb *dev,
545545
u8 cmd_no, int channel)
546546
{
547547
struct kvaser_cmd *cmd;
548+
size_t cmd_len;
548549
int err;
549550

550551
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
551552
if (!cmd)
552553
return -ENOMEM;
553554

554555
cmd->header.cmd_no = cmd_no;
556+
cmd_len = kvaser_usb_hydra_cmd_size(cmd);
555557
if (channel < 0) {
556558
kvaser_usb_hydra_set_cmd_dest_he
557559
(cmd, KVASER_USB_HYDRA_HE_ADDRESS_ILLEGAL);
@@ -568,7 +570,7 @@ static int kvaser_usb_hydra_send_simple_cmd(struct kvaser_usb *dev,
568570
kvaser_usb_hydra_set_cmd_transid
569571
(cmd, kvaser_usb_hydra_get_next_transid(dev));
570572

571-
err = kvaser_usb_send_cmd(dev, cmd, kvaser_usb_hydra_cmd_size(cmd));
573+
err = kvaser_usb_send_cmd(dev, cmd, cmd_len);
572574
if (err)
573575
goto end;
574576

@@ -584,21 +586,22 @@ kvaser_usb_hydra_send_simple_cmd_async(struct kvaser_usb_net_priv *priv,
584586
{
585587
struct kvaser_cmd *cmd;
586588
struct kvaser_usb *dev = priv->dev;
589+
size_t cmd_len;
587590
int err;
588591

589592
cmd = kzalloc(sizeof(*cmd), GFP_ATOMIC);
590593
if (!cmd)
591594
return -ENOMEM;
592595

593596
cmd->header.cmd_no = cmd_no;
597+
cmd_len = kvaser_usb_hydra_cmd_size(cmd);
594598

595599
kvaser_usb_hydra_set_cmd_dest_he
596600
(cmd, dev->card_data.hydra.channel_to_he[priv->channel]);
597601
kvaser_usb_hydra_set_cmd_transid
598602
(cmd, kvaser_usb_hydra_get_next_transid(dev));
599603

600-
err = kvaser_usb_send_cmd_async(priv, cmd,
601-
kvaser_usb_hydra_cmd_size(cmd));
604+
err = kvaser_usb_send_cmd_async(priv, cmd, cmd_len);
602605
if (err)
603606
kfree(cmd);
604607

@@ -742,6 +745,7 @@ static int kvaser_usb_hydra_get_single_capability(struct kvaser_usb *dev,
742745
{
743746
struct kvaser_usb_dev_card_data *card_data = &dev->card_data;
744747
struct kvaser_cmd *cmd;
748+
size_t cmd_len;
745749
u32 value = 0;
746750
u32 mask = 0;
747751
u16 cap_cmd_res;
@@ -753,13 +757,14 @@ static int kvaser_usb_hydra_get_single_capability(struct kvaser_usb *dev,
753757
return -ENOMEM;
754758

755759
cmd->header.cmd_no = CMD_GET_CAPABILITIES_REQ;
760+
cmd_len = kvaser_usb_hydra_cmd_size(cmd);
756761
cmd->cap_req.cap_cmd = cpu_to_le16(cap_cmd_req);
757762

758763
kvaser_usb_hydra_set_cmd_dest_he(cmd, card_data->hydra.sysdbg_he);
759764
kvaser_usb_hydra_set_cmd_transid
760765
(cmd, kvaser_usb_hydra_get_next_transid(dev));
761766

762-
err = kvaser_usb_send_cmd(dev, cmd, kvaser_usb_hydra_cmd_size(cmd));
767+
err = kvaser_usb_send_cmd(dev, cmd, cmd_len);
763768
if (err)
764769
goto end;
765770

@@ -1578,6 +1583,7 @@ static int kvaser_usb_hydra_get_busparams(struct kvaser_usb_net_priv *priv,
15781583
struct kvaser_usb *dev = priv->dev;
15791584
struct kvaser_usb_net_hydra_priv *hydra = priv->sub_priv;
15801585
struct kvaser_cmd *cmd;
1586+
size_t cmd_len;
15811587
int err;
15821588

15831589
if (!hydra)
@@ -1588,6 +1594,7 @@ static int kvaser_usb_hydra_get_busparams(struct kvaser_usb_net_priv *priv,
15881594
return -ENOMEM;
15891595

15901596
cmd->header.cmd_no = CMD_GET_BUSPARAMS_REQ;
1597+
cmd_len = kvaser_usb_hydra_cmd_size(cmd);
15911598
kvaser_usb_hydra_set_cmd_dest_he
15921599
(cmd, dev->card_data.hydra.channel_to_he[priv->channel]);
15931600
kvaser_usb_hydra_set_cmd_transid
@@ -1597,7 +1604,7 @@ static int kvaser_usb_hydra_get_busparams(struct kvaser_usb_net_priv *priv,
15971604

15981605
reinit_completion(&priv->get_busparams_comp);
15991606

1600-
err = kvaser_usb_send_cmd(dev, cmd, kvaser_usb_hydra_cmd_size(cmd));
1607+
err = kvaser_usb_send_cmd(dev, cmd, cmd_len);
16011608
if (err)
16021609
return err;
16031610

@@ -1624,13 +1631,15 @@ static int kvaser_usb_hydra_set_bittiming(const struct net_device *netdev,
16241631
struct kvaser_cmd *cmd;
16251632
struct kvaser_usb_net_priv *priv = netdev_priv(netdev);
16261633
struct kvaser_usb *dev = priv->dev;
1634+
size_t cmd_len;
16271635
int err;
16281636

16291637
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
16301638
if (!cmd)
16311639
return -ENOMEM;
16321640

16331641
cmd->header.cmd_no = CMD_SET_BUSPARAMS_REQ;
1642+
cmd_len = kvaser_usb_hydra_cmd_size(cmd);
16341643
memcpy(&cmd->set_busparams_req.busparams_nominal, busparams,
16351644
sizeof(cmd->set_busparams_req.busparams_nominal));
16361645

@@ -1639,7 +1648,7 @@ static int kvaser_usb_hydra_set_bittiming(const struct net_device *netdev,
16391648
kvaser_usb_hydra_set_cmd_transid
16401649
(cmd, kvaser_usb_hydra_get_next_transid(dev));
16411650

1642-
err = kvaser_usb_send_cmd(dev, cmd, kvaser_usb_hydra_cmd_size(cmd));
1651+
err = kvaser_usb_send_cmd(dev, cmd, cmd_len);
16431652

16441653
kfree(cmd);
16451654

@@ -1652,13 +1661,15 @@ static int kvaser_usb_hydra_set_data_bittiming(const struct net_device *netdev,
16521661
struct kvaser_cmd *cmd;
16531662
struct kvaser_usb_net_priv *priv = netdev_priv(netdev);
16541663
struct kvaser_usb *dev = priv->dev;
1664+
size_t cmd_len;
16551665
int err;
16561666

16571667
cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
16581668
if (!cmd)
16591669
return -ENOMEM;
16601670

16611671
cmd->header.cmd_no = CMD_SET_BUSPARAMS_FD_REQ;
1672+
cmd_len = kvaser_usb_hydra_cmd_size(cmd);
16621673
memcpy(&cmd->set_busparams_req.busparams_data, busparams,
16631674
sizeof(cmd->set_busparams_req.busparams_data));
16641675

@@ -1676,7 +1687,7 @@ static int kvaser_usb_hydra_set_data_bittiming(const struct net_device *netdev,
16761687
kvaser_usb_hydra_set_cmd_transid
16771688
(cmd, kvaser_usb_hydra_get_next_transid(dev));
16781689

1679-
err = kvaser_usb_send_cmd(dev, cmd, kvaser_usb_hydra_cmd_size(cmd));
1690+
err = kvaser_usb_send_cmd(dev, cmd, cmd_len);
16801691

16811692
kfree(cmd);
16821693

@@ -1804,6 +1815,7 @@ static int kvaser_usb_hydra_get_software_info(struct kvaser_usb *dev)
18041815
static int kvaser_usb_hydra_get_software_details(struct kvaser_usb *dev)
18051816
{
18061817
struct kvaser_cmd *cmd;
1818+
size_t cmd_len;
18071819
int err;
18081820
u32 flags;
18091821
struct kvaser_usb_dev_card_data *card_data = &dev->card_data;
@@ -1813,14 +1825,15 @@ static int kvaser_usb_hydra_get_software_details(struct kvaser_usb *dev)
18131825
return -ENOMEM;
18141826

18151827
cmd->header.cmd_no = CMD_GET_SOFTWARE_DETAILS_REQ;
1828+
cmd_len = kvaser_usb_hydra_cmd_size(cmd);
18161829
cmd->sw_detail_req.use_ext_cmd = 1;
18171830
kvaser_usb_hydra_set_cmd_dest_he
18181831
(cmd, KVASER_USB_HYDRA_HE_ADDRESS_ILLEGAL);
18191832

18201833
kvaser_usb_hydra_set_cmd_transid
18211834
(cmd, kvaser_usb_hydra_get_next_transid(dev));
18221835

1823-
err = kvaser_usb_send_cmd(dev, cmd, kvaser_usb_hydra_cmd_size(cmd));
1836+
err = kvaser_usb_send_cmd(dev, cmd, cmd_len);
18241837
if (err)
18251838
goto end;
18261839

@@ -1938,6 +1951,7 @@ static int kvaser_usb_hydra_set_opt_mode(const struct kvaser_usb_net_priv *priv)
19381951
{
19391952
struct kvaser_usb *dev = priv->dev;
19401953
struct kvaser_cmd *cmd;
1954+
size_t cmd_len;
19411955
int err;
19421956

19431957
if ((priv->can.ctrlmode &
@@ -1953,6 +1967,7 @@ static int kvaser_usb_hydra_set_opt_mode(const struct kvaser_usb_net_priv *priv)
19531967
return -ENOMEM;
19541968

19551969
cmd->header.cmd_no = CMD_SET_DRIVERMODE_REQ;
1970+
cmd_len = kvaser_usb_hydra_cmd_size(cmd);
19561971
kvaser_usb_hydra_set_cmd_dest_he
19571972
(cmd, dev->card_data.hydra.channel_to_he[priv->channel]);
19581973
kvaser_usb_hydra_set_cmd_transid
@@ -1962,7 +1977,7 @@ static int kvaser_usb_hydra_set_opt_mode(const struct kvaser_usb_net_priv *priv)
19621977
else
19631978
cmd->set_ctrlmode.mode = KVASER_USB_HYDRA_CTRLMODE_NORMAL;
19641979

1965-
err = kvaser_usb_send_cmd(dev, cmd, kvaser_usb_hydra_cmd_size(cmd));
1980+
err = kvaser_usb_send_cmd(dev, cmd, cmd_len);
19661981
kfree(cmd);
19671982

19681983
return err;

0 commit comments

Comments
 (0)