265 lines
14 KiB
Diff
265 lines
14 KiB
Diff
|
From 66935d134e1f359eda5cfac053b0bf716811670a Mon Sep 17 00:00:00 2001
|
||
|
From: Victor Toso <me@victortoso.com>
|
||
|
Date: Fri, 12 Jul 2019 11:12:36 +0200
|
||
|
Subject: [PATCH 8/9] device-info: remove g_list_length() on
|
||
|
compare_addresses()
|
||
|
|
||
|
The g_list_length() function does iterate over both lists to compare
|
||
|
its length. Considering that we use this to check for true/false and
|
||
|
we will iterate again on both lists, we can do so once.
|
||
|
|
||
|
This also avoids covscan/clang warnings:
|
||
|
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:216:27: warning: Access to field 'data' results in a dereference of a null pointer (loaded from variable 'lb')
|
||
|
| # PciDevice *devb = lb->data;
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:397:5: note: Taking false branch
|
||
|
| # if (!user_pci_addr) {
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:407:22: note: Calling 'find_device_at_pci_address'
|
||
|
| # char *dev_path = find_device_at_pci_address(user_pci_addr, &vendor_id, &device_id);
|
||
|
| # ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:329:5: note: Taking true branch
|
||
|
| # g_return_val_if_fail(pci_addr != NULL, NULL);
|
||
|
| # ^
|
||
|
| /usr/include/glib-2.0/glib/gmessages.h:594:9: note: expanded from macro 'g_return_val_if_fail'
|
||
|
| # if G_LIKELY(expr) { } else \
|
||
|
| # ^
|
||
|
| /usr/include/glib-2.0/glib/gmacros.h:385:43: note: expanded from macro 'G_LIKELY'
|
||
|
| ##define G_LIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR((expr)), 1))
|
||
|
| # ^
|
||
|
| /usr/include/glib-2.0/glib/gmacros.h:379:4: note: expanded from macro '_G_BOOLEAN_EXPR'
|
||
|
| # if (expr) \
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:329:5: note: Taking true branch
|
||
|
| /usr/include/glib-2.0/glib/gmessages.h:594:6: note: expanded from macro 'g_return_val_if_fail'
|
||
|
| # if G_LIKELY(expr) { } else \
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:329:5: note: Loop condition is false. Exiting loop
|
||
|
| /usr/include/glib-2.0/glib/gmessages.h:593:40: note: expanded from macro 'g_return_val_if_fail'
|
||
|
| ##define g_return_val_if_fail(expr,val) G_STMT_START{ \
|
||
|
| # ^
|
||
|
| /usr/include/glib-2.0/glib/gmacros.h:346:23: note: expanded from macro 'G_STMT_START'
|
||
|
| ##define G_STMT_START do
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:330:5: note: Taking true branch
|
||
|
| # g_return_val_if_fail(device_id != NULL, NULL);
|
||
|
| # ^
|
||
|
| /usr/include/glib-2.0/glib/gmessages.h:594:9: note: expanded from macro 'g_return_val_if_fail'
|
||
|
| # if G_LIKELY(expr) { } else \
|
||
|
| # ^
|
||
|
| /usr/include/glib-2.0/glib/gmacros.h:385:43: note: expanded from macro 'G_LIKELY'
|
||
|
| ##define G_LIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR((expr)), 1))
|
||
|
| # ^
|
||
|
| /usr/include/glib-2.0/glib/gmacros.h:379:4: note: expanded from macro '_G_BOOLEAN_EXPR'
|
||
|
| # if (expr) \
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:330:5: note: Taking true branch
|
||
|
| /usr/include/glib-2.0/glib/gmessages.h:594:6: note: expanded from macro 'g_return_val_if_fail'
|
||
|
| # if G_LIKELY(expr) { } else \
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:330:5: note: Loop condition is false. Exiting loop
|
||
|
| /usr/include/glib-2.0/glib/gmessages.h:593:40: note: expanded from macro 'g_return_val_if_fail'
|
||
|
| ##define g_return_val_if_fail(expr,val) G_STMT_START{ \
|
||
|
| # ^
|
||
|
| /usr/include/glib-2.0/glib/gmacros.h:346:23: note: expanded from macro 'G_STMT_START'
|
||
|
| ##define G_STMT_START do
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:331:5: note: Taking true branch
|
||
|
| # g_return_val_if_fail(vendor_id != NULL, NULL);
|
||
|
| # ^
|
||
|
| /usr/include/glib-2.0/glib/gmessages.h:594:9: note: expanded from macro 'g_return_val_if_fail'
|
||
|
| # if G_LIKELY(expr) { } else \
|
||
|
| # ^
|
||
|
| /usr/include/glib-2.0/glib/gmacros.h:385:43: note: expanded from macro 'G_LIKELY'
|
||
|
| ##define G_LIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR((expr)), 1))
|
||
|
| # ^
|
||
|
| /usr/include/glib-2.0/glib/gmacros.h:379:4: note: expanded from macro '_G_BOOLEAN_EXPR'
|
||
|
| # if (expr) \
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:331:5: note: Taking true branch
|
||
|
| /usr/include/glib-2.0/glib/gmessages.h:594:6: note: expanded from macro 'g_return_val_if_fail'
|
||
|
| # if G_LIKELY(expr) { } else \
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:331:5: note: Loop condition is false. Exiting loop
|
||
|
| /usr/include/glib-2.0/glib/gmessages.h:593:40: note: expanded from macro 'g_return_val_if_fail'
|
||
|
| ##define g_return_val_if_fail(expr,val) G_STMT_START{ \
|
||
|
| # ^
|
||
|
| /usr/include/glib-2.0/glib/gmacros.h:346:23: note: expanded from macro 'G_STMT_START'
|
||
|
| ##define G_STMT_START do
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:334:5: note: Loop condition is true. Entering loop body
|
||
|
| # for (int i = 0; i < 10; ++i) {
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:340:13: note: Assuming the condition is false
|
||
|
| # if (stat(dev_path, &buf) != 0) {
|
||
|
| # ^~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:340:9: note: Taking false branch
|
||
|
| # if (stat(dev_path, &buf) != 0) {
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:355:13: note: Assuming the condition is false
|
||
|
| # if (realpath(sys_path, device_link) == NULL) {
|
||
|
| # ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:355:9: note: Taking false branch
|
||
|
| # if (realpath(sys_path, device_link) == NULL) {
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:361:36: note: Calling 'parse_pci_address_from_sysfs_path'
|
||
|
| # PciAddress *drm_pci_addr = parse_pci_address_from_sysfs_path(device_link);
|
||
|
| # ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:129:9: note: Assuming 'pos' is non-null
|
||
|
| # if (!pos) {
|
||
|
| # ^~~~
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:129:5: note: Taking false branch
|
||
|
| # if (!pos) {
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:136:9: note: Assuming 'pos' is non-null
|
||
|
| # if (!pos) {
|
||
|
| # ^~~~
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:136:5: note: Taking false branch
|
||
|
| # if (!pos) {
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:142:9: note: Assuming 'pos' is non-null
|
||
|
| # if (!pos) {
|
||
|
| # ^~~~
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:142:5: note: Taking false branch
|
||
|
| # if (!pos) {
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:146:27: note: Calling 'pci_address_new'
|
||
|
| # PciAddress *address = pci_address_new();
|
||
|
| # ^~~~~~~~~~~~~~~~~
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:61:12: note: Taking false branch
|
||
|
| # return g_new0(PciAddress, 1);
|
||
|
| # ^
|
||
|
| /usr/include/glib-2.0/glib/gmem.h:279:42: note: expanded from macro 'g_new0'
|
||
|
| ##define g_new0(struct_type, n_structs) _G_NEW (struct_type, n_structs, malloc0)
|
||
|
| # ^
|
||
|
| /usr/include/glib-2.0/glib/gmem.h:211:4: note: expanded from macro '_G_NEW'
|
||
|
| # if (__s == 1) \
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:61:12: note: Left side of '&&' is false
|
||
|
| /usr/include/glib-2.0/glib/gmem.h:279:42: note: expanded from macro 'g_new0'
|
||
|
| ##define g_new0(struct_type, n_structs) _G_NEW (struct_type, n_structs, malloc0)
|
||
|
| # ^
|
||
|
| /usr/include/glib-2.0/glib/gmem.h:213:40: note: expanded from macro '_G_NEW'
|
||
|
| # else if (__builtin_constant_p (__n) && \
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:61:12: note: Null pointer value stored to field 'devices'
|
||
|
| # return g_new0(PciAddress, 1);
|
||
|
| # ^~~~~~~~~~~~~~~~~~~~~
|
||
|
| /usr/include/glib-2.0/glib/gmem.h:279:42: note: expanded from macro 'g_new0'
|
||
|
| ##define g_new0(struct_type, n_structs) _G_NEW (struct_type, n_structs, malloc0)
|
||
|
| # ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
| /usr/include/glib-2.0/glib/gmem.h:217:12: note: expanded from macro '_G_NEW'
|
||
|
| # __p = g_##func##_n (__n, __s); \
|
||
|
| # ^~~~~~~~~~~~~~~~~~~~~~~
|
||
|
| <scratch space>:76:1: note: expanded from here
|
||
|
| #g_malloc0_n
|
||
|
| #^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:146:27: note: Returning from 'pci_address_new'
|
||
|
| # PciAddress *address = pci_address_new();
|
||
|
| # ^~~~~~~~~~~~~~~~~
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:149:5: note: Loop condition is true. Entering loop body
|
||
|
| # while (pos) {
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:150:26: note: Taking false branch
|
||
|
| # PciDevice *dev = g_new0(PciDevice, 1);
|
||
|
| # ^
|
||
|
| /usr/include/glib-2.0/glib/gmem.h:279:42: note: expanded from macro 'g_new0'
|
||
|
| ##define g_new0(struct_type, n_structs) _G_NEW (struct_type, n_structs, malloc0)
|
||
|
| # ^
|
||
|
| /usr/include/glib-2.0/glib/gmem.h:211:4: note: expanded from macro '_G_NEW'
|
||
|
| # if (__s == 1) \
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:150:26: note: Left side of '&&' is false
|
||
|
| /usr/include/glib-2.0/glib/gmem.h:279:42: note: expanded from macro 'g_new0'
|
||
|
| ##define g_new0(struct_type, n_structs) _G_NEW (struct_type, n_structs, malloc0)
|
||
|
| # ^
|
||
|
| /usr/include/glib-2.0/glib/gmem.h:213:40: note: expanded from macro '_G_NEW'
|
||
|
| # else if (__builtin_constant_p (__n) && \
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:152:9: note: Taking true branch
|
||
|
| # if (!parse_pci_device(pos + 1, next, dev)) {
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:154:13: note: Execution continues on line 159
|
||
|
| # break;
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:361:36: note: Returning from 'parse_pci_address_from_sysfs_path'
|
||
|
| # PciAddress *drm_pci_addr = parse_pci_address_from_sysfs_path(device_link);
|
||
|
| # ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:362:9: note: Taking false branch
|
||
|
| # if (!drm_pci_addr) {
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:367:14: note: Calling 'compare_addresses'
|
||
|
| # if (!compare_addresses(pci_addr, drm_pci_addr)) {
|
||
|
| # ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:207:11: note: Assuming the condition is true
|
||
|
| # if (!(a->domain == b->domain
|
||
|
| # ^~~~~~~~~~~~~~~~~~~~~~
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:207:11: note: Left side of '&&' is true
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:208:12: note: Assuming the condition is true
|
||
|
| # && g_list_length(a->devices) == g_list_length(b->devices))) {
|
||
|
| # ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:207:5: note: Taking false branch
|
||
|
| # if (!(a->domain == b->domain
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:212:35: note: 'lb' initialized to a null pointer value
|
||
|
| # for (GList *la = a->devices, *lb = b->devices;
|
||
|
| # ^~
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:213:10: note: Assuming 'la' is not equal to NULL
|
||
|
| # la != NULL;
|
||
|
| # ^~~~~~~~~~
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:212:5: note: Loop condition is true. Entering loop body
|
||
|
| # for (GList *la = a->devices, *lb = b->devices;
|
||
|
| # ^
|
||
|
| spice-vdagent-0.19.0/src/vdagent/device-info.c:216:27: note: Access to field 'data' results in a dereference of a null pointer (loaded from variable 'lb')
|
||
|
| # PciDevice *devb = lb->data;
|
||
|
| # ^~
|
||
|
| # 214| la = la->next, lb = lb->next) {
|
||
|
| # 215| PciDevice *deva = la->data;
|
||
|
| # 216|-> PciDevice *devb = lb->data;
|
||
|
| # 217|
|
||
|
| # 218| if (deva->slot != devb->slot
|
||
|
|
||
|
Signed-off-by: Victor Toso <victortoso@redhat.com>
|
||
|
Acked-by: Frediano Ziglio <fziglio@redhat.com>
|
||
|
---
|
||
|
src/vdagent/device-info.c | 12 +++++++-----
|
||
|
1 file changed, 7 insertions(+), 5 deletions(-)
|
||
|
|
||
|
diff --git a/src/vdagent/device-info.c b/src/vdagent/device-info.c
|
||
|
index 4983543..6b0e28f 100644
|
||
|
--- a/src/vdagent/device-info.c
|
||
|
+++ b/src/vdagent/device-info.c
|
||
|
@@ -204,13 +204,13 @@ static PciAddress* parse_pci_address_from_spice(char *input)
|
||
|
static bool compare_addresses(PciAddress *a, PciAddress *b)
|
||
|
{
|
||
|
// only check domain, slot, and function
|
||
|
- if (!(a->domain == b->domain
|
||
|
- && g_list_length(a->devices) == g_list_length(b->devices))) {
|
||
|
+ if (a->domain != b->domain) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
- for (GList *la = a->devices, *lb = b->devices;
|
||
|
- la != NULL;
|
||
|
+ const GList *la, *lb;
|
||
|
+ for (la = a->devices, lb = b->devices;
|
||
|
+ la != NULL && lb != NULL;
|
||
|
la = la->next, lb = lb->next) {
|
||
|
PciDevice *deva = la->data;
|
||
|
PciDevice *devb = lb->data;
|
||
|
@@ -220,7 +220,9 @@ static bool compare_addresses(PciAddress *a, PciAddress *b)
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
- return true;
|
||
|
+
|
||
|
+ /* True only if both have the same length */
|
||
|
+ return (la == NULL && lb == NULL);
|
||
|
}
|
||
|
|
||
|
// Connector type names from xorg modesetting driver
|
||
|
--
|
||
|
2.21.0
|
||
|
|