tag: id3v2: 3 2.3.0 used synch-safe integers for the tag size, but not for the frame size. (Fixes #331368)

Original commit message from CVS:
* gst-libs/gst/tag/id3v2.c: (id3demux_id3v2_frames_to_tag_list):
ID3 2.3.0 used synch-safe integers for the tag size, but not for the
frame size. (Fixes #331368)
This commit is contained in:
Jan Schmidt 2006-02-16 10:58:18 +00:00 committed by Tim-Philipp Müller
parent dc5506d372
commit e4af0fe41f

View file

@ -362,6 +362,7 @@ id3demux_id3v2_frames_to_tag_list (ID3TagsWorking * work, guint size)
gchar frame_id[5] = ""; gchar frame_id[5] = "";
guint16 frame_flags = 0x0; guint16 frame_flags = 0x0;
gboolean obsolete_id = FALSE; gboolean obsolete_id = FALSE;
gboolean read_synch_size = TRUE;
/* Read the header */ /* Read the header */
switch (ID3V2_VER_MAJOR (work->hdr.version)) { switch (ID3V2_VER_MAJOR (work->hdr.version)) {
@ -375,10 +376,13 @@ id3demux_id3v2_frames_to_tag_list (ID3TagsWorking * work, guint size)
frame_id[4] = 0; frame_id[4] = 0;
obsolete_id = convert_fid_to_v240 (frame_id); obsolete_id = convert_fid_to_v240 (frame_id);
frame_size = read_synch_uint (work->hdr.frame_data + 3, 3); /* 3 byte non-synchsafe size */
frame_size = work->hdr.frame_data[3] << 16 |
work->hdr.frame_data[4] << 8 | work->hdr.frame_data[5];
frame_flags = 0; frame_flags = 0;
break; break;
case 3: case 3:
read_synch_size = FALSE; /* 2.3 frame size is not synch-safe */
case 4: case 4:
default: default:
frame_id[0] = work->hdr.frame_data[0]; frame_id[0] = work->hdr.frame_data[0];
@ -386,7 +390,11 @@ id3demux_id3v2_frames_to_tag_list (ID3TagsWorking * work, guint size)
frame_id[2] = work->hdr.frame_data[2]; frame_id[2] = work->hdr.frame_data[2];
frame_id[3] = work->hdr.frame_data[3]; frame_id[3] = work->hdr.frame_data[3];
frame_id[4] = 0; frame_id[4] = 0;
frame_size = read_synch_uint (work->hdr.frame_data + 4, 4); if (read_synch_size)
frame_size = read_synch_uint (work->hdr.frame_data + 4, 4);
else
frame_size = GST_READ_UINT32_BE (work->hdr.frame_data + 4);
frame_flags = GST_READ_UINT16_BE (work->hdr.frame_data + 8); frame_flags = GST_READ_UINT16_BE (work->hdr.frame_data + 8);
if (ID3V2_VER_MAJOR (work->hdr.version) == 3) { if (ID3V2_VER_MAJOR (work->hdr.version) == 3) {
@ -403,8 +411,8 @@ id3demux_id3v2_frames_to_tag_list (ID3TagsWorking * work, guint size)
frame_size == 0 || strcmp (frame_id, "") == 0) frame_size == 0 || strcmp (frame_id, "") == 0)
break; /* No more frames to read */ break; /* No more frames to read */
#if 0 #if 1
g_print GST_LOG
("Frame @ %d (0x%02x) id %s size %d, next=%d (0x%02x) obsolete=%d\n", ("Frame @ %d (0x%02x) id %s size %d, next=%d (0x%02x) obsolete=%d\n",
work->hdr.frame_data - start, work->hdr.frame_data - start, frame_id, work->hdr.frame_data - start, work->hdr.frame_data - start, frame_id,
frame_size, work->hdr.frame_data + frame_hdr_size + frame_size - start, frame_size, work->hdr.frame_data + frame_hdr_size + frame_size - start,