summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alexey Yakovenko <wakeroid@gmail.com>2010-04-01 16:16:42 +0200
committerGravatar Alexey Yakovenko <wakeroid@gmail.com>2010-04-01 16:16:42 +0200
commit31a9125937554dcf1a02be252fe174ac7ac11590 (patch)
tree77ce4c2168163862e2d3e25c8dda75bd1bacba86
parent9183e3d1c54fae7be902ced6dd06f41546ec2e8e (diff)
fixed possible segfault in junk_id3v2_read_full when reading replaygain info from TXXX frame
-rw-r--r--deadbeef.h1
-rw-r--r--junklib.c7
-rw-r--r--plugins/mpgmad/mpgmad.c2
3 files changed, 7 insertions, 3 deletions
diff --git a/deadbeef.h b/deadbeef.h
index 9294da11..2b5777ff 100644
--- a/deadbeef.h
+++ b/deadbeef.h
@@ -559,6 +559,7 @@ typedef struct DB_decoder_s {
int (*numvoices) (DB_fileinfo_t *info);
void (*mutevoice) (DB_fileinfo_t *info, int voice, int mute);
+ int (*read_metadata) (DB_playItem_t *it);
int (*write_metadata) (DB_playItem_t *it);
// NULL terminated array of all supported extensions
diff --git a/junklib.c b/junklib.c
index 66757420..735ef368 100644
--- a/junklib.c
+++ b/junklib.c
@@ -1050,10 +1050,12 @@ junk_get_leading_size (DB_FILE *fp) {
int pos = deadbeef->ftell (fp);
if (deadbeef->fread (header, 1, 10, fp) != 10) {
deadbeef->fseek (fp, pos, SEEK_SET);
+ trace ("junk_get_leading_size: file is too short\n");
return -1; // too short
}
deadbeef->fseek (fp, pos, SEEK_SET);
if (strncmp (header, "ID3", 3)) {
+ trace ("junk_get_leading_size: no id3v2 found\n");
return -1; // no tag
}
uint8_t flags = header[5];
@@ -1071,6 +1073,7 @@ junk_get_leading_size (DB_FILE *fp) {
//trace ("junklib: leading junk size %d\n", size);
return size + 10 + 10 * footerpresent;
}
+
int
junk_id3v2_unsync (uint8_t *out, int len, int maxlen) {
uint8_t buf [maxlen];
@@ -2543,7 +2546,7 @@ junk_id3v2_read_full (playItem_t *it, DB_id3v2_tag_t *tag_store, DB_FILE *fp) {
comment = newcomment;
trace ("COMM combined: %s\n", comment);
}
- else if (!strcmp (frameid, "TXXX")) {
+ else if (it && !strcmp (frameid, "TXXX")) {
if (sz < 2) {
trace ("TXXX frame is too short, skipped\n");
readptr += sz; // bad tag
@@ -2700,7 +2703,7 @@ junk_id3v2_read_full (playItem_t *it, DB_id3v2_tag_t *tag_store, DB_FILE *fp) {
comment = newcomment;
trace ("COM text: %s\n", text);
}
- else if (!strcmp (frameid, "TXX")) {
+ else if (it && !strcmp (frameid, "TXX")) {
if (sz < 2) {
trace ("TXX frame is too short, skipped\n");
readptr += sz; // bad tag
diff --git a/plugins/mpgmad/mpgmad.c b/plugins/mpgmad/mpgmad.c
index d88abe6f..8d99f1d3 100644
--- a/plugins/mpgmad/mpgmad.c
+++ b/plugins/mpgmad/mpgmad.c
@@ -1094,8 +1094,8 @@ cmp3_insert (DB_playItem_t *after, const char *fname) {
memset (&buffer, 0, sizeof (buffer));
buffer.file = fp;
int skip = deadbeef->junk_get_leading_size (buffer.file);
- trace ("mpgmad: skipping %d bytes (tag)\n", skip);
if (skip > 0) {
+ trace ("mpgmad: skipping %d bytes (tag)\n", skip);
deadbeef->fseek(buffer.file, skip, SEEK_SET);
}
// calc approx. mp3 duration