On Sun, Mar 6, 2022 at 9:28 AM Jiri Olsa <olsajiri@xxxxxxxxx> wrote: > > On Fri, Mar 04, 2022 at 03:11:01PM -0800, Andrii Nakryiko wrote: > > SNIP > > > > +static int > > > +kprobe_multi_resolve_syms(const void *usyms, u32 cnt, > > > + unsigned long *addrs) > > > +{ > > > + unsigned long addr, size; > > > + const char **syms; > > > + int err = -ENOMEM; > > > + unsigned int i; > > > + char *func; > > > + > > > + size = cnt * sizeof(*syms); > > > + syms = kvzalloc(size, GFP_KERNEL); > > > + if (!syms) > > > + return -ENOMEM; > > > + > > > + func = kmalloc(KSYM_NAME_LEN, GFP_KERNEL); > > > + if (!func) > > > + goto error; > > > + > > > + if (copy_from_user(syms, usyms, size)) { > > > + err = -EFAULT; > > > + goto error; > > > + } > > > + > > > + for (i = 0; i < cnt; i++) { > > > + err = strncpy_from_user(func, syms[i], KSYM_NAME_LEN); > > > + if (err == KSYM_NAME_LEN) > > > + err = -E2BIG; > > > + if (err < 0) > > > + goto error; > > > + > > > + err = -EINVAL; > > > + if (func[0] == '\0') > > > + goto error; > > > > wouldn't empty string be handled by kallsyms_lookup_name? > > it would scan and compare all symbols with empty string, > so it's better to test for it I don't mind, but it seems like kallsyms_lookup_name() should be made smarter than that instead, no? > > jirka > > > > > > + addr = kallsyms_lookup_name(func); > > > + if (!addr) > > > + goto error; > > > + if (!kallsyms_lookup_size_offset(addr, &size, NULL)) > > > + size = MCOUNT_INSN_SIZE; > > > + addr = ftrace_location_range(addr, addr + size - 1); > > > + if (!addr) > > > + goto error; > > > + addrs[i] = addr; > > > + } > > > + > > > + err = 0; > > > +error: > > > + kvfree(syms); > > > + kfree(func); > > > + return err; > > > +} > > > + > > > > [...]