From 5867aa68735744eb6bfb8d3825281c0987ec276b Mon Sep 17 00:00:00 2001 From: Nicolas Williams Date: Fri, 12 Feb 2016 13:03:06 -0600 Subject: [PATCH] hdb-sqlite: fix error code confusion --- lib/hdb/hdb-sqlite.c | 44 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/lib/hdb/hdb-sqlite.c b/lib/hdb/hdb-sqlite.c index ff387c3f7..432b6fc46 100644 --- a/lib/hdb/hdb-sqlite.c +++ b/lib/hdb/hdb-sqlite.c @@ -586,7 +586,7 @@ hdb_sqlite_store(krb5_context context, HDB *db, unsigned flags, ret = hdb_sqlite_exec_stmt(context, hsdb, "BEGIN IMMEDIATE TRANSACTION", EINVAL); if(ret != SQLITE_OK) { - ret = EINVAL; + ret = HDB_ERR_UK_SERROR; krb5_set_error_message(context, ret, "SQLite BEGIN TRANSACTION failed: %s", sqlite3_errmsg(hsdb->db)); @@ -616,8 +616,15 @@ hdb_sqlite_store(krb5_context context, HDB *db, unsigned flags, ret = hdb_sqlite_step(context, hsdb->db, hsdb->add_entry); sqlite3_clear_bindings(hsdb->add_entry); sqlite3_reset(hsdb->add_entry); - if(ret != SQLITE_DONE) + if (ret != SQLITE_DONE && ret != SQLITE_CONSTRAINT) { + ret = HDB_ERR_UK_SERROR; goto rollback; + } + if (ret == SQLITE_CONSTRAINT) { + ret = HDB_ERR_EXISTS; + goto rollback; + } + ret = 0; ret = bind_principal(context, entry->entry.principal, hsdb->add_principal, 1); if (ret) @@ -626,8 +633,15 @@ hdb_sqlite_store(krb5_context context, HDB *db, unsigned flags, ret = hdb_sqlite_step(context, hsdb->db, hsdb->add_principal); sqlite3_clear_bindings(hsdb->add_principal); sqlite3_reset(hsdb->add_principal); - if(ret != SQLITE_DONE) + if (ret != SQLITE_DONE && ret != SQLITE_CONSTRAINT) { + ret = HDB_ERR_UK_SERROR; goto rollback; + } + if (ret == SQLITE_CONSTRAINT) { + ret = HDB_ERR_EXISTS; + goto rollback; + } + ret = 0; entry_id = sqlite3_column_int64(get_ids, 1); @@ -640,18 +654,23 @@ hdb_sqlite_store(krb5_context context, HDB *db, unsigned flags, sqlite3_bind_int64(hsdb->delete_aliases, 1, entry_id); ret = hdb_sqlite_step_once(context, db, hsdb->delete_aliases); - if(ret != SQLITE_DONE) + if (ret != SQLITE_DONE) { + ret = HDB_ERR_UK_SERROR; goto rollback; + } sqlite3_bind_blob(hsdb->update_entry, 1, value.data, value.length, SQLITE_STATIC); sqlite3_bind_int64(hsdb->update_entry, 2, entry_id); ret = hdb_sqlite_step_once(context, db, hsdb->update_entry); - if(ret != SQLITE_DONE) + if (ret != SQLITE_DONE) { + ret = HDB_ERR_UK_SERROR; goto rollback; + } } else { /* Error! */ + ret = HDB_ERR_UK_SERROR; goto rollback; } @@ -667,9 +686,14 @@ hdb_sqlite_store(krb5_context context, HDB *db, unsigned flags, sqlite3_bind_int64(hsdb->add_alias, 2, entry_id); ret = hdb_sqlite_step_once(context, db, hsdb->add_alias); - - if(ret != SQLITE_DONE) + if (ret == SQLITE_CONSTRAINT) { + ret = HDB_ERR_EXISTS; goto rollback; + } + if (ret != SQLITE_DONE) { + ret = HDB_ERR_UK_SERROR; + goto rollback; + } } commit: @@ -684,8 +708,8 @@ commit: ret = hdb_sqlite_exec_stmt(context, hsdb, "COMMIT", EINVAL); if(ret != SQLITE_OK) - krb5_warnx(context, "hdb-sqlite: COMMIT problem: %d: %s", - ret, sqlite3_errmsg(hsdb->db)); + krb5_warnx(context, "hdb-sqlite: COMMIT problem: %ld: %s", + (long)HDB_ERR_UK_SERROR, sqlite3_errmsg(hsdb->db)); return ret == SQLITE_OK ? 0 : HDB_ERR_UK_SERROR; @@ -693,7 +717,7 @@ rollback: krb5_warnx(context, "hdb-sqlite: store rollback problem: %d: %s", ret, sqlite3_errmsg(hsdb->db)); - ret = hdb_sqlite_exec_stmt(context, hsdb, "ROLLBACK", EINVAL); + (void) hdb_sqlite_exec_stmt(context, hsdb, "ROLLBACK", ret); return ret; }