{
if(key.size() < 1)
return false;
- for(String::ConstIterator it = key.begin(); it != key.end(); it++)
- // forbid non-printable, non-ascii, '=' (#61) and '~' (#126)
- if (*it < 32 || *it >= 128 || *it == 61 || *it == 126)
+
+ // A key may consist of ASCII 0x20 through 0x7D, 0x3D ('=') excluded.
+
+ for(String::ConstIterator it = key.begin(); it != key.end(); it++) {
+ if(*it < 0x20 || *it > 0x7D || *it == 0x3D)
return false;
+ }
+
return true;
}
void Ogg::XiphComment::addField(const String &key, const String &value, bool replace)
{
+ if(!checkKey(key)) {
+ debug("Ogg::XiphComment::addField() - Invalid key. Field not added.");
+ return;
+ }
+
+ const String upperKey = key.upper();
+
if(replace)
- removeFields(key.upper());
+ removeFields(upperKey);
if(!key.isEmpty() && !value.isEmpty())
- d->fieldListMap[key.upper()].append(value);
+ d->fieldListMap[upperKey].append(value);
}
void Ogg::XiphComment::removeField(const String &key, const String &value)
CPPUNIT_TEST(testSetYear);
CPPUNIT_TEST(testTrack);
CPPUNIT_TEST(testSetTrack);
- CPPUNIT_TEST(testInvalidKeys);
+ CPPUNIT_TEST(testInvalidKeys1);
+ CPPUNIT_TEST(testInvalidKeys2);
CPPUNIT_TEST(testClearComment);
CPPUNIT_TEST(testRemoveFields);
CPPUNIT_TEST(testPicture);
CPPUNIT_ASSERT_EQUAL(String("3"), cmt.fieldListMap()["TRACKNUMBER"].front());
}
- void testInvalidKeys()
+ void testInvalidKeys1()
{
PropertyMap map;
map[""] = String("invalid key: empty string");
map["A=B"] = String("invalid key: contains '='");
map["A~B"] = String("invalid key: contains '~'");
+ map["A\x7F\B"] = String("invalid key: contains '\x7F'");
+ map[L"A\x3456\B"] = String("invalid key: Unicode");
Ogg::XiphComment cmt;
PropertyMap unsuccessful = cmt.setProperties(map);
- CPPUNIT_ASSERT_EQUAL((unsigned int)3, unsuccessful.size());
+ CPPUNIT_ASSERT_EQUAL((unsigned int)5, unsuccessful.size());
CPPUNIT_ASSERT(cmt.properties().isEmpty());
}
+ void testInvalidKeys2()
+ {
+ Ogg::XiphComment cmt;
+ cmt.addField("", "invalid key: empty string");
+ cmt.addField("A=B", "invalid key: contains '='");
+ cmt.addField("A~B", "invalid key: contains '~'");
+ cmt.addField("A\x7F\B", "invalid key: contains '\x7F'");
+ cmt.addField(L"A\x3456\B", "invalid key: Unicode");
+ CPPUNIT_ASSERT_EQUAL(0U, cmt.fieldCount());
+ }
+
void testClearComment()
{
ScopedFileCopy copy("empty", ".ogg");