kgdb: Read buffer overflow
authorJason Wessel <jason.wessel@windriver.com>
Fri, 11 Dec 2009 14:43:13 +0000 (08:43 -0600)
committerJason Wessel <jason.wessel@windriver.com>
Fri, 11 Dec 2009 14:43:13 +0000 (08:43 -0600)
Roel Kluin reported an error found with Parfait.  Where we want to
ensure that that kgdb_info[-1] never gets accessed.

Also check to ensure any negative tid does not exceed the size of the
shadow CPU array, else report critical debug context because it is an
internal kgdb failure.

Reported-by: Roel Kluin <roel.kluin@gmail.com>
Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
kernel/kgdb.c

index 7d70146340224b501c2c77dec5fdc0a40bb1820a..29357a9ccfb2b2127998ebc95c9954f15c18b856 100644 (file)
@@ -541,12 +541,17 @@ static struct task_struct *getthread(struct pt_regs *regs, int tid)
         */
        if (tid == 0 || tid == -1)
                tid = -atomic_read(&kgdb_active) - 2;
-       if (tid < 0) {
+       if (tid < -1 && tid > -NR_CPUS - 2) {
                if (kgdb_info[-tid - 2].task)
                        return kgdb_info[-tid - 2].task;
                else
                        return idle_task(-tid - 2);
        }
+       if (tid <= 0) {
+               printk(KERN_ERR "KGDB: Internal thread select error\n");
+               dump_stack();
+               return NULL;
+       }
 
        /*
         * find_task_by_pid_ns() does not take the tasklist lock anymore