]> granicus.if.org Git - esp-idf/commitdiff
fat/sdmmc: unmount FATFS object on error
authorIvan Grokhotkov <ivan@espressif.com>
Wed, 19 Apr 2017 07:03:30 +0000 (15:03 +0800)
committerIvan Grokhotkov <ivan@espressif.com>
Wed, 19 Apr 2017 07:03:30 +0000 (15:03 +0800)
Failure to call f_mount(NULL,...) makes FATFS attempt to clean up the old
FS object upon next mount. If previous mount operation has failed, some
parts of FS object may not be fully initialized, which will cause errors
(such as attempting to delete a mutex which wasn’t allocated).

components/fatfs/src/vfs_fat_sdmmc.c

index a9e5362dc5f3d5905bd35553569fd8654d5f3188..edbc2c12edbf260bcf768eb6a419b6a7a51e75b5 100644 (file)
@@ -34,6 +34,7 @@ esp_err_t esp_vfs_fat_sdmmc_mount(const char* base_path,
 {
     const size_t workbuf_size = 4096;
     void* workbuf = NULL;
+    FATFS* fs = NULL;
 
     if (s_card != NULL) {
         return ESP_ERR_INVALID_STATE;
@@ -82,7 +83,6 @@ esp_err_t esp_vfs_fat_sdmmc_mount(const char* base_path,
     char drv[3] = {(char)('0' + pdrv), ':', 0};
 
     // connect FATFS to VFS
-    FATFS* fs;
     err = esp_vfs_fat_register(base_path, drv, mount_config->max_files, &fs);
     if (err == ESP_ERR_INVALID_STATE) {
         // it's okay, already registered with VFS
@@ -129,6 +129,9 @@ esp_err_t esp_vfs_fat_sdmmc_mount(const char* base_path,
 fail:
     sdmmc_host_deinit();
     free(workbuf);
+    if (fs) {
+        f_mount(NULL, drv, 0);
+    }
     esp_vfs_fat_unregister_path(base_path);
     ff_diskio_unregister(pdrv);
     free(s_card);