@@ -71,6 +71,9 @@ int mmap_rnd_compat_bits __read_mostly = CONFIG_ARCH_MMAP_RND_COMPAT_BITS;
7171static bool ignore_rlimit_data ;
7272core_param (ignore_rlimit_data , ignore_rlimit_data , bool , 0644 );
7373
74+ const struct vm_operations_struct anon_vm_ops = {};
75+ const struct vm_operations_struct dummy_vm_ops = {};
76+
7477static void unmap_region (struct mm_struct * mm ,
7578 struct vm_area_struct * vma , struct vm_area_struct * prev ,
7679 unsigned long start , unsigned long end );
@@ -561,6 +564,8 @@ static unsigned long count_vma_pages_range(struct mm_struct *mm,
561564void __vma_link_rb (struct mm_struct * mm , struct vm_area_struct * vma ,
562565 struct rb_node * * rb_link , struct rb_node * rb_parent )
563566{
567+ WARN_ONCE (!vma -> vm_ops , "missing vma->vm_ops" );
568+
564569 /* Update tracking information for the gap following the new vma. */
565570 if (vma -> vm_next )
566571 vma_gap_update (vma -> vm_next );
@@ -1774,12 +1779,19 @@ unsigned long mmap_region(struct file *file, unsigned long addr,
17741779 */
17751780 WARN_ON_ONCE (addr != vma -> vm_start );
17761781
1782+ /* All mappings must have ->vm_ops set */
1783+ if (!vma -> vm_ops )
1784+ vma -> vm_ops = & dummy_vm_ops ;
1785+
17771786 addr = vma -> vm_start ;
17781787 vm_flags = vma -> vm_flags ;
17791788 } else if (vm_flags & VM_SHARED ) {
17801789 error = shmem_zero_setup (vma );
17811790 if (error )
17821791 goto free_vma ;
1792+ } else {
1793+ /* vma_is_anonymous() relies on this. */
1794+ vma -> vm_ops = & anon_vm_ops ;
17831795 }
17841796
17851797 vma_link (mm , vma , prev , rb_link , rb_parent );
@@ -2992,6 +3004,7 @@ static int do_brk_flags(unsigned long addr, unsigned long len, unsigned long fla
29923004
29933005 INIT_LIST_HEAD (& vma -> anon_vma_chain );
29943006 vma -> vm_mm = mm ;
3007+ vma -> vm_ops = & anon_vm_ops ;
29953008 vma -> vm_start = addr ;
29963009 vma -> vm_end = addr + len ;
29973010 vma -> vm_pgoff = pgoff ;
0 commit comments