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 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; > > +} > > + > > [...]