X-Git-Url: https://git.sommitrealweird.co.uk/onak.git/blobdiff_plain/7ca3c239d76ae7112c166f29c35e11620ba93d9f..94ffe75fd3251c74320167cf94604e73fdb99dfc:/keydb_db4.c?ds=inline diff --git a/keydb_db4.c b/keydb_db4.c index eb41f86..d582eaa 100644 --- a/keydb_db4.c +++ b/keydb_db4.c @@ -2,6 +2,19 @@ * keydb_db4.c - Routines to store and fetch keys in a DB4 database. * * Copyright 2002-2008 Jonathan McDowell + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include @@ -296,7 +309,7 @@ static void db4_initdb(bool readonly) FILE *numdb = NULL; int ret = 0; int i = 0; - u_int32_t flags = 0; + uint32_t flags = 0; struct stat statbuf; int maxlocks; @@ -874,7 +887,7 @@ static int db4_delete_key(uint64_t keyid, bool intrans) worddb_data[ 8] = (keyid >> 24) & 0xFF; worddb_data[ 9] = (keyid >> 16) & 0xFF; worddb_data[10] = (keyid >> 8) & 0xFF; - worddb_data[11] = keyid & 0xFF; + worddb_data[11] = keyid & 0xFF; ret = cursor->c_get(cursor, &key, @@ -883,17 +896,14 @@ static int db4_delete_key(uint64_t keyid, bool intrans) if (ret == 0) { ret = cursor->c_del(cursor, 0); - if (ret != 0) { - logthing(LOGTHING_ERROR, - "Problem deleting word: %s", - db_strerror(ret)); - } } if (ret != 0) { logthing(LOGTHING_ERROR, - "Problem deleting word: %s", - db_strerror(ret)); + "Problem deleting word: %s " + "(0x%016" PRIX64 ")", + db_strerror(ret), + keyid); if (ret == DB_LOCK_DEADLOCK) { deadlock = true; } @@ -902,6 +912,42 @@ static int db4_delete_key(uint64_t keyid, bool intrans) ret = cursor->c_close(cursor); cursor = NULL; + ret = skshashdb->cursor(skshashdb, + txn, + &cursor, + 0); /* flags */ + get_skshash(publickey, &hash); + + memset(&key, 0, sizeof(key)); + memset(&data, 0, sizeof(data)); + key.data = hash.hash; + key.size = sizeof(hash.hash); + data.data = &keyid; + data.size = sizeof(keyid); + + ret = cursor->c_get(cursor, + &key, + &data, + DB_GET_BOTH); + + if (ret == 0) { + ret = cursor->c_del(cursor, 0); + } + + if (ret != 0) { + logthing(LOGTHING_ERROR, + "Problem deleting skshash: %s " + "(0x%016" PRIX64 ")", + db_strerror(ret), + keyid); + if (ret == DB_LOCK_DEADLOCK) { + deadlock = true; + } + } + + ret = cursor->c_close(cursor); + cursor = NULL; + /* * Free our UID and word lists. */ @@ -938,17 +984,14 @@ static int db4_delete_key(uint64_t keyid, bool intrans) if (ret == 0) { ret = cursor->c_del(cursor, 0); - if (ret != 0) { - logthing(LOGTHING_ERROR, - "Problem deleting short keyid: %s", - db_strerror(ret)); - } } if (ret != 0) { logthing(LOGTHING_ERROR, - "Problem deleting short keyid: %s", - db_strerror(ret)); + "Problem deleting short keyid: %s " + "(0x%016" PRIX64 ")", + db_strerror(ret), + keyid); if (ret == DB_LOCK_DEADLOCK) { deadlock = true; } @@ -973,18 +1016,14 @@ static int db4_delete_key(uint64_t keyid, bool intrans) if (ret == 0) { ret = cursor->c_del(cursor, 0); - if (ret != 0) { - logthing(LOGTHING_ERROR, - "Problem deleting short" - " keyid: %s", - db_strerror(ret)); - } } if (ret != 0) { logthing(LOGTHING_ERROR, - "Problem deleting short keyid: %s", - db_strerror(ret)); + "Problem deleting short keyid: %s " + "(0x%016" PRIX64 ")", + db_strerror(ret), + keyid); if (ret == DB_LOCK_DEADLOCK) { deadlock = true; } @@ -999,38 +1038,6 @@ static int db4_delete_key(uint64_t keyid, bool intrans) } - if (!deadlock) { - get_skshash(publickey, &hash); - - memset(&key, 0, sizeof(key)); - memset(&data, 0, sizeof(data)); - key.data = hash.hash; - key.size = sizeof(hash.hash); - data.data = &keyid; - data.size = sizeof(keyid); - - ret = cursor->c_get(cursor, - &key, - &data, - DB_GET_BOTH); - - if (ret == 0) { - ret = cursor->c_del(cursor, 0); - } - - if (ret != 0) { - logthing(LOGTHING_ERROR, - "Problem deleting skshash: %s", - db_strerror(ret)); - if (ret == DB_LOCK_DEADLOCK) { - deadlock = true; - } - } - - ret = cursor->c_close(cursor); - cursor = NULL; - } - if (!deadlock) { key.data = &keyid; key.size = sizeof(keyid); @@ -1082,7 +1089,7 @@ static int db4_store_key(struct openpgp_publickey *publickey, bool intrans, bool deadlock = false; struct skshash hash; - keyid = get_keyid(publickey); + get_keyid(publickey, &keyid); if (!intrans) { db4_starttrans();