From: Dan Carpenter <dan.carpenter@linaro.org>
To: Al Viro <viro@zeniv.linux.org.uk>
Cc: ecryptfs@vger.kernel.org
Subject: [bug report] ecryptfs: get rid of pointless mount references in ecryptfs dentries
Date: Mon, 8 Sep 2025 09:45:11 +0300 [thread overview]
Message-ID: <aL57d7vS51ATFmR0@stanley.mountain> (raw)
Hello Al Viro,
Commit 386e98ec6285 ("ecryptfs: get rid of pointless mount references
in ecryptfs dentries") from Jul 24, 2025 (linux-next), leads to the
following Smatch static checker warning:
fs/ecryptfs/main.c:545 ecryptfs_get_tree()
warn: pointer dereferenced without being set 'sbi'
fs/ecryptfs/main.c
433 static int ecryptfs_get_tree(struct fs_context *fc)
434 {
435 struct super_block *s;
436 struct ecryptfs_fs_context *ctx = fc->fs_private;
437 struct ecryptfs_sb_info *sbi = fc->s_fs_info;
438 struct ecryptfs_mount_crypt_stat *mount_crypt_stat;
439 const char *err = "Getting sb failed";
440 struct inode *inode;
441 struct path path;
442 int rc;
443
444 if (!fc->source) {
445 rc = -EINVAL;
446 err = "Device name cannot be null";
447 goto out;
448 }
449
450 mount_crypt_stat = &sbi->mount_crypt_stat;
451 rc = ecryptfs_validate_options(fc);
452 if (rc) {
453 err = "Error validating options";
454 goto out;
455 }
456
457 s = sget_fc(fc, NULL, set_anon_super_fc);
458 if (IS_ERR(s)) {
459 rc = PTR_ERR(s);
460 goto out;
461 }
462
463 rc = super_setup_bdi(s);
464 if (rc)
465 goto out1;
466
467 ecryptfs_set_superblock_private(s, sbi);
468
469 /* ->kill_sb() will take care of sbi after that point */
470 sbi = NULL;
^^^^^^^^^^^
sbi is set to NULL
471 s->s_op = &ecryptfs_sops;
472 s->s_xattr = ecryptfs_xattr_handlers;
473 set_default_d_op(s, &ecryptfs_dops);
474
475 err = "Reading sb failed";
476 rc = kern_path(fc->source, LOOKUP_FOLLOW | LOOKUP_DIRECTORY, &path);
477 if (rc) {
478 ecryptfs_printk(KERN_WARNING, "kern_path() failed\n");
479 goto out1;
480 }
481 if (path.dentry->d_sb->s_type == &ecryptfs_fs_type) {
482 rc = -EINVAL;
483 printk(KERN_ERR "Mount on filesystem of type "
484 "eCryptfs explicitly disallowed due to "
485 "known incompatibilities\n");
486 goto out_free;
487 }
488
489 if (is_idmapped_mnt(path.mnt)) {
490 rc = -EINVAL;
491 printk(KERN_ERR "Mounting on idmapped mounts currently disallowed\n");
492 goto out_free;
493 }
494
495 if (ctx->check_ruid &&
496 !uid_eq(d_inode(path.dentry)->i_uid, current_uid())) {
497 rc = -EPERM;
498 printk(KERN_ERR "Mount of device (uid: %d) not owned by "
499 "requested user (uid: %d)\n",
500 i_uid_read(d_inode(path.dentry)),
501 from_kuid(&init_user_ns, current_uid()));
502 goto out_free;
503 }
504
505 ecryptfs_set_superblock_lower(s, path.dentry->d_sb);
506
507 /**
508 * Set the POSIX ACL flag based on whether they're enabled in the lower
509 * mount.
510 */
511 s->s_flags = fc->sb_flags & ~SB_POSIXACL;
512 s->s_flags |= path.dentry->d_sb->s_flags & SB_POSIXACL;
513
514 /**
515 * Force a read-only eCryptfs mount when:
516 * 1) The lower mount is ro
517 * 2) The ecryptfs_encrypted_view mount option is specified
518 */
519 if (sb_rdonly(path.dentry->d_sb) || mount_crypt_stat->flags & ECRYPTFS_ENCRYPTED_VIEW_ENABLED)
520 s->s_flags |= SB_RDONLY;
521
522 s->s_maxbytes = path.dentry->d_sb->s_maxbytes;
523 s->s_blocksize = path.dentry->d_sb->s_blocksize;
524 s->s_magic = ECRYPTFS_SUPER_MAGIC;
525 s->s_stack_depth = path.dentry->d_sb->s_stack_depth + 1;
526
527 rc = -EINVAL;
528 if (s->s_stack_depth > FILESYSTEM_MAX_STACK_DEPTH) {
529 pr_err("eCryptfs: maximum fs stacking depth exceeded\n");
530 goto out_free;
531 }
532
533 inode = ecryptfs_get_inode(d_inode(path.dentry), s);
534 rc = PTR_ERR(inode);
535 if (IS_ERR(inode))
536 goto out_free;
537
538 s->s_root = d_make_root(inode);
539 if (!s->s_root) {
540 rc = -ENOMEM;
541 goto out_free;
542 }
543
544 ecryptfs_set_dentry_lower(s->s_root, path.dentry);
--> 545 sbi->lower_mnt = path.mnt;
^^^^^^^^^^^^^^
The patch adds a NULL pointer dereference.
546
547 s->s_flags |= SB_ACTIVE;
548 fc->root = dget(s->s_root);
549 return 0;
550
551 out_free:
552 path_put(&path);
553 out1:
554 deactivate_locked_super(s);
555 out:
556 if (sbi)
557 ecryptfs_destroy_mount_crypt_stat(&sbi->mount_crypt_stat);
558
559 printk(KERN_ERR "%s; rc = [%d]\n", err, rc);
560 return rc;
561 }
regards,
dan carpenter
reply other threads:[~2025-09-08 6:45 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aL57d7vS51ATFmR0@stanley.mountain \
--to=dan.carpenter@linaro.org \
--cc=ecryptfs@vger.kernel.org \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox