diff -ur -x '*.lo' -x '*.o' -x config.h -x config.log libid3tag-0.15.1b/file.c libid3tag-0.15.1b-fixed/file.c --- libid3tag-0.15.1b/file.c 2004-01-23 12:41:32.000000000 +0300 +++ libid3tag-0.15.1b-fixed/file.c 2005-05-24 23:34:08.000000000 +0400 @@ -37,6 +37,10 @@ # include # endif +# ifdef HAVE_SYS_STAT_H +# include +# endif + # include "id3tag.h" # include "file.h" # include "tag.h" @@ -575,6 +579,10 @@ int v2_write(struct id3_file *file, id3_byte_t const *data, id3_length_t length) { + struct stat st; + char *buffer; + id3_length_t datalen, offset; + assert(!data || length > 0); if (data && @@ -592,9 +600,25 @@ } /* hard general case: rewrite entire file */ + if (stat(file->path, &st) == -1) + return -1; - /* ... */ + offset = file->tags ? file->tags[0].length : 0; + datalen = st.st_size - offset; + if ((buffer = (char *) malloc(datalen)) == NULL) + return -1; + if (fseek(file->iofile, offset, SEEK_SET) == -1 || + fread(buffer, datalen, 1, file->iofile) != 1 || + fseek(file->iofile, 0, SEEK_SET) == -1 || + fwrite(data, length, 1, file->iofile) != 1 || + fwrite(buffer, datalen, 1, file->iofile) != 1 || + fflush(file->iofile) == EOF) { + free(buffer); + return -1; + } + free(buffer); + done: return 0; }