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 ++;