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;