From 1c74114ff487b8a70229c8c50f69af0f4b1f4c82 Mon Sep 17 00:00:00 2001 From: Johan Danielsson Date: Mon, 21 Oct 2002 15:51:44 +0000 Subject: [PATCH] (from Derrick Brashear): Propagating a large database without this means the slave kdcs can get erroneous HDB_NOENTRY and return the resulting errors. This creates a new db handle, populates it, and moves it into place. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@11514 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/kadm5/ipropd_slave.c | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/lib/kadm5/ipropd_slave.c b/lib/kadm5/ipropd_slave.c index a4c2d8f11..a3ec74782 100644 --- a/lib/kadm5/ipropd_slave.c +++ b/lib/kadm5/ipropd_slave.c @@ -229,9 +229,24 @@ receive_everything (krb5_context context, int fd, int32_t opcode; unsigned long tmp; - ret = server_context->db->open(context, - server_context->db, - O_RDWR | O_CREAT | O_TRUNC, 0600); + char *dbname; + HDB *mydb; + + asprintf(&dbname, "%s-NEW", server_context->db->name); + ret = hdb_create(context, &mydb, dbname); + if(ret) + krb5_err(context,1, ret, "hdb_create"); + free(dbname); + + ret = hdb_set_master_keyfile (context, + mydb, server_context->config.stash_file); + if(ret) + krb5_err(context,1, ret, "hdb_set_master_keyfile"); + + /* I really want to use O_EXCL here, but given that I can't easily clean + up on error, I won't */ + ret = mydb->open(context, mydb, O_RDWR | O_CREAT | O_TRUNC, 0600); + if (ret) krb5_err (context, 1, ret, "db->open"); @@ -255,9 +270,9 @@ receive_everything (krb5_context context, int fd, ret = hdb_value2entry (context, &fake_data, &entry); if (ret) krb5_err (context, 1, ret, "hdb_value2entry"); - ret = server_context->db->store(server_context->context, - server_context->db, - 0, &entry); + ret = mydb->store(server_context->context, + mydb, + 0, &entry); if (ret) krb5_err (context, 1, ret, "hdb_store"); @@ -286,9 +301,15 @@ receive_everything (krb5_context context, int fd, krb5_data_free (&data); - ret = server_context->db->close (context, server_context->db); + ret = mydb->close (context, mydb); if (ret) krb5_err (context, 1, ret, "db->close"); + ret = mydb->rename (context, mydb, server_context->db->name); + if (ret) + krb5_err (context, 1, ret, "db->rename"); + ret = mydb->destroy (context, mydb); + if (ret) + krb5_err (context, 1, ret, "db->destroy"); } static char *realm;