Re: [PATCH v2 2/3] exportfs: allow fs to disable CAP_DAC_READ_SEARCH check

kernel test robot
2024-11-13T22:50:48Z

Hi Erin,

kernel test robot noticed the following build errors:

[auto build test ERROR on 14b6320953a3f856a3f93bf9a0e423395baa593d]

url: https://github.com/intel-lab-lkp/linux/commits/Erin-Shepherd/pseudofs-add-support-for-export_ops/20241114-020539
base: 14b6320953a3f856a3f93bf9a0e423395baa593d
patch link: https://lore.kernel.org/r/20241113-pidfs_fh-v2-2-9a4d28155a37%40e43.eu
patch subject: [PATCH v2 2/3] exportfs: allow fs to disable CAP_DAC_READ_SEARCH check
config: x86_64-allnoconfig (https://download.01.org/0day-ci/archive/20241114/202411140603.E03vXsdz-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/20241114/202411140603.E03vXsdz-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/202411140603.E03vXsdz-lkp@intel.com/

All errors (new ones prefixed by >>):

In file included from fs/fhandle.c:2:
In file included from include/linux/syscalls.h:93:
In file included from include/trace/syscall.h:7:
In file included from include/linux/trace_events.h:6:
In file included from include/linux/ring_buffer.h:5:
In file included from include/linux/mm.h:2213:
include/linux/vmstat.h:518:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
518 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
| ~~~~~~~~~~~ ^ ~~~
>> fs/fhandle.c:242:28: error: initializing 'struct export_operations *' with an expression of type 'const struct export_operations *' discards qualifiers [-Werror,-Wincompatible-pointer-types-discards-qualifiers]
242 | struct export_operations *nop = root->mnt->mnt_sb->s_export_op;
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning and 1 error generated.

vim +242 fs/fhandle.c

237
238 static inline bool may_decode_fh(struct handle_to_path_ctx *ctx,
239 unsigned int o_flags)
240 {
241 struct path *root = &ctx->root;
> 242 struct export_operations *nop = root->mnt->mnt_sb->s_export_op;
243
244 if (nop && nop->flags & EXPORT_OP_UNRESTRICTED_OPEN)
245 return true;
246
247 if (capable(CAP_DAC_READ_SEARCH))
248 return true;
249
250 /*
251 * Allow relaxed permissions of file handles if the caller has the
252 * ability to mount the filesystem or create a bind-mount of the
253 * provided @mountdirfd.
254 *
255 * In both cases the caller may be able to get an unobstructed way to
256 * the encoded file handle. If the caller is only able to create a
257 * bind-mount we need to verify that there are no locked mounts on top
258 * of it that could prevent us from getting to the encoded file.
259 *
260 * In principle, locked mounts can prevent the caller from mounting the
261 * filesystem but that only applies to procfs and sysfs neither of which
262 * support decoding file handles.
263 *
264 * Restrict to O_DIRECTORY to provide a deterministic API that avoids a
265 * confusing api in the face of disconnected non-dir dentries.
266 *
267 * There's only one dentry for each directory inode (VFS rule)...
268 */
269 if (!(o_flags & O_DIRECTORY))
270 return false;
271
272 if (ns_capable(root->mnt->mnt_sb->s_user_ns, CAP_SYS_ADMIN))
273 ctx->flags = HANDLE_CHECK_PERMS;
274 else if (is_mounted(root->mnt) &&
275 ns_capable(real_mount(root->mnt)->mnt_ns->user_ns,
276 CAP_SYS_ADMIN) &&
277 !has_locked_children(real_mount(root->mnt), root->dentry))
278 ctx->flags = HANDLE_CHECK_PERMS | HANDLE_CHECK_SUBTREE;
279 else
280 return false;
281
282 /* Are we able to override DAC permissions? */
283 if (!ns_capable(current_user_ns(), CAP_DAC_READ_SEARCH))
284 return false;
285
286 ctx->fh_flags = EXPORT_FH_DIR_ONLY;
287 return true;
288 }
289

--
0-DAY CI Kernel Test Service