linux-hold-tasklist-lock-in-get-page-offset-20030321

tasklist_lock must be held to traverse list
This commit is contained in:
Chaskiel M Grundman 2003-03-21 18:28:31 +00:00 committed by Derrick Brashear
parent 7f4d43ac2f
commit 38cec12f2c

View File

@ -25,9 +25,9 @@ RCSID("$Header$");
#include <linux/slab.h> #include <linux/slab.h>
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
#include <linux/init.h> #include <linux/init.h>
#include <linux/sched.h>
#endif #endif
#ifndef EXPORTED_SYS_CALL_TABLE #ifndef EXPORTED_SYS_CALL_TABLE
#include <linux/sched.h>
#include <linux/syscall.h> #include <linux/syscall.h>
#endif #endif
@ -440,14 +440,26 @@ static long get_page_offset(void)
struct task_struct *p, *q; struct task_struct *p, *q;
/* search backward thru the circular list */ /* search backward thru the circular list */
#ifdef DEFINED_PREV_TASK #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
for(q = current; p = q; q = prev_task(p)) read_lock(&tasklist_lock);
#else
for(p = current; p; p = p->prev_task)
#endif #endif
if (p->pid == 1) /* search backward thru the circular list */
return p->addr_limit.seg; #ifdef DEFINED_PREV_TASK
for(q = current; p = q; q = prev_task(p)) {
return 0; #else
for(p = current; p; p = p->prev_task) {
#endif
if (p->pid == 1) {
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
read_unlock(&tasklist_lock);
#endif
return p->addr_limit.seg;
}
}
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
read_unlock(&tasklist_lock);
#endif
return 0;
#endif #endif
} }