[Crash-utility] [PATCH RFC 02/14] memory: do not compare unsigned expression with negative value

Dave Anderson anderson at redhat.com
Fri Oct 27 19:56:11 UTC 2017



----- Original Message -----
> Signed-off-by: Oleksandr Natalenko <oleksandr at redhat.com>
> ---
>  memory.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/memory.c b/memory.c
> index 9926199..abf3982 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -14467,7 +14467,7 @@ display_with_pre_and_post(void *bufptr, ulonglong
> addr, struct searchinfo *si)
>  	}
>  
>  	amount = ctx * t;
> -	addr_d = addr - amount < 0 ? 0 : addr - amount;
> +	addr_d = (long)addr - amount < 0 ? 0 : addr - amount;
>  
>  	display_memory(addr_d, ctx, flag, memtype, NULL);
>  
> --

I didn't write this code, but I do take the responsibility for accepting the patch.

The code above is used by the "search" command, where if it finds an instance of the
specified searched-for value, it will not only display the memory location where it exists,
but also the context around it.  The context is a "-x <count>" argument value passed to
the "search" command, which is multiplied by the word size specified.  I'm not sure
what the originator of this code meant by the "addr - amount < 0" qualification, 
because any kernel virtual address (other than s390x) would be perceived as a negative
number when preceded by "(long)".  So if your patch is applied, it would always be < 0,
set addr_d to 0, which gets ignored by display_memory(), and therefore it would never
show the context preceding the found entity as intended.
 
So again, you have found a coding irregularity, but your patch breaks what works just fine.

Probably it should just set addr_d = addr - amount, but that's what the code effectively
does now (by mistake), so I'm just going to leave this alone.

Dave




More information about the Crash-utility mailing list