Changeset da1bafb in mainline for kernel/generic/src/security/cap.c
- Timestamp:
- 2010-05-24T18:57:31Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0095368
- Parents:
- 666f492
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/security/cap.c
r666f492 rda1bafb 27 27 */ 28 28 29 /** @addtogroup generic 29 /** @addtogroup generic 30 30 * @{ 31 31 */ 32 32 33 33 /** 34 * @file 35 * @brief 34 * @file cap.c 35 * @brief Capabilities control. 36 36 * 37 37 * @see cap.h 38 38 */ 39 39 40 40 #include <security/cap.h> 41 41 #include <proc/task.h> … … 48 48 /** Set capabilities. 49 49 * 50 * @param t Task whose capabilities are to be changed.50 * @param task Task whose capabilities are to be changed. 51 51 * @param caps New set of capabilities. 52 * 52 53 */ 53 void cap_set(task_t *t , cap_t caps)54 void cap_set(task_t *task, cap_t caps) 54 55 { 55 ipl_t ipl; 56 57 ipl = interrupts_disable(); 58 spinlock_lock(&t->lock); 59 60 t->capabilities = caps; 61 62 spinlock_unlock(&t->lock); 63 interrupts_restore(ipl); 56 irq_spinlock_lock(&task->lock, true); 57 task->capabilities = caps; 58 irq_spinlock_unlock(&task->lock, true); 64 59 } 65 60 66 61 /** Get capabilities. 67 62 * 68 * @param t Task whose capabilities are to be returned. 63 * @param task Task whose capabilities are to be returned. 64 * 69 65 * @return Task's capabilities. 66 * 70 67 */ 71 cap_t cap_get(task_t *t )68 cap_t cap_get(task_t *task) 72 69 { 73 ipl_t ipl; 74 cap_t caps; 75 76 ipl = interrupts_disable(); 77 spinlock_lock(&t->lock); 78 79 caps = t->capabilities; 80 81 spinlock_unlock(&t->lock); 82 interrupts_restore(ipl); 70 irq_spinlock_lock(&task->lock, true); 71 cap_t caps = task->capabilities; 72 irq_spinlock_unlock(&task->lock, true); 83 73 84 74 return caps; … … 93 83 * 94 84 * @return Zero on success or an error code from @ref errno.h. 85 * 95 86 */ 96 87 unative_t sys_cap_grant(sysarg64_t *uspace_taskid_arg, cap_t caps) 97 88 { 98 sysarg64_t taskid_arg;99 task_t *t;100 ipl_t ipl;101 int rc;102 103 89 if (!(cap_get(TASK) & CAP_CAP)) 104 90 return (unative_t) EPERM; 105 91 106 rc = copy_from_uspace(&taskid_arg, uspace_taskid_arg, sizeof(sysarg64_t)); 92 sysarg64_t taskid_arg; 93 int rc = copy_from_uspace(&taskid_arg, uspace_taskid_arg, sizeof(sysarg64_t)); 107 94 if (rc != 0) 108 95 return (unative_t) rc; 109 110 ipl = interrupts_disable(); 111 spinlock_lock(&tasks_lock); 112 t = task_find_by_id((task_id_t) taskid_arg.value); 113 if ((!t) || (!context_check(CONTEXT, t->context))) { 114 spinlock_unlock(&tasks_lock); 115 interrupts_restore(ipl); 96 97 irq_spinlock_lock(&tasks_lock, true); 98 task_t *task = task_find_by_id((task_id_t) taskid_arg.value); 99 100 if ((!task) || (!context_check(CONTEXT, task->context))) { 101 irq_spinlock_unlock(&tasks_lock, true); 116 102 return (unative_t) ENOENT; 117 103 } 118 104 119 spinlock_lock(&t->lock);120 cap_set(t, cap_get(t) | caps);121 spinlock_unlock(&t->lock);105 irq_spinlock_lock(&task->lock, false); 106 task->capabilities |= caps; 107 irq_spinlock_unlock(&task->lock, false); 122 108 123 spinlock_unlock(&tasks_lock); 124 interrupts_restore(ipl); 109 irq_spinlock_unlock(&tasks_lock, true); 125 110 return 0; 126 111 } … … 135 120 * 136 121 * @return Zero on success or an error code from @ref errno.h. 122 * 137 123 */ 138 124 unative_t sys_cap_revoke(sysarg64_t *uspace_taskid_arg, cap_t caps) 139 125 { 140 126 sysarg64_t taskid_arg; 141 task_t *t; 142 ipl_t ipl; 143 int rc; 144 145 rc = copy_from_uspace(&taskid_arg, uspace_taskid_arg, sizeof(sysarg64_t)); 127 int rc = copy_from_uspace(&taskid_arg, uspace_taskid_arg, sizeof(sysarg64_t)); 146 128 if (rc != 0) 147 129 return (unative_t) rc; 148 149 ipl = interrupts_disable(); 150 spinlock_lock(&tasks_lock); 151 t = task_find_by_id((task_id_t) taskid_arg.value); 152 if ((!t) || (!context_check(CONTEXT, t->context))) { 153 spinlock_unlock(&tasks_lock); 154 interrupts_restore(ipl); 130 131 irq_spinlock_lock(&tasks_lock, true); 132 133 task_t *task = task_find_by_id((task_id_t) taskid_arg.value); 134 if ((!task) || (!context_check(CONTEXT, task->context))) { 135 irq_spinlock_unlock(&tasks_lock, true); 155 136 return (unative_t) ENOENT; 156 137 } 157 138 158 139 /* 159 140 * Revoking capabilities is different from granting them in that … … 161 142 * doesn't have CAP_CAP. 162 143 */ 163 if (!(cap_get(TASK) & CAP_CAP) || !(t == TASK)) { 164 spinlock_unlock(&tasks_lock); 165 interrupts_restore(ipl); 144 irq_spinlock_unlock(&TASK->lock, false); 145 146 if ((!(TASK->capabilities & CAP_CAP)) || (task != TASK)) { 147 irq_spinlock_unlock(&TASK->lock, false); 148 irq_spinlock_unlock(&tasks_lock, true); 166 149 return (unative_t) EPERM; 167 150 } 168 151 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 175 interrupts_restore(ipl); 152 task->capabilities &= ~caps; 153 irq_spinlock_unlock(&TASK->lock, false); 154 155 irq_spinlock_unlock(&tasks_lock, true); 176 156 return 0; 177 157 } … … 179 159 /** @} 180 160 */ 181
Note:
See TracChangeset
for help on using the changeset viewer.