• Li Huafei's avatar
    perf probe: Fix NULL pointer dereference in convert_variable_location() · 3cb17cce
    Li Huafei authored
    If we just check whether the variable can be converted, 'tvar' should be
    a null pointer. However, the null pointer check is missing in the
    'Constant value' execution path.
    
    The following cases can trigger this problem:
    
    	$ cat test.c
    	#include <stdio.h>
    
    	void main(void)
    	{
    	        int a;
    	        const int b = 1;
    
    	        asm volatile("mov %1, %0" : "=r"(a): "i"(b));
    	        printf("a: %d\n", a);
    	}
    
    	$ gcc test.c -o test -O -g
    	$ sudo ./perf probe -x ./test -L "main"
    	<main@/home/lhf/test.c:0>
    	      0  void main(void)
    	         {
    	      2          int a;
    	                 const int b = 1;
    
    	                 asm volatile("mov %1, %0" : "=r"(a): "i"(b));
    	      6          printf("a: %d\n", a);
    	         }
    
    	$ sudo ./perf probe -x ./test -V "main:6"
    	Segmentation fault
    
    The check on 'tvar' is added. If 'tavr' is a null pointer, we return 0
    to indicate that the variable can be converted. Now, we can successfully
    show the variables that can be accessed.
    
    	$ sudo ./perf probe -x ./test -V "main:6"
    	Available variables at main:6
    	        @<main+13>
    	                char*   __fmt
    	                int     a
    	                int     b
    
    However, the variable 'b' cannot be tracked.
    
    	$ sudo ./perf probe -x ./test -D "main:6 b"
    	Failed to find the location of the 'b' variable at this address.
    	 Perhaps it has been optimized out.
    	 Use -V with the --range option to show 'b' location range.
    	  Error: Failed to add events.
    
    This is because __die_find_variable_cb() did not successfully match
    variable 'b', which has the DW_AT_const_value attribute instead of
    DW_AT_location. We added support for DW_AT_const_value in
    __die_find_variable_cb(). With this modification, we can successfully
    track the variable 'b'.
    
    	$ sudo ./perf probe -x ./test -D "main:6 b"
    	p:probe_test/main_L6 /home/lhf/test:0x1156 b=\1:s32
    
    Fixes: 66f69b21 ("perf probe: Support DW_AT_const_value constant value")
    Signed-off-by: default avatarLi Huafei <lihuafei1@huawei.com>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Frank Ch. Eigler <fche@redhat.com>
    Cc: Jianlin Lv <jianlin.lv@arm.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Masami Hiramatsu <mhiramat@kernel.org>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
    Cc: Yang Jihong <yangjihong1@huawei.com>
    Cc: Zhang Jinhao <zhangjinhao2@huawei.com>
    http://lore.kernel.org/lkml/20210601092750.169601-1-lihuafei1@huawei.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    3cb17cce
probe-finder.c 51.1 KB