forked from len0rd/rockbox
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
This commit is contained in:
parent
bcdb3217de
commit
85058f5d9c
6 changed files with 33 additions and 6 deletions
|
|
@ -2329,7 +2329,8 @@ static bool on_start_file(struct enc_file_event_data *data)
|
|||
|
||||
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;
|
||||
|
|
|
|||
|
|
@ -144,8 +144,7 @@ static bool on_end_file(struct enc_file_event_data *data)
|
|||
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 @@ enum codec_status codec_main(void)
|
|||
|
||||
/* reset parameters to initial state */
|
||||
ci->enc_set_parameters(NULL);
|
||||
|
||||
|
||||
/* main application waits for this flag during encoder removing */
|
||||
ci->enc_codec_loaded = 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -257,8 +257,7 @@ static bool on_end_file(struct enc_file_event_data *data)
|
|||
|
||||
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 ||
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
||||
|
|
|
|||
|
|
@ -2084,6 +2084,8 @@ long fat_readwrite( struct fat_file *file, long sectorcount,
|
|||
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 @@ long fat_readwrite( struct fat_file *file, long sectorcount,
|
|||
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;
|
||||
|
|
|
|||
|
|
@ -901,7 +901,10 @@ static void pcmrec_flush(unsigned flush_num)
|
|||
INC_ENC_INDEX(enc_rd_index);
|
||||
|
||||
if (errors != 0)
|
||||
{
|
||||
pcmrec_end_file();
|
||||
break;
|
||||
}
|
||||
|
||||
if (flush_num == PCMREC_FLUSH_MINI &&
|
||||
++chunks_flushed >= MINI_CHUNKS)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue