From 8240eea180b594f58492cfa382b1af4ac6339e27 Mon Sep 17 00:00:00 2001 From: Martin Vychodil Date: Tue, 7 Apr 2026 12:15:51 +0200 Subject: [PATCH] fix(fatfs): Fixed VFS adapter early return paths --- components/fatfs/vfs/vfs_fat.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/components/fatfs/vfs/vfs_fat.c b/components/fatfs/vfs/vfs_fat.c index b19f8c10d0..d5fb97a809 100644 --- a/components/fatfs/vfs/vfs_fat.c +++ b/components/fatfs/vfs/vfs_fat.c @@ -562,7 +562,12 @@ static ssize_t vfs_fat_pwrite(void *ctx, int fd, const void *src, size_t size, o f_res = f_write(file, src, size, &wr); if (((wr == 0) && (size != 0)) && (f_res == 0)) { errno = ENOSPC; - return -1; + ret = -1; + FRESULT seek_res = f_lseek(file, prev_pos); + if (seek_res != FR_OK) { + ESP_LOGE(TAG, "%s: f_lseek restore after ENOSPC write failed (fresult=%d)", __func__, seek_res); + } + goto pwrite_release; } if (f_res == FR_OK) { ret = wr; @@ -1026,7 +1031,7 @@ static void vfs_fat_seekdir(void* ctx, DIR* pdir, long offset) if (res != FR_OK) { ESP_LOGD(TAG, "%s: rewinddir fresult=%d", __func__, res); errno = fresult_to_errno(res); - return; + goto seekdir_done; } fat_dir->offset = 0; } @@ -1035,10 +1040,11 @@ static void vfs_fat_seekdir(void* ctx, DIR* pdir, long offset) if (res != FR_OK) { ESP_LOGD(TAG, "%s: f_readdir fresult=%d", __func__, res); errno = fresult_to_errno(res); - return; + goto seekdir_done; } fat_dir->offset++; } +seekdir_done: _lock_release(&fat_ctx->lock); }