Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/ddi/ddi.c

    rd7533c7 r77429d3  
    104104{
    105105        ASSERT(TASK);
    106        
    107         if ((pf % FRAME_SIZE) != 0)
    108                 return EBADMEM;
    109        
    110         if ((vp % PAGE_SIZE) != 0)
    111                 return EBADMEM;
    112        
    113         /*
    114          * Unprivileged tasks are only allowed to map pareas
    115          * which are explicitly marked as such.
    116          */
    117         bool priv =
    118             ((cap_get(TASK) & CAP_MEM_MANAGER) == CAP_MEM_MANAGER);
     106        ASSERT((pf % FRAME_SIZE) == 0);
     107        ASSERT((vp % PAGE_SIZE) == 0);
     108       
     109        /*
     110         * Make sure the caller is authorised to make this syscall.
     111         */
     112        cap_t caps = cap_get(TASK);
     113        if (!(caps & CAP_MEM_MANAGER))
     114                return EPERM;
    119115       
    120116        mem_backend_data_t backend_data;
     
    127123       
    128124        if (znum == (size_t) -1) {
    129                 /*
    130                  * Frames not found in any zone
    131                  * -> assume it is a hardware device and allow mapping
    132                  *    for privileged tasks.
     125                /* Frames not found in any zones
     126                 * -> assume it is hardware device and allow mapping
    133127                 */
    134128                irq_spinlock_unlock(&zones.lock, true);
    135                
    136                 if (!priv)
    137                         return EPERM;
    138                
    139129                goto map;
    140130        }
    141131       
    142132        if (zones.info[znum].flags & ZONE_FIRMWARE) {
    143                 /*
    144                  * Frames are part of firmware
    145                  * -> allow mapping for privileged tasks.
    146                  */
     133                /* Frames are part of firmware */
    147134                irq_spinlock_unlock(&zones.lock, true);
    148                
    149                 if (!priv)
    150                         return EPERM;
    151                
    152135                goto map;
    153136        }
     
    155138        if (zone_flags_available(zones.info[znum].flags)) {
    156139                /*
    157                  * Frames are part of physical memory, check
    158                  * if the memory region is enabled for mapping.
     140                 * Frames are part of physical memory, check if the memory
     141                 * region is enabled for mapping.
    159142                 */
    160143                irq_spinlock_unlock(&zones.lock, true);
     
    167150                if ((!parea) || (parea->frames < pages)) {
    168151                        mutex_unlock(&parea_lock);
    169                         return ENOENT;
    170                 }
    171                
    172                 if (!priv) {
    173                         if (!parea->unpriv) {
    174                                 mutex_unlock(&parea_lock);
    175                                 return EPERM;
    176                         }
     152                        goto err;
    177153                }
    178154               
     
    182158       
    183159        irq_spinlock_unlock(&zones.lock, true);
     160       
     161err:
    184162        return ENOENT;
    185163       
Note: See TracChangeset for help on using the changeset viewer.