diff options
author | John M. Calandrino <jmc@jupiter-cs.cs.unc.edu> | 2007-04-26 14:39:12 -0400 |
---|---|---|
committer | John M. Calandrino <jmc@jupiter-cs.cs.unc.edu> | 2007-04-26 14:39:12 -0400 |
commit | a659c1befd8744f857742e97868fb3a0c5cf70fc (patch) | |
tree | 46f3af0495abb5f078fdcc396839408b1538c90f /arch | |
parent | dbcc425afe9a3b8036262fe5591334c43b411b93 (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.c | 19 | ||||
-rw-r--r-- | arch/i386/kernel/sem_syscalls.c | 18 |
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 | ||