lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Thu, 20 Sep 2018 12:00:41 +0930
From:   Joel Stanley <joel@....id.au>
To:     Richard Weinberger <richard@....at>,
        Greg KH <gregkh@...uxfoundation.org>
Cc:     linux-mtd@...ts.infradead.org,
        Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
        koen.vandeputte@...ntric.com, Eddie James <eajames.ibm@...il.com>
Subject: Re: [PATCH] Revert "ubifs: xattr: Don't operate on deleted inodes"

On Mon, 17 Sep 2018 at 07:30, Richard Weinberger <richard@....at> wrote:
>
> This reverts commit 11a6fc3dc743e22fb50f2196ec55bee5140d3c52.
> UBIFS wants to assert that xattr operations are only issued on files
> with positive link count. The said patch made this operations return
> -ENOENT for unlinked files such that the asserts will no longer trigger.
> This was wrong since xattr operations are perfectly fine on unlinked
> files.
> Instead the assertions need to be fixed/removed.
>
> Cc: <stable@...r.kernel.org>
> Fixes: 11a6fc3dc743 ("ubifs: xattr: Don't operate on deleted inodes")
> Reported-by: Koen Vandeputte <koen.vandeputte@...ntric.com>
> Signed-off-by: Richard Weinberger <richard@....at>

The bad commit 11a6fc3dc743 was included in 4.18.7, and broke our
systems which use overlayfs on top of ubifs.

This patch didn't apply cleanly for me to 4.18.8 (an encoding issue?),
but I did a revert of the offending commit which did the trick.

Tested-by: Joel Stanley <joel@....id.au>

Cheers,

Joel


> ---
>  fs/ubifs/xattr.c | 24 ------------------------
>  1 file changed, 24 deletions(-)
>
> diff --git a/fs/ubifs/xattr.c b/fs/ubifs/xattr.c
> index 61afdfee4b28..f5ad1ede7990 100644
> --- a/fs/ubifs/xattr.c
> +++ b/fs/ubifs/xattr.c
> @@ -152,12 +152,6 @@ static int create_xattr(struct ubifs_info *c, struct inode *host,
>         ui->data_len = size;
>
>         mutex_lock(&host_ui->ui_mutex);
> -
> -       if (!host->i_nlink) {
> -               err = -ENOENT;
> -               goto out_noent;
> -       }
> -
>         host->i_ctime = current_time(host);
>         host_ui->xattr_cnt += 1;
>         host_ui->xattr_size += CALC_DENT_SIZE(fname_len(nm));
> @@ -190,7 +184,6 @@ static int create_xattr(struct ubifs_info *c, struct inode *host,
>         host_ui->xattr_size -= CALC_XATTR_BYTES(size);
>         host_ui->xattr_names -= fname_len(nm);
>         host_ui->flags &= ~UBIFS_CRYPT_FL;
> -out_noent:
>         mutex_unlock(&host_ui->ui_mutex);
>  out_free:
>         make_bad_inode(inode);
> @@ -242,12 +235,6 @@ static int change_xattr(struct ubifs_info *c, struct inode *host,
>         mutex_unlock(&ui->ui_mutex);
>
>         mutex_lock(&host_ui->ui_mutex);
> -
> -       if (!host->i_nlink) {
> -               err = -ENOENT;
> -               goto out_noent;
> -       }
> -
>         host->i_ctime = current_time(host);
>         host_ui->xattr_size -= CALC_XATTR_BYTES(old_size);
>         host_ui->xattr_size += CALC_XATTR_BYTES(size);
> @@ -269,7 +256,6 @@ static int change_xattr(struct ubifs_info *c, struct inode *host,
>  out_cancel:
>         host_ui->xattr_size -= CALC_XATTR_BYTES(size);
>         host_ui->xattr_size += CALC_XATTR_BYTES(old_size);
> -out_noent:
>         mutex_unlock(&host_ui->ui_mutex);
>         make_bad_inode(inode);
>  out_free:
> @@ -496,12 +482,6 @@ static int remove_xattr(struct ubifs_info *c, struct inode *host,
>                 return err;
>
>         mutex_lock(&host_ui->ui_mutex);
> -
> -       if (!host->i_nlink) {
> -               err = -ENOENT;
> -               goto out_noent;
> -       }
> -
>         host->i_ctime = current_time(host);
>         host_ui->xattr_cnt -= 1;
>         host_ui->xattr_size -= CALC_DENT_SIZE(fname_len(nm));
> @@ -521,7 +501,6 @@ static int remove_xattr(struct ubifs_info *c, struct inode *host,
>         host_ui->xattr_size += CALC_DENT_SIZE(fname_len(nm));
>         host_ui->xattr_size += CALC_XATTR_BYTES(ui->data_len);
>         host_ui->xattr_names += fname_len(nm);
> -out_noent:
>         mutex_unlock(&host_ui->ui_mutex);
>         ubifs_release_budget(c, &req);
>         make_bad_inode(inode);
> @@ -561,9 +540,6 @@ static int ubifs_xattr_remove(struct inode *host, const char *name)
>
>         ubifs_assert(c, inode_is_locked(host));
>
> -       if (!host->i_nlink)
> -               return -ENOENT;
> -
>         if (fname_len(&nm) > UBIFS_MAX_NLEN)
>                 return -ENAMETOOLONG;
>
> --
> 2.19.0
>

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