]> granicus.if.org Git - taglib/commitdiff
Be more careful when parsing Vorbis Comments
authorFrank Lai <frank.franklai@gmail.com>
Thu, 9 Jun 2011 16:44:54 +0000 (18:44 +0200)
committerLukáš Lalinský <lalinsky@gmail.com>
Thu, 9 Jun 2011 16:44:54 +0000 (18:44 +0200)
taglib/ogg/xiphcomment.cpp

index 344d9cfcad7d35156c20a823bcca34e083b74da0..e7e8fa915a8ede594548012dd6de92bddbc29ab5 100644 (file)
@@ -295,21 +295,31 @@ void Ogg::XiphComment::parse(const ByteVector &data)
 
   // Next the number of fields in the comment vector.
 
-  int commentFields = data.mid(pos, 4).toUInt(false);
+  uint commentFields = data.mid(pos, 4).toUInt(false);
   pos += 4;
 
-  for(int i = 0; i < commentFields; i++) {
+  if(commentFields > (data.size() - 8) / 4) {
+    return;
+  }
+
+  for(uint i = 0; i < commentFields; i++) {
 
     // Each comment field is in the format "KEY=value" in a UTF8 string and has
     // 4 bytes before the text starts that gives the length.
 
-    int commentLength = data.mid(pos, 4).toUInt(false);
+    uint commentLength = data.mid(pos, 4).toUInt(false);
     pos += 4;
 
     String comment = String(data.mid(pos, commentLength), String::UTF8);
     pos += commentLength;
+    if(pos > data.size()) {
+      break;
+    }
 
     int commentSeparatorPosition = comment.find("=");
+    if(commentSeparatorPosition == -1) {
+      break;
+    }
 
     String key = comment.substr(0, commentSeparatorPosition);
     String value = comment.substr(commentSeparatorPosition + 1);