@@ -3671,8 +3671,11 @@ static void test_can_verify(void)
3671
3671
void trace_check_vprintf (struct trace_iterator * iter , const char * fmt ,
3672
3672
va_list ap )
3673
3673
{
3674
+ long text_delta = iter -> tr -> text_delta ;
3675
+ long data_delta = iter -> tr -> data_delta ;
3674
3676
const char * p = fmt ;
3675
3677
const char * str ;
3678
+ bool good ;
3676
3679
int i , j ;
3677
3680
3678
3681
if (WARN_ON_ONCE (!fmt ))
@@ -3691,7 +3694,10 @@ void trace_check_vprintf(struct trace_iterator *iter, const char *fmt,
3691
3694
3692
3695
j = 0 ;
3693
3696
3694
- /* We only care about %s and variants */
3697
+ /*
3698
+ * We only care about %s and variants
3699
+ * as well as %p[sS] if delta is non-zero
3700
+ */
3695
3701
for (i = 0 ; p [i ]; i ++ ) {
3696
3702
if (i + 1 >= iter -> fmt_size ) {
3697
3703
/*
@@ -3720,6 +3726,11 @@ void trace_check_vprintf(struct trace_iterator *iter, const char *fmt,
3720
3726
}
3721
3727
if (p [i + j ] == 's' )
3722
3728
break ;
3729
+
3730
+ if (text_delta && p [i + 1 ] == 'p' &&
3731
+ ((p [i + 2 ] == 's' || p [i + 2 ] == 'S' )))
3732
+ break ;
3733
+
3723
3734
star = false;
3724
3735
}
3725
3736
j = 0 ;
@@ -3733,6 +3744,24 @@ void trace_check_vprintf(struct trace_iterator *iter, const char *fmt,
3733
3744
iter -> fmt [i ] = '\0' ;
3734
3745
trace_seq_vprintf (& iter -> seq , iter -> fmt , ap );
3735
3746
3747
+ /* Add delta to %pS pointers */
3748
+ if (p [i + 1 ] == 'p' ) {
3749
+ unsigned long addr ;
3750
+ char fmt [4 ];
3751
+
3752
+ fmt [0 ] = '%' ;
3753
+ fmt [1 ] = 'p' ;
3754
+ fmt [2 ] = p [i + 2 ]; /* Either %ps or %pS */
3755
+ fmt [3 ] = '\0' ;
3756
+
3757
+ addr = va_arg (ap , unsigned long );
3758
+ addr += text_delta ;
3759
+ trace_seq_printf (& iter -> seq , fmt , (void * )addr );
3760
+
3761
+ p += i + 3 ;
3762
+ continue ;
3763
+ }
3764
+
3736
3765
/*
3737
3766
* If iter->seq is full, the above call no longer guarantees
3738
3767
* that ap is in sync with fmt processing, and further calls
@@ -3751,6 +3780,14 @@ void trace_check_vprintf(struct trace_iterator *iter, const char *fmt,
3751
3780
/* The ap now points to the string data of the %s */
3752
3781
str = va_arg (ap , const char * );
3753
3782
3783
+ good = trace_safe_str (iter , str , star , len );
3784
+
3785
+ /* Could be from the last boot */
3786
+ if (data_delta && !good ) {
3787
+ str += data_delta ;
3788
+ good = trace_safe_str (iter , str , star , len );
3789
+ }
3790
+
3754
3791
/*
3755
3792
* If you hit this warning, it is likely that the
3756
3793
* trace event in question used %s on a string that
@@ -3760,8 +3797,7 @@ void trace_check_vprintf(struct trace_iterator *iter, const char *fmt,
3760
3797
* instead. See samples/trace_events/trace-events-sample.h
3761
3798
* for reference.
3762
3799
*/
3763
- if (WARN_ONCE (!trace_safe_str (iter , str , star , len ),
3764
- "fmt: '%s' current_buffer: '%s'" ,
3800
+ if (WARN_ONCE (!good , "fmt: '%s' current_buffer: '%s'" ,
3765
3801
fmt , seq_buf_str (& iter -> seq .seq ))) {
3766
3802
int ret ;
3767
3803
0 commit comments