All of lore.kernel.org
 help / color / mirror / Atom feed
* fs/proc/task_mmu.c:467 do_procmap_query() warn: comparison of a potentially tagged address (do_procmap_query, -2, usize)
@ 2024-11-20 18:10 kernel test robot
  0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2024-11-20 18:10 UTC (permalink / raw)
  To: oe-kbuild; +Cc: lkp, Dan Carpenter

BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
CC: linux-kernel@vger.kernel.org
TO: Andrii Nakryiko <andrii@kernel.org>
CC: Andrew Morton <akpm@linux-foundation.org>
CC: Linux Memory Management List <linux-mm@kvack.org>

Hi Andrii,

First bad commit (maybe != root cause):

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   bf9aa14fc523d2763fc9a10672a709224e8fcaf4
commit: bfc69fd05ef9b6416f4811aafafb7f2b34daa000 fs/procfs: add build ID fetching to PROCMAP_QUERY API
date:   4 months ago
:::::: branch date: 18 hours ago
:::::: commit date: 4 months ago
config: arm64-randconfig-r073-20241119 (https://download.01.org/0day-ci/archive/20241121/202411210252.5UK5fy4Z-lkp@intel.com/config)
compiler: aarch64-linux-gcc (GCC) 14.2.0

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202411210252.5UK5fy4Z-lkp@intel.com/

New smatch warnings:
fs/proc/task_mmu.c:467 do_procmap_query() warn: comparison of a potentially tagged address (do_procmap_query, -2, usize)

Old smatch warnings:
fs/proc/task_mmu.c:2675 pagemap_scan_get_args() warn: potential user controlled sizeof overflow 'arg->vec_len * 24' '0-u64max * 24'

vim +467 fs/proc/task_mmu.c

ed5d583a88a9207 Andrii Nakryiko 2024-06-27  453  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  454  static int do_procmap_query(struct proc_maps_private *priv, void __user *uarg)
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  455  {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  456  	struct procmap_query karg;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  457  	struct vm_area_struct *vma;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  458  	struct mm_struct *mm;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  459  	const char *name = NULL;
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  460  	char build_id_buf[BUILD_ID_SIZE_MAX], *name_buf = NULL;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  461  	__u64 usize;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  462  	int err;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  463  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  464  	if (copy_from_user(&usize, (void __user *)uarg, sizeof(usize)))
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  465  		return -EFAULT;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  466  	/* argument struct can never be that large, reject abuse */
ed5d583a88a9207 Andrii Nakryiko 2024-06-27 @467  	if (usize > PAGE_SIZE)
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  468  		return -E2BIG;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  469  	/* argument struct should have at least query_flags and query_addr fields */
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  470  	if (usize < offsetofend(struct procmap_query, query_addr))
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  471  		return -EINVAL;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  472  	err = copy_struct_from_user(&karg, sizeof(karg), uarg, usize);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  473  	if (err)
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  474  		return err;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  475  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  476  	/* reject unknown flags */
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  477  	if (karg.query_flags & ~PROCMAP_QUERY_VALID_FLAGS_MASK)
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  478  		return -EINVAL;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  479  	/* either both buffer address and size are set, or both should be zero */
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  480  	if (!!karg.vma_name_size != !!karg.vma_name_addr)
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  481  		return -EINVAL;
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  482  	if (!!karg.build_id_size != !!karg.build_id_addr)
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  483  		return -EINVAL;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  484  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  485  	mm = priv->mm;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  486  	if (!mm || !mmget_not_zero(mm))
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  487  		return -ESRCH;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  488  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  489  	err = query_vma_setup(mm);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  490  	if (err) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  491  		mmput(mm);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  492  		return err;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  493  	}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  494  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  495  	vma = query_matching_vma(mm, karg.query_addr, karg.query_flags);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  496  	if (IS_ERR(vma)) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  497  		err = PTR_ERR(vma);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  498  		vma = NULL;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  499  		goto out;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  500  	}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  501  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  502  	karg.vma_start = vma->vm_start;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  503  	karg.vma_end = vma->vm_end;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  504  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  505  	karg.vma_flags = 0;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  506  	if (vma->vm_flags & VM_READ)
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  507  		karg.vma_flags |= PROCMAP_QUERY_VMA_READABLE;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  508  	if (vma->vm_flags & VM_WRITE)
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  509  		karg.vma_flags |= PROCMAP_QUERY_VMA_WRITABLE;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  510  	if (vma->vm_flags & VM_EXEC)
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  511  		karg.vma_flags |= PROCMAP_QUERY_VMA_EXECUTABLE;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  512  	if (vma->vm_flags & VM_MAYSHARE)
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  513  		karg.vma_flags |= PROCMAP_QUERY_VMA_SHARED;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  514  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  515  	karg.vma_page_size = vma_kernel_pagesize(vma);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  516  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  517  	if (vma->vm_file) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  518  		const struct inode *inode = file_user_inode(vma->vm_file);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  519  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  520  		karg.vma_offset = ((__u64)vma->vm_pgoff) << PAGE_SHIFT;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  521  		karg.dev_major = MAJOR(inode->i_sb->s_dev);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  522  		karg.dev_minor = MINOR(inode->i_sb->s_dev);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  523  		karg.inode = inode->i_ino;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  524  	} else {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  525  		karg.vma_offset = 0;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  526  		karg.dev_major = 0;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  527  		karg.dev_minor = 0;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  528  		karg.inode = 0;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  529  	}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  530  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  531  	if (karg.build_id_size) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  532  		__u32 build_id_sz;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  533  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  534  		err = build_id_parse(vma, build_id_buf, &build_id_sz);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  535  		if (err) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  536  			karg.build_id_size = 0;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  537  		} else {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  538  			if (karg.build_id_size < build_id_sz) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  539  				err = -ENAMETOOLONG;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  540  				goto out;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  541  			}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  542  			karg.build_id_size = build_id_sz;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  543  		}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  544  	}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  545  
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  546  	if (karg.build_id_size) {
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  547  		__u32 build_id_sz;
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  548  
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  549  		err = build_id_parse(vma, build_id_buf, &build_id_sz);
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  550  		if (err) {
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  551  			karg.build_id_size = 0;
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  552  		} else {
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  553  			if (karg.build_id_size < build_id_sz) {
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  554  				err = -ENAMETOOLONG;
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  555  				goto out;
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  556  			}
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  557  			karg.build_id_size = build_id_sz;
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  558  		}
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  559  	}
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  560  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  561  	if (karg.vma_name_size) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  562  		size_t name_buf_sz = min_t(size_t, PATH_MAX, karg.vma_name_size);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  563  		const struct path *path;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  564  		const char *name_fmt;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  565  		size_t name_sz = 0;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  566  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  567  		get_vma_name(vma, &path, &name, &name_fmt);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  568  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  569  		if (path || name_fmt || name) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  570  			name_buf = kmalloc(name_buf_sz, GFP_KERNEL);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  571  			if (!name_buf) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  572  				err = -ENOMEM;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  573  				goto out;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  574  			}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  575  		}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  576  		if (path) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  577  			name = d_path(path, name_buf, name_buf_sz);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  578  			if (IS_ERR(name)) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  579  				err = PTR_ERR(name);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  580  				goto out;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  581  			}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  582  			name_sz = name_buf + name_buf_sz - name;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  583  		} else if (name || name_fmt) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  584  			name_sz = 1 + snprintf(name_buf, name_buf_sz, name_fmt ?: "%s", name);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  585  			name = name_buf;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  586  		}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  587  		if (name_sz > name_buf_sz) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  588  			err = -ENAMETOOLONG;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  589  			goto out;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  590  		}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  591  		karg.vma_name_size = name_sz;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  592  	}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  593  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  594  	/* unlock vma or mmap_lock, and put mm_struct before copying data to user */
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  595  	query_vma_teardown(mm, vma);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  596  	mmput(mm);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  597  
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  598  	if (karg.vma_name_size && copy_to_user(u64_to_user_ptr(karg.vma_name_addr),
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  599  					       name, karg.vma_name_size)) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  600  		kfree(name_buf);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  601  		return -EFAULT;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  602  	}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  603  	kfree(name_buf);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  604  
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  605  	if (karg.build_id_size && copy_to_user(u64_to_user_ptr(karg.build_id_addr),
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  606  					       build_id_buf, karg.build_id_size))
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  607  		return -EFAULT;
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  608  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  609  	if (copy_to_user(uarg, &karg, min_t(size_t, sizeof(karg), usize)))
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  610  		return -EFAULT;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  611  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  612  	return 0;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  613  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  614  out:
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  615  	query_vma_teardown(mm, vma);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  616  	mmput(mm);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  617  	kfree(name_buf);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  618  	return err;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  619  }
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  620  

