blob: aa61d09f87482058b455006f8d55e9ddb4bca15d [file] [log] [blame]
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 <assert.h>
# endif
+# ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+# 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;
}