From: Qasim Ijaz <qasdev00@gmail.com>
To: andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com,
kuba@kernel.org, pabeni@redhat.com, horms@kernel.org
Cc: linux-usb@vger.kernel.org, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, Qasim Ijaz <qasdev00@gmail.com>
Subject: [PATCH 3/4] net: ch9200: improve error handling in get_mac_address()
Date: Wed, 19 Mar 2025 11:21:55 +0000 [thread overview]
Message-ID: <20250319112156.48312-4-qasdev00@gmail.com> (raw)
In-Reply-To: <20250319112156.48312-1-qasdev00@gmail.com>
The get_mac_address() function has an issue where it does not
directly check the return value of each control_read(), instead
it sums up the return values and checks them all at the end
which means if any call to control_read() fails the function just
continues on.
Handle this by validating the return value of each call and fail fast
and early instead of continuing.
Fixes: 4a476bd6d1d9 ("usbnet: New driver for QinHeng CH9200 devices")
Signed-off-by: Qasim Ijaz <qasdev00@gmail.com>
---
drivers/net/usb/ch9200.c | 32 +++++++++++++++++++-------------
1 file changed, 19 insertions(+), 13 deletions(-)
diff --git a/drivers/net/usb/ch9200.c b/drivers/net/usb/ch9200.c
index 3a81e9e96fd3..a910aea0febe 100644
--- a/drivers/net/usb/ch9200.c
+++ b/drivers/net/usb/ch9200.c
@@ -304,24 +304,27 @@ static int ch9200_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
static int get_mac_address(struct usbnet *dev, unsigned char *data)
{
- int err = 0;
unsigned char mac_addr[0x06];
- int rd_mac_len = 0;
+ int rd_mac_len;
netdev_dbg(dev->net, "%s:\n\tusbnet VID:%0x PID:%0x\n", __func__,
le16_to_cpu(dev->udev->descriptor.idVendor),
le16_to_cpu(dev->udev->descriptor.idProduct));
- memset(mac_addr, 0, sizeof(mac_addr));
- rd_mac_len = control_read(dev, REQUEST_READ, 0,
- MAC_REG_STATION_L, mac_addr, 0x02,
- CONTROL_TIMEOUT_MS);
- rd_mac_len += control_read(dev, REQUEST_READ, 0, MAC_REG_STATION_M,
- mac_addr + 2, 0x02, CONTROL_TIMEOUT_MS);
- rd_mac_len += control_read(dev, REQUEST_READ, 0, MAC_REG_STATION_H,
- mac_addr + 4, 0x02, CONTROL_TIMEOUT_MS);
- if (rd_mac_len != ETH_ALEN)
- err = -EINVAL;
+ rd_mac_len = control_read(dev, REQUEST_READ, 0, MAC_REG_STATION_L,
+ mac_addr, 0x02, CONTROL_TIMEOUT_MS);
+ if (rd_mac_len < 0)
+ return rd_mac_len;
+
+ rd_mac_len = control_read(dev, REQUEST_READ, 0, MAC_REG_STATION_M,
+ mac_addr + 2, 0x02, CONTROL_TIMEOUT_MS);
+ if (rd_mac_len < 0)
+ return rd_mac_len;
+
+ rd_mac_len = control_read(dev, REQUEST_READ, 0, MAC_REG_STATION_H,
+ mac_addr + 4, 0x02, CONTROL_TIMEOUT_MS);
+ if (rd_mac_len < 0)
+ return rd_mac_len;
data[0] = mac_addr[5];
data[1] = mac_addr[4];
@@ -330,7 +333,7 @@ static int get_mac_address(struct usbnet *dev, unsigned char *data)
data[4] = mac_addr[1];
data[5] = mac_addr[0];
- return err;
+ return 0;
}
static int ch9200_bind(struct usbnet *dev, struct usb_interface *intf)
@@ -386,6 +389,9 @@ static int ch9200_bind(struct usbnet *dev, struct usb_interface *intf)
CONTROL_TIMEOUT_MS);
retval = get_mac_address(dev, addr);
+ if (retval < 0)
+ return retval;
+
eth_hw_addr_set(dev->net, addr);
return retval;
--
2.39.5
next prev parent reply other threads:[~2025-03-19 11:22 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-19 11:21 [PATCH 0/4] net: fix bugs and error handling in qinheng ch9200 driver and mii interface Qasim Ijaz
2025-03-19 11:21 ` [PATCH 1/4] net: fix uninitialised access in mii_nway_restart() Qasim Ijaz
2025-03-20 13:48 ` Simon Horman
2025-03-25 13:33 ` Jakub Kicinski
2025-04-10 22:15 ` Qasim Ijaz
2025-04-10 23:17 ` Jakub Kicinski
2025-04-11 1:12 ` Andrew Lunn
2025-04-12 18:30 ` Qasim Ijaz
2025-03-19 11:21 ` [PATCH 2/4] net: ch9200: remove extraneous return in control_write() to propagate failures Qasim Ijaz
2025-03-20 13:48 ` Simon Horman
2025-03-19 11:21 ` Qasim Ijaz [this message]
2025-03-20 13:38 ` [PATCH 3/4] net: ch9200: improve error handling in get_mac_address() Markus Elfring
2025-03-20 13:49 ` Simon Horman
2025-03-19 11:21 ` [PATCH 4/4] net: ch9200: add error handling in ch9200_bind() Qasim Ijaz
2025-03-20 13:49 ` Simon Horman
2025-03-20 14:00 ` Markus Elfring
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250319112156.48312-4-qasdev00@gmail.com \
--to=qasdev00@gmail.com \
--cc=andrew+netdev@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=horms@kernel.org \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).