Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c31f1f3f authored by Paul Crowley's avatar Paul Crowley
Browse files

Check for breadcrumbs only where relevant

Don't look for breadcrumb files like convert_fde unless the fstab
flags indicate we actually care whether they are present or absent.

Bug: 26989796
Change-Id: I3cde9896b22fc6f5a4b63dc3f97ac4e3588b5568
parent b71e8970
Loading
Loading
Loading
Loading
+25 −22
Original line number Diff line number Diff line
@@ -440,26 +440,32 @@ out:
    return ret;
}

// Check to see if a mountable volume has encryption requirements
static int handle_encryptable(const struct fstab_rec* rec)
static bool needs_block_encryption(const struct fstab_rec* rec)
{
    /* Check for existence of convert_fbe breadcrumb file */
    if (device_is_force_encrypted() && fs_mgr_is_encryptable(rec)) return true;
    if (rec->fs_mgr_flags & MF_FORCECRYPT) return true;
    if (rec->fs_mgr_flags & MF_CRYPT) {
        /* Check for existence of convert_fde breadcrumb file */
        char convert_fde_name[PATH_MAX];
        snprintf(convert_fde_name, sizeof(convert_fde_name),
                 "%s/misc/vold/convert_fde", rec->mount_point);
        if (access(convert_fde_name, F_OK) == 0) return true;
    }
    if (rec->fs_mgr_flags & MF_FORCEFDEORFBE) {
        /* Check for absence of convert_fbe breadcrumb file */
        char convert_fbe_name[PATH_MAX];
        snprintf(convert_fbe_name, sizeof(convert_fbe_name),
                 "%s/convert_fbe", rec->mount_point);
    bool convert_fbe = (access(convert_fbe_name, F_OK) == 0);

    /* Check for existence of convert_fbe breadcrumb file */
    char convert_fde_name[PATH_MAX];
    snprintf(convert_fde_name, sizeof(convert_fbe_name),
             "%s/misc/vold/convert_fde", rec->mount_point);
    bool convert_fde = (access(convert_fde_name, F_OK) == 0);
        if (access(convert_fbe_name, F_OK) != 0) return true;
    }
    return false;
}

// Check to see if a mountable volume has encryption requirements
static int handle_encryptable(const struct fstab_rec* rec)
{
    /* If this is block encryptable, need to trigger encryption */
    if (   (rec->fs_mgr_flags & MF_FORCECRYPT)
        || ((rec->fs_mgr_flags & MF_CRYPT) && convert_fde)
        || ((rec->fs_mgr_flags & MF_FORCEFDEORFBE) && !convert_fbe)
        || (device_is_force_encrypted() && fs_mgr_is_encryptable(rec))) {
    if (needs_block_encryption(rec)) {
        if (umount(rec->mount_point) == 0) {
            return FS_MGR_MNTALL_DEV_NEEDS_ENCRYPTION;
        } else {
@@ -467,17 +473,14 @@ static int handle_encryptable(const struct fstab_rec* rec)
                    rec->mount_point, strerror(errno));
            return FS_MGR_MNTALL_DEV_NOT_ENCRYPTED;
        }
    }

    } else if (rec->fs_mgr_flags & (MF_FILEENCRYPTION | MF_FORCEFDEORFBE)) {
    // Deal with file level encryption
    if (   (rec->fs_mgr_flags & MF_FILEENCRYPTION)
        || ((rec->fs_mgr_flags & MF_FORCEFDEORFBE) && convert_fbe)) {
        INFO("%s is file encrypted\n", rec->mount_point);
        return FS_MGR_MNTALL_DEV_FILE_ENCRYPTED;
    }

    } else {
        return FS_MGR_MNTALL_DEV_NOT_ENCRYPTED;
    }
}

/* When multiple fstab records share the same mount_point, it will
 * try to mount each one in turn, and ignore any duplicates after a