equal
deleted
inserted
replaced
159 size = GST_READ_UINT32_LE (data + 4); |
159 size = GST_READ_UINT32_LE (data + 4); |
160 |
160 |
161 GST_DEBUG_OBJECT (element, "fourcc=%" GST_FOURCC_FORMAT ", size=%u", |
161 GST_DEBUG_OBJECT (element, "fourcc=%" GST_FOURCC_FORMAT ", size=%u", |
162 GST_FOURCC_ARGS (fourcc), size); |
162 GST_FOURCC_ARGS (fourcc), size); |
163 |
163 |
|
164 /* be paranoid: size may be nonsensical value here, such as (guint) -1 */ |
|
165 if (G_UNLIKELY (size > G_MAXINT)) |
|
166 goto bogus_size; |
|
167 |
164 if (bufsize < size + 8 + offset) { |
168 if (bufsize < size + 8 + offset) { |
165 GST_DEBUG_OBJECT (element, |
169 GST_DEBUG_OBJECT (element, |
166 "Needed chunk data (%d) is more than available (%d), shortcutting", |
170 "Needed chunk data (%d) is more than available (%d), shortcutting", |
167 size, bufsize - 8 - offset); |
171 size, bufsize - 8 - offset); |
168 size = bufsize - 8 - offset; |
172 size = bufsize - 8 - offset; |
187 too_small: |
191 too_small: |
188 { |
192 { |
189 GST_DEBUG_OBJECT (element, |
193 GST_DEBUG_OBJECT (element, |
190 "Failed to parse chunk header (offset %d, %d available, %d needed)", |
194 "Failed to parse chunk header (offset %d, %d available, %d needed)", |
191 offset, bufsize, 8); |
195 offset, bufsize, 8); |
|
196 return FALSE; |
|
197 } |
|
198 bogus_size: |
|
199 { |
|
200 GST_ERROR_OBJECT (element, "Broken file: bogus chunk size %u", size); |
192 return FALSE; |
201 return FALSE; |
193 } |
202 } |
194 } |
203 } |
195 |
204 |
196 /** |
205 /** |
644 while (size > 8) { |
653 while (size > 8) { |
645 tag = GST_READ_UINT32_LE (data); |
654 tag = GST_READ_UINT32_LE (data); |
646 tsize = GST_READ_UINT32_LE (data + 4); |
655 tsize = GST_READ_UINT32_LE (data + 4); |
647 size -= 8; |
656 size -= 8; |
648 data += 8; |
657 data += 8; |
|
658 |
|
659 GST_DEBUG ("tag %" GST_FOURCC_FORMAT ", size %u", |
|
660 GST_FOURCC_ARGS (tag), tsize); |
|
661 |
649 if (tsize > size) { |
662 if (tsize > size) { |
650 GST_WARNING_OBJECT (element, |
663 GST_WARNING_OBJECT (element, |
651 "Tagsize %d is larger than available data %d", tsize, size); |
664 "Tagsize %d is larger than available data %d", tsize, size); |
652 tsize = size; |
665 tsize = size; |
653 } |
666 } |
686 break; |
699 break; |
687 case GST_RIFF_INFO_IGNR: |
700 case GST_RIFF_INFO_IGNR: |
688 type = GST_TAG_GENRE; |
701 type = GST_TAG_GENRE; |
689 break; |
702 break; |
690 case GST_RIFF_INFO_IKEY: |
703 case GST_RIFF_INFO_IKEY: |
691 type = NULL; /*"Keywords"; */ ; |
704 type = GST_TAG_KEYWORDS; |
692 break; |
705 break; |
693 case GST_RIFF_INFO_ILGT: |
706 case GST_RIFF_INFO_ILGT: |
694 type = NULL; /*"Lightness"; */ |
707 type = NULL; /*"Lightness"; */ |
695 break; |
708 break; |
696 case GST_RIFF_INFO_IMED: |
709 case GST_RIFF_INFO_IMED: |
745 } else { |
758 } else { |
746 GST_WARNING_OBJECT (element, "could not extract %s tag", type); |
759 GST_WARNING_OBJECT (element, "could not extract %s tag", type); |
747 } |
760 } |
748 } |
761 } |
749 |
762 |
|
763 if (tsize & 1) { |
|
764 tsize++; |
|
765 if (tsize > size) |
|
766 tsize = size; |
|
767 } |
|
768 |
750 data += tsize; |
769 data += tsize; |
751 size -= tsize; |
770 size -= tsize; |
752 } |
771 } |
753 |
772 |
754 if (!gst_tag_list_is_empty (taglist)) { |
773 if (!gst_tag_list_is_empty (taglist)) { |