(kadm5_log_previous): document assumptions and make less broken.

Bug report from Ronny Blomme.


git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@20584 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Love Hörnquist Åstrand
2007-05-08 00:40:47 +00:00
parent 06244210e0
commit 0018da82f1

View File

@@ -798,6 +798,10 @@ kadm5_log_goto_end (int fd)
/* /*
* Return previous log entry. * Return previous log entry.
*
* The pointer in `sp<73> is assumed to be at the top of the entry before
* previous entry. On success, the `sp<73> pointer is set to data portion
* of previous entry. In case of error, its not changed at all.
*/ */
kadm5_ret_t kadm5_ret_t
@@ -809,9 +813,11 @@ kadm5_log_previous (krb5_context context,
uint32_t *len) uint32_t *len)
{ {
krb5_error_code ret; krb5_error_code ret;
off_t off; off_t off, oldoff;
int32_t tmp; int32_t tmp;
oldoff = krb5_storage_seek(sp, 0, SEEK_CUR);
krb5_storage_seek(sp, -8, SEEK_CUR); krb5_storage_seek(sp, -8, SEEK_CUR);
ret = krb5_ret_int32 (sp, &tmp); ret = krb5_ret_int32 (sp, &tmp);
if (ret) if (ret)
@@ -825,6 +831,7 @@ kadm5_log_previous (krb5_context context,
if (ret) if (ret)
goto end_of_storage; goto end_of_storage;
if (tmp != *ver) { if (tmp != *ver) {
krb5_storage_seek(sp, oldoff, SEEK_SET);
krb5_set_error_string(context, "kadm5_log_previous: log entry " krb5_set_error_string(context, "kadm5_log_previous: log entry "
"have consistency failure, version number wrong"); "have consistency failure, version number wrong");
return KADM5_BAD_DB; return KADM5_BAD_DB;
@@ -838,7 +845,8 @@ kadm5_log_previous (krb5_context context,
ret = krb5_ret_int32 (sp, &tmp); ret = krb5_ret_int32 (sp, &tmp);
if (ret) if (ret)
goto end_of_storage; goto end_of_storage;
if (tmp != *ver) { if (tmp != *len) {
krb5_storage_seek(sp, oldoff, SEEK_SET);
krb5_set_error_string(context, "kadm5_log_previous: log entry " krb5_set_error_string(context, "kadm5_log_previous: log entry "
"have consistency failure, length wrong"); "have consistency failure, length wrong");
return KADM5_BAD_DB; return KADM5_BAD_DB;
@@ -846,6 +854,7 @@ kadm5_log_previous (krb5_context context,
return 0; return 0;
end_of_storage: end_of_storage:
krb5_storage_seek(sp, oldoff, SEEK_SET);
krb5_set_error_string(context, "kadm5_log_previous: end of storage " krb5_set_error_string(context, "kadm5_log_previous: end of storage "
"reached before end"); "reached before end");
return ret; return ret;