tree:   https://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git 
willy-maple
head:   7e346d2845b4bd77663394f39fa70456e0084c86
commit: 059c8a0bb9679195f39e18eaa5b3f548f13e7226 [137/202] mm/mmap: Change 
mmap_region to use maple tree state
config: x86_64-randconfig-m001-20210202 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <l...@intel.com>
Reported-by: Dan Carpenter <dan.carpen...@oracle.com>

smatch warnings:
mm/mmap.c:1895 mmap_region() error: uninitialized symbol 'next'.

vim +/next +1895 mm/mmap.c

0165ab443556bd Miklos Szeredi        2007-07-15  1753  unsigned long 
mmap_region(struct file *file, unsigned long addr,
897ab3e0c49e24 Mike Rapoport         2017-02-24  1754           unsigned long 
len, vm_flags_t vm_flags, unsigned long pgoff,
897ab3e0c49e24 Mike Rapoport         2017-02-24  1755           struct 
list_head *uf)
0165ab443556bd Miklos Szeredi        2007-07-15  1756  {
0165ab443556bd Miklos Szeredi        2007-07-15  1757   struct mm_struct *mm = 
current->mm;
059c8a0bb96791 Liam R. Howlett       2020-11-10  1758   struct vm_area_struct 
*vma = NULL;
059c8a0bb96791 Liam R. Howlett       2020-11-10  1759   struct vm_area_struct 
*prev, *next;
059c8a0bb96791 Liam R. Howlett       2020-11-10  1760   pgoff_t pglen = len >> 
PAGE_SHIFT;
0165ab443556bd Miklos Szeredi        2007-07-15  1761   unsigned long charged = 
0;
059c8a0bb96791 Liam R. Howlett       2020-11-10  1762   unsigned long end = 
addr + len;
059c8a0bb96791 Liam R. Howlett       2020-11-10  1763   unsigned long 
merge_start = addr, merge_end = end;
059c8a0bb96791 Liam R. Howlett       2020-11-10  1764   pgoff_t vm_pgoff;
059c8a0bb96791 Liam R. Howlett       2020-11-10  1765   int error;
059c8a0bb96791 Liam R. Howlett       2020-11-10  1766   MA_STATE(mas, 
&mm->mm_mt, addr, end - 1);
0165ab443556bd Miklos Szeredi        2007-07-15  1767  
e8420a8ece80b3 Cyril Hrubis          2013-04-29  1768   /* Check against 
address space limit. */
84638335900f19 Konstantin Khlebnikov 2016-01-14  1769   if (!may_expand_vm(mm, 
vm_flags, len >> PAGE_SHIFT)) {
e8420a8ece80b3 Cyril Hrubis          2013-04-29  1770           unsigned long 
nr_pages;
e8420a8ece80b3 Cyril Hrubis          2013-04-29  1771  
e8420a8ece80b3 Cyril Hrubis          2013-04-29  1772           /*
e8420a8ece80b3 Cyril Hrubis          2013-04-29  1773            * MAP_FIXED 
may remove pages of mappings that intersects with
e8420a8ece80b3 Cyril Hrubis          2013-04-29  1774            * requested 
mapping. Account for the pages it would unmap.
e8420a8ece80b3 Cyril Hrubis          2013-04-29  1775            */
059c8a0bb96791 Liam R. Howlett       2020-11-10  1776           nr_pages = 
count_vma_pages_range(mm, addr, end);
e8420a8ece80b3 Cyril Hrubis          2013-04-29  1777  
84638335900f19 Konstantin Khlebnikov 2016-01-14  1778           if 
(!may_expand_vm(mm, vm_flags,
84638335900f19 Konstantin Khlebnikov 2016-01-14  1779                           
        (len >> PAGE_SHIFT) - nr_pages))
e8420a8ece80b3 Cyril Hrubis          2013-04-29  1780                   return 
-ENOMEM;
e8420a8ece80b3 Cyril Hrubis          2013-04-29  1781   }
e8420a8ece80b3 Cyril Hrubis          2013-04-29  1782  
059c8a0bb96791 Liam R. Howlett       2020-11-10  1783   /* Unmap any existing 
mapping in the area */
059c8a0bb96791 Liam R. Howlett       2020-11-10  1784   if (do_munmap(mm, addr, 
len, uf))
^1da177e4c3f41 Linus Torvalds        2005-04-16  1785           return -ENOMEM;
059c8a0bb96791 Liam R. Howlett       2020-11-10  1786  
^1da177e4c3f41 Linus Torvalds        2005-04-16  1787   /*
^1da177e4c3f41 Linus Torvalds        2005-04-16  1788    * Private writable 
mapping: check memory availability
^1da177e4c3f41 Linus Torvalds        2005-04-16  1789    */
5a6fe125950676 Mel Gorman            2009-02-10  1790   if 
(accountable_mapping(file, vm_flags)) {
^1da177e4c3f41 Linus Torvalds        2005-04-16  1791           charged = len 
>> PAGE_SHIFT;
191c542442fdf5 Al Viro               2012-02-13  1792           if 
(security_vm_enough_memory_mm(mm, charged))
^1da177e4c3f41 Linus Torvalds        2005-04-16  1793                   return 
-ENOMEM;
^1da177e4c3f41 Linus Torvalds        2005-04-16  1794           vm_flags |= 
VM_ACCOUNT;
^1da177e4c3f41 Linus Torvalds        2005-04-16  1795   }
^1da177e4c3f41 Linus Torvalds        2005-04-16  1796  
^1da177e4c3f41 Linus Torvalds        2005-04-16  1797  
059c8a0bb96791 Liam R. Howlett       2020-11-10  1798   if (vm_flags & 
VM_SPECIAL) {
059c8a0bb96791 Liam R. Howlett       2020-11-10  1799           prev = 
mas_prev(&mas, 0);
059c8a0bb96791 Liam R. Howlett       2020-11-10  1800           goto 
cannot_expand;

"next" not initialized on this path.

059c8a0bb96791 Liam R. Howlett       2020-11-10  1801   }
059c8a0bb96791 Liam R. Howlett       2020-11-10  1802  
059c8a0bb96791 Liam R. Howlett       2020-11-10  1803   /* Attempt to expand an 
old mapping */
059c8a0bb96791 Liam R. Howlett       2020-11-10  1804  
059c8a0bb96791 Liam R. Howlett       2020-11-10  1805   /* Check next */
059c8a0bb96791 Liam R. Howlett       2020-11-10  1806   next = mas_next(&mas, 
ULONG_MAX);
059c8a0bb96791 Liam R. Howlett       2020-11-10  1807   if (next && 
next->vm_start == end && vma_policy(next) &&
059c8a0bb96791 Liam R. Howlett       2020-11-10  1808       
can_vma_merge_before(next, vm_flags, NULL, file, pgoff+pglen,
059c8a0bb96791 Liam R. Howlett       2020-11-10  1809                           
 NULL_VM_UFFD_CTX)) {
059c8a0bb96791 Liam R. Howlett       2020-11-10  1810           merge_end = 
next->vm_end;
059c8a0bb96791 Liam R. Howlett       2020-11-10  1811           vma = next;
059c8a0bb96791 Liam R. Howlett       2020-11-10  1812           vm_pgoff = 
next->vm_pgoff - pglen;
059c8a0bb96791 Liam R. Howlett       2020-11-10  1813   }
059c8a0bb96791 Liam R. Howlett       2020-11-10  1814  
059c8a0bb96791 Liam R. Howlett       2020-11-10  1815   /* Check prev */
059c8a0bb96791 Liam R. Howlett       2020-11-10  1816   prev = mas_prev(&mas, 
0);
059c8a0bb96791 Liam R. Howlett       2020-11-10  1817   if (prev && 
prev->vm_end == addr && !vma_policy(prev) &&
059c8a0bb96791 Liam R. Howlett       2020-11-10  1818       
can_vma_merge_after(prev, vm_flags, NULL, file, pgoff,
059c8a0bb96791 Liam R. Howlett       2020-11-10  1819                           
NULL_VM_UFFD_CTX)) {
059c8a0bb96791 Liam R. Howlett       2020-11-10  1820           merge_start = 
prev->vm_start;
059c8a0bb96791 Liam R. Howlett       2020-11-10  1821           vma = prev;
059c8a0bb96791 Liam R. Howlett       2020-11-10  1822           vm_pgoff = 
prev->vm_pgoff;
059c8a0bb96791 Liam R. Howlett       2020-11-10  1823   }
059c8a0bb96791 Liam R. Howlett       2020-11-10  1824  
059c8a0bb96791 Liam R. Howlett       2020-11-10  1825  
059c8a0bb96791 Liam R. Howlett       2020-11-10  1826   /* Actually expand, if 
possible */
059c8a0bb96791 Liam R. Howlett       2020-11-10  1827   if (vma &&
059c8a0bb96791 Liam R. Howlett       2020-11-10  1828       !vma_expand(&mas, 
vma, merge_start, merge_end, vm_pgoff, next)) {
059c8a0bb96791 Liam R. Howlett       2020-11-10  1829           
khugepaged_enter_vma_merge(prev, vm_flags);
059c8a0bb96791 Liam R. Howlett       2020-11-10  1830           goto expanded;
059c8a0bb96791 Liam R. Howlett       2020-11-10  1831   }
059c8a0bb96791 Liam R. Howlett       2020-11-10  1832  
059c8a0bb96791 Liam R. Howlett       2020-11-10  1833   mas_set_range(&mas, 
addr, end - 1);
059c8a0bb96791 Liam R. Howlett       2020-11-10  1834  cannot_expand:
^1da177e4c3f41 Linus Torvalds        2005-04-16  1835   /*
^1da177e4c3f41 Linus Torvalds        2005-04-16  1836    * Determine the object 
being mapped and call the appropriate
^1da177e4c3f41 Linus Torvalds        2005-04-16  1837    * specific mapper. the 
address has already been validated, but
^1da177e4c3f41 Linus Torvalds        2005-04-16  1838    * not unmapped, but 
the maps are removed from the list.
^1da177e4c3f41 Linus Torvalds        2005-04-16  1839    */
490fc053865c9c Linus Torvalds        2018-07-21  1840   vma = vm_area_alloc(mm);
^1da177e4c3f41 Linus Torvalds        2005-04-16  1841   if (!vma) {
^1da177e4c3f41 Linus Torvalds        2005-04-16  1842           error = -ENOMEM;
^1da177e4c3f41 Linus Torvalds        2005-04-16  1843           goto 
unacct_error;
^1da177e4c3f41 Linus Torvalds        2005-04-16  1844   }
^1da177e4c3f41 Linus Torvalds        2005-04-16  1845  
^1da177e4c3f41 Linus Torvalds        2005-04-16  1846   vma->vm_start = addr;
059c8a0bb96791 Liam R. Howlett       2020-11-10  1847   vma->vm_end = end;
^1da177e4c3f41 Linus Torvalds        2005-04-16  1848   vma->vm_flags = 
vm_flags;
3ed75eb8f1cd89 Coly Li               2007-10-18  1849   vma->vm_page_prot = 
vm_get_page_prot(vm_flags);
^1da177e4c3f41 Linus Torvalds        2005-04-16  1850   vma->vm_pgoff = pgoff;
^1da177e4c3f41 Linus Torvalds        2005-04-16  1851  
^1da177e4c3f41 Linus Torvalds        2005-04-16  1852   if (file) {
^1da177e4c3f41 Linus Torvalds        2005-04-16  1853           if (vm_flags & 
VM_DENYWRITE) {
^1da177e4c3f41 Linus Torvalds        2005-04-16  1854                   error = 
deny_write_access(file);
^1da177e4c3f41 Linus Torvalds        2005-04-16  1855                   if 
(error)
^1da177e4c3f41 Linus Torvalds        2005-04-16  1856                           
goto free_vma;
^1da177e4c3f41 Linus Torvalds        2005-04-16  1857           }
4bb5f5d9395bc1 David Herrmann        2014-08-08  1858           if (vm_flags & 
VM_SHARED) {
4bb5f5d9395bc1 David Herrmann        2014-08-08  1859                   error = 
mapping_map_writable(file->f_mapping);
4bb5f5d9395bc1 David Herrmann        2014-08-08  1860                   if 
(error)
4bb5f5d9395bc1 David Herrmann        2014-08-08  1861                           
goto allow_write_and_free_vma;
4bb5f5d9395bc1 David Herrmann        2014-08-08  1862           }
4bb5f5d9395bc1 David Herrmann        2014-08-08  1863  
4bb5f5d9395bc1 David Herrmann        2014-08-08  1864           /* ->mmap() can 
change vma->vm_file, but must guarantee that
4bb5f5d9395bc1 David Herrmann        2014-08-08  1865            * vma_link() 
below can deny write-access if VM_DENYWRITE is set
4bb5f5d9395bc1 David Herrmann        2014-08-08  1866            * and map 
writably if VM_SHARED is set. This usually means the
4bb5f5d9395bc1 David Herrmann        2014-08-08  1867            * new file 
must not have been exposed to user-space, yet.
4bb5f5d9395bc1 David Herrmann        2014-08-08  1868            */
cb0942b8124979 Al Viro               2012-08-27  1869           vma->vm_file = 
get_file(file);
f74ac01520c9f6 Miklos Szeredi        2017-02-20  1870           error = 
call_mmap(file, vma);
^1da177e4c3f41 Linus Torvalds        2005-04-16  1871           if (error)
^1da177e4c3f41 Linus Torvalds        2005-04-16  1872                   goto 
unmap_and_free_vma;
^1da177e4c3f41 Linus Torvalds        2005-04-16  1873  
309d08d9b3a365 Liu Zixian            2020-12-05  1874           /* Can addr 
have changed??
309d08d9b3a365 Liu Zixian            2020-12-05  1875            *
309d08d9b3a365 Liu Zixian            2020-12-05  1876            * Answer: Yes, 
several device drivers can do it in their
309d08d9b3a365 Liu Zixian            2020-12-05  1877            *         
f_op->mmap method. -DaveM
309d08d9b3a365 Liu Zixian            2020-12-05  1878            * Bug: If addr 
is changed, prev, rb_link, rb_parent should
309d08d9b3a365 Liu Zixian            2020-12-05  1879            *      be 
updated for vma_link()
309d08d9b3a365 Liu Zixian            2020-12-05  1880            */
309d08d9b3a365 Liu Zixian            2020-12-05  1881           
WARN_ON_ONCE(addr != vma->vm_start);
309d08d9b3a365 Liu Zixian            2020-12-05  1882  
309d08d9b3a365 Liu Zixian            2020-12-05  1883           addr = 
vma->vm_start;
309d08d9b3a365 Liu Zixian            2020-12-05  1884  
d70cec8983241a Miaohe Lin            2020-08-06  1885           /* If vm_flags 
changed after call_mmap(), we should try merge vma again
d70cec8983241a Miaohe Lin            2020-08-06  1886            * as we may 
succeed this time.
d70cec8983241a Miaohe Lin            2020-08-06  1887            */
059c8a0bb96791 Liam R. Howlett       2020-11-10  1888           if 
(unlikely(vm_flags != vma->vm_flags && prev &&
059c8a0bb96791 Liam R. Howlett       2020-11-10  1889                        
prev->vm_end == addr && !vma_policy(prev) &&
059c8a0bb96791 Liam R. Howlett       2020-11-10  1890                        
can_vma_merge_after(prev, vm_flags, NULL, file,
059c8a0bb96791 Liam R. Howlett       2020-11-10  1891                           
                 pgoff, NULL_VM_UFFD_CTX))) {
059c8a0bb96791 Liam R. Howlett       2020-11-10  1892                   
merge_start = prev->vm_start;
059c8a0bb96791 Liam R. Howlett       2020-11-10  1893                   
vm_pgoff = prev->vm_pgoff;
059c8a0bb96791 Liam R. Howlett       2020-11-10  1894                   if 
(!vma_expand(&mas, prev, merge_start, merge_end,
059c8a0bb96791 Liam R. Howlett       2020-11-10 @1895                           
        vm_pgoff, next)) {
                                                                                
                  ^^^^
Warning here.  The code is too complicated to know if it's a false
positive.  Smatch is not very good about tracking bit masks and
particularly tests like "if (vm_flags & VM_SPECIAL)" are not tracked
accross function boundaries...

bc4fe4cdd602b3 Miaohe Lin            2020-10-10  1896                           
/* ->mmap() can change vma->vm_file and fput the original file. So
bc4fe4cdd602b3 Miaohe Lin            2020-10-10  1897                           
 * fput the vma->vm_file here or we would add an extra fput for file
bc4fe4cdd602b3 Miaohe Lin            2020-10-10  1898                           
 * and cause general protection fault ultimately.
bc4fe4cdd602b3 Miaohe Lin            2020-10-10  1899                           
 */
bc4fe4cdd602b3 Miaohe Lin            2020-10-10  1900                           
fput(vma->vm_file);
d70cec8983241a Miaohe Lin            2020-08-06  1901                           
vm_area_free(vma);
059c8a0bb96791 Liam R. Howlett       2020-11-10  1902                           
vma = prev;
059c8a0bb96791 Liam R. Howlett       2020-11-10  1903                           
/* Update vm_flags and possible addr to pick up the change. We don't
059c8a0bb96791 Liam R. Howlett       2020-11-10  1904                           
 * warn here if addr changed as the vma is not linked by vma_link().
059c8a0bb96791 Liam R. Howlett       2020-11-10  1905                           
 */
059c8a0bb96791 Liam R. Howlett       2020-11-10  1906                           
addr = vma->vm_start;
d70cec8983241a Miaohe Lin            2020-08-06  1907                           
vm_flags = vma->vm_flags;
d70cec8983241a Miaohe Lin            2020-08-06  1908                           
goto unmap_writable;
d70cec8983241a Miaohe Lin            2020-08-06  1909                   }
d70cec8983241a Miaohe Lin            2020-08-06  1910           }
d70cec8983241a Miaohe Lin            2020-08-06  1911  
^1da177e4c3f41 Linus Torvalds        2005-04-16  1912           vm_flags = 
vma->vm_flags;
f8dbf0a7a4c5d9 Huang Shijie          2009-09-21  1913   } else if (vm_flags & 
VM_SHARED) {
f8dbf0a7a4c5d9 Huang Shijie          2009-09-21  1914           error = 
shmem_zero_setup(vma);
f8dbf0a7a4c5d9 Huang Shijie          2009-09-21  1915           if (error)
f8dbf0a7a4c5d9 Huang Shijie          2009-09-21  1916                   goto 
free_vma;
bfd40eaff5abb9 Kirill A. Shutemov    2018-07-26  1917   } else {

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-...@lists.01.org

Attachment: .config.gz
Description: application/gzip

Reply via email to