s390/mem_detect: do not update output parameters on failure
authorAlexander Gordeev <agordeev@linux.ibm.com>
Wed, 25 Jan 2023 18:16:10 +0000 (19:16 +0100)
committerHeiko Carstens <hca@linux.ibm.com>
Tue, 31 Jan 2023 17:56:36 +0000 (18:56 +0100)
Function __get_mem_detect_block() resets start and end
output parameters in case of invalid mem_detect array
index is provided. That violates the rule of sparing
the output on fail path and leads e.g to a below anomaly:

for_each_mem_detect_block(i, &start, &end)
continue;

One would expect start and end contain addresses of the
last memory block (if available), but in fact the two
will be reset to zeroes. That is not how an iterator is
expected to work.

Reviewed-by: Vasily Gorbik <gor@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
arch/s390/include/asm/mem_detect.h

index a7c922a690509a22d279c42de7e2b8312152ec9d..058ac2647eb7e93c09fdd5ef7833bbacfdba3ec8 100644 (file)
@@ -40,11 +40,8 @@ void add_mem_detect_block(u64 start, u64 end);
 static inline int __get_mem_detect_block(u32 n, unsigned long *start,
                                         unsigned long *end)
 {
-       if (n >= mem_detect.count) {
-               *start = 0;
-               *end = 0;
+       if (n >= mem_detect.count)
                return -1;
-       }
 
        if (n < MEM_INLINED_ENTRIES) {
                *start = (unsigned long)mem_detect.entries[n].start;