Fix some krb5_storage_write() usages

This commit is contained in:
Nicolas Williams
2017-05-26 16:19:52 -05:00
committed by Viktor Dukhovni
parent 2c542ce8b1
commit 122cdc578e
5 changed files with 52 additions and 36 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Kungliga Tekniska Högskolan
* Copyright (c) 2017 Kungliga Tekniska Högskolan
* (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved.
*
@@ -51,6 +51,7 @@ gss_export_cred(OM_uint32 * minor_status,
struct _gss_mechanism_cred *mc;
gss_buffer_desc buffer;
krb5_error_code ret;
krb5_ssize_t bytes;
krb5_storage *sp;
OM_uint32 major;
krb5_data data;
@@ -84,8 +85,8 @@ gss_export_cred(OM_uint32 * minor_status,
return major;
}
ret = krb5_storage_write(sp, buffer.value, buffer.length);
if (ret < 0 || (size_t)ret != buffer.length) {
bytes = krb5_storage_write(sp, buffer.value, buffer.length);
if (bytes < 0 || (size_t)bytes != buffer.length) {
gss_release_buffer(minor_status, &buffer);
krb5_storage_free(sp);
*minor_status = EINVAL;

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 1997 - 2001 Kungliga Tekniska Högskolan
* Copyright (c) 1997 - 2017 Kungliga Tekniska Högskolan
* (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved.
*
@@ -951,7 +951,7 @@ mdb_store(krb5_context context, HDB *db, unsigned flags, hdb_entry_ex *entry)
krb5_data kdb_ent = { 0, 0 };
krb5_data key = { 0, 0 };
krb5_data value = { 0, 0 };
ssize_t sz;
krb5_ssize_t sz;
if ((flags & HDB_F_PRECHECK) && (flags & HDB_F_REPLACE))
return 0;
@@ -977,7 +977,7 @@ mdb_store(krb5_context context, HDB *db, unsigned flags, hdb_entry_ex *entry)
if (ret) goto out;
sz = krb5_storage_write(sp, "\n", 2); /* NUL-terminate */
ret = ENOMEM;
if (sz == -1) goto out;
if (sz != 2) goto out;
ret = krb5_storage_to_data(sp, &line);
if (ret) goto out;
@@ -1278,7 +1278,7 @@ _hdb_mit_dump2mitdb_entry(krb5_context context, char *line, krb5_storage *sp)
krb5_error_code ret = EINVAL;
char *p = line, *q;
char *princ;
ssize_t sz;
krb5_ssize_t sz;
size_t i;
size_t princ_len;
unsigned int num_tl_data;
@@ -1374,7 +1374,7 @@ _hdb_mit_dump2mitdb_entry(krb5_context context, char *line, krb5_storage *sp)
ret = krb5_store_uint16(sp, princ_len);
if (ret) return ret;
sz = krb5_storage_write(sp, princ, princ_len);
if (sz == -1) return ENOMEM;
if (sz != princ_len) return ENOMEM;
/* scan and write TL data */
for (i = 0; i < num_tl_data; i++) {
@@ -1407,7 +1407,7 @@ _hdb_mit_dump2mitdb_entry(krb5_context context, char *line, krb5_storage *sp)
return EINVAL;
sz = krb5_storage_write(sp, buf, tl_length);
free(buf);
if (sz == -1) return ENOMEM;
if (sz != tl_length) return ENOMEM;
} else {
if (strcmp(nexttoken(&p, 0, "'-1' field"), "-1") != 0) return EINVAL;
}
@@ -1450,7 +1450,7 @@ _hdb_mit_dump2mitdb_entry(krb5_context context, char *line, krb5_storage *sp)
return EINVAL;
sz = krb5_storage_write(sp, buf, keylen);
free(buf);
if (sz == -1) return ENOMEM;
if (sz != keylen) return ENOMEM;
} else {
if (strcmp(nexttoken(&p, 0,
"'-1' zero-length key/salt field"),

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 1997 - 2007 Kungliga Tekniska Högskolan
* Copyright (c) 1997 - 2017 Kungliga Tekniska Högskolan
* (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved.
*
@@ -911,9 +911,11 @@ kadm5_log_flush(kadm5_server_context *context, krb5_storage *sp)
len = data.length;
bytes = krb5_storage_write(sp, data.data, len);
krb5_data_free(&data);
if (bytes < 0) {
if (bytes != len) {
krb5_storage_free(sp);
return errno;
ret = bytes == -1 ? errno : KADM5_LOG_CORRUPT;
krb5_warn(context->context, ret, "short write to iprop log file");
return ret;
}
if (bytes != (krb5_ssize_t)len) {
krb5_storage_free(sp);
@@ -938,6 +940,7 @@ kadm5_ret_t
kadm5_log_create(kadm5_server_context *context, hdb_entry *entry)
{
krb5_storage *sp;
krb5_ssize_t bytes;
kadm5_ret_t ret;
krb5_data value;
hdb_entry_ex ent;
@@ -975,9 +978,9 @@ kadm5_log_create(kadm5_server_context *context, hdb_entry *entry)
if (ret == 0)
ret = krb5_store_uint32(sp, value.length);
if (ret == 0) {
if (krb5_storage_write(sp, value.data, value.length) !=
(krb5_ssize_t)value.length)
ret = errno;
bytes = krb5_storage_write(sp, value.data, value.length);
if (bytes != (krb5_ssize_t)value.length)
ret = bytes == -1 ? errno : ENOMEM;
}
if (ret == 0)
ret = krb5_store_uint32(sp, value.length);
@@ -1140,6 +1143,7 @@ kadm5_log_rename(kadm5_server_context *context,
hdb_entry *entry)
{
krb5_storage *sp;
krb5_ssize_t bytes;
kadm5_ret_t ret;
uint32_t len = 0; /* So dumb compilers don't warn */
off_t end_off = 0; /* Ditto; this allows de-indentation by two levels */
@@ -1206,9 +1210,9 @@ kadm5_log_rename(kadm5_server_context *context,
ret = krb5_store_principal(sp, source);
if (ret == 0) {
errno = 0;
if (krb5_storage_write(sp, value.data, value.length) !=
(krb5_ssize_t)value.length)
ret = errno ? errno : EIO;
bytes = krb5_storage_write(sp, value.data, value.length);
if (bytes != (krb5_ssize_t)value.length)
ret = bytes == -1 ? errno : ENOMEM;
}
if (ret == 0) {
end_off = krb5_storage_seek(sp, 0, SEEK_CUR);
@@ -1307,6 +1311,7 @@ kadm5_log_modify(kadm5_server_context *context,
uint32_t mask)
{
krb5_storage *sp;
krb5_ssize_t bytes;
kadm5_ret_t ret;
krb5_data value;
uint32_t len;
@@ -1350,9 +1355,9 @@ kadm5_log_modify(kadm5_server_context *context,
if (ret == 0)
ret = krb5_store_uint32(sp, mask);
if (ret == 0) {
if (krb5_storage_write(sp, value.data, value.length) !=
(krb5_ssize_t)value.length)
ret = errno;
bytes = krb5_storage_write(sp, value.data, value.length);
if (bytes != (krb5_ssize_t)value.length)
ret = bytes == -1 ? errno : ENOMEM;
}
if (ret == 0)
ret = krb5_store_uint32(sp, len);
@@ -2523,8 +2528,8 @@ kadm5_log_truncate(kadm5_server_context *context, size_t keep, size_t maxbytes)
ret = krb5_store_uint32(sp, 0); /* end of trailer */
if (ret == 0) {
bytes = krb5_storage_write(sp, entries.data, entries.length);
if (bytes == -1)
ret = errno;
if (bytes != entries.length)
ret = bytes == -1 ? errno : EIO;
}
if (ret == 0)
ret = krb5_storage_fsync(sp);

View File

@@ -546,24 +546,34 @@ fcc_initialize(krb5_context context,
f->version = context->fcache_vno;
else
f->version = KRB5_FCC_FVNO_4;
ret |= krb5_store_int8(sp, 5);
ret |= krb5_store_int8(sp, f->version);
if (ret == 0)
ret = krb5_store_int8(sp, 5);
if (ret == 0)
ret = krb5_store_int8(sp, f->version);
storage_set_flags(context, sp, f->version);
if(f->version == KRB5_FCC_FVNO_4 && ret == 0) {
/* V4 stuff */
if (context->kdc_sec_offset) {
ret |= krb5_store_int16 (sp, 12); /* length */
ret |= krb5_store_int16 (sp, FCC_TAG_DELTATIME); /* Tag */
ret |= krb5_store_int16 (sp, 8); /* length of data */
ret |= krb5_store_int32 (sp, context->kdc_sec_offset);
ret |= krb5_store_int32 (sp, context->kdc_usec_offset);
if (ret == 0)
ret = krb5_store_int16 (sp, 12); /* length */
if (ret == 0)
ret = krb5_store_int16 (sp, FCC_TAG_DELTATIME); /* Tag */
if (ret == 0)
ret = krb5_store_int16 (sp, 8); /* length of data */
if (ret == 0)
ret = krb5_store_int32 (sp, context->kdc_sec_offset);
if (ret == 0)
ret = krb5_store_int32 (sp, context->kdc_usec_offset);
} else {
ret |= krb5_store_int16 (sp, 0);
if (ret == 0)
ret = krb5_store_int16 (sp, 0);
}
}
ret |= krb5_store_principal(sp, primary_principal);
if (ret == 0)
ret = krb5_store_principal(sp, primary_principal);
ret |= write_storage(context, sp, fd);
if (ret == 0)
ret = write_storage(context, sp, fd);
krb5_storage_free(sp);
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan
* Copyright (c) 2006 - 2017 Kungliga Tekniska Högskolan
* (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved.
*
@@ -925,7 +925,7 @@ fill_zeros(krb5_context context, krb5_storage *sp, size_t len)
if (l > sizeof(zeros))
l = sizeof(zeros);
sret = krb5_storage_write(sp, zeros, l);
if (sret <= 0)
if (sret != l)
return krb5_enomem(context);
len -= sret;