Rev 1297 | Rev 1702 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1297 | Rev 1588 | ||
|---|---|---|---|
| Line 110... | Line 110... | ||
| 110 | if (!t) { |
110 | if (!t) { |
| 111 | spinlock_unlock(&tasks_lock); |
111 | spinlock_unlock(&tasks_lock); |
| 112 | interrupts_restore(ipl); |
112 | interrupts_restore(ipl); |
| 113 | return (__native) ENOENT; |
113 | return (__native) ENOENT; |
| 114 | } |
114 | } |
| 115 | spinlock_unlock(&tasks_lock); |
- | |
| 116 | 115 | ||
| - | 116 | spinlock_lock(&t->lock); |
|
| 117 | cap_set(t, cap_get(t) | caps); |
117 | cap_set(t, cap_get(t) | caps); |
| - | 118 | spinlock_unlock(&t->lock); |
|
| - | 119 | ||
| - | 120 | spinlock_unlock(&tasks_lock); |
|
| - | 121 | ||
| - | 122 | ||
| 118 | 123 | ||
| 119 | interrupts_restore(ipl); |
124 | interrupts_restore(ipl); |
| 120 | return 0; |
125 | return 0; |
| 121 | } |
126 | } |
| 122 | 127 | ||
| Line 147... | Line 152... | ||
| 147 | if (!t) { |
152 | if (!t) { |
| 148 | spinlock_unlock(&tasks_lock); |
153 | spinlock_unlock(&tasks_lock); |
| 149 | interrupts_restore(ipl); |
154 | interrupts_restore(ipl); |
| 150 | return (__native) ENOENT; |
155 | return (__native) ENOENT; |
| 151 | } |
156 | } |
| 152 | spinlock_unlock(&tasks_lock); |
- | |
| 153 | 157 | ||
| 154 | /* |
158 | /* |
| 155 | * Revoking capabilities is different from granting them in that |
159 | * Revoking capabilities is different from granting them in that |
| 156 | * a task can revoke capabilities from itself even if it |
160 | * a task can revoke capabilities from itself even if it |
| 157 | * doesn't have CAP_CAP. |
161 | * doesn't have CAP_CAP. |
| 158 | */ |
162 | */ |
| 159 | if (!(cap_get(TASK) & CAP_CAP) || !(t == TASK)) { |
163 | if (!(cap_get(TASK) & CAP_CAP) || !(t == TASK)) { |
| - | 164 | spinlock_unlock(&tasks_lock); |
|
| 160 | interrupts_restore(ipl); |
165 | interrupts_restore(ipl); |
| 161 | return (__native) EPERM; |
166 | return (__native) EPERM; |
| 162 | } |
167 | } |
| 163 | - | ||
| 164 | cap_set(t, cap_get(t) & ~caps); |
- | |
| 165 | 168 | ||
| - | 169 | spinlock_lock(&t->lock); |
|
| - | 170 | cap_set(t, cap_get(t) & ~caps); |
|
| - | 171 | spinlock_unlock(&t->lock); |
|
| - | 172 | ||
| - | 173 | spinlock_unlock(&tasks_lock); |
|
| - | 174 | ||
| 166 | interrupts_restore(ipl); |
175 | interrupts_restore(ipl); |
| 167 | return 0; |
176 | return 0; |
| 168 | } |
177 | } |