From 85058f5d9caa0f9768b155c8963eaed6aa989ed5 Mon Sep 17 00:00:00 2001 From: Peter D'Hoye Date: Wed, 10 Oct 2007 23:26:17 +0000 Subject: Fix FS #5852 by trying to properly close and update the recorded file, and give the FAT the correct file info. Add filehandle checks to some file functions. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15072 a1c6a512-1295-4272-9138-f99709370657 --- firmware/common/file.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'firmware/common/file.c') diff --git a/firmware/common/file.c b/firmware/common/file.c index ea2471ae92..9cab001e8d 100644 --- a/firmware/common/file.c +++ b/firmware/common/file.c @@ -278,14 +278,22 @@ int fsync(int fd) if ( file->dirty ) { rc = flush_cache(fd); if (rc < 0) + { + /* when failing, try to close the file anyway */ + fat_closewrite(&(file->fatfile), file->size, file->attr); return rc * 10 - 3; + } } /* truncate? */ if (file->trunc) { rc = ftruncate(fd, file->size); if (rc < 0) + { + /* when failing, try to close the file anyway */ + fat_closewrite(&(file->fatfile), file->size, file->attr); return rc * 10 - 4; + } } /* tie up all loose ends */ @@ -475,6 +483,10 @@ static int readwrite(int fd, void* buf, long count, bool write) struct filedesc* file = &openfiles[fd]; int rc; + if (fd < 0 || fd > MAX_OPEN_FILES-1) { + errno = EINVAL; + return -1; + } if ( !file->busy ) { errno = EBADF; return -1; @@ -643,6 +655,10 @@ off_t lseek(int fd, off_t offset, int whence) LDEBUGF("lseek(%d,%ld,%d)\n",fd,offset,whence); + if (fd < 0 || fd > MAX_OPEN_FILES-1) { + errno = EINVAL; + return -1; + } if ( !file->busy ) { errno = EBADF; return -1; @@ -716,6 +732,10 @@ off_t filesize(int fd) { struct filedesc* file = &openfiles[fd]; + if (fd < 0 || fd > MAX_OPEN_FILES-1) { + errno = EINVAL; + return -1; + } if ( !file->busy ) { errno = EBADF; return -1; @@ -743,3 +763,4 @@ int release_files(int volume) return closed; /* return how many we did */ } #endif /* #ifdef HAVE_HOTSWAP */ + -- cgit v1.2.3