Blob Blame History Raw
diff -Naur audacious-3.10.1-orig/src/libaudtag/ape/ape.cc audacious-3.10.1/src/libaudtag/ape/ape.cc
--- audacious-3.10.1-orig/src/libaudtag/ape/ape.cc	2018-12-26 07:55:16.000000000 +0100
+++ audacious-3.10.1/src/libaudtag/ape/ape.cc	2020-06-07 09:48:07.496046462 +0200
@@ -44,7 +44,8 @@
 #pragma pack(pop)
 
 struct ValuePair {
-    String key, value;
+    String key;
+    Index<char> value;
 };
 
 #define APE_FLAG_HAS_HEADER (1 << 31)
@@ -193,17 +194,19 @@
 
     value ++;
 
-    if (header[0] > (unsigned) (data + length - value))
+    uint32_t value_len = FROM_LE32 (header[0]);
+    if (value_len > (unsigned) (data + length - value))
     {
         AUDWARN ("Item value of length %d, but only %d bytes remain in tag.\n",
-         (int) header[0], (int) (data + length - value));
+         (int) value_len, (int) (data + length - value));
         return nullptr;
     }
 
     pair.key = String (data + 8);
-    pair.value = String (str_copy (value, header[0]));
+    pair.value.insert (value, -1, value_len);
+    pair.value.append (0);
 
-    return value + header[0];
+    return value + value_len;
 }
 
 static Index<ValuePair> ape_read_items (VFSFile & handle)
@@ -233,7 +236,7 @@
         if (! (item = ape_read_item (item, data.end () - item, pair)))
             break;
 
-        AUDDBG ("Read: %s = %s.\n", (const char *) pair.key, (const char *) pair.value);
+        AUDDBG ("Read: %s = %s.\n", (const char *) pair.key, pair.value.begin ());
         list.append (std::move (pair));
     }
 
@@ -246,28 +249,28 @@
 
     for (const ValuePair & pair : list)
     {
-        if (! strcmp (pair.key, "Artist"))
-            tuple.set_str (Tuple::Artist, pair.value);
-        else if (! strcmp (pair.key, "Title"))
-            tuple.set_str (Tuple::Title, pair.value);
-        else if (! strcmp (pair.key, "Album"))
-            tuple.set_str (Tuple::Album, pair.value);
-        else if (! strcmp (pair.key, "Comment"))
-            tuple.set_str (Tuple::Comment, pair.value);
-        else if (! strcmp (pair.key, "Genre"))
-            tuple.set_str (Tuple::Genre, pair.value);
-        else if (! strcmp (pair.key, "Track"))
-            tuple.set_int (Tuple::Track, atoi (pair.value));
-        else if (! strcmp (pair.key, "Year"))
-            tuple.set_int (Tuple::Year, atoi (pair.value));
+        if (! strcmp_nocase (pair.key, "Artist"))
+            tuple.set_str (Tuple::Artist, pair.value.begin ());
+        else if (! strcmp_nocase (pair.key, "Title"))
+            tuple.set_str (Tuple::Title, pair.value.begin ());
+        else if (! strcmp_nocase (pair.key, "Album"))
+            tuple.set_str (Tuple::Album, pair.value.begin ());
+        else if (! strcmp_nocase (pair.key, "Comment"))
+            tuple.set_str (Tuple::Comment, pair.value.begin ());
+        else if (! strcmp_nocase (pair.key, "Genre"))
+            tuple.set_str (Tuple::Genre, pair.value.begin ());
+        else if (! strcmp_nocase (pair.key, "Track"))
+            tuple.set_int (Tuple::Track, atoi (pair.value.begin ()));
+        else if (! strcmp_nocase (pair.key, "Year"))
+            tuple.set_int (Tuple::Year, atoi (pair.value.begin ()));
         else if (! strcmp_nocase (pair.key, "REPLAYGAIN_TRACK_GAIN"))
-            tuple.set_gain (Tuple::TrackGain, Tuple::GainDivisor, pair.value);
+            tuple.set_gain (Tuple::TrackGain, Tuple::GainDivisor, pair.value.begin ());
         else if (! strcmp_nocase (pair.key, "REPLAYGAIN_TRACK_PEAK"))
-            tuple.set_gain (Tuple::TrackPeak, Tuple::PeakDivisor, pair.value);
+            tuple.set_gain (Tuple::TrackPeak, Tuple::PeakDivisor, pair.value.begin ());
         else if (! strcmp_nocase (pair.key, "REPLAYGAIN_ALBUM_GAIN"))
-            tuple.set_gain (Tuple::AlbumGain, Tuple::GainDivisor, pair.value);
+            tuple.set_gain (Tuple::AlbumGain, Tuple::GainDivisor, pair.value.begin ());
         else if (! strcmp_nocase (pair.key, "REPLAYGAIN_ALBUM_PEAK"))
-            tuple.set_gain (Tuple::AlbumPeak, Tuple::PeakDivisor, pair.value);
+            tuple.set_gain (Tuple::AlbumPeak, Tuple::PeakDivisor, pair.value.begin ());
     }
 
     return true;
@@ -387,13 +390,13 @@
 
     for (const ValuePair & pair : list)
     {
-        if (! strcmp (pair.key, "Artist") || ! strcmp (pair.key, "Title") ||
-         ! strcmp (pair.key, "Album") || ! strcmp (pair.key, "Comment") ||
-         ! strcmp (pair.key, "Genre") || ! strcmp (pair.key, "Track") ||
-         ! strcmp (pair.key, "Year"))
+        if (! strcmp_nocase (pair.key, "Artist") || ! strcmp_nocase (pair.key, "Title") ||
+         ! strcmp_nocase (pair.key, "Album") || ! strcmp_nocase (pair.key, "Comment") ||
+         ! strcmp_nocase (pair.key, "Genre") || ! strcmp_nocase (pair.key, "Track") ||
+         ! strcmp_nocase (pair.key, "Year"))
             continue;
 
-        if (! ape_write_item (handle, pair.key, pair.value, & length))
+        if (! ape_write_item (handle, pair.key, pair.value.begin (), & length))
             return false;
 
         items ++;