From: Steven Rostedt > Sent: 12 October 2022 11:41 > > Have the specific functions for kernel probes that read strings to inject > the "(fault)" name directly. trace_probes.c does this too (for uprobes) > but as the code to read strings are going to be used by synthetic events > (and perhaps other utilities), it simplifies the code by making sure those > other uses do not need to implement the "(fault)" name injection as well. > > Cc: stable@xxxxxxxxxxxxxxx > Fixes: bd82631d7ccdc ("tracing: Add support for dynamic strings to synthetic events") > Signed-off-by: Steven Rostedt (Google) <rostedt@xxxxxxxxxxx> > --- > kernel/trace/trace_probe_kernel.h | 31 +++++++++++++++++++++++++------ > 1 file changed, 25 insertions(+), 6 deletions(-) > > diff --git a/kernel/trace/trace_probe_kernel.h b/kernel/trace/trace_probe_kernel.h > index 1d43df29a1f8..77dbd9ff9782 100644 > --- a/kernel/trace/trace_probe_kernel.h > +++ b/kernel/trace/trace_probe_kernel.h > @@ -2,6 +2,8 @@ > #ifndef __TRACE_PROBE_KERNEL_H_ > #define __TRACE_PROBE_KERNEL_H_ > > +#define FAULT_STRING "(fault)" > + > /* > * This depends on trace_probe.h, but can not include it due to > * the way trace_probe_tmpl.h is used by trace_kprobe.c and trace_eprobe.c. > @@ -13,8 +15,16 @@ static nokprobe_inline int > kern_fetch_store_strlen_user(unsigned long addr) > { > const void __user *uaddr = (__force const void __user *)addr; > + int ret; > > - return strnlen_user_nofault(uaddr, MAX_STRING_SIZE); > + ret = strnlen_user_nofault(uaddr, MAX_STRING_SIZE); > + /* > + * strnlen_user_nofault returns zero on fault, insert the > + * FAULT_STRING when that occurs. > + */ > + if (ret <= 0) > + return strlen(FAULT_STRING) + 1; > + return ret; > } Isn't that going to do the wrong thing if the user string is valid memory but just zero length?? David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)