lkml.org 
[lkml]   [2018]   [Feb]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 052/159] staging: android: ashmem: Fix a race condition in pin ioctls
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Ben Hutchings <ben@decadent.org.uk>

    commit ce8a3a9e76d0193e2e8d74a06d275b3c324ca652 upstream.

    ashmem_pin_unpin() reads asma->file and asma->size before taking the
    ashmem_mutex, so it can race with other operations that modify them.

    Build-tested only.

    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/staging/android/ashmem.c | 19 +++++++++++--------
    1 file changed, 11 insertions(+), 8 deletions(-)

    --- a/drivers/staging/android/ashmem.c
    +++ b/drivers/staging/android/ashmem.c
    @@ -710,30 +710,32 @@ static int ashmem_pin_unpin(struct ashme
    size_t pgstart, pgend;
    int ret = -EINVAL;

    + mutex_lock(&ashmem_mutex);
    +
    if (unlikely(!asma->file))
    - return -EINVAL;
    + goto out_unlock;

    - if (unlikely(copy_from_user(&pin, p, sizeof(pin))))
    - return -EFAULT;
    + if (unlikely(copy_from_user(&pin, p, sizeof(pin)))) {
    + ret = -EFAULT;
    + goto out_unlock;
    + }

    /* per custom, you can pass zero for len to mean "everything onward" */
    if (!pin.len)
    pin.len = PAGE_ALIGN(asma->size) - pin.offset;

    if (unlikely((pin.offset | pin.len) & ~PAGE_MASK))
    - return -EINVAL;
    + goto out_unlock;

    if (unlikely(((__u32)-1) - pin.offset < pin.len))
    - return -EINVAL;
    + goto out_unlock;

    if (unlikely(PAGE_ALIGN(asma->size) < pin.offset + pin.len))
    - return -EINVAL;
    + goto out_unlock;

    pgstart = pin.offset / PAGE_SIZE;
    pgend = pgstart + (pin.len / PAGE_SIZE) - 1;

    - mutex_lock(&ashmem_mutex);
    -
    switch (cmd) {
    case ASHMEM_PIN:
    ret = ashmem_pin(asma, pgstart, pgend);
    @@ -746,6 +748,7 @@ static int ashmem_pin_unpin(struct ashme
    break;
    }

    +out_unlock:
    mutex_unlock(&ashmem_mutex);

    return ret;

    \
     
     \ /
      Last update: 2018-02-23 20:32    [W:4.153 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site