Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/security/perm.c

    r07d4271 r5a5269d  
    8989                return EPERM;
    9090
     91        irq_spinlock_lock(&tasks_lock, true);
    9192        task_t *task = task_find_by_id(taskid);
    92         if (!task)
     93
     94        if ((!task) || (!container_check(CONTAINER, task->container))) {
     95                irq_spinlock_unlock(&tasks_lock, true);
    9396                return ENOENT;
    94 
    95         errno_t rc = ENOENT;
    96 
    97         irq_spinlock_lock(&task->lock, true);
    98         if (container_check(CONTAINER, task->container)) {
    99                 task->perms |= perms;
    100                 rc = EOK;
    10197        }
    102         irq_spinlock_unlock(&task->lock, true);
    103 
    104         task_release(task);
    105         return rc;
     98
     99        irq_spinlock_lock(&task->lock, false);
     100        task->perms |= perms;
     101        irq_spinlock_unlock(&task->lock, false);
     102
     103        irq_spinlock_unlock(&tasks_lock, true);
     104        return EOK;
    106105}
    107106
     
    119118static errno_t perm_revoke(task_id_t taskid, perm_t perms)
    120119{
     120        irq_spinlock_lock(&tasks_lock, true);
     121
    121122        task_t *task = task_find_by_id(taskid);
    122         if (!task)
     123        if ((!task) || (!container_check(CONTAINER, task->container))) {
     124                irq_spinlock_unlock(&tasks_lock, true);
    123125                return ENOENT;
     126        }
    124127
    125128        /*
     
    128131         * doesn't have PERM_PERM.
    129132         */
    130         if (task != TASK && !(perm_get(TASK) & PERM_PERM)) {
    131                 task_release(task);
     133        irq_spinlock_lock(&TASK->lock, false);
     134
     135        if ((!(TASK->perms & PERM_PERM)) || (task != TASK)) {
     136                irq_spinlock_unlock(&TASK->lock, false);
     137                irq_spinlock_unlock(&tasks_lock, true);
    132138                return EPERM;
    133139        }
    134140
    135         errno_t rc = ENOENT;
    136 
    137         irq_spinlock_lock(&task->lock, true);
    138         if (container_check(CONTAINER, task->container)) {
    139                 task->perms &= ~perms;
    140                 rc = EOK;
    141         }
    142         irq_spinlock_unlock(&task->lock, true);
    143 
    144         task_release(task);
    145         return rc;
     141        task->perms &= ~perms;
     142        irq_spinlock_unlock(&TASK->lock, false);
     143
     144        irq_spinlock_unlock(&tasks_lock, true);
     145        return EOK;
    146146}
    147147
Note: See TracChangeset for help on using the changeset viewer.