summaryrefslogtreecommitdiffstats
path: root/common/storage_lmdb.cpp
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2017-05-03 21:29:28 +0200
committerChristian Mollekopf <chrigi_1@fastmail.fm>2017-05-03 21:29:28 +0200
commit9228b3ba170a0f68dbb432b2455c75d5fff21506 (patch)
tree0bfc3231b050efcfb7c5aec0664bd4739a6266f2 /common/storage_lmdb.cpp
parentca5020095abfb76e63bd801e9722c07193eb05f5 (diff)
downloadsink-9228b3ba170a0f68dbb432b2455c75d5fff21506.tar.gz
sink-9228b3ba170a0f68dbb432b2455c75d5fff21506.zip
Sanity check db names
lmdb and sink deal badly with e.g. a string containing a null in the millde as db name. Thus we try to protect better against it. This is an actual problem we triggered: https://phabricator.kde.org/T5880
Diffstat (limited to 'common/storage_lmdb.cpp')
-rw-r--r--common/storage_lmdb.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/common/storage_lmdb.cpp b/common/storage_lmdb.cpp
index 08eea37..18364ea 100644
--- a/common/storage_lmdb.cpp
+++ b/common/storage_lmdb.cpp
@@ -169,6 +169,26 @@ public:
169 if (const int rc = mdb_dbi_open(transaction, db.constData(), flags, &dbi)) { 169 if (const int rc = mdb_dbi_open(transaction, db.constData(), flags, &dbi)) {
170 //Create the db if it is not existing already 170 //Create the db if it is not existing already
171 if (rc == MDB_NOTFOUND && !readOnly) { 171 if (rc == MDB_NOTFOUND && !readOnly) {
172 //Sanity check db name
173 {
174 auto parts = db.split('.');
175 for (const auto &p : parts) {
176 auto containsSpecialCharacter = [] (const QByteArray &p) {
177 for (int i = 0; i < p.size(); i++) {
178 const auto c = p.at(i);
179 //Between 0 and z in the ascii table. Essentially ensures that the name is printable and doesn't contain special chars
180 if (c < 0x30 || c > 0x7A) {
181 return true;
182 }
183 }
184 return false;
185 };
186 if (p.isEmpty() || containsSpecialCharacter(p)) {
187 SinkError() << "Tried to create a db with an invalid name. Hex:" << db.toHex() << " ASCII:" << db;
188 Q_ASSERT(false);
189 }
190 }
191 }
172 if (const int rc = mdb_dbi_open(transaction, db.constData(), flags | MDB_CREATE, &dbi)) { 192 if (const int rc = mdb_dbi_open(transaction, db.constData(), flags | MDB_CREATE, &dbi)) {
173 SinkWarning() << "Failed to create db " << QByteArray(mdb_strerror(rc)); 193 SinkWarning() << "Failed to create db " << QByteArray(mdb_strerror(rc));
174 Error error(name.toLatin1(), ErrorCodes::GenericError, "Error while creating database: " + QByteArray(mdb_strerror(rc))); 194 Error error(name.toLatin1(), ErrorCodes::GenericError, "Error while creating database: " + QByteArray(mdb_strerror(rc)));