:::::: The code at line 467 was first introduced by commit
:::::: ed5d583a88a9207b866c14ba834984c6f3c51d23 fs/procfs: implement efficient VMA querying API for /proc/<pid>/maps

:::::: TO: Andrii Nakryiko <andrii@kernel.org>
:::::: CC: Andrew Morton <akpm@linux-foundation.org>

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 2+ messages in thread

* fs/proc/task_mmu.c:467 do_procmap_query() warn: comparison of a potentially tagged address (do_procmap_query, -2, usize)
@ 2024-12-16 22:21 kernel test robot
  0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2024-12-16 22:21 UTC (permalink / raw)
  To: oe-kbuild; +Cc: lkp, Dan Carpenter

BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
CC: linux-kernel@vger.kernel.org
TO: Andrii Nakryiko <andrii@kernel.org>
CC: Andrew Morton <akpm@linux-foundation.org>
CC: Linux Memory Management List <linux-mm@kvack.org>

Hi Andrii,

First bad commit (maybe != root cause):

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   78d4f34e2115b517bcbfe7ec0d018bbbb6f9b0b8
commit: bfc69fd05ef9b6416f4811aafafb7f2b34daa000 fs/procfs: add build ID fetching to PROCMAP_QUERY API
date:   5 months ago
:::::: branch date: 22 hours ago
:::::: commit date: 5 months ago
config: arm64-randconfig-r073-20241207 (https://download.01.org/0day-ci/archive/20241217/202412170634.DRhrET92-lkp@intel.com/config)
compiler: aarch64-linux-gcc (GCC) 14.2.0

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202412170634.DRhrET92-lkp@intel.com/

New smatch warnings:
fs/proc/task_mmu.c:467 do_procmap_query() warn: comparison of a potentially tagged address (do_procmap_query, -2, usize)

Old smatch warnings:
fs/proc/task_mmu.c:2675 pagemap_scan_get_args() warn: potential user controlled sizeof overflow 'arg->vec_len * 24' '0-u64max * 24'

vim +467 fs/proc/task_mmu.c

ed5d583a88a9207 Andrii Nakryiko 2024-06-27  453  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  454  static int do_procmap_query(struct proc_maps_private *priv, void __user *uarg)
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  455  {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  456  	struct procmap_query karg;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  457  	struct vm_area_struct *vma;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  458  	struct mm_struct *mm;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  459  	const char *name = NULL;
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  460  	char build_id_buf[BUILD_ID_SIZE_MAX], *name_buf = NULL;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  461  	__u64 usize;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  462  	int err;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  463  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  464  	if (copy_from_user(&usize, (void __user *)uarg, sizeof(usize)))
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  465  		return -EFAULT;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  466  	/* argument struct can never be that large, reject abuse */
ed5d583a88a9207 Andrii Nakryiko 2024-06-27 @467  	if (usize > PAGE_SIZE)
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  468  		return -E2BIG;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  469  	/* argument struct should have at least query_flags and query_addr fields */
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  470  	if (usize < offsetofend(struct procmap_query, query_addr))
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  471  		return -EINVAL;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  472  	err = copy_struct_from_user(&karg, sizeof(karg), uarg, usize);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  473  	if (err)
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  474  		return err;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  475  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  476  	/* reject unknown flags */
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  477  	if (karg.query_flags & ~PROCMAP_QUERY_VALID_FLAGS_MASK)
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  478  		return -EINVAL;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  479  	/* either both buffer address and size are set, or both should be zero */
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  480  	if (!!karg.vma_name_size != !!karg.vma_name_addr)
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  481  		return -EINVAL;
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  482  	if (!!karg.build_id_size != !!karg.build_id_addr)
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  483  		return -EINVAL;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  484  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  485  	mm = priv->mm;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  486  	if (!mm || !mmget_not_zero(mm))
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  487  		return -ESRCH;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  488  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  489  	err = query_vma_setup(mm);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  490  	if (err) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  491  		mmput(mm);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  492  		return err;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  493  	}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  494  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  495  	vma = query_matching_vma(mm, karg.query_addr, karg.query_flags);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  496  	if (IS_ERR(vma)) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  497  		err = PTR_ERR(vma);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  498  		vma = NULL;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  499  		goto out;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  500  	}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  501  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  502  	karg.vma_start = vma->vm_start;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  503  	karg.vma_end = vma->vm_end;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  504  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  505  	karg.vma_flags = 0;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  506  	if (vma->vm_flags & VM_READ)
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  507  		karg.vma_flags |= PROCMAP_QUERY_VMA_READABLE;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  508  	if (vma->vm_flags & VM_WRITE)
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  509  		karg.vma_flags |= PROCMAP_QUERY_VMA_WRITABLE;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  510  	if (vma->vm_flags & VM_EXEC)
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  511  		karg.vma_flags |= PROCMAP_QUERY_VMA_EXECUTABLE;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  512  	if (vma->vm_flags & VM_MAYSHARE)
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  513  		karg.vma_flags |= PROCMAP_QUERY_VMA_SHARED;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  514  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  515  	karg.vma_page_size = vma_kernel_pagesize(vma);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  516  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  517  	if (vma->vm_file) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  518  		const struct inode *inode = file_user_inode(vma->vm_file);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  519  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  520  		karg.vma_offset = ((__u64)vma->vm_pgoff) << PAGE_SHIFT;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  521  		karg.dev_major = MAJOR(inode->i_sb->s_dev);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  522  		karg.dev_minor = MINOR(inode->i_sb->s_dev);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  523  		karg.inode = inode->i_ino;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  524  	} else {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  525  		karg.vma_offset = 0;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  526  		karg.dev_major = 0;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  527  		karg.dev_minor = 0;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  528  		karg.inode = 0;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  529  	}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  530  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  531  	if (karg.build_id_size) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  532  		__u32 build_id_sz;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  533  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  534  		err = build_id_parse(vma, build_id_buf, &build_id_sz);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  535  		if (err) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  536  			karg.build_id_size = 0;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  537  		} else {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  538  			if (karg.build_id_size < build_id_sz) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  539  				err = -ENAMETOOLONG;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  540  				goto out;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  541  			}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  542  			karg.build_id_size = build_id_sz;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  543  		}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  544  	}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  545  
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  546  	if (karg.build_id_size) {
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  547  		__u32 build_id_sz;
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  548  
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  549  		err = build_id_parse(vma, build_id_buf, &build_id_sz);
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  550  		if (err) {
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  551  			karg.build_id_size = 0;
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  552  		} else {
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  553  			if (karg.build_id_size < build_id_sz) {
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  554  				err = -ENAMETOOLONG;
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  555  				goto out;
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  556  			}
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  557  			karg.build_id_size = build_id_sz;
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  558  		}
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  559  	}
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  560  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  561  	if (karg.vma_name_size) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  562  		size_t name_buf_sz = min_t(size_t, PATH_MAX, karg.vma_name_size);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  563  		const struct path *path;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  564  		const char *name_fmt;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  565  		size_t name_sz = 0;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  566  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  567  		get_vma_name(vma, &path, &name, &name_fmt);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  568  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  569  		if (path || name_fmt || name) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  570  			name_buf = kmalloc(name_buf_sz, GFP_KERNEL);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  571  			if (!name_buf) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  572  				err = -ENOMEM;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  573  				goto out;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  574  			}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  575  		}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  576  		if (path) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  577  			name = d_path(path, name_buf, name_buf_sz);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  578  			if (IS_ERR(name)) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  579  				err = PTR_ERR(name);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  580  				goto out;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  581  			}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  582  			name_sz = name_buf + name_buf_sz - name;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  583  		} else if (name || name_fmt) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  584  			name_sz = 1 + snprintf(name_buf, name_buf_sz, name_fmt ?: "%s", name);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  585  			name = name_buf;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  586  		}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  587  		if (name_sz > name_buf_sz) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  588  			err = -ENAMETOOLONG;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  589  			goto out;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  590  		}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  591  		karg.vma_name_size = name_sz;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  592  	}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  593  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  594  	/* unlock vma or mmap_lock, and put mm_struct before copying data to user */
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  595  	query_vma_teardown(mm, vma);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  596  	mmput(mm);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  597  
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  598  	if (karg.vma_name_size && copy_to_user(u64_to_user_ptr(karg.vma_name_addr),
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  599  					       name, karg.vma_name_size)) {
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  600  		kfree(name_buf);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  601  		return -EFAULT;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  602  	}
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  603  	kfree(name_buf);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  604  
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  605  	if (karg.build_id_size && copy_to_user(u64_to_user_ptr(karg.build_id_addr),
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  606  					       build_id_buf, karg.build_id_size))
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  607  		return -EFAULT;
bfc69fd05ef9b64 Andrii Nakryiko 2024-06-27  608  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  609  	if (copy_to_user(uarg, &karg, min_t(size_t, sizeof(karg), usize)))
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  610  		return -EFAULT;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  611  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  612  	return 0;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  613  
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  614  out:
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  615  	query_vma_teardown(mm, vma);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  616  	mmput(mm);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  617  	kfree(name_buf);
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  618  	return err;
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  619  }
ed5d583a88a9207 Andrii Nakryiko 2024-06-27  620  

:::::: The code at line 467 was first introduced by commit
:::::: ed5d583a88a9207b866c14ba834984c6f3c51d23 fs/procfs: implement efficient VMA querying API for /proc/<pid>/maps

:::::: TO: Andrii Nakryiko <andrii@kernel.org>
:::::: CC: Andrew Morton <akpm@linux-foundation.org>

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2024-12-16 22:22 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-16 22:21 fs/proc/task_mmu.c:467 do_procmap_query() warn: comparison of a potentially tagged address (do_procmap_query, -2, usize) kernel test robot
  -- strict thread matches above, loose matches on Subject: below --
2024-11-20 18:10 kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.