gst_plugins_base/gst-libs/gst/riff/riff-read.c
changeset 16 8e837d1bf446
parent 0 0e761a78d257
child 30 7e817e7e631c
equal deleted inserted replaced
15:4b0c6ed43234 16:8e837d1bf446
   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)) {