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). * (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved. * All rights reserved.
* *
@@ -51,6 +51,7 @@ gss_export_cred(OM_uint32 * minor_status,
struct _gss_mechanism_cred *mc; struct _gss_mechanism_cred *mc;
gss_buffer_desc buffer; gss_buffer_desc buffer;
krb5_error_code ret; krb5_error_code ret;
krb5_ssize_t bytes;
krb5_storage *sp; krb5_storage *sp;
OM_uint32 major; OM_uint32 major;
krb5_data data; krb5_data data;
@@ -84,8 +85,8 @@ gss_export_cred(OM_uint32 * minor_status,
return major; return major;
} }
ret = krb5_storage_write(sp, buffer.value, buffer.length); bytes = krb5_storage_write(sp, buffer.value, buffer.length);
if (ret < 0 || (size_t)ret != buffer.length) { if (bytes < 0 || (size_t)bytes != buffer.length) {
gss_release_buffer(minor_status, &buffer); gss_release_buffer(minor_status, &buffer);
krb5_storage_free(sp); krb5_storage_free(sp);
*minor_status = EINVAL; *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). * (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved. * 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 kdb_ent = { 0, 0 };
krb5_data key = { 0, 0 }; krb5_data key = { 0, 0 };
krb5_data value = { 0, 0 }; krb5_data value = { 0, 0 };
ssize_t sz; krb5_ssize_t sz;
if ((flags & HDB_F_PRECHECK) && (flags & HDB_F_REPLACE)) if ((flags & HDB_F_PRECHECK) && (flags & HDB_F_REPLACE))
return 0; return 0;
@@ -977,7 +977,7 @@ mdb_store(krb5_context context, HDB *db, unsigned flags, hdb_entry_ex *entry)
if (ret) goto out; if (ret) goto out;
sz = krb5_storage_write(sp, "\n", 2); /* NUL-terminate */ sz = krb5_storage_write(sp, "\n", 2); /* NUL-terminate */
ret = ENOMEM; ret = ENOMEM;
if (sz == -1) goto out; if (sz != 2) goto out;
ret = krb5_storage_to_data(sp, &line); ret = krb5_storage_to_data(sp, &line);
if (ret) goto out; 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; krb5_error_code ret = EINVAL;
char *p = line, *q; char *p = line, *q;
char *princ; char *princ;
ssize_t sz; krb5_ssize_t sz;
size_t i; size_t i;
size_t princ_len; size_t princ_len;
unsigned int num_tl_data; 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); ret = krb5_store_uint16(sp, princ_len);
if (ret) return ret; if (ret) return ret;
sz = krb5_storage_write(sp, princ, princ_len); sz = krb5_storage_write(sp, princ, princ_len);
if (sz == -1) return ENOMEM; if (sz != princ_len) return ENOMEM;
/* scan and write TL data */ /* scan and write TL data */
for (i = 0; i < num_tl_data; i++) { 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; return EINVAL;
sz = krb5_storage_write(sp, buf, tl_length); sz = krb5_storage_write(sp, buf, tl_length);
free(buf); free(buf);
if (sz == -1) return ENOMEM; if (sz != tl_length) return ENOMEM;
} else { } else {
if (strcmp(nexttoken(&p, 0, "'-1' field"), "-1") != 0) return EINVAL; 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; return EINVAL;
sz = krb5_storage_write(sp, buf, keylen); sz = krb5_storage_write(sp, buf, keylen);
free(buf); free(buf);
if (sz == -1) return ENOMEM; if (sz != keylen) return ENOMEM;
} else { } else {
if (strcmp(nexttoken(&p, 0, if (strcmp(nexttoken(&p, 0,
"'-1' zero-length key/salt field"), "'-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). * (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved. * All rights reserved.
* *
@@ -911,9 +911,11 @@ kadm5_log_flush(kadm5_server_context *context, krb5_storage *sp)
len = data.length; len = data.length;
bytes = krb5_storage_write(sp, data.data, len); bytes = krb5_storage_write(sp, data.data, len);
krb5_data_free(&data); krb5_data_free(&data);
if (bytes < 0) { if (bytes != len) {
krb5_storage_free(sp); 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) { if (bytes != (krb5_ssize_t)len) {
krb5_storage_free(sp); krb5_storage_free(sp);
@@ -938,6 +940,7 @@ kadm5_ret_t
kadm5_log_create(kadm5_server_context *context, hdb_entry *entry) kadm5_log_create(kadm5_server_context *context, hdb_entry *entry)
{ {
krb5_storage *sp; krb5_storage *sp;
krb5_ssize_t bytes;
kadm5_ret_t ret; kadm5_ret_t ret;
krb5_data value; krb5_data value;
hdb_entry_ex ent; hdb_entry_ex ent;
@@ -975,9 +978,9 @@ kadm5_log_create(kadm5_server_context *context, hdb_entry *entry)
if (ret == 0) if (ret == 0)
ret = krb5_store_uint32(sp, value.length); ret = krb5_store_uint32(sp, value.length);
if (ret == 0) { if (ret == 0) {
if (krb5_storage_write(sp, value.data, value.length) != bytes = krb5_storage_write(sp, value.data, value.length);
(krb5_ssize_t)value.length) if (bytes != (krb5_ssize_t)value.length)
ret = errno; ret = bytes == -1 ? errno : ENOMEM;
} }
if (ret == 0) if (ret == 0)
ret = krb5_store_uint32(sp, value.length); ret = krb5_store_uint32(sp, value.length);
@@ -1140,6 +1143,7 @@ kadm5_log_rename(kadm5_server_context *context,
hdb_entry *entry) hdb_entry *entry)
{ {
krb5_storage *sp; krb5_storage *sp;
krb5_ssize_t bytes;
kadm5_ret_t ret; kadm5_ret_t ret;
uint32_t len = 0; /* So dumb compilers don't warn */ uint32_t len = 0; /* So dumb compilers don't warn */
off_t end_off = 0; /* Ditto; this allows de-indentation by two levels */ 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); ret = krb5_store_principal(sp, source);
if (ret == 0) { if (ret == 0) {
errno = 0; errno = 0;
if (krb5_storage_write(sp, value.data, value.length) != bytes = krb5_storage_write(sp, value.data, value.length);
(krb5_ssize_t)value.length) if (bytes != (krb5_ssize_t)value.length)
ret = errno ? errno : EIO; ret = bytes == -1 ? errno : ENOMEM;
} }
if (ret == 0) { if (ret == 0) {
end_off = krb5_storage_seek(sp, 0, SEEK_CUR); end_off = krb5_storage_seek(sp, 0, SEEK_CUR);
@@ -1307,6 +1311,7 @@ kadm5_log_modify(kadm5_server_context *context,
uint32_t mask) uint32_t mask)
{ {
krb5_storage *sp; krb5_storage *sp;
krb5_ssize_t bytes;
kadm5_ret_t ret; kadm5_ret_t ret;
krb5_data value; krb5_data value;
uint32_t len; uint32_t len;
@@ -1350,9 +1355,9 @@ kadm5_log_modify(kadm5_server_context *context,
if (ret == 0) if (ret == 0)
ret = krb5_store_uint32(sp, mask); ret = krb5_store_uint32(sp, mask);
if (ret == 0) { if (ret == 0) {
if (krb5_storage_write(sp, value.data, value.length) != bytes = krb5_storage_write(sp, value.data, value.length);
(krb5_ssize_t)value.length) if (bytes != (krb5_ssize_t)value.length)
ret = errno; ret = bytes == -1 ? errno : ENOMEM;
} }
if (ret == 0) if (ret == 0)
ret = krb5_store_uint32(sp, len); 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 */ ret = krb5_store_uint32(sp, 0); /* end of trailer */
if (ret == 0) { if (ret == 0) {
bytes = krb5_storage_write(sp, entries.data, entries.length); bytes = krb5_storage_write(sp, entries.data, entries.length);
if (bytes == -1) if (bytes != entries.length)
ret = errno; ret = bytes == -1 ? errno : EIO;
} }
if (ret == 0) if (ret == 0)
ret = krb5_storage_fsync(sp); ret = krb5_storage_fsync(sp);

View File

@@ -546,24 +546,34 @@ fcc_initialize(krb5_context context,
f->version = context->fcache_vno; f->version = context->fcache_vno;
else else
f->version = KRB5_FCC_FVNO_4; f->version = KRB5_FCC_FVNO_4;
ret |= krb5_store_int8(sp, 5); if (ret == 0)
ret |= krb5_store_int8(sp, f->version); ret = krb5_store_int8(sp, 5);
if (ret == 0)
ret = krb5_store_int8(sp, f->version);
storage_set_flags(context, sp, f->version); storage_set_flags(context, sp, f->version);
if(f->version == KRB5_FCC_FVNO_4 && ret == 0) { if(f->version == KRB5_FCC_FVNO_4 && ret == 0) {
/* V4 stuff */ /* V4 stuff */
if (context->kdc_sec_offset) { if (context->kdc_sec_offset) {
ret |= krb5_store_int16 (sp, 12); /* length */ if (ret == 0)
ret |= krb5_store_int16 (sp, FCC_TAG_DELTATIME); /* Tag */ ret = krb5_store_int16 (sp, 12); /* length */
ret |= krb5_store_int16 (sp, 8); /* length of data */ if (ret == 0)
ret |= krb5_store_int32 (sp, context->kdc_sec_offset); ret = krb5_store_int16 (sp, FCC_TAG_DELTATIME); /* Tag */
ret |= krb5_store_int32 (sp, context->kdc_usec_offset); 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 { } 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); 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). * (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved. * All rights reserved.
* *
@@ -925,7 +925,7 @@ fill_zeros(krb5_context context, krb5_storage *sp, size_t len)
if (l > sizeof(zeros)) if (l > sizeof(zeros))
l = sizeof(zeros); l = sizeof(zeros);
sret = krb5_storage_write(sp, zeros, l); sret = krb5_storage_write(sp, zeros, l);
if (sret <= 0) if (sret != l)
return krb5_enomem(context); return krb5_enomem(context);
len -= sret; len -= sret;