logthing(LOGTHING_NOTICE, "Upgrading DB4 database");
ret = db_env_create(&privctx->dbenv, 0);
- privctx->dbenv->set_errcall(privctx->dbenv, &db4_errfunc);
- privctx->dbenv->remove(privctx->dbenv, config.db_dir, 0);
- privctx->dbenv = NULL;
+ if (ret == 0) {
+ privctx->dbenv->set_errcall(privctx->dbenv, &db4_errfunc);
+ privctx->dbenv->remove(privctx->dbenv, config.db_dir, 0);
+ privctx->dbenv = NULL;
+ }
for (i = 0; i < privctx->numdbs; i++) {
ret = db_create(&curdb, NULL, 0);
if (ret == 0) {
snprintf(buf, sizeof(buf) - 1, "%s/keydb.%d.db",
config.db_dir, i);
logthing(LOGTHING_DEBUG, "Upgrading %s", buf);
- ret = curdb->upgrade(curdb, buf, 0);
+ curdb->upgrade(curdb, buf, 0);
curdb->close(curdb, 0);
} else {
logthing(LOGTHING_ERROR, "Error upgrading DB %s : %s",
if (ret == 0) {
snprintf(buf, sizeof(buf) - 1, "%s/worddb", config.db_dir);
logthing(LOGTHING_DEBUG, "Upgrading %s", buf);
- ret = curdb->upgrade(curdb, buf, 0);
+ curdb->upgrade(curdb, buf, 0);
curdb->close(curdb, 0);
} else {
logthing(LOGTHING_ERROR, "Error upgrading DB %s : %s",
if (ret == 0) {
snprintf(buf, sizeof(buf) - 1, "%s/id32db", config.db_dir);
logthing(LOGTHING_DEBUG, "Upgrading %s", buf);
- ret = curdb->upgrade(curdb, buf, 0);
+ curdb->upgrade(curdb, buf, 0);
curdb->close(curdb, 0);
} else {
logthing(LOGTHING_ERROR, "Error upgrading DB %s : %s",
if (ret == 0) {
snprintf(buf, sizeof(buf) - 1, "%s/skshashdb", config.db_dir);
logthing(LOGTHING_DEBUG, "Upgrading %s", buf);
- ret = curdb->upgrade(curdb, buf, 0);
+ curdb->upgrade(curdb, buf, 0);
curdb->close(curdb, 0);
} else {
logthing(LOGTHING_ERROR, "Error upgrading DB %s : %s",
if (ret == 0) {
snprintf(buf, sizeof(buf) - 1, "%s/subkeydb", config.db_dir);
logthing(LOGTHING_DEBUG, "Upgrading %s", buf);
- ret = curdb->upgrade(curdb, buf, 0);
+ curdb->upgrade(curdb, buf, 0);
curdb->close(curdb, 0);
} else {
logthing(LOGTHING_ERROR, "Error upgrading DB %s : %s",
&cursor,
0); /* flags */
+ if (ret != 0) {
+ return 0;
+ }
+
shortkeyid = keyid & 0xFFFFFFFF;
memset(&key, 0, sizeof(key));
}
}
- ret = cursor->c_close(cursor);
+ cursor->c_close(cursor);
cursor = NULL;
}
&cursor,
0); /* flags */
+ if (ret != 0) {
+ db4_endtrans(dbctx);
+ break;
+ }
+
memset(&key, 0, sizeof(key));
memset(&data, 0, sizeof(data));
key.data = curword->object;
free(data.data);
data.data = NULL;
}
- ret = cursor->c_close(cursor);
+ cursor->c_close(cursor);
cursor = NULL;
firstpass = 0;
db4_endtrans(dbctx);
&cursor,
0); /* flags */
+ if (ret != 0) {
+ return 0;
+ }
+
memset(&key, 0, sizeof(key));
memset(&data, 0, sizeof(data));
key.data = (void *) hash->hash;
}
}
- ret = cursor->c_close(cursor);
+ cursor->c_close(cursor);
cursor = NULL;
return db4_fetch_key_id(dbctx, keyid, publickey, false);
DBT key, data;
DBC *cursor = NULL;
uint32_t shortkeyid = 0;
- uint64_t *subkeyids = NULL;
+ struct openpgp_fingerprint *subkeyids = NULL;
int ret = 0;
int i;
char **uids = NULL;
struct ll *curword = NULL;
bool deadlock = false;
struct skshash hash;
+ uint64_t subkeyid;
if (!intrans) {
db4_starttrans(dbctx);
wordlist = makewordlist(wordlist, uids[i]);
}
- ret = privctx->worddb->cursor(privctx->worddb,
+ privctx->worddb->cursor(privctx->worddb,
privctx->txn,
&cursor,
0); /* flags */
}
}
}
- ret = cursor->c_close(cursor);
+ cursor->c_close(cursor);
cursor = NULL;
ret = privctx->skshashdb->cursor(privctx->skshashdb,
privctx->txn,
&cursor,
0); /* flags */
- get_skshash(publickey, &hash);
+ if (ret == 0) {
+ 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);
+ 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);
+ ret = cursor->c_get(cursor,
+ &key,
+ &data,
+ DB_GET_BOTH);
- if (ret == 0) {
- ret = cursor->c_del(cursor, 0);
- }
+ 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;
+ 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;
+ cursor->c_close(cursor);
+ cursor = NULL;
+ }
/*
* Free our UID and word lists.
}
if (!deadlock) {
- ret = privctx->id32db->cursor(privctx->id32db,
+ privctx->id32db->cursor(privctx->id32db,
privctx->txn,
&cursor,
0); /* flags */
subkeyids = keysubkeys(publickey);
i = 0;
- while (subkeyids != NULL && subkeyids[i] != 0) {
+ while (subkeyids != NULL && subkeyids[i].length != 0) {
+ subkeyid = fingerprint2keyid(&subkeyids[i]);
memset(&key, 0, sizeof(key));
- key.data = &subkeyids[i];
- key.size = sizeof(subkeyids[i]);
+ key.data = &subkeyid;
+ key.size = sizeof(subkeyid);
privctx->subkeydb->del(privctx->subkeydb,
privctx->txn, &key, 0);
if (ret != 0) {
}
}
- shortkeyid = subkeyids[i++] & 0xFFFFFFFF;
+ shortkeyid = subkeyid & 0xFFFFFFFF;
memset(&key, 0, sizeof(key));
memset(&data, 0, sizeof(data));
deadlock = true;
}
}
+ i++;
}
if (subkeyids != NULL) {
free(subkeyids);
subkeyids = NULL;
}
- ret = cursor->c_close(cursor);
+ cursor->c_close(cursor);
cursor = NULL;
-
}
if (!deadlock) {
DBT data;
uint64_t keyid = 0;
uint32_t shortkeyid = 0;
- uint64_t *subkeyids = NULL;
+ struct openpgp_fingerprint *subkeyids = NULL;
char **uids = NULL;
char *primary = NULL;
unsigned char worddb_data[12];
struct ll *curword = NULL;
bool deadlock = false;
struct skshash hash;
+ uint64_t subkeyid;
if (get_keyid(publickey, &keyid) != ONAK_E_OK) {
logthing(LOGTHING_ERROR, "Couldn't find key ID for key.");
if (!deadlock) {
subkeyids = keysubkeys(publickey);
i = 0;
- while (subkeyids != NULL && subkeyids[i] != 0) {
+ while (subkeyids != NULL && subkeyids[i].length != 0) {
+ subkeyid = fingerprint2keyid(&subkeyids[i]);
/* Store the subkey ID -> main key ID mapping */
memset(&key, 0, sizeof(key));
memset(&data, 0, sizeof(data));
- key.data = &subkeyids[i];
- key.size = sizeof(subkeyids[i]);
+ key.data = &subkeyid;
+ key.size = sizeof(subkeyid);
data.data = &keyid;
data.size = sizeof(keyid);
}
/* Store the short subkey ID -> main key ID mapping */
- shortkeyid = subkeyids[i++] & 0xFFFFFFFF;
+ shortkeyid = subkeyid & 0xFFFFFFFF;
memset(&key, 0, sizeof(key));
memset(&data, 0, sizeof(data));
deadlock = true;
}
}
+ i++;
}
if (subkeyids != NULL) {
free(subkeyids);
&cursor,
0); /* flags */
+ if (ret != 0) {
+ continue;
+ }
+
memset(&dbkey, 0, sizeof(dbkey));
memset(&data, 0, sizeof(data));
ret = cursor->c_get(cursor, &dbkey, &data, DB_NEXT);
db_strerror(ret));
}
- ret = cursor->c_close(cursor);
+ cursor->c_close(cursor);
cursor = NULL;
}
"Error opening db environment: %s (%s)",
config.db_dir,
db_strerror(ret));
- privctx->dbenv->close(privctx->dbenv, 0);
- privctx->dbenv = NULL;
+ if (privctx->dbenv != NULL) {
+ privctx->dbenv->close(privctx->dbenv, 0);
+ privctx->dbenv = NULL;
+ }
}
}