All of lore.kernel.org
 help / color / mirror / Atom feed
* [brauner-vfs:vfs.all 11/48] fs/notify/fanotify/fanotify_user.c:2004:13: warning: variable 'obj' is used uninitialized whenever 'if' condition is false
@ 2025-02-05 16:16 kernel test robot
  2025-02-05 16:20 ` Christian Brauner
  0 siblings, 1 reply; 2+ messages in thread
From: kernel test robot @ 2025-02-05 16:16 UTC (permalink / raw)
  To: Miklos Szeredi; +Cc: llvm, oe-kbuild-all, Christian Brauner, Christian Brauner

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git vfs.all
head:   b7601b2abc4dbae86d85da3939ce185eac2ed4ff
commit: 21c1471c81dc7fd8de1f47d74cef9efc91356971 [11/48] fanotify: notify on mount attach and detach
config: i386-buildonly-randconfig-005-20250205 (https://download.01.org/0day-ci/archive/20250206/202502060049.cygRkOiu-lkp@intel.com/config)
compiler: clang version 19.1.3 (https://github.com/llvm/llvm-project ab51eccf88f5321e7c60591c5546b254b6afab99)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250206/202502060049.cygRkOiu-lkp@intel.com/reproduce)

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>
| Closes: https://lore.kernel.org/oe-kbuild-all/202502060049.cygRkOiu-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> fs/notify/fanotify/fanotify_user.c:2004:13: warning: variable 'obj' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized]
    2004 |         } else if (obj_type == FSNOTIFY_OBJ_TYPE_MNTNS) {
         |                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/notify/fanotify/fanotify_user.c:2009:7: note: uninitialized use occurs here
    2009 |         if (!obj)
         |              ^~~
   fs/notify/fanotify/fanotify_user.c:2004:9: note: remove the 'if' if its condition is always true
    2004 |         } else if (obj_type == FSNOTIFY_OBJ_TYPE_MNTNS) {
         |                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/notify/fanotify/fanotify_user.c:1819:11: note: initialize the variable 'obj' to silence this warning
    1819 |         void *obj;
         |                  ^
         |                   = NULL
   1 warning generated.


vim +2004 fs/notify/fanotify/fanotify_user.c

  1806	
  1807	static int do_fanotify_mark(int fanotify_fd, unsigned int flags, __u64 mask,
  1808				    int dfd, const char  __user *pathname)
  1809	{
  1810		struct inode *inode = NULL;
  1811		struct fsnotify_group *group;
  1812		struct path path;
  1813		struct fan_fsid __fsid, *fsid = NULL;
  1814		u32 valid_mask = FANOTIFY_EVENTS | FANOTIFY_EVENT_FLAGS;
  1815		unsigned int mark_type = flags & FANOTIFY_MARK_TYPE_BITS;
  1816		unsigned int mark_cmd = flags & FANOTIFY_MARK_CMD_BITS;
  1817		unsigned int ignore = flags & FANOTIFY_MARK_IGNORE_BITS;
  1818		unsigned int obj_type, fid_mode;
  1819		void *obj;
  1820		u32 umask = 0;
  1821		int ret;
  1822	
  1823		pr_debug("%s: fanotify_fd=%d flags=%x dfd=%d pathname=%p mask=%llx\n",
  1824			 __func__, fanotify_fd, flags, dfd, pathname, mask);
  1825	
  1826		/* we only use the lower 32 bits as of right now. */
  1827		if (upper_32_bits(mask))
  1828			return -EINVAL;
  1829	
  1830		if (flags & ~FANOTIFY_MARK_FLAGS)
  1831			return -EINVAL;
  1832	
  1833		switch (mark_type) {
  1834		case FAN_MARK_INODE:
  1835			obj_type = FSNOTIFY_OBJ_TYPE_INODE;
  1836			break;
  1837		case FAN_MARK_MOUNT:
  1838			obj_type = FSNOTIFY_OBJ_TYPE_VFSMOUNT;
  1839			break;
  1840		case FAN_MARK_FILESYSTEM:
  1841			obj_type = FSNOTIFY_OBJ_TYPE_SB;
  1842			break;
  1843		case FAN_MARK_MNTNS:
  1844			obj_type = FSNOTIFY_OBJ_TYPE_MNTNS;
  1845			break;
  1846		default:
  1847			return -EINVAL;
  1848		}
  1849	
  1850		switch (mark_cmd) {
  1851		case FAN_MARK_ADD:
  1852		case FAN_MARK_REMOVE:
  1853			if (!mask)
  1854				return -EINVAL;
  1855			break;
  1856		case FAN_MARK_FLUSH:
  1857			if (flags & ~(FANOTIFY_MARK_TYPE_BITS | FAN_MARK_FLUSH))
  1858				return -EINVAL;
  1859			break;
  1860		default:
  1861			return -EINVAL;
  1862		}
  1863	
  1864		if (IS_ENABLED(CONFIG_FANOTIFY_ACCESS_PERMISSIONS))
  1865			valid_mask |= FANOTIFY_PERM_EVENTS;
  1866	
  1867		if (mask & ~valid_mask)
  1868			return -EINVAL;
  1869	
  1870	
  1871		/* We don't allow FAN_MARK_IGNORE & FAN_MARK_IGNORED_MASK together */
  1872		if (ignore == (FAN_MARK_IGNORE | FAN_MARK_IGNORED_MASK))
  1873			return -EINVAL;
  1874	
  1875		/*
  1876		 * Event flags (FAN_ONDIR, FAN_EVENT_ON_CHILD) have no effect with
  1877		 * FAN_MARK_IGNORED_MASK.
  1878		 */
  1879		if (ignore == FAN_MARK_IGNORED_MASK) {
  1880			mask &= ~FANOTIFY_EVENT_FLAGS;
  1881			umask = FANOTIFY_EVENT_FLAGS;
  1882		}
  1883	
  1884		CLASS(fd, f)(fanotify_fd);
  1885		if (fd_empty(f))
  1886			return -EBADF;
  1887	
  1888		/* verify that this is indeed an fanotify instance */
  1889		if (unlikely(fd_file(f)->f_op != &fanotify_fops))
  1890			return -EINVAL;
  1891		group = fd_file(f)->private_data;
  1892	
  1893		/* Only report mount events on mnt namespace */
  1894		if (FAN_GROUP_FLAG(group, FAN_REPORT_MNT)) {
  1895			if (mask & ~FANOTIFY_MOUNT_EVENTS)
  1896				return -EINVAL;
  1897			if (mark_type != FAN_MARK_MNTNS)
  1898				return -EINVAL;
  1899		} else {
  1900			if (mask & FANOTIFY_MOUNT_EVENTS)
  1901				return -EINVAL;
  1902			if (mark_type == FAN_MARK_MNTNS)
  1903				return -EINVAL;
  1904		}
  1905	
  1906		/*
  1907		 * An unprivileged user is not allowed to setup mount nor filesystem
  1908		 * marks.  This also includes setting up such marks by a group that
  1909		 * was initialized by an unprivileged user.
  1910		 */
  1911		if ((!capable(CAP_SYS_ADMIN) ||
  1912		     FAN_GROUP_FLAG(group, FANOTIFY_UNPRIV)) &&
  1913		    mark_type != FAN_MARK_INODE)
  1914			return -EPERM;
  1915	
  1916		/*
  1917		 * Permission events are not allowed for FAN_CLASS_NOTIF.
  1918		 * Pre-content permission events are not allowed for FAN_CLASS_CONTENT.
  1919		 */
  1920		if (mask & FANOTIFY_PERM_EVENTS &&
  1921		    group->priority == FSNOTIFY_PRIO_NORMAL)
  1922			return -EINVAL;
  1923		else if (mask & FANOTIFY_PRE_CONTENT_EVENTS &&
  1924			 group->priority == FSNOTIFY_PRIO_CONTENT)
  1925			return -EINVAL;
  1926	
  1927		if (mask & FAN_FS_ERROR &&
  1928		    mark_type != FAN_MARK_FILESYSTEM)
  1929			return -EINVAL;
  1930	
  1931		/*
  1932		 * Evictable is only relevant for inode marks, because only inode object
  1933		 * can be evicted on memory pressure.
  1934		 */
  1935		if (flags & FAN_MARK_EVICTABLE &&
  1936		     mark_type != FAN_MARK_INODE)
  1937			return -EINVAL;
  1938	
  1939		/*
  1940		 * Events that do not carry enough information to report
  1941		 * event->fd require a group that supports reporting fid.  Those
  1942		 * events are not supported on a mount mark, because they do not
  1943		 * carry enough information (i.e. path) to be filtered by mount
  1944		 * point.
  1945		 */
  1946		fid_mode = FAN_GROUP_FLAG(group, FANOTIFY_FID_BITS);
  1947		if (mask & ~(FANOTIFY_FD_EVENTS|FANOTIFY_MOUNT_EVENTS|FANOTIFY_EVENT_FLAGS) &&
  1948		    (!fid_mode || mark_type == FAN_MARK_MOUNT))
  1949			return -EINVAL;
  1950	
  1951		/*
  1952		 * FAN_RENAME uses special info type records to report the old and
  1953		 * new parent+name.  Reporting only old and new parent id is less
  1954		 * useful and was not implemented.
  1955		 */
  1956		if (mask & FAN_RENAME && !(fid_mode & FAN_REPORT_NAME))
  1957			return -EINVAL;
  1958	
  1959		/* Pre-content events are not currently generated for directories. */
  1960		if (mask & FANOTIFY_PRE_CONTENT_EVENTS && mask & FAN_ONDIR)
  1961			return -EINVAL;
  1962	
  1963		if (mark_cmd == FAN_MARK_FLUSH) {
  1964			if (mark_type == FAN_MARK_MOUNT)
  1965				fsnotify_clear_vfsmount_marks_by_group(group);
  1966			else if (mark_type == FAN_MARK_FILESYSTEM)
  1967				fsnotify_clear_sb_marks_by_group(group);
  1968			else
  1969				fsnotify_clear_inode_marks_by_group(group);
  1970			return 0;
  1971		}
  1972	
  1973		ret = fanotify_find_path(dfd, pathname, &path, flags,
  1974				(mask & ALL_FSNOTIFY_EVENTS), obj_type);
  1975		if (ret)
  1976			return ret;
  1977	
  1978		if (mark_cmd == FAN_MARK_ADD) {
  1979			ret = fanotify_events_supported(group, &path, mask, flags);
  1980			if (ret)
  1981				goto path_put_and_out;
  1982		}
  1983	
  1984		if (fid_mode) {
  1985			ret = fanotify_test_fsid(path.dentry, flags, &__fsid);
  1986			if (ret)
  1987				goto path_put_and_out;
  1988	
  1989			ret = fanotify_test_fid(path.dentry, flags);
  1990			if (ret)
  1991				goto path_put_and_out;
  1992	
  1993			fsid = &__fsid;
  1994		}
  1995	
  1996		/* inode held in place by reference to path; group by fget on fd */
  1997		if (obj_type == FSNOTIFY_OBJ_TYPE_INODE) {
  1998			inode = path.dentry->d_inode;
  1999			obj = inode;
  2000		} else if (obj_type == FSNOTIFY_OBJ_TYPE_VFSMOUNT) {
  2001			obj = path.mnt;
  2002		} else if (obj_type == FSNOTIFY_OBJ_TYPE_SB) {
  2003			obj = path.mnt->mnt_sb;
> 2004		} else if (obj_type == FSNOTIFY_OBJ_TYPE_MNTNS) {
  2005			obj = mnt_ns_from_dentry(path.dentry);
  2006		}
  2007	
  2008		ret = -EINVAL;
  2009		if (!obj)
  2010			goto path_put_and_out;
  2011	
  2012		/*
  2013		 * If some other task has this inode open for write we should not add
  2014		 * an ignore mask, unless that ignore mask is supposed to survive
  2015		 * modification changes anyway.
  2016		 */
  2017		if (mark_cmd == FAN_MARK_ADD && (flags & FANOTIFY_MARK_IGNORE_BITS) &&
  2018		    !(flags & FAN_MARK_IGNORED_SURV_MODIFY)) {
  2019			ret = !inode ? -EINVAL : -EISDIR;
  2020			/* FAN_MARK_IGNORE requires SURV_MODIFY for sb/mount/dir marks */
  2021			if (ignore == FAN_MARK_IGNORE &&
  2022			    (!inode || S_ISDIR(inode->i_mode)))
  2023				goto path_put_and_out;
  2024	
  2025			ret = 0;
  2026			if (inode && inode_is_open_for_write(inode))
  2027				goto path_put_and_out;
  2028		}
  2029	
  2030		/* Mask out FAN_EVENT_ON_CHILD flag for sb/mount/non-dir marks */
  2031		if (!inode || !S_ISDIR(inode->i_mode)) {
  2032			mask &= ~FAN_EVENT_ON_CHILD;
  2033			umask = FAN_EVENT_ON_CHILD;
  2034			/*
  2035			 * If group needs to report parent fid, register for getting
  2036			 * events with parent/name info for non-directory.
  2037			 */
  2038			if ((fid_mode & FAN_REPORT_DIR_FID) &&
  2039			    (flags & FAN_MARK_ADD) && !ignore)
  2040				mask |= FAN_EVENT_ON_CHILD;
  2041		}
  2042	
  2043		/* create/update an inode mark */
  2044		switch (mark_cmd) {
  2045		case FAN_MARK_ADD:
  2046			ret = fanotify_add_mark(group, obj, obj_type, mask, flags,
  2047						fsid);
  2048			break;
  2049		case FAN_MARK_REMOVE:
  2050			ret = fanotify_remove_mark(group, obj, obj_type, mask, flags,
  2051						   umask);
  2052			break;
  2053		default:
  2054			ret = -EINVAL;
  2055		}
  2056	
  2057	path_put_and_out:
  2058		path_put(&path);
  2059		return ret;
  2060	}
  2061	

-- 
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:[~2025-02-05 16:21 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-05 16:16 [brauner-vfs:vfs.all 11/48] fs/notify/fanotify/fanotify_user.c:2004:13: warning: variable 'obj' is used uninitialized whenever 'if' condition is false kernel test robot
2025-02-05 16:20 ` Christian Brauner

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.