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