r8169: Avoid memcpy() over-reading of ETH_SS_STATS
[linux-2.6-microblaze.git] / mm / shmem.c
index a08cede..5d46611 100644 (file)
@@ -2258,25 +2258,11 @@ out_nomem:
 static int shmem_mmap(struct file *file, struct vm_area_struct *vma)
 {
        struct shmem_inode_info *info = SHMEM_I(file_inode(file));
+       int ret;
 
-       if (info->seals & F_SEAL_FUTURE_WRITE) {
-               /*
-                * New PROT_WRITE and MAP_SHARED mmaps are not allowed when
-                * "future write" seal active.
-                */
-               if ((vma->vm_flags & VM_SHARED) && (vma->vm_flags & VM_WRITE))
-                       return -EPERM;
-
-               /*
-                * Since an F_SEAL_FUTURE_WRITE sealed memfd can be mapped as
-                * MAP_SHARED and read-only, take care to not allow mprotect to
-                * revert protections on such mappings. Do this only for shared
-                * mappings. For private mappings, don't need to mask
-                * VM_MAYWRITE as we still want them to be COW-writable.
-                */
-               if (vma->vm_flags & VM_SHARED)
-                       vma->vm_flags &= ~(VM_MAYWRITE);
-       }
+       ret = seal_check_future_write(info->seals, vma);
+       if (ret)
+               return ret;
 
        /* arm64 - allow memory tagging on RAM-based files */
        vma->vm_flags |= VM_MTE_ALLOWED;
@@ -2375,8 +2361,18 @@ static int shmem_mfill_atomic_pte(struct mm_struct *dst_mm,
        pgoff_t offset, max_off;
 
        ret = -ENOMEM;
-       if (!shmem_inode_acct_block(inode, 1))
+       if (!shmem_inode_acct_block(inode, 1)) {
+               /*
+                * We may have got a page, returned -ENOENT triggering a retry,
+                * and now we find ourselves with -ENOMEM. Release the page, to
+                * avoid a BUG_ON in our caller.
+                */
+               if (unlikely(*pagep)) {
+                       put_page(*pagep);
+                       *pagep = NULL;
+               }
                goto out;
+       }
 
        if (!*pagep) {
                page = shmem_alloc_page(gfp, info, pgoff);