um: virt-pci: Avoid GCC non-NULL warning
Subsystems (2)
PATCH 1/1 um: virt-pci: Avoid GCC non-NULL warning
GCC gets confused about the return value of get_cpu_var() possibly being NULL, so explicitly test for it before calls to memcpy() and memset(). Avoids warnings like this:
arch/um/drivers/virt-pci.c: In function 'um_pci_send_cmd':
include/linux/fortify-string.h:48:33: warning: argument 1 null where non-null expected [-Wnonnull]
48 | #define __underlying_memcpy __builtin_memcpy
| ^
include/linux/fortify-string.h:438:9: note: in expansion of macro '__underlying_memcpy'
438 | __underlying_##op(p, q, __fortify_size); \
| ^~~~~~~~~~~~~
include/linux/fortify-string.h:483:26: note: in expansion of macro '__fortify_memcpy_chk'
483 | #define memcpy(p, q, s) __fortify_memcpy_chk(p, q, s, \
| ^~~~~~~~~~~~~~~~~~~~
arch/um/drivers/virt-pci.c:100:9: note: in expansion of macro 'memcpy'
100 | memcpy(buf, cmd, cmd_size);
| ^~~~~~While at it, avoid literal "8" and use stored sizeof(buf->data) in memset() and um_pci_send_cmd().
Reported-by kernel test robot <[email protected]>
Fixes ba38961a069b ("um: Enable FORTIFY_SOURCE")
Cc Richard Weinberger <[email protected]>
Cc Anton Ivanov <[email protected]>
Cc Johannes Berg <[email protected]>
Cc "Michael S. Tsirkin" <[email protected]>
Cc Al Viro <[email protected]>
Cc Xiu Jianfeng <[email protected]>
Cc Vincent Whitchurch <[email protected]>
Signed-off-by Kees Cook <[email protected]>
---
I can take this via the hardening tree, since that's where I introduced the warning. :)
--- arch/um/drivers/virt-pci.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
arch/um/drivers/virt-pci.c +6 -3
@@ -97,7 +97,8 @@ static int um_pci_send_cmd(struct um_pci_device *dev, } buf =get_cpu_var (um_pci_msg_bufs); -memcpy (buf, cmd, cmd_size); +if (buf) +memcpy (buf, cmd, cmd_size);if (posted) {u8 *ncmd =kmalloc (cmd_size + extra_size,GFP_ATOMIC );
@@ -182,6 +183,7 @@ static unsigned long um_pci_cfgspace_read(void *priv, unsigned int offset,struct um_pci_message_buffer *buf;u8 *data;unsigned long ret =ULONG_MAX ; +size_t bytes =sizeof (buf->data);if (!dev)return ULONG_MAX ;
@@ -189,7 +191,8 @@ static unsigned long um_pci_cfgspace_read(void *priv, unsigned int offset, buf =get_cpu_var (um_pci_msg_bufs); data = buf->data; -memset (buf->data,0xff ,sizeof (buf->data)); +if (buf) +memset (data,0xff , bytes);switch (size) {case 1 :
@@ -204,7 +207,7 @@ static unsigned long um_pci_cfgspace_read(void *priv, unsigned int offset, goto out; } -if (um_pci_send_cmd (dev, &hdr,sizeof (hdr),NULL ,0 , data,8 )) +if (um_pci_send_cmd (dev, &hdr,sizeof (hdr),NULL ,0 , data, bytes)) goto out;switch (size) {
Signature · 1 line
2.34.1