--- /dev/null
+diff --git a/kernel/signal.c b/kernel/signal.c
+index 76f1f25..23f2fa4 100644
+--- a/kernel/signal.c
++++ b/kernel/signal.c
+@@ -573,10 +573,11 @@ static int check_kill_permission(int sig, struct siginfo *info,
+ if (!valid_signal(sig))
+ return -EINVAL;
+
++/*
+ if ((info != SEND_SIG_NOINFO) &&
+ (is_si_special(info) || !SI_FROMUSER(info)))
+ goto skip;
+-
++*/
+ vxdprintk(VXD_CBIT(misc, 7),
+ "check_kill_permission(%d,%p,%p[#%u,%u])",
+ sig, info, t, vx_task_xid(t), t->pid);
+@@ -610,13 +611,17 @@ static int check_kill_permission(int sig, struct siginfo *info,
+ return error;
+
+ error = -ESRCH;
++ /* FIXME: we shouldn't return ESRCH ever, to avoid
++ loops, maybe ENOENT or EACCES? */
+ if (!vx_check(vx_task_xid(t), VS_WATCH_P | VS_IDENT)) {
+ vxdprintk(current->xid || VXD_CBIT(misc, 7),
+ "signal %d[%p] xid mismatch %p[#%u,%u] xid=#%u",
+ sig, info, t, vx_task_xid(t), t->pid, current->xid);
+ return error;
+ }
++/*
+ skip:
++*/
+ return security_task_kill(t, info, sig, 0);
+ }
+
+@@ -1074,7 +1079,7 @@ int kill_pid_info(int sig, struct siginfo *info, struct pid *pid)
+ rcu_read_lock();
+ retry:
+ p = pid_task(pid, PIDTYPE_PID);
+- if (p && vx_check(vx_task_xid(p), VS_ADMIN | VS_IDENT)) {
++ if (p && vx_check(vx_task_xid(p), VS_IDENT)) {
+ error = group_send_sig_info(sig, info, p);
+ if (unlikely(error == -ESRCH))
+ /*