struct trace_event_call *tp_event;
 
        if (p_event->attr.kprobe_func) {
-               func = kzalloc(KSYM_NAME_LEN, GFP_KERNEL);
-               if (!func)
-                       return -ENOMEM;
-               ret = strncpy_from_user(
-                       func, u64_to_user_ptr(p_event->attr.kprobe_func),
-                       KSYM_NAME_LEN);
-               if (ret == KSYM_NAME_LEN)
-                       ret = -E2BIG;
-               if (ret < 0)
-                       goto out;
+               func = strndup_user(u64_to_user_ptr(p_event->attr.kprobe_func),
+                                   KSYM_NAME_LEN);
+               if (IS_ERR(func)) {
+                       ret = PTR_ERR(func);
+                       return (ret == -EINVAL) ? -E2BIG : ret;
+               }
 
                if (func[0] == '\0') {
                        kfree(func);