(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
This commit is contained in:
@@ -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;
|
||||
|
Reference in New Issue
Block a user