diff --git a/include/bits.c b/include/bits.c index e77df54fa..af077f3b4 100644 --- a/include/bits.c +++ b/include/bits.c @@ -118,7 +118,8 @@ int main(int argc, char **argv) { FILE *f; int flag; - const char *fn, *hb; + char *p = NULL; + const char *hb; if (argc > 1 && strcmp(argv[1], "--version") == 0) { printf("some version"); @@ -126,14 +127,11 @@ int main(int argc, char **argv) } if(argc < 2){ - fn = "bits.h"; hb = "__BITS_H__"; f = stdout; } else { - char *p; - fn = argv[1]; - p = malloc(strlen(fn) + 5); - sprintf(p, "__%s__", fn); + p = malloc(strlen(argv[1]) + 5); + sprintf(p, "__%s__", argv[1]); hb = p; for(; *p; p++){ if(!isalnum((unsigned char)*p)) diff --git a/lib/asn1/der_put.c b/lib/asn1/der_put.c index 1fd1e714c..843d09f5c 100644 --- a/lib/asn1/der_put.c +++ b/lib/asn1/der_put.c @@ -502,12 +502,14 @@ _heim_time2generalizedtime (time_t t, heim_octet_string *s, int gtimep) struct tm tm; const size_t len = gtimep ? 15 : 13; + s->data = NULL; + s->length = 0; + if (_der_gmtime(t, &tm) == NULL) + return ASN1_BAD_TIMEFORMAT; s->data = malloc(len + 1); if (s->data == NULL) return ENOMEM; s->length = len; - if (_der_gmtime(t, &tm) == NULL) - return ASN1_BAD_TIMEFORMAT; if (gtimep) snprintf (s->data, len + 1, "%04d%02d%02d%02d%02d%02dZ", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, diff --git a/lib/base/db.c b/lib/base/db.c index e90329a6c..c660baf21 100644 --- a/lib/base/db.c +++ b/lib/base/db.c @@ -500,6 +500,8 @@ heim_db_begin(heim_db_t db, int read_only, heim_error_t *error) if (db->plug->beginf) { ret = db->plug->beginf(db->db_data, read_only, error); + if (ret) + return ret; } else if (!db->in_transaction) { /* Try to emulate transactions */ diff --git a/lib/base/heimbase.c b/lib/base/heimbase.c index fdb511bba..a93b1c7bf 100644 --- a/lib/base/heimbase.c +++ b/lib/base/heimbase.c @@ -986,7 +986,7 @@ heim_path_vcreate(heim_object_t ptr, size_t size, heim_object_t leaf, heim_number_get_int(path_element), leaf); } - return 0; + return ret; err: if (error && !*error) { diff --git a/lib/gssapi/krb5/8003.c b/lib/gssapi/krb5/8003.c index d4555c510..5af477fe9 100644 --- a/lib/gssapi/krb5/8003.c +++ b/lib/gssapi/krb5/8003.c @@ -157,7 +157,7 @@ _gsskrb5_create_8003_checksum ( *p++ = (fwd_data->length >> 8) & 0xFF; /* Dlgth */ memcpy(p, (unsigned char *) fwd_data->data, fwd_data->length); - p += fwd_data->length; + /* p += fwd_data->length; */ /* commented out to quiet warning */ } return GSS_S_COMPLETE; diff --git a/lib/gssapi/krb5/accept_sec_context.c b/lib/gssapi/krb5/accept_sec_context.c index 3b85dcebe..26e84318a 100644 --- a/lib/gssapi/krb5/accept_sec_context.c +++ b/lib/gssapi/krb5/accept_sec_context.c @@ -482,6 +482,7 @@ gsskrb5_acceptor_start(OM_uint32 * minor_status, if (kret) { ret = GSS_S_FAILURE; *minor_status = kret; + return ret; } kret = krb5_copy_principal(context, diff --git a/lib/gssapi/krb5/add_cred.c b/lib/gssapi/krb5/add_cred.c index 9bafca9a8..42f6b4818 100644 --- a/lib/gssapi/krb5/add_cred.c +++ b/lib/gssapi/krb5/add_cred.c @@ -154,8 +154,6 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_add_cred ( if (cred->keytab) { char *name = NULL; - major = GSS_S_FAILURE; - *minor_status = krb5_kt_get_full_name(context, cred->keytab, &name); if (*minor_status) @@ -171,8 +169,6 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_add_cred ( const char *type, *name; char *type_name = NULL; - major = GSS_S_FAILURE; - type = krb5_cc_get_type(context, cred->ccache); if (type == NULL){ *minor_status = ENOMEM; diff --git a/lib/gssapi/krb5/arcfour.c b/lib/gssapi/krb5/arcfour.c index a61f7686e..0aa2da080 100644 --- a/lib/gssapi/krb5/arcfour.c +++ b/lib/gssapi/krb5/arcfour.c @@ -1114,6 +1114,7 @@ _gssapi_wrap_iov_arcfour(OM_uint32 *minor_status, if (kret) { *minor_status = kret; major_status = GSS_S_FAILURE; + return major_status; } { diff --git a/lib/gssapi/krb5/cfx.c b/lib/gssapi/krb5/cfx.c index 3c1536b60..29fecca86 100644 --- a/lib/gssapi/krb5/cfx.c +++ b/lib/gssapi/krb5/cfx.c @@ -391,7 +391,6 @@ _gssapi_wrap_cfx_iov(OM_uint32 *minor_status, if (IS_DCE_STYLE(ctx)) rrc -= ec; gsshsize += gsstsize; - gsstsize = 0; } else if (GSS_IOV_BUFFER_FLAGS(trailer->type) & GSS_IOV_BUFFER_FLAG_ALLOCATE) { major_status = _gk_allocate_buffer(minor_status, trailer, gsstsize); if (major_status) @@ -683,6 +682,7 @@ unrotate_iov(OM_uint32 *minor_status, size_t rrc, gss_iov_buffer_desc *iov, int if (iov[i].buffer.length <= skip) { skip -= iov[i].buffer.length; } else { + /* copy back to original buffer */ memcpy(((uint8_t *)iov[i].buffer.value) + skip, q, iov[i].buffer.length - skip); q += iov[i].buffer.length - skip; skip = 0; @@ -697,13 +697,14 @@ unrotate_iov(OM_uint32 *minor_status, size_t rrc, gss_iov_buffer_desc *iov, int GSS_IOV_BUFFER_TYPE(iov[i].type) == GSS_IOV_BUFFER_TYPE_PADDING || GSS_IOV_BUFFER_TYPE(iov[i].type) == GSS_IOV_BUFFER_TYPE_TRAILER) { - memcpy(q, iov[i].buffer.value, min(iov[i].buffer.length, skip)); + memcpy(iov[i].buffer.value, q, min(iov[i].buffer.length, skip)); if (iov[i].buffer.length > skip) break; skip -= iov[i].buffer.length; q += iov[i].buffer.length; } } + free(p); return GSS_S_COMPLETE; } @@ -930,7 +931,6 @@ _gssapi_unwrap_cfx_iov(OM_uint32 *minor_status, } gsshsize += gsstsize; - gsstsize = 0; } else if (trailer->buffer.length != gsstsize) { major_status = GSS_S_DEFECTIVE_TOKEN; goto failure; diff --git a/lib/gssapi/krb5/context_time.c b/lib/gssapi/krb5/context_time.c index 51c6e5be9..58249cb5a 100644 --- a/lib/gssapi/krb5/context_time.c +++ b/lib/gssapi/krb5/context_time.c @@ -49,6 +49,7 @@ _gsskrb5_lifetime_left(OM_uint32 *minor_status, kret = krb5_timeofday(context, &now); if (kret) { + *lifetime_rec = 0; *minor_status = kret; return GSS_S_FAILURE; } diff --git a/lib/gssapi/krb5/creds.c b/lib/gssapi/krb5/creds.c index f1fe32f33..1cc3ac848 100644 --- a/lib/gssapi/krb5/creds.c +++ b/lib/gssapi/krb5/creds.c @@ -229,6 +229,10 @@ _gsskrb5_import_cred(OM_uint32 * minor_status, ret = krb5_cc_store_cred(context, id, &creds); krb5_free_cred_contents(context, &creds); + if (ret) { + *minor_status = ret; + return GSS_S_FAILURE; + } flags |= GSS_CF_DESTROY_CRED_ON_RELEASE; diff --git a/lib/gssapi/krb5/init_sec_context.c b/lib/gssapi/krb5/init_sec_context.c index 0ecf38869..4ef5c9c71 100644 --- a/lib/gssapi/krb5/init_sec_context.c +++ b/lib/gssapi/krb5/init_sec_context.c @@ -787,14 +787,11 @@ repl_mutual repl); *minor_status = 0; - if (time_rec) { - ret = _gsskrb5_lifetime_left(minor_status, - context, - ctx->endtime, - time_rec); - } else { - ret = GSS_S_COMPLETE; - } + if (time_rec) + _gsskrb5_lifetime_left(minor_status, + context, + ctx->endtime, + time_rec); if (ret_flags) *ret_flags = ctx->flags; diff --git a/lib/gssapi/krb5/verify_mic.c b/lib/gssapi/krb5/verify_mic.c index 46926bee5..9968ce403 100644 --- a/lib/gssapi/krb5/verify_mic.c +++ b/lib/gssapi/krb5/verify_mic.c @@ -254,15 +254,11 @@ retry: krb5_crypto_destroy (context, crypto); ret = krb5_crypto_init(context, key, ETYPE_DES3_CBC_SHA1, &crypto); - if (ret){ - *minor_status = ret; - return GSS_S_FAILURE; - } - - ret = krb5_verify_checksum (context, crypto, - KRB5_KU_USAGE_SIGN, - tmp, message_buffer->length + 8, - &csum); + if (ret == 0) + ret = krb5_verify_checksum(context, crypto, + KRB5_KU_USAGE_SIGN, + tmp, message_buffer->length + 8, + &csum); free (tmp); if (ret) { krb5_crypto_destroy (context, crypto); diff --git a/lib/gssapi/mech/gss_indicate_mechs.c b/lib/gssapi/mech/gss_indicate_mechs.c index 8fd53d956..12d7f1ae3 100644 --- a/lib/gssapi/mech/gss_indicate_mechs.c +++ b/lib/gssapi/mech/gss_indicate_mechs.c @@ -43,6 +43,7 @@ gss_indicate_mechs(OM_uint32 *minor_status, if (major_status) return (major_status); + /* XXX We ignore ENOMEM from gss_add_oid_set_member() */ HEIM_SLIST_FOREACH(m, &_gss_mechs, gm_link) { if (m->gm_mech.gm_indicate_mechs) { major_status = m->gm_mech.gm_indicate_mechs( @@ -50,11 +51,11 @@ gss_indicate_mechs(OM_uint32 *minor_status, if (major_status) continue; for (i = 0; i < set->count; i++) - major_status = gss_add_oid_set_member( + gss_add_oid_set_member( minor_status, &set->elements[i], mech_set); gss_release_oid_set(minor_status, &set); } else { - major_status = gss_add_oid_set_member( + gss_add_oid_set_member( minor_status, &m->gm_mech_oid, mech_set); } } diff --git a/lib/gssapi/ntlm/creds.c b/lib/gssapi/ntlm/creds.c index 5c18ed094..b918dd541 100644 --- a/lib/gssapi/ntlm/creds.c +++ b/lib/gssapi/ntlm/creds.c @@ -62,6 +62,7 @@ _gss_ntlm_inquire_cred if (n == NULL || n->user == NULL || n->domain == NULL) { if (n) free(n->user); + free(n); *minor_status = ENOMEM; return GSS_S_FAILURE; } diff --git a/lib/gssapi/test_cred.c b/lib/gssapi/test_cred.c index 23428050d..7ebab9a24 100644 --- a/lib/gssapi/test_cred.c +++ b/lib/gssapi/test_cred.c @@ -154,6 +154,8 @@ acquire_add_release_add(gss_name_t name, gss_cred_usage_t usage) NULL, NULL, NULL); + if (maj_stat != GSS_S_COMPLETE) + gss_err(1, min_stat, "add_cred 2 %d != GSS_S_COMPLETE", (int)maj_stat); maj_stat = gss_release_cred(&min_stat, &cred2); if (maj_stat != GSS_S_COMPLETE) @@ -161,7 +163,7 @@ acquire_add_release_add(gss_name_t name, gss_cred_usage_t usage) maj_stat = gss_release_cred(&min_stat, &cred3); if (maj_stat != GSS_S_COMPLETE) - gss_err(1, min_stat, "release 2 %d != GSS_S_COMPLETE", (int)maj_stat); + gss_err(1, min_stat, "release 3 %d != GSS_S_COMPLETE", (int)maj_stat); } static int version_flag = 0; diff --git a/lib/gssapi/test_ntlm.c b/lib/gssapi/test_ntlm.c index 56f4814e6..de3a8dd88 100644 --- a/lib/gssapi/test_ntlm.c +++ b/lib/gssapi/test_ntlm.c @@ -333,5 +333,5 @@ main(int argc, char **argv) ret += test_libntlm_v2(0); ret += test_libntlm_v2(NTLM_NEG_KEYEX); - return 0; + return ret; } diff --git a/lib/hcrypto/evp-pkcs11.c b/lib/hcrypto/evp-pkcs11.c index ac637f67e..93af9b456 100644 --- a/lib/hcrypto/evp-pkcs11.c +++ b/lib/hcrypto/evp-pkcs11.c @@ -121,17 +121,13 @@ p11_module_init_once(void *context) fprintf(stderr, "p11_module_init(%s): %s\n", PKCS11_MODULE_PATH, dlerror()); } #endif - if (pkcs11_module_handle == NULL) { - rv = CKR_LIBRARY_LOAD_FAILED; + if (pkcs11_module_handle == NULL) goto cleanup; - } C_GetFunctionList_fn = (CK_RV (*)(CK_FUNCTION_LIST_PTR_PTR)) dlsym(pkcs11_module_handle, "C_GetFunctionList"); - if (C_GetFunctionList_fn == NULL) { - rv = CKR_LIBRARY_LOAD_FAILED; + if (C_GetFunctionList_fn == NULL) goto cleanup; - } rv = C_GetFunctionList_fn(&module); if (rv != CKR_OK) diff --git a/lib/hcrypto/evp.c b/lib/hcrypto/evp.c index 57c954dbf..23838709c 100644 --- a/lib/hcrypto/evp.c +++ b/lib/hcrypto/evp.c @@ -603,7 +603,8 @@ EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *c) return ret; } if (c->cipher_data) { - memset(c->cipher_data, 0, c->cipher->ctx_size); + if (c->cipher) + memset(c->cipher_data, 0, c->cipher->ctx_size); free(c->cipher_data); c->cipher_data = NULL; } diff --git a/lib/hcrypto/test_rand.c b/lib/hcrypto/test_rand.c index 335b35a9f..b3ee2b104 100644 --- a/lib/hcrypto/test_rand.c +++ b/lib/hcrypto/test_rand.c @@ -103,10 +103,7 @@ main(int argc, char **argv) exit(0); } - argc -= idx; - argv += idx; - - if (argc != 0) + if (argc != idx) usage(1); buffer = emalloc(len); diff --git a/lib/hdb/common.c b/lib/hdb/common.c index 150590c7b..b8ecd3278 100644 --- a/lib/hdb/common.c +++ b/lib/hdb/common.c @@ -222,9 +222,11 @@ hdb_remove_aliases(krb5_context context, HDB *db, krb5_data *key) for (i = 0; i < aliases->aliases.len; i++) { krb5_data akey; - hdb_principal2key(context, &aliases->aliases.val[i], &akey); - code = db->hdb__del(context, db, akey); - krb5_data_free(&akey); + code = hdb_principal2key(context, &aliases->aliases.val[i], &akey); + if (code == 0) { + code = db->hdb__del(context, db, akey); + krb5_data_free(&akey); + } if (code) { free_hdb_entry(&oldentry); return code; @@ -251,14 +253,16 @@ hdb_add_aliases(krb5_context context, HDB *db, hdb_entry_alias entryalias; entryalias.principal = entry->entry.principal; - hdb_principal2key(context, &aliases->aliases.val[i], &key); code = hdb_entry_alias2value(context, &entryalias, &value); if (code) { krb5_data_free(&key); return code; } - code = db->hdb__put(context, db, flags, key, value); - krb5_data_free(&key); + code = hdb_principal2key(context, &aliases->aliases.val[i], &key); + if (code == 0) { + code = db->hdb__put(context, db, flags, key, value); + krb5_data_free(&key); + } krb5_data_free(&value); if (code) return code; @@ -283,9 +287,11 @@ hdb_check_aliases(krb5_context context, HDB *db, hdb_entry_ex *entry) hdb_entry_alias alias; krb5_data akey, value; - hdb_principal2key(context, &aliases->aliases.val[i], &akey); - code = db->hdb__get(context, db, akey, &value); - krb5_data_free(&akey); + code = hdb_principal2key(context, &aliases->aliases.val[i], &akey); + if (code == 0) { + code = db->hdb__get(context, db, akey, &value); + krb5_data_free(&akey); + } if (code == HDB_ERR_NOENTRY) continue; else if (code) diff --git a/lib/hdb/hdb-sqlite.c b/lib/hdb/hdb-sqlite.c index d3461d018..b0867d98a 100644 --- a/lib/hdb/hdb-sqlite.c +++ b/lib/hdb/hdb-sqlite.c @@ -635,7 +635,6 @@ hdb_sqlite_store(krb5_context context, HDB *db, unsigned flags, ret = HDB_ERR_EXISTS; goto rollback; } - ret = 0; ret = bind_principal(context, entry->entry.principal, hsdb->add_principal, 1); if (ret) @@ -663,8 +662,6 @@ hdb_sqlite_store(krb5_context context, HDB *db, unsigned flags, entry_id = sqlite3_column_int64(get_ids, 1); - ret = 0; - } else if(ret == SQLITE_ROW) { /* Found a principal */ if(! (flags & HDB_F_REPLACE)) /* Not allowed to replace it */ diff --git a/lib/hdb/hdb.c b/lib/hdb/hdb.c index 31a8fa1e2..1cb33df08 100644 --- a/lib/hdb/hdb.c +++ b/lib/hdb/hdb.c @@ -420,6 +420,7 @@ hdb_list_builtin(krb5_context context, char **list) if (asprintf(&f, "%sfoo", h->prefix) == -1) f = NULL; if ((sym = make_sym(h->prefix)) == NULL) { + free(buf); free(f); return krb5_enomem(context); } diff --git a/lib/hdb/keys.c b/lib/hdb/keys.c index 7c24093f8..a10245573 100644 --- a/lib/hdb/keys.c +++ b/lib/hdb/keys.c @@ -167,15 +167,14 @@ parse_key_set(krb5_context context, const char *key, salt with, this is mostly useful with null salt for v4 compat, and a cell name for afs compat */ salt->saltvalue.data = strdup(buf[i]); - if (salt->saltvalue.data == NULL) { - krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); - return ENOMEM; - } + if (salt->saltvalue.data == NULL) + return krb5_enomem(context); salt->saltvalue.length = strlen(buf[i]); } } if(enctypes == NULL || salt->salttype == 0) { + krb5_free_salt(context, *salt); krb5_set_error_message(context, EINVAL, "bad value for default_keys `%s'", key); return EINVAL; } @@ -689,6 +688,7 @@ hdb_generate_key_set(krb5_context context, krb5_principal principal, if (ret) { krb5_warn(context, ret, "bad value for default_keys `%s'", *kp); ret = 0; + krb5_free_salt(context, salt); continue; } diff --git a/lib/hx509/cert.c b/lib/hx509/cert.c index ba7f112d5..2d6f58612 100644 --- a/lib/hx509/cert.c +++ b/lib/hx509/cert.c @@ -1846,7 +1846,7 @@ match_alt_name(const GeneralName *n, const Certificate *c, int *same, int *match) { GeneralNames sa; - int ret; + int ret = 0; size_t i, j; i = 0; @@ -1861,7 +1861,7 @@ match_alt_name(const GeneralName *n, const Certificate *c, for (j = 0; j < sa.len; j++) { if (n->element == sa.val[j].element) { *same = 1; - ret = match_general_name(n, &sa.val[j], match); + match_general_name(n, &sa.val[j], match); } } free_GeneralNames(&sa); @@ -1900,7 +1900,7 @@ match_tree(const GeneralSubtrees *t, const Certificate *c, int *match) certname.u.directoryName.u.rdnSequence = c->tbsCertificate.subject.u.rdnSequence; - ret = match_general_name(&t->val[i].base, &certname, &name); + match_general_name(&t->val[i].base, &certname, &name); } /* Handle subjectAltNames, this is icky since they @@ -1908,7 +1908,7 @@ match_tree(const GeneralSubtrees *t, const Certificate *c, int *match) * same type. So if there have been a match of type, require * altname to be set. */ - ret = match_alt_name(&t->val[i].base, c, &same, &alt_name); + match_alt_name(&t->val[i].base, c, &same, &alt_name); } if (name && (!same || alt_name)) *match = 1; diff --git a/lib/hx509/name.c b/lib/hx509/name.c index 70c3e246a..fb6be5cd4 100644 --- a/lib/hx509/name.c +++ b/lib/hx509/name.c @@ -238,14 +238,17 @@ _hx509_Name_to_string(const Name *n, char **str) size_t k; ret = wind_ucs2utf8_length(bmp, bmplen, &k); - if (ret) + if (ret) { + free(oidname); return ret; + } ss = malloc(k + 1); if (ss == NULL) _hx509_abort("allocation failure"); /* XXX */ ret = wind_ucs2utf8(bmp, bmplen, ss, NULL); if (ret) { + free(oidname); free(ss); return ret; } @@ -263,8 +266,10 @@ _hx509_Name_to_string(const Name *n, char **str) size_t k; ret = wind_ucs4utf8_length(uni, unilen, &k); - if (ret) + if (ret) { + free(oidname); return ret; + } ss = malloc(k + 1); if (ss == NULL) @@ -272,6 +277,7 @@ _hx509_Name_to_string(const Name *n, char **str) ret = wind_ucs4utf8(uni, unilen, ss, NULL); if (ret) { free(ss); + free(oidname); return ret; } ss[k] = '\0'; diff --git a/lib/kadm5/iprop-log.c b/lib/kadm5/iprop-log.c index 866933996..9c18f832e 100644 --- a/lib/kadm5/iprop-log.c +++ b/lib/kadm5/iprop-log.c @@ -400,7 +400,7 @@ int last_version(struct last_version_options *opt, int argc, char **argv) { kadm5_server_context *server_context; - char *alt_argv[2]; + char *alt_argv[2] = { NULL, NULL }; krb5_error_code ret; uint32_t version; size_t i; @@ -410,7 +410,6 @@ last_version(struct last_version_options *opt, int argc, char **argv) if (argc == 0) { alt_argv[0] = strdup(server_context->log_context.log_file); - alt_argv[1] = NULL; if (alt_argv[0] == NULL) krb5_err(context, 1, errno, "strdup"); argv = alt_argv; @@ -451,6 +450,7 @@ last_version(struct last_version_options *opt, int argc, char **argv) } kadm5_destroy(server_context); + free(alt_argv[0]); return 0; } diff --git a/lib/krb5/cache.c b/lib/krb5/cache.c index fb6d24fa4..c43cd0ab7 100644 --- a/lib/krb5/cache.c +++ b/lib/krb5/cache.c @@ -1754,8 +1754,10 @@ krb5_cc_get_lifetime(krb5_context context, krb5_ccache id, time_t *t) return krb5_enomem(context); ret = krb5_cc_start_seq_get(context, id, &cursor); - if (ret) + if (ret) { + free(start_realm); return ret; + } while ((ret = krb5_cc_next_cred(context, id, &cursor, &cred)) == 0) { /** diff --git a/lib/krb5/dcache.c b/lib/krb5/dcache.c index a8d283020..a451ebcf6 100644 --- a/lib/krb5/dcache.c +++ b/lib/krb5/dcache.c @@ -547,8 +547,10 @@ static krb5_error_code KRB5_CALLCONV dcc_get_cache_first(krb5_context context, krb5_cc_cursor *cursor) { struct dcache_iter *iter; + krb5_error_code ret; char *name; + *cursor = NULL; iter = calloc(1, sizeof(*iter)); if (iter == NULL) return krb5_enomem(context); @@ -562,18 +564,17 @@ dcc_get_cache_first(krb5_context context, krb5_cc_cursor *cursor) return KRB5_CC_FORMAT; } -#if 1 - free(name); - return KRB5_CC_FORMAT; -#else - - /* XXX */ ret = dcc_resolve(context, NULL, name); free(name); + if (ret) { + free(iter); + return ret; + } + + /* XXX We need to opendir() here */ *cursor = iter; return 0; -#endif } static krb5_error_code KRB5_CALLCONV @@ -588,6 +589,8 @@ dcc_get_cache_next(krb5_context context, krb5_cc_cursor cursor, krb5_ccache *id) krb5_clear_error_message(context); return KRB5_CC_END; } + + /* XXX We need to readdir() here */ iter->first = 0; return KRB5_CC_END; @@ -601,6 +604,7 @@ dcc_end_cache_get(krb5_context context, krb5_cc_cursor cursor) if (iter == NULL) return krb5_einval(context, 2); + /* XXX We need to closedir() here */ if (iter->dc) dcc_release(context, iter->dc); free(iter); diff --git a/lib/krb5/expand_path.c b/lib/krb5/expand_path.c index 3315efa5a..57892f2c9 100644 --- a/lib/krb5/expand_path.c +++ b/lib/krb5/expand_path.c @@ -465,7 +465,6 @@ _krb5_expand_path_tokensv(krb5_context context, char *tok_begin, *tok_end, *append; char **extra_tokens = NULL; const char *path_left; - const char *s; size_t nargs = 0; size_t len = 0; va_list ap; @@ -478,9 +477,9 @@ _krb5_expand_path_tokensv(krb5_context context, *ppath_out = NULL; va_start(ap, ppath_out); - while ((s = va_arg(ap, const char *))) { + while (va_arg(ap, const char *)) { nargs++; - s = va_arg(ap, const char *); + va_arg(ap, const char *); } va_end(ap); nargs *= 2; @@ -494,7 +493,7 @@ _krb5_expand_path_tokensv(krb5_context context, return krb5_enomem(context); va_start(ap, ppath_out); for (i = 0; i < nargs; i++) { - s = va_arg(ap, const char *); /* token key */ + char *s = va_arg(ap, const char *); /* token key */ if (s == NULL) break; extra_tokens[i] = strdup(s); diff --git a/lib/krb5/fcache.c b/lib/krb5/fcache.c index b8d4a29fd..a4b0ee8e1 100644 --- a/lib/krb5/fcache.c +++ b/lib/krb5/fcache.c @@ -964,12 +964,12 @@ cred_delete(krb5_context context, if (srealm && strcmp(srealm, "X-CACHECONF:") == 0) { ret = krb5_principal_set_realm(context, cred->server, "X-RMED-CONF:"); if (ret) - return; + goto out; } sp = krb5_storage_emem(); if (sp == NULL) - return; + goto out; krb5_storage_set_eof_code(sp, KRB5_CC_END); storage_set_flags(context, sp, FCACHE(id)->version); diff --git a/lib/krb5/keytab_file.c b/lib/krb5/keytab_file.c index 8b596790a..14b0f6c59 100644 --- a/lib/krb5/keytab_file.c +++ b/lib/krb5/keytab_file.c @@ -486,6 +486,8 @@ loop: if(start) *start = pos; if(end) *end = pos + 4 + len; out: + if (ret) + krb5_kt_free_entry(context, entry); krb5_storage_seek(cursor->sp, pos + 4 + len, SEEK_SET); return ret; } diff --git a/lib/krb5/keytab_keyfile.c b/lib/krb5/keytab_keyfile.c index d1af4c19c..cb865a794 100644 --- a/lib/krb5/keytab_keyfile.c +++ b/lib/krb5/keytab_keyfile.c @@ -127,7 +127,7 @@ static krb5_error_code KRB5_CALLCONV akf_resolve(krb5_context context, const char *name, krb5_keytab id) { int ret; - struct akf_data *d = malloc(sizeof (struct akf_data)); + struct akf_data *d = calloc(1, sizeof (struct akf_data)); if (d == NULL) return krb5_enomem(context); diff --git a/lib/krb5/pkinit.c b/lib/krb5/pkinit.c index 7cc630d8d..8a3eb7b65 100644 --- a/lib/krb5/pkinit.c +++ b/lib/krb5/pkinit.c @@ -307,8 +307,10 @@ cert2epi(hx509_context context, void *ctx, hx509_cert c) id.issuerAndSerialNumber->length, &iasn, &size, ret); free_IssuerAndSerialNumber(&iasn); - if (ret) + if (ret) { + free_ExternalPrincipalIdentifier(&id); return ret; + } if (id.issuerAndSerialNumber->length != size) abort(); } diff --git a/lib/krb5/principal.c b/lib/krb5/principal.c index 81348d607..fac22ef6f 100644 --- a/lib/krb5/principal.c +++ b/lib/krb5/principal.c @@ -1357,6 +1357,7 @@ krb5_sname_to_principal(krb5_context context, if (ret) { _krb5_debug(context, 5, "Failed to get name canon rules: ret = %d", ret); + free(remote_host); return ret; } if (rules[0].type == KRB5_NCRT_NSS && @@ -1784,8 +1785,6 @@ apply_name_canon_rule(krb5_context context, krb5_name_canon_rule rules, if (ndots > rule->maxdots) return 0; - ret = 0; - if (rule->match_domain != NULL && !is_domain_suffix(orig_hostname, rule->match_domain)) return 0; diff --git a/lib/krb5/store.c b/lib/krb5/store.c index 9917d64a9..c7355f686 100644 --- a/lib/krb5/store.c +++ b/lib/krb5/store.c @@ -450,6 +450,7 @@ krb5_ret_int(krb5_storage *sp, int ret; unsigned char v[8]; uint64_t w; + *value = 0; /* quiets warnings */ ret = sp->fetch(sp, v, len); if (ret < 0) return errno; diff --git a/lib/roken/getcap.c b/lib/roken/getcap.c index a341c104b..a8dd94bef 100644 --- a/lib/roken/getcap.c +++ b/lib/roken/getcap.c @@ -280,6 +280,7 @@ getent(char **cap, size_t *len, char **db_array, int fd, != NULL) { free(record); retval = cdbget(capdbp, &record, name); + /* record is no longer for us to free here */ if (retval < 0) { /* no record available */ (void)capdbp->close(capdbp); @@ -400,17 +401,20 @@ getent(char **cap, size_t *len, char **db_array, int fd, */ if (rp >= r_end) { u_int pos; + char *tmp; size_t newsize; pos = rp - record; newsize = r_end - record + BFRAG; - record = realloc(record, newsize); - if (record == NULL) { + tmp = realloc(record, newsize); + if (tmp == NULL) { errno = ENOMEM; if (myfd) (void)close(fd); + free(record); return (-2); } + record = tmp; r_end = record + newsize; rp = record + pos; } @@ -448,8 +452,10 @@ getent(char **cap, size_t *len, char **db_array, int fd, break; } - if (!foundit) + if (!foundit) { + free(record); return (-1); + } /* * Got the capability record, but now we have to expand all tc=name @@ -541,19 +547,22 @@ getent(char **cap, size_t *len, char **db_array, int fd, if (diff >= r_end - rp) { u_int pos, tcpos, tcposend; size_t newsize; + char *tmp; pos = rp - record; newsize = r_end - record + diff + BFRAG; tcpos = tcstart - record; tcposend = tcend - record; - record = realloc(record, newsize); - if (record == NULL) { + tmp = realloc(record, newsize); + if (tmp == NULL) { errno = ENOMEM; if (myfd) (void)close(fd); free(icap); + free(record); return (-2); } + record = tmp; r_end = record + newsize; rp = record + pos; tcstart = record + tcpos; @@ -584,12 +593,15 @@ getent(char **cap, size_t *len, char **db_array, int fd, if (myfd) (void)close(fd); *len = rp - record - 1; /* don't count NUL */ - if (r_end > rp) - if ((record = - realloc(record, (size_t)(rp - record))) == NULL) { + if (r_end > rp) { + char *tmp = realloc(record, (size_t)(rp - record)); + if (tmp == NULL) { errno = ENOMEM; + free(record); return (-2); } + record = tmp; + } *cap = record; if (tc_not_resolved) @@ -886,9 +898,14 @@ cgetustr(char *buf, const char *cap, char **str) /* * Give back any extra memory and return value and success. */ - if (m_room != 0) - if ((mem = realloc(mem, (size_t)(mp - mem))) == NULL) + if (m_room != 0) { + char *tmp = realloc(mem, (size_t)(mp - mem)); + if (tmp == NULL) { + free(mem); return (-2); + } + mem = tmp; + } *str = mem; return (len); } diff --git a/lib/roken/tsearch.c b/lib/roken/tsearch.c index aa853c52e..0820bb62c 100644 --- a/lib/roken/tsearch.c +++ b/lib/roken/tsearch.c @@ -117,14 +117,13 @@ rk_tdelete(const void * vkey, void ** vrootp, int (*compar)(const void *, const void *)) { node_t **rootp = (node_t **)vrootp; - node_t *p, *q, *r; + node_t *q, *r; int cmp; - if (rootp == NULL || (p = *rootp) == NULL) + if (rootp == NULL || *rootp == NULL) return NULL; while ((cmp = (*compar)(vkey, (*rootp)->key)) != 0) { - p = *rootp; rootp = (cmp < 0) ? &(*rootp)->llink : /* follow llink branch */ &(*rootp)->rlink; /* follow rlink branch */ diff --git a/lib/sl/slc-gram.y b/lib/sl/slc-gram.y index 93bb4056a..31ec6bc24 100644 --- a/lib/sl/slc-gram.y +++ b/lib/sl/slc-gram.y @@ -328,6 +328,7 @@ gen_command(struct assignment *as) cprint(1, " { "); fprintf(cfile, "\"%s\", ", a->u.value); fprintf(cfile, "%s_wrap, ", f); + free(f); b = find(as, "argument"); if(b) fprintf(cfile, "\"%s %s\", ", a->u.value, b->u.value);