Subversion Repositories HelenOS-historic

Rev

Rev 1264 | Rev 1588 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1264 Rev 1297
Line 34... Line 34...
34
 */
34
 */
35
 
35
 
36
#include <security/cap.h>
36
#include <security/cap.h>
37
#include <proc/task.h>
37
#include <proc/task.h>
38
#include <synch/spinlock.h>
38
#include <synch/spinlock.h>
-
 
39
#include <syscall/sysarg64.h>
-
 
40
#include <syscall/copy.h>
39
#include <arch.h>
41
#include <arch.h>
40
#include <typedefs.h>
42
#include <typedefs.h>
-
 
43
#include <errno.h>
41
 
44
 
42
/** Set capabilities.
45
/** Set capabilities.
43
 *
46
 *
44
 * @param t Task whose capabilities are to be changed.
47
 * @param t Task whose capabilities are to be changed.
45
 * @param caps New set of capabilities.
48
 * @param caps New set of capabilities.
Line 75... Line 78...
75
    spinlock_unlock(&t->lock);
78
    spinlock_unlock(&t->lock);
76
    interrupts_restore(ipl);
79
    interrupts_restore(ipl);
77
   
80
   
78
    return caps;
81
    return caps;
79
}
82
}
-
 
83
 
-
 
84
/** Grant capabilities to a task.
-
 
85
 *
-
 
86
 * The calling task must have the CAP_CAP capability.
-
 
87
 *
-
 
88
 * @param uspace_taskid_arg Userspace structure holding destination task ID.
-
 
89
 * @param caps Capabilities to grant.
-
 
90
 *
-
 
91
 * @return Zero on success or an error code from @ref errno.h.
-
 
92
 */
-
 
93
__native sys_cap_grant(sysarg64_t *uspace_taskid_arg, cap_t caps)
-
 
94
{
-
 
95
    sysarg64_t taskid_arg;
-
 
96
    task_t *t;
-
 
97
    ipl_t ipl;
-
 
98
    int rc;
-
 
99
   
-
 
100
    if (!(cap_get(TASK) & CAP_CAP))
-
 
101
        return (__native) EPERM;
-
 
102
   
-
 
103
    rc = copy_from_uspace(&taskid_arg, uspace_taskid_arg, sizeof(sysarg64_t));
-
 
104
    if (rc != 0)
-
 
105
        return (__native) rc;
-
 
106
       
-
 
107
    ipl = interrupts_disable();
-
 
108
    spinlock_lock(&tasks_lock);
-
 
109
    t = task_find_by_id((task_id_t) taskid_arg.value);
-
 
110
    if (!t) {
-
 
111
        spinlock_unlock(&tasks_lock);
-
 
112
        interrupts_restore(ipl);
-
 
113
        return (__native) ENOENT;
-
 
114
    }
-
 
115
    spinlock_unlock(&tasks_lock);
-
 
116
   
-
 
117
    cap_set(t, cap_get(t) | caps);
-
 
118
   
-
 
119
    interrupts_restore(ipl);   
-
 
120
    return 0;
-
 
121
}
-
 
122
 
-
 
123
/** Revoke capabilities from a task.
-
 
124
 *
-
 
125
 * The calling task must have the CAP_CAP capability or the caller must
-
 
126
 * attempt to revoke capabilities from itself.
-
 
127
 *
-
 
128
 * @param uspace_taskid_arg Userspace structure holding destination task ID.
-
 
129
 * @param caps Capabilities to revoke.
-
 
130
 *
-
 
131
 * @return Zero on success or an error code from @ref errno.h.
-
 
132
 */
-
 
133
__native sys_cap_revoke(sysarg64_t *uspace_taskid_arg, cap_t caps)
-
 
134
{
-
 
135
    sysarg64_t taskid_arg;
-
 
136
    task_t *t;
-
 
137
    ipl_t ipl;
-
 
138
    int rc;
-
 
139
   
-
 
140
    rc = copy_from_uspace(&taskid_arg, uspace_taskid_arg, sizeof(sysarg64_t));
-
 
141
    if (rc != 0)
-
 
142
        return (__native) rc;
-
 
143
 
-
 
144
    ipl = interrupts_disable();
-
 
145
    spinlock_lock(&tasks_lock);
-
 
146
    t = task_find_by_id((task_id_t) taskid_arg.value);
-
 
147
    if (!t) {
-
 
148
        spinlock_unlock(&tasks_lock);
-
 
149
        interrupts_restore(ipl);
-
 
150
        return (__native) ENOENT;
-
 
151
    }
-
 
152
    spinlock_unlock(&tasks_lock);
-
 
153
 
-
 
154
    /*
-
 
155
     * Revoking capabilities is different from granting them in that
-
 
156
     * a task can revoke capabilities from itself even if it
-
 
157
     * doesn't have CAP_CAP.
-
 
158
     */
-
 
159
    if (!(cap_get(TASK) & CAP_CAP) || !(t == TASK)) {
-
 
160
        interrupts_restore(ipl);
-
 
161
        return (__native) EPERM;
-
 
162
    }
-
 
163
 
-
 
164
    cap_set(t, cap_get(t) & ~caps);
-
 
165
   
-
 
166
    interrupts_restore(ipl);
-
 
167
    return 0;
-
 
168
}