Index: apps/codecs/mp3_enc.c =================================================================== --- apps/codecs/mp3_enc.c (revision 15040) +++ apps/codecs/mp3_enc.c (working copy) @@ -2329,7 +2329,8 @@ static bool on_end_file(struct enc_file_event_data *data) { - if (!is_file_data_ok(data) || ci->close(data->rec_file) != 0) + /* always _try_ to write the file header, even on error */ + if (ci->close(data->rec_file) != 0) return false; data->rec_file = -1; Index: apps/codecs/wavpack_enc.c =================================================================== --- apps/codecs/wavpack_enc.c (revision 15040) +++ apps/codecs/wavpack_enc.c (working copy) @@ -257,8 +257,7 @@ uint32_t data_size; - if (!is_file_data_ok(data)) - return false; + /* always _try_ to write the file header, even on error */ /* read template headers at start */ if (ci->lseek(data->rec_file, 0, SEEK_SET) != 0 || Index: apps/codecs/wav_enc.c =================================================================== --- apps/codecs/wav_enc.c (revision 15040) +++ apps/codecs/wav_enc.c (working copy) @@ -144,8 +144,7 @@ struct riff_header hdr; uint32_t data_size; - if (!is_file_data_ok(data)) - return false; + /* always _try_ to write the file header, even on error */ if (ci->lseek(data->rec_file, 0, SEEK_SET) != 0 || ci->read(data->rec_file, &hdr, sizeof (hdr)) != sizeof (hdr)) @@ -387,7 +386,7 @@ /* reset parameters to initial state */ ci->enc_set_parameters(NULL); - + /* main application waits for this flag during encoder removing */ ci->enc_codec_loaded = 0; Index: firmware/common/file.c =================================================================== --- firmware/common/file.c (revision 15040) +++ firmware/common/file.c (working copy) @@ -7,7 +7,7 @@ * \/ \/ \/ \/ \/ * $Id$ * - * Copyright (C) 2002 by Björn Stenberg + * Copyright (C) 2002 by Björn Stenberg * * All files in this archive are subject to the GNU General Public License. * See the file COPYING in the source tree root for full license agreement. @@ -278,14 +278,22 @@ 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 @@ 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 @@ 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 @@ { 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 @@ return closed; /* return how many we did */ } #endif /* #ifdef HAVE_HOTSWAP */ + Index: firmware/pcm_record.c =================================================================== --- firmware/pcm_record.c (revision 15040) +++ firmware/pcm_record.c (working copy) @@ -901,7 +901,10 @@ INC_ENC_INDEX(enc_rd_index); if (errors != 0) + { + pcmrec_end_file(); break; + } if (flush_num == PCMREC_FLUSH_MINI && ++chunks_flushed >= MINI_CHUNKS) Index: firmware/drivers/fat.c =================================================================== --- firmware/drivers/fat.c (revision 15040) +++ firmware/drivers/fat.c (working copy) @@ -2084,6 +2084,8 @@ numsec++; if ( numsec > (long)fat_bpb->bpb_secperclus || !cluster ) { long oldcluster = cluster; + long oldsector = sector; + long oldnumsec = numsec; if (write) cluster = next_write_cluster(file, cluster, §or); else { @@ -2099,7 +2101,9 @@ if ( write ) { /* remember last cluster, in case we want to append to the file */ + sector = oldsector; cluster = oldcluster; + numsec = oldnumsec; clusternum--; i = -1; /* Error code */ break;