netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH][next] zd1211rw: zd_usb: Use struct_size() helper
@ 2019-08-30 18:57 Gustavo A. R. Silva
  2019-08-31  9:38 ` kbuild test robot
  2019-09-03 13:45 ` Kalle Valo
  0 siblings, 2 replies; 3+ messages in thread
From: Gustavo A. R. Silva @ 2019-08-30 18:57 UTC (permalink / raw)
  To: Daniel Drake, Ulrich Kunitz, Kalle Valo, David S. Miller
  Cc: linux-wireless, netdev, linux-kernel, Gustavo A. R. Silva

One of the more common cases of allocation size calculations is finding
the size of a structure that has a zero-sized array at the end, along
with memory for some number of elements for that array. For example:

struct usb_int_regs {
	...
        struct reg_data regs[0];
} __packed;

Make use of the struct_size() helper instead of an open-coded version
in order to avoid any potential type mistakes.

So, replace the following function:

static int usb_int_regs_length(unsigned int count)
{
       return sizeof(struct usb_int_regs) + count * sizeof(struct reg_data);
}

with:

struct_size(regs, regs, count)

This code was detected with the help of Coccinelle.

Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
---
 drivers/net/wireless/zydas/zd1211rw/zd_usb.c | 11 +++--------
 1 file changed, 3 insertions(+), 8 deletions(-)

diff --git a/drivers/net/wireless/zydas/zd1211rw/zd_usb.c b/drivers/net/wireless/zydas/zd1211rw/zd_usb.c
index 1965cd0fafc4..4e44ea8c652d 100644
--- a/drivers/net/wireless/zydas/zd1211rw/zd_usb.c
+++ b/drivers/net/wireless/zydas/zd1211rw/zd_usb.c
@@ -1597,11 +1597,6 @@ static int zd_ep_regs_out_msg(struct usb_device *udev, void *data, int len,
 	}
 }
 
-static int usb_int_regs_length(unsigned int count)
-{
-	return sizeof(struct usb_int_regs) + count * sizeof(struct reg_data);
-}
-
 static void prepare_read_regs_int(struct zd_usb *usb,
 				  struct usb_req_read_regs *req,
 				  unsigned int count)
@@ -1636,10 +1631,10 @@ static bool check_read_regs(struct zd_usb *usb, struct usb_req_read_regs *req,
 	/* The created block size seems to be larger than expected.
 	 * However results appear to be correct.
 	 */
-	if (rr->length < usb_int_regs_length(count)) {
+	if (rr->length < struct_size(regs, regs, count)) {
 		dev_dbg_f(zd_usb_dev(usb),
-			 "error: actual length %d less than expected %d\n",
-			 rr->length, usb_int_regs_length(count));
+			 "error: actual length %d less than expected %ld\n",
+			 rr->length, struct_size(regs, regs, count));
 		return false;
 	}
 
-- 
2.23.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH][next] zd1211rw: zd_usb: Use struct_size() helper
  2019-08-30 18:57 [PATCH][next] zd1211rw: zd_usb: Use struct_size() helper Gustavo A. R. Silva
@ 2019-08-31  9:38 ` kbuild test robot
  2019-09-03 13:45 ` Kalle Valo
  1 sibling, 0 replies; 3+ messages in thread
From: kbuild test robot @ 2019-08-31  9:38 UTC (permalink / raw)
  To: Gustavo A. R. Silva
  Cc: kbuild-all, Daniel Drake, Ulrich Kunitz, Kalle Valo,
	David S. Miller, linux-wireless, netdev, linux-kernel,
	Gustavo A. R. Silva

