aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorJohn M. Calandrino <jmc@jupiter-cs.cs.unc.edu>2007-04-26 14:39:12 -0400
committerJohn M. Calandrino <jmc@jupiter-cs.cs.unc.edu>2007-04-26 14:39:12 -0400
commita659c1befd8744f857742e97868fb3a0c5cf70fc (patch)
tree46f3af0495abb5f078fdcc396839408b1538c90f /arch
parentdbcc425afe9a3b8036262fe5591334c43b411b93 (diff)
Made changes to protect empty queues from being traversed in
semaphore-related calls.
Diffstat (limited to 'arch')
-rw-r--r--arch/i386/kernel/pi_sem_syscalls.c19
-rw-r--r--arch/i386/kernel/sem_syscalls.c18
2 files changed, 25 insertions, 12 deletions
diff --git a/arch/i386/kernel/pi_sem_syscalls.c b/arch/i386/kernel/pi_sem_syscalls.c
index 7c4758c42a..ad0df7add0 100644
--- a/arch/i386/kernel/pi_sem_syscalls.c
+++ b/arch/i386/kernel/pi_sem_syscalls.c
@@ -130,13 +130,20 @@ asmlinkage long sys_pi_sema_free(pi_sema_id sem_id)
130 return -EINVAL; 130 return -EINVAL;
131 131
132 spin_lock_irqsave(&pi_sems[sem_id].wait.lock, flags); 132 spin_lock_irqsave(&pi_sems[sem_id].wait.lock, flags);
133 list_for_each_safe(tmp, next, &pi_sems[sem_id].wait.task_list) { 133 if (waitqueue_active(&pi_sems[sem_id].wait)) {
134 wait_queue_t *curr = list_entry(tmp, wait_queue_t, task_list); 134 list_for_each_safe(tmp, next,
135 list_del(tmp); 135 &pi_sems[sem_id].wait.task_list) {
136 set_rt_flags((struct task_struct*)curr->private, RT_F_EXIT_SEM); 136 wait_queue_t *curr = list_entry(tmp, wait_queue_t,
137 curr->func(curr, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 137 task_list);
138 0, NULL); 138 list_del(tmp);
139 set_rt_flags((struct task_struct*)curr->private,
140 RT_F_EXIT_SEM);
141 curr->func(curr,
142 TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE,
143 0, NULL);
144 }
139 } 145 }
146
140 spin_unlock_irqrestore(&pi_sems[sem_id].wait.lock, flags); 147 spin_unlock_irqrestore(&pi_sems[sem_id].wait.lock, flags);
141 pi_sems[sem_id].used = 0; 148 pi_sems[sem_id].used = 0;
142 149
diff --git a/arch/i386/kernel/sem_syscalls.c b/arch/i386/kernel/sem_syscalls.c
index bc7c162e0b..f1a118fd7e 100644
--- a/arch/i386/kernel/sem_syscalls.c
+++ b/arch/i386/kernel/sem_syscalls.c
@@ -67,13 +67,19 @@ asmlinkage long sys_sema_free(sema_id sem_id)
67 return -EINVAL; 67 return -EINVAL;
68 68
69 spin_lock_irqsave(&sems[sem_id].wait.lock, flags); 69 spin_lock_irqsave(&sems[sem_id].wait.lock, flags);
70 list_for_each_safe(tmp, next, &sems[sem_id].wait.task_list) { 70 if (waitqueue_active(&sems[sem_id].wait)) {
71 wait_queue_t *curr = list_entry(tmp, wait_queue_t, task_list); 71 list_for_each_safe(tmp, next, &sems[sem_id].wait.task_list) {
72 list_del(tmp); 72 wait_queue_t *curr = list_entry(tmp, wait_queue_t,
73 set_rt_flags((struct task_struct*)curr->private, RT_F_EXIT_SEM); 73 task_list);
74 curr->func(curr, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 74 list_del(tmp);
75 0, NULL); 75 set_rt_flags((struct task_struct*)curr->private,
76 RT_F_EXIT_SEM);
77 curr->func(curr,
78 TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE,
79 0, NULL);
80 }
76 } 81 }
82
77 spin_unlock_irqrestore(&sems[sem_id].wait.lock, flags); 83 spin_unlock_irqrestore(&sems[sem_id].wait.lock, flags);
78 sems[sem_id].used = 0; 84 sems[sem_id].used = 0;
79 85