krb5 commit: In kdb5_util dump, only lock DB for iprop dumps

Greg Hudson ghudson at MIT.EDU
Wed Feb 26 16:42:21 EST 2014


https://github.com/krb5/krb5/commit/a2ac57b0ec230efed06fabc2d55db1fcbc6f7ea3
commit a2ac57b0ec230efed06fabc2d55db1fcbc6f7ea3
Author: Greg Hudson <ghudson at mit.edu>
Date:   Sun Feb 23 11:28:44 2014 -0500

    In kdb5_util dump, only lock DB for iprop dumps
    
    Revert #7384, as there are no longer policy refcounts.  For iprop
    dumps we want to make sure that the reported serial number matches the
    DB state (although we could perhaps relax that requirement with enough
    analysis), but for non-iprop dumps we don't need any transactional
    guarantees.
    
    Also use the correct constant name for the locking mode (the numeric
    value is the same, fortunately), and only unlock the database if we
    successfully locked it.
    
    ticket: 7869 (new)

 src/kadmin/dbutil/dump.c |   22 ++++++++++++----------
 1 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/src/kadmin/dbutil/dump.c b/src/kadmin/dbutil/dump.c
index d28a9cd..acdb679 100644
--- a/src/kadmin/dbutil/dump.c
+++ b/src/kadmin/dbutil/dump.c
@@ -1230,7 +1230,7 @@ dump_db(int argc, char **argv)
     kdb_log_context *log_ctx;
     unsigned int ipropx_version = IPROPX_VERSION_0;
     krb5_kvno kt_kvno;
-    krb5_boolean conditional = FALSE;
+    krb5_boolean conditional = FALSE, db_locked = FALSE;
     kdb_last_t last;
 
     /* Parse the arguments. */
@@ -1396,15 +1396,16 @@ dump_db(int argc, char **argv)
     args.dump = dump;
     fprintf(args.ofile, "%s", dump->header);
 
-    /* We grab the lock twice (once again in the iterator call), but that's ok
-     * since krb5_db_lock handles recursive locks. */
-    ret = krb5_db_lock(util_context, KRB5_LOCKMODE_SHARED);
-    if (ret != 0 && ret != KRB5_PLUGIN_OP_NOTSUPP) {
-        fprintf(stderr, _("%s: Couldn't grab lock\n"), progname);
-        goto error;
-    }
-
     if (dump_sno) {
+        /* Make sure the dump reflects the serial number we're recording. */
+        ret = krb5_db_lock(util_context, KRB5_DB_LOCKMODE_SHARED);
+        if (ret == 0) {
+            db_locked = TRUE;
+        } else if (ret != KRB5_PLUGIN_OP_NOTSUPP) {
+            fprintf(stderr, _("%s: Couldn't grab lock\n"), progname);
+            goto error;
+        }
+
         ret = ulog_get_last(util_context, &last);
         if (ret) {
             com_err(progname, ret, _("while reading update log header"));
@@ -1442,7 +1443,8 @@ dump_db(int argc, char **argv)
     return;
 
 error:
-    krb5_db_unlock(util_context);
+    if (db_locked)
+        krb5_db_unlock(util_context);
     if (tmpofile != NULL)
         unlink(tmpofile);
     free(tmpofile);


More information about the cvs-krb5 mailing list