From ccb148eedbbc5a6d91754b126ae766ded7ac9805 Mon Sep 17 00:00:00 2001 From: Nicolas Williams Date: Wed, 14 Aug 2013 22:40:45 -0500 Subject: [PATCH] lib/hdb/db3.c:DB_open() needs to DB_close() more Without this the KDC can trip the assert in DB_open(). --- lib/hdb/db3.c | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/lib/hdb/db3.c b/lib/hdb/db3.c index 4dc38f9e9..891cf9877 100644 --- a/lib/hdb/db3.c +++ b/lib/hdb/db3.c @@ -62,20 +62,20 @@ DB_close(krb5_context context, HDB *db) { DB3_HDB *db3 = (DB3_HDB *)db; DB *d = (DB*)db->hdb_db; - DBC *dbcp; + DBC *dbcp = (DBC*)db->hdb_dbc; heim_assert(d != 0, "Closing already closed HDB"); - dbcp = (DBC*)db->hdb_dbc; - (*dbcp->c_close)(dbcp); - db->hdb_dbc = 0; - (*d->close)(d, 0); - db->hdb_db = 0; - - if (db3->lock_fd >= 0) { + if (dbcp != NULL) + dbcp->c_close(dbcp); + if (d != NULL) + d->close(d, 0); + if (db3->lock_fd >= 0) close(db3->lock_fd); - db3->lock_fd = -1; - } + + db3->lock_fd = -1; + db->hdb_dbc = 0; + db->hdb_db = 0; return 0; } @@ -278,6 +278,7 @@ _open_db(DB *d, char *fn, int myflags, int flags, mode_t mode, int *fd) if (ret == -1) { ret = errno; close(*fd); + *fd = -1; return ret; } @@ -289,8 +290,10 @@ _open_db(DB *d, char *fn, int myflags, int flags, mode_t mode, int *fd) ret = (*d->open)(d, fn, NULL, DB_BTREE, myflags, mode); #endif - if (ret != 0) - close(*fd); + if (ret != 0) { + close(*fd); + *fd = -1; + } return ret; } @@ -333,15 +336,17 @@ DB_open(krb5_context context, HDB *db, int flags, mode_t mode) } db->hdb_db = d; + /* From here on out always DB_close() before returning on error */ + ret = _open_db(d, fn, myflags, flags, mode, &db3->lock_fd); free(fn); if (ret == ENOENT) { /* try to open without .db extension */ - ret = _open_db(d, db->hdb_name, myflags, flags, - mode, &db3->lock_fd); + ret = _open_db(d, db->hdb_name, myflags, flags, mode, &db3->lock_fd); } if (ret) { + DB_close(context, db); krb5_set_error_message(context, ret, "opening %s: %s", db->hdb_name, strerror(ret)); return ret; @@ -353,6 +358,7 @@ DB_open(krb5_context context, HDB *db, int flags, mode_t mode) ret = (*d->cursor)(d, NULL, &dbc, DB_CURSOR_BULK); if (ret) { + DB_close(context, db); krb5_set_error_message(context, ret, "d->cursor: %s", strerror(ret)); return ret; }