lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Tue, 7 Jun 2022 19:05:49 +0200 From: Greg Kroah-Hartman <gregkh@...uxfoundation.org> To: linux-kernel@...r.kernel.org Cc: Greg Kroah-Hartman <gregkh@...uxfoundation.org>, stable@...r.kernel.org, Christophe de Dinechin <christophe@...echin.org>, Christophe de Dinechin <dinechin@...hat.com>, Andrew Morton <akpm@...ux-foundation.org>, Ben Segall <bsegall@...gle.com>, "Michael S. Tsirkin" <mst@...hat.com>, Steven Rostedt <rostedt@...dmis.org>, Ingo Molnar <mingo@...hat.com>, Mel Gorman <mgorman@...e.de>, Dietmar Eggemann <dietmar.eggemann@....com>, Vincent Guittot <vincent.guittot@...aro.org>, Paolo Bonzini <pbonzini@...hat.com>, Daniel Bristot de Oliveira <bristot@...hat.com>, Jason Wang <jasowang@...hat.com>, Zhen Lei <thunder.leizhen@...wei.com>, Juri Lelli <juri.lelli@...hat.com>, Peter Zijlstra <peterz@...radead.org> Subject: [PATCH 5.18 831/879] nodemask.h: fix compilation error with GCC12 From: Christophe de Dinechin <dinechin@...hat.com> commit 37462a920392cb86541650a6f4121155f11f1199 upstream. With gcc version 12.0.1 20220401 (Red Hat 12.0.1-0), building with defconfig results in the following compilation error: | CC mm/swapfile.o | mm/swapfile.c: In function `setup_swap_info': | mm/swapfile.c:2291:47: error: array subscript -1 is below array bounds | of `struct plist_node[]' [-Werror=array-bounds] | 2291 | p->avail_lists[i].prio = 1; | | ~~~~~~~~~~~~~~^~~ | In file included from mm/swapfile.c:16: | ./include/linux/swap.h:292:27: note: while referencing `avail_lists' | 292 | struct plist_node avail_lists[]; /* | | ^~~~~~~~~~~ This is due to the compiler detecting that the mask in node_states[__state] could theoretically be zero, which would lead to first_node() returning -1 through find_first_bit. I believe that the warning/error is legitimate. I first tried adding a test to check that the node mask is not emtpy, since a similar test exists in the case where MAX_NUMNODES == 1. However, adding the if statement causes other warnings to appear in for_each_cpu_node_but, because it introduces a dangling else ambiguity. And unfortunately, GCC is not smart enough to detect that the added test makes the case where (node) == -1 impossible, so it still complains with the same message. This is why I settled on replacing that with a harmless, but relatively useless (node) >= 0 test. Based on the warning for the dangling else, I also decided to fix the case where MAX_NUMNODES == 1 by moving the condition inside the for loop. It will still only be tested once. This ensures that the meaning of an else following for_each_node_mask or derivatives would not silently have a different meaning depending on the configuration. Link: https://lkml.kernel.org/r/20220414150855.2407137-3-dinechin@redhat.com Signed-off-by: Christophe de Dinechin <christophe@...echin.org> Signed-off-by: Christophe de Dinechin <dinechin@...hat.com> Reviewed-by: Andrew Morton <akpm@...ux-foundation.org> Cc: Ben Segall <bsegall@...gle.com> Cc: "Michael S. Tsirkin" <mst@...hat.com> Cc: Steven Rostedt <rostedt@...dmis.org> Cc: Ingo Molnar <mingo@...hat.com> Cc: Mel Gorman <mgorman@...e.de> Cc: Dietmar Eggemann <dietmar.eggemann@....com> Cc: Vincent Guittot <vincent.guittot@...aro.org> Cc: Paolo Bonzini <pbonzini@...hat.com> Cc: Daniel Bristot de Oliveira <bristot@...hat.com> Cc: Jason Wang <jasowang@...hat.com> Cc: Zhen Lei <thunder.leizhen@...wei.com> Cc: Juri Lelli <juri.lelli@...hat.com> Cc: Peter Zijlstra <peterz@...radead.org> Cc: <stable@...r.kernel.org> Signed-off-by: Andrew Morton <akpm@...ux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@...uxfoundation.org> --- include/linux/nodemask.h | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) --- a/include/linux/nodemask.h +++ b/include/linux/nodemask.h @@ -375,14 +375,13 @@ static inline void __nodes_fold(nodemask } #if MAX_NUMNODES > 1 -#define for_each_node_mask(node, mask) \ - for ((node) = first_node(mask); \ - (node) < MAX_NUMNODES; \ - (node) = next_node((node), (mask))) +#define for_each_node_mask(node, mask) \ + for ((node) = first_node(mask); \ + (node >= 0) && (node) < MAX_NUMNODES; \ + (node) = next_node((node), (mask))) #else /* MAX_NUMNODES == 1 */ -#define for_each_node_mask(node, mask) \ - if (!nodes_empty(mask)) \ - for ((node) = 0; (node) < 1; (node)++) +#define for_each_node_mask(node, mask) \ + for ((node) = 0; (node) < 1 && !nodes_empty(mask); (node)++) #endif /* MAX_NUMNODES */ /*
Powered by blists - more mailing lists