Source
3598
3598
3599
3599
if (info) {
3600
3600
ret = copy_siginfo_from_user_any(&kinfo, info);
3601
3601
if (unlikely(ret))
3602
3602
goto err;
3603
3603
3604
3604
ret = -EINVAL;
3605
3605
if (unlikely(sig != kinfo.si_signo))
3606
3606
goto err;
3607
3607
3608
+
/* Only allow sending arbitrary signals to yourself. */
3609
+
ret = -EPERM;
3608
3610
if ((task_pid(current) != pid) &&
3609
-
(kinfo.si_code >= 0 || kinfo.si_code == SI_TKILL)) {
3610
-
/* Only allow sending arbitrary signals to yourself. */
3611
-
ret = -EPERM;
3612
-
if (kinfo.si_code != SI_USER)
3613
-
goto err;
3614
-
3615
-
/* Turn this into a regular kill signal. */
3616
-
prepare_kill_siginfo(sig, &kinfo);
3617
-
}
3611
+
(kinfo.si_code >= 0 || kinfo.si_code == SI_TKILL))
3612
+
goto err;
3618
3613
} else {
3619
3614
prepare_kill_siginfo(sig, &kinfo);
3620
3615
}
3621
3616
3622
3617
ret = kill_pid_info(sig, &kinfo, pid);
3623
3618
3624
3619
err:
3625
3620
fdput(f);
3626
3621
return ret;
3627
3622
}