[-- Attachment #1: Type: text/plain, Size: 7287 bytes --]

Hi "Gustavo,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on linus/master]
[cannot apply to v5.3-rc6 next-20190830]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Gustavo-A-R-Silva/zd1211rw-zd_usb-Use-struct_size-helper/20190831-161121
config: mips-allmodconfig (attached as .config)
compiler: mips-linux-gcc (GCC) 7.4.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        GCC_VERSION=7.4.0 make.cross ARCH=mips 

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

   In file included from drivers/net/wireless/zydas/zd1211rw/zd_usb.c:22:0:
   drivers/net/wireless/zydas/zd1211rw/zd_usb.c: In function 'check_read_regs':
>> drivers/net/wireless/zydas/zd1211rw/zd_def.h:18:25: warning: format '%ld' expects argument of type 'long int', but argument 6 has type 'size_t {aka unsigned int}' [-Wformat=]
     dev_printk(level, dev, "%s() " fmt, __func__, ##args)
                            ^
>> drivers/net/wireless/zydas/zd1211rw/zd_def.h:22:4: note: in expansion of macro 'dev_printk_f'
       dev_printk_f(KERN_DEBUG, dev, fmt, ## args)
       ^~~~~~~~~~~~
>> drivers/net/wireless/zydas/zd1211rw/zd_usb.c:1635:3: note: in expansion of macro 'dev_dbg_f'
      dev_dbg_f(zd_usb_dev(usb),
      ^~~~~~~~~
   drivers/net/wireless/zydas/zd1211rw/zd_usb.c:1636:51: note: format string is defined here
        "error: actual length %d less than expected %ld\n",
                                                    ~~^
                                                    %d

vim +/dev_dbg_f +1635 drivers/net/wireless/zydas/zd1211rw/zd_usb.c

e85d0918b54fbd drivers/net/wireless/zd1211rw/zd_usb.c       Daniel Drake        2006-06-02  1622  
c900eff30a14ec drivers/net/wireless/zd1211rw/zd_usb.c       Jussi Kivilinna     2011-06-20  1623  static bool check_read_regs(struct zd_usb *usb, struct usb_req_read_regs *req,
c900eff30a14ec drivers/net/wireless/zd1211rw/zd_usb.c       Jussi Kivilinna     2011-06-20  1624  			    unsigned int count)
e85d0918b54fbd drivers/net/wireless/zd1211rw/zd_usb.c       Daniel Drake        2006-06-02  1625  {
e85d0918b54fbd drivers/net/wireless/zd1211rw/zd_usb.c       Daniel Drake        2006-06-02  1626  	int i;
e85d0918b54fbd drivers/net/wireless/zd1211rw/zd_usb.c       Daniel Drake        2006-06-02  1627  	struct zd_usb_interrupt *intr = &usb->intr;
e85d0918b54fbd drivers/net/wireless/zd1211rw/zd_usb.c       Daniel Drake        2006-06-02  1628  	struct read_regs_int *rr = &intr->read_regs;
e85d0918b54fbd drivers/net/wireless/zd1211rw/zd_usb.c       Daniel Drake        2006-06-02  1629  	struct usb_int_regs *regs = (struct usb_int_regs *)rr->buffer;
e85d0918b54fbd drivers/net/wireless/zd1211rw/zd_usb.c       Daniel Drake        2006-06-02  1630  
e85d0918b54fbd drivers/net/wireless/zd1211rw/zd_usb.c       Daniel Drake        2006-06-02  1631  	/* The created block size seems to be larger than expected.
e85d0918b54fbd drivers/net/wireless/zd1211rw/zd_usb.c       Daniel Drake        2006-06-02  1632  	 * However results appear to be correct.
e85d0918b54fbd drivers/net/wireless/zd1211rw/zd_usb.c       Daniel Drake        2006-06-02  1633  	 */
d352eeccec7e84 drivers/net/wireless/zydas/zd1211rw/zd_usb.c Gustavo A. R. Silva 2019-08-30  1634  	if (rr->length < struct_size(regs, regs, count)) {
e85d0918b54fbd drivers/net/wireless/zd1211rw/zd_usb.c       Daniel Drake        2006-06-02 @1635  		dev_dbg_f(zd_usb_dev(usb),
d352eeccec7e84 drivers/net/wireless/zydas/zd1211rw/zd_usb.c Gustavo A. R. Silva 2019-08-30  1636  			 "error: actual length %d less than expected %ld\n",
d352eeccec7e84 drivers/net/wireless/zydas/zd1211rw/zd_usb.c Gustavo A. R. Silva 2019-08-30  1637  			 rr->length, struct_size(regs, regs, count));
c900eff30a14ec drivers/net/wireless/zd1211rw/zd_usb.c       Jussi Kivilinna     2011-06-20  1638  		return false;
e85d0918b54fbd drivers/net/wireless/zd1211rw/zd_usb.c       Daniel Drake        2006-06-02  1639  	}
c900eff30a14ec drivers/net/wireless/zd1211rw/zd_usb.c       Jussi Kivilinna     2011-06-20  1640  
e85d0918b54fbd drivers/net/wireless/zd1211rw/zd_usb.c       Daniel Drake        2006-06-02  1641  	if (rr->length > sizeof(rr->buffer)) {
e85d0918b54fbd drivers/net/wireless/zd1211rw/zd_usb.c       Daniel Drake        2006-06-02  1642  		dev_dbg_f(zd_usb_dev(usb),
e85d0918b54fbd drivers/net/wireless/zd1211rw/zd_usb.c       Daniel Drake        2006-06-02  1643  			 "error: actual length %d exceeds buffer size %zu\n",
e85d0918b54fbd drivers/net/wireless/zd1211rw/zd_usb.c       Daniel Drake        2006-06-02  1644  			 rr->length, sizeof(rr->buffer));
c900eff30a14ec drivers/net/wireless/zd1211rw/zd_usb.c       Jussi Kivilinna     2011-06-20  1645  		return false;
e85d0918b54fbd drivers/net/wireless/zd1211rw/zd_usb.c       Daniel Drake        2006-06-02  1646  	}
e85d0918b54fbd drivers/net/wireless/zd1211rw/zd_usb.c       Daniel Drake        2006-06-02  1647  
e85d0918b54fbd drivers/net/wireless/zd1211rw/zd_usb.c       Daniel Drake        2006-06-02  1648  	for (i = 0; i < count; i++) {
e85d0918b54fbd drivers/net/wireless/zd1211rw/zd_usb.c       Daniel Drake        2006-06-02  1649  		struct reg_data *rd = &regs->regs[i];
e85d0918b54fbd drivers/net/wireless/zd1211rw/zd_usb.c       Daniel Drake        2006-06-02  1650  		if (rd->addr != req->addr[i]) {
e85d0918b54fbd drivers/net/wireless/zd1211rw/zd_usb.c       Daniel Drake        2006-06-02  1651  			dev_dbg_f(zd_usb_dev(usb),
e85d0918b54fbd drivers/net/wireless/zd1211rw/zd_usb.c       Daniel Drake        2006-06-02  1652  				 "rd[%d] addr %#06hx expected %#06hx\n", i,
e85d0918b54fbd drivers/net/wireless/zd1211rw/zd_usb.c       Daniel Drake        2006-06-02  1653  				 le16_to_cpu(rd->addr),
e85d0918b54fbd drivers/net/wireless/zd1211rw/zd_usb.c       Daniel Drake        2006-06-02  1654  				 le16_to_cpu(req->addr[i]));
c900eff30a14ec drivers/net/wireless/zd1211rw/zd_usb.c       Jussi Kivilinna     2011-06-20  1655  			return false;
c900eff30a14ec drivers/net/wireless/zd1211rw/zd_usb.c       Jussi Kivilinna     2011-06-20  1656  		}
c900eff30a14ec drivers/net/wireless/zd1211rw/zd_usb.c       Jussi Kivilinna     2011-06-20  1657  	}
c900eff30a14ec drivers/net/wireless/zd1211rw/zd_usb.c       Jussi Kivilinna     2011-06-20  1658  
c900eff30a14ec drivers/net/wireless/zd1211rw/zd_usb.c       Jussi Kivilinna     2011-06-20  1659  	return true;
c900eff30a14ec drivers/net/wireless/zd1211rw/zd_usb.c       Jussi Kivilinna     2011-06-20  1660  }
c900eff30a14ec drivers/net/wireless/zd1211rw/zd_usb.c       Jussi Kivilinna     2011-06-20  1661  

:::::: The code at line 1635 was first introduced by commit
:::::: e85d0918b54fbd9b38003752f7d665416b06edd8 [PATCH] ZyDAS ZD1211 USB-WLAN driver

:::::: TO: Daniel Drake <dsd@gentoo.org>
:::::: CC: Jeff Garzik <jeff@garzik.org>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 61473 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH][next] zd1211rw: zd_usb: Use struct_size() helper
  2019-08-30 18:57 [PATCH][next] zd1211rw: zd_usb: Use struct_size() helper Gustavo A. R. Silva
  2019-08-31  9:38 ` kbuild test robot
@ 2019-09-03 13:45 ` Kalle Valo
  1 sibling, 0 replies; 3+ messages in thread
From: Kalle Valo @ 2019-09-03 13:45 UTC (permalink / raw)
  To: Gustavo A. R. Silva
  Cc: Daniel Drake, Ulrich Kunitz, David S. Miller, linux-wireless,
	netdev, linux-kernel, Gustavo A. R. Silva

"Gustavo A. R. Silva" <gustavo@embeddedor.com> wrote:

> One of the more common cases of allocation size calculations is finding
> the size of a structure that has a zero-sized array at the end, along
> with memory for some number of elements for that array. For example:
> 
> struct usb_int_regs {
> 	...
>         struct reg_data regs[0];
> } __packed;
> 
> Make use of the struct_size() helper instead of an open-coded version
> in order to avoid any potential type mistakes.
> 
> So, replace the following function:
> 
> static int usb_int_regs_length(unsigned int count)
> {
>        return sizeof(struct usb_int_regs) + count * sizeof(struct reg_data);
> }
> 
> with:
> 
> struct_size(regs, regs, count)
> 
> This code was detected with the help of Coccinelle.
> 
> Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>

Patch applied to wireless-drivers-next.git, thanks.

84b0b6635247 zd1211rw: zd_usb: Use struct_size() helper

-- 
https://patchwork.kernel.org/patch/11124457/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2019-09-03 13:46 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-30 18:57 [PATCH][next] zd1211rw: zd_usb: Use struct_size() helper Gustavo A. R. Silva
2019-08-31  9:38 ` kbuild test robot
2019-09-03 13:45 ` Kalle Valo

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).