diff options
author | Tom Rini <trini@konsulko.com> | 2017-09-22 14:37:43 +0300 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2017-09-22 14:37:43 +0300 |
commit | 2460098cffacd18729262e3ed36656e6943783ed (patch) | |
tree | 1c23bcec4fbcb250aeb5667aff8287751abafaea /fs/fat/fat.c | |
parent | 2dc5b553b9bcd701bd7abd60f99f407cb0c37762 (diff) | |
download | u-boot-2460098cffacd18729262e3ed36656e6943783ed.tar.xz |
fs/fat: Reduce stack usage
We have limited stack in SPL builds. Drop itrblock and move to
malloc/free of itr to move this off of the stack. As part of this fix a
double-free issue in fat_size().
Signed-off-by: Tom Rini <trini@konsulko.com>
---
Rework to use malloc/free as moving this to a global overflows some SH
targets.
Diffstat (limited to 'fs/fat/fat.c')
-rw-r--r-- | fs/fat/fat.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/fs/fat/fat.c b/fs/fat/fat.c index f0284398b4..36a309c73c 100644 --- a/fs/fat/fat.c +++ b/fs/fat/fat.c @@ -1034,24 +1034,27 @@ int file_fat_detectfs(void) int fat_exists(const char *filename) { fsdata fsdata; - fat_itr itrblock, *itr = &itrblock; + fat_itr *itr; int ret; + itr = malloc(sizeof(fat_itr)); ret = fat_itr_root(itr, &fsdata); if (ret) return 0; ret = fat_itr_resolve(itr, filename, TYPE_ANY); free(fsdata.fatbuf); + free(itr); return ret == 0; } int fat_size(const char *filename, loff_t *size) { fsdata fsdata; - fat_itr itrblock, *itr = &itrblock; + fat_itr *itr; int ret; + itr = malloc(sizeof(fat_itr)); ret = fat_itr_root(itr, &fsdata); if (ret) return ret; @@ -1072,8 +1075,9 @@ int fat_size(const char *filename, loff_t *size) } *size = FAT2CPU32(itr->dent->size); -out: free(fsdata.fatbuf); +out: + free(itr); return ret; } @@ -1081,9 +1085,10 @@ int file_fat_read_at(const char *filename, loff_t pos, void *buffer, loff_t maxsize, loff_t *actread) { fsdata fsdata; - fat_itr itrblock, *itr = &itrblock; + fat_itr *itr; int ret; + itr = malloc(sizeof(fat_itr)); ret = fat_itr_root(itr, &fsdata); if (ret) return ret; @@ -1097,6 +1102,7 @@ int file_fat_read_at(const char *filename, loff_t pos, void *buffer, out: free(fsdata.fatbuf); + free(itr); return ret; } |