From f148757110f160688b962d2d4897899a2ddbc8b8 Mon Sep 17 00:00:00 2001 From: CTCaer Date: Mon, 27 Apr 2020 09:41:13 +0300 Subject: [PATCH] hos: Disallow booting CFW if normal FS and exFAT sd This will stop black screens when user boots CFW with an exFAT sd card and without having the exFAT microupdate. --- bootloader/hos/hos.c | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/bootloader/hos/hos.c b/bootloader/hos/hos.c index b044cff..922a6ea 100644 --- a/bootloader/hos/hos.c +++ b/bootloader/hos/hos.c @@ -2,7 +2,7 @@ * Copyright (c) 2018 naehrwert * Copyright (c) 2018 st4rk * Copyright (c) 2018 Ced2911 - * Copyright (c) 2018-2019 CTCaer + * Copyright (c) 2018-2020 CTCaer * Copyright (c) 2018 balika011 * * This program is free software; you can redistribute it and/or modify it @@ -352,7 +352,7 @@ static int _read_emmc_pkg1(launch_ctxt_t *ctxt) if (!ctxt->pkg1_id) { _hos_crit_error("Unknown pkg1 version."); - EHPRINTFARGS("%sNot yet supported HOS version!", + EHPRINTFARGS("%sNot yet supported HOS version!", (emu_cfg.enabled && !h_cfg.emummc_force_disable) ? "Is emuMMC corrupt?\nOr " : ""); goto out; } @@ -436,6 +436,37 @@ static void _free_launch_components(launch_ctxt_t *ctxt) free(ctxt->kip1_patches); } +static bool _get_fs_exfat_compatible(link_t *info) +{ + u32 fs_idx; + u32 fs_ids_cnt; + u32 sha_buf[32 / sizeof(u32)]; + kip1_id_t *kip_ids; + + LIST_FOREACH_ENTRY(pkg2_kip1_info_t, ki, info, link) + { + if (strncmp((const char*)ki->kip1->name, "FS", 2)) + continue; + + if (!se_calc_sha256(sha_buf, ki->kip1, ki->size)) + break; + + pkg2_get_ids(&kip_ids, &fs_ids_cnt); + + for (fs_idx = 0; fs_idx < fs_ids_cnt; fs_idx++) + if (!memcmp(sha_buf, kip_ids[fs_idx].hash, 8)) + break; + + // Return false if FAT32 only. + if (fs_ids_cnt <= fs_idx && !(fs_idx & 1)) + return false; + + break; + } + + return true; +} + int hos_launch(ini_sec_t *cfg) { minerva_change_freq(FREQ_1600); @@ -643,6 +674,15 @@ int hos_launch(ini_sec_t *cfg) LIST_FOREACH_ENTRY(merge_kip_t, mki, &ctxt.kip1_list, link) pkg2_merge_kip(&kip1_info, (pkg2_kip1_t *)mki->kip1); + // Check if FS is compatible with exFAT. + if (!ctxt.stock && sd_fs.fs_type == FS_EXFAT && !_get_fs_exfat_compatible(&kip1_info)) + { + _hos_crit_error("Your SD Card is exFAT and the installed\nFS only supports FAT32!"); + + _free_launch_components(&ctxt); + return 0; + } + // Patch kip1s in memory if needed. const char* unappliedPatch = pkg2_patch_kips(&kip1_info, ctxt.kip1_patches); if (unappliedPatch != NULL)