On 08/07, Oleg Nesterov wrote:Even simpler. #include <stdio.h> #include <signal.h> #include <unistd.h> #include <sys/ptrace.h> #include <sys/wait.h> #define __USE_GNU #include <sched.h> void die(const char *msg) { printf("ERR!! %s: %m\n", msg); kill(0, SIGKILL); } void set_cpu(int cpu) { unsigned cpuval = 1 << cpu; if (sched_setaffinity(0, 4, (void*)&cpuval) < 0) die("setaffinity"); } // __wake_up_parent() does SYNC wake up, we need a handler to provoke // signal_wake_up(). // otherwise ptrace_stop() is not preempted after read_unlock(tasklist). static void sigchld(int sig) { } int main(void) { set_cpu(0); int pid = fork(); if (!pid) for (;;) ; struct sched_param sp = { 99 }; if (sched_setscheduler(0, SCHED_FIFO, &sp)) die("setscheduler"); signal(SIGCHLD, sigchld); if (ptrace(PTRACE_ATTACH, pid, NULL, NULL)) die("attach"); wait(NULL); if (ptrace(PTRACE_DETACH, pid, NULL, NULL)) die("detach"); kill(pid, SIGKILL); return 0; } Locks CPU 0. Not a security problem, needs CAP_SYS_NICE and the task could be reniced and killed, but still not good. ptracee does ptrace_stop()->do_notify_parent_cldstop(), ptracer preempts the child before it calls schedule(), ptrace(PTRACE_DETACH) goes to wait_task_inactive() and yields forever. Can we just replace yield() with schedule_timeout_uninterruptible(1) ? wait_task_inactive() has no time-critical callers, and as it currently used "on_rq" case is really unlikely. Oleg. -
| Jeremy Fitzhardinge | Re: [RFC 00/15] x86_64: Optimize percpu accesses |
| Vladislav Bolkhovitin | Re: Integration of SCST in the mainstream Linux kernel |
| Mike Galbraith | Re: regression: CD burning (k3b) went broke |
git: | |
| Jarek Poplawski | [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock(). |
| Gerrit Renker | [PATCH 27/37] dccp: Integration of dynamic feature activation - part 2 (server side) |
| Linus Torvalds | Re: [GIT]: Networking |
| Michael Grollman | Re: 8169 Intermittent ifup Failure Issue With RTL8102E Chipset in Intel's New D945... |
