(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;
|
int32_t opcode;
|
||||||
unsigned long tmp;
|
unsigned long tmp;
|
||||||
|
|
||||||
ret = server_context->db->open(context,
|
char *dbname;
|
||||||
server_context->db,
|
HDB *mydb;
|
||||||
O_RDWR | O_CREAT | O_TRUNC, 0600);
|
|
||||||
|
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)
|
if (ret)
|
||||||
krb5_err (context, 1, ret, "db->open");
|
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);
|
ret = hdb_value2entry (context, &fake_data, &entry);
|
||||||
if (ret)
|
if (ret)
|
||||||
krb5_err (context, 1, ret, "hdb_value2entry");
|
krb5_err (context, 1, ret, "hdb_value2entry");
|
||||||
ret = server_context->db->store(server_context->context,
|
ret = mydb->store(server_context->context,
|
||||||
server_context->db,
|
mydb,
|
||||||
0, &entry);
|
0, &entry);
|
||||||
if (ret)
|
if (ret)
|
||||||
krb5_err (context, 1, ret, "hdb_store");
|
krb5_err (context, 1, ret, "hdb_store");
|
||||||
|
|
||||||
@@ -286,9 +301,15 @@ receive_everything (krb5_context context, int fd,
|
|||||||
|
|
||||||
krb5_data_free (&data);
|
krb5_data_free (&data);
|
||||||
|
|
||||||
ret = server_context->db->close (context, server_context->db);
|
ret = mydb->close (context, mydb);
|
||||||
if (ret)
|
if (ret)
|
||||||
krb5_err (context, 1, ret, "db->close");
|
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;
|
static char *realm;
|
||||||
|
Reference in New Issue
Block a user