lkml.org 
[lkml]   [2018]   [Nov]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 039/205] udf: Prevent write-unsupported filesystem to be remounted read-write
    Date
    4.19-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Jan Kara <jack@suse.cz>

    [ Upstream commit a9ad01bc759df79b0012f43ee52164391e31cd96 ]

    There are certain filesystem features which we support for reading but
    not for writing. We properly refuse to mount such filesystems read-write
    however for some features (such as read-only partitions), we don't check
    for these features when remounting the filesystem from read-only to
    read-write. Thus such filesystems could be remounted read-write leading
    to strange behavior (most likely crashes).

    Fix the problem by marking in superblock whether the filesystem has some
    features that are supported in read-only mode and check this flag during
    remount.

    Signed-off-by: Jan Kara <jack@suse.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    fs/udf/super.c | 30 ++++++++++++++++--------------
    fs/udf/udf_sb.h | 2 ++
    2 files changed, 18 insertions(+), 14 deletions(-)

    --- a/fs/udf/super.c
    +++ b/fs/udf/super.c
    @@ -613,14 +613,11 @@ static int udf_remount_fs(struct super_b
    struct udf_options uopt;
    struct udf_sb_info *sbi = UDF_SB(sb);
    int error = 0;
    - struct logicalVolIntegrityDescImpUse *lvidiu = udf_sb_lvidiu(sb);
    +
    + if (!(*flags & SB_RDONLY) && UDF_QUERY_FLAG(sb, UDF_FLAG_RW_INCOMPAT))
    + return -EACCES;

    sync_filesystem(sb);
    - if (lvidiu) {
    - int write_rev = le16_to_cpu(lvidiu->minUDFWriteRev);
    - if (write_rev > UDF_MAX_WRITE_VERSION && !(*flags & SB_RDONLY))
    - return -EACCES;
    - }

    uopt.flags = sbi->s_flags;
    uopt.uid = sbi->s_uid;
    @@ -1257,6 +1254,7 @@ static int udf_load_partdesc(struct supe
    ret = -EACCES;
    goto out_bh;
    }
    + UDF_SET_FLAG(sb, UDF_FLAG_RW_INCOMPAT);
    ret = udf_load_vat(sb, i, type1_idx);
    if (ret < 0)
    goto out_bh;
    @@ -2155,10 +2153,12 @@ static int udf_fill_super(struct super_b
    UDF_MAX_READ_VERSION);
    ret = -EINVAL;
    goto error_out;
    - } else if (minUDFWriteRev > UDF_MAX_WRITE_VERSION &&
    - !sb_rdonly(sb)) {
    - ret = -EACCES;
    - goto error_out;
    + } else if (minUDFWriteRev > UDF_MAX_WRITE_VERSION) {
    + if (!sb_rdonly(sb)) {
    + ret = -EACCES;
    + goto error_out;
    + }
    + UDF_SET_FLAG(sb, UDF_FLAG_RW_INCOMPAT);
    }

    sbi->s_udfrev = minUDFWriteRev;
    @@ -2176,10 +2176,12 @@ static int udf_fill_super(struct super_b
    }

    if (sbi->s_partmaps[sbi->s_partition].s_partition_flags &
    - UDF_PART_FLAG_READ_ONLY &&
    - !sb_rdonly(sb)) {
    - ret = -EACCES;
    - goto error_out;
    + UDF_PART_FLAG_READ_ONLY) {
    + if (!sb_rdonly(sb)) {
    + ret = -EACCES;
    + goto error_out;
    + }
    + UDF_SET_FLAG(sb, UDF_FLAG_RW_INCOMPAT);
    }

    if (udf_find_fileset(sb, &fileset, &rootdir)) {
    --- a/fs/udf/udf_sb.h
    +++ b/fs/udf/udf_sb.h
    @@ -30,6 +30,8 @@
    #define UDF_FLAG_LASTBLOCK_SET 16
    #define UDF_FLAG_BLOCKSIZE_SET 17
    #define UDF_FLAG_INCONSISTENT 18
    +#define UDF_FLAG_RW_INCOMPAT 19 /* Set when we find RW incompatible
    + * feature */

    #define UDF_PART_FLAG_UNALLOC_BITMAP 0x0001
    #define UDF_PART_FLAG_UNALLOC_TABLE 0x0002

    \
     
     \ /
      Last update: 2018-11-19 19:08    [W:4.407 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site