summaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorGreg Hudson <ghudson@mit.edu>2013-02-09 00:43:35 -0500
committerGreg Hudson <ghudson@mit.edu>2013-02-09 00:43:35 -0500
commit7905cd6a2eddbf264242bb2a85f811878b2da7ab (patch)
tree72b4028cbe0e399e1d293e2b718530913f0a2673 /src/lib
parent92e2bac0f38f7f60a8fc74b5964357212c4289e1 (diff)
downloadkrb5-7905cd6a2eddbf264242bb2a85f811878b2da7ab.tar.gz
krb5-7905cd6a2eddbf264242bb2a85f811878b2da7ab.tar.xz
krb5-7905cd6a2eddbf264242bb2a85f811878b2da7ab.zip
Add and use k5memdup, k5memdup0 helpers
Add k5-int.h static functions to duplicate byte ranges, optionally with a trailing zero byte, and set an error code like k5alloc does. Use them where they would shorten existing code.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/crypto/krb/checksum_confounder.c9
-rw-r--r--src/lib/crypto/krb/derive.c3
-rw-r--r--src/lib/crypto/krb/enc_old.c3
-rw-r--r--src/lib/gssapi/krb5/gssapi_krb5.c5
-rw-r--r--src/lib/gssapi/krb5/import_cred.c6
-rw-r--r--src/lib/gssapi/krb5/import_name.c6
-rw-r--r--src/lib/gssapi/krb5/naming_exts.c4
-rw-r--r--src/lib/kadm5/srv/svr_principal.c8
-rw-r--r--src/lib/kdb/kdb5.c7
-rw-r--r--src/lib/kdb/kdb_default.c6
-rw-r--r--src/lib/kdb/kdb_log.c7
-rw-r--r--src/lib/krb5/ccache/ccbase.c10
-rw-r--r--src/lib/krb5/keytab/kt_srvtab.c7
-rw-r--r--src/lib/krb5/keytab/ktbase.c10
-rw-r--r--src/lib/krb5/krb/copy_tick.c6
-rw-r--r--src/lib/krb5/krb/fwd_tgt.c9
-rw-r--r--src/lib/krb5/krb/get_in_tkt.c6
-rw-r--r--src/lib/krb5/krb/pac.c18
-rw-r--r--src/lib/krb5/krb/pac_sign.c6
-rw-r--r--src/lib/krb5/krb/preauth2.c9
-rw-r--r--src/lib/krb5/krb/send_tgs.c8
-rw-r--r--src/lib/krb5/krb/walk_rtree.c14
-rw-r--r--src/lib/krb5/os/an_to_ln.c22
-rw-r--r--src/lib/krb5/os/changepw.c13
-rw-r--r--src/lib/krb5/os/get_krbhst.c8
-rw-r--r--src/lib/krb5/os/hostaddr.c7
-rw-r--r--src/lib/krb5/os/locate_kdc.c6
-rw-r--r--src/lib/krb5/rcache/rc_dfl.c4
-rw-r--r--src/lib/krb5/unicode/ucstr.c8
29 files changed, 76 insertions, 159 deletions
diff --git a/src/lib/crypto/krb/checksum_confounder.c b/src/lib/crypto/krb/checksum_confounder.c
index 116b3c7ff..afc473bfe 100644
--- a/src/lib/crypto/krb/checksum_confounder.c
+++ b/src/lib/crypto/krb/checksum_confounder.c
@@ -41,10 +41,10 @@ mk_xorkey(krb5_key origkey, krb5_key *xorkey)
krb5_keyblock xorkeyblock;
size_t i = 0;
- xorbytes = malloc(origkey->keyblock.length);
+ xorbytes = k5memdup(origkey->keyblock.contents, origkey->keyblock.length,
+ &retval);
if (xorbytes == NULL)
- return ENOMEM;
- memcpy(xorbytes, origkey->keyblock.contents, origkey->keyblock.length);
+ return retval;
for (i = 0; i < origkey->keyblock.length; i++)
xorbytes[i] ^= 0xf0;
@@ -118,7 +118,7 @@ krb5_error_code krb5int_confounder_verify(const struct krb5_cksumtypes *ctp,
krb5_crypto_iov *hash_iov = NULL, iov;
size_t blocksize = ctp->enc->block_size, hashsize = ctp->hash->hashsize;
- plaintext = k5alloc(input->length, &ret);
+ plaintext = k5memdup(input->data, input->length, &ret);
if (plaintext == NULL)
return ret;
@@ -129,7 +129,6 @@ krb5_error_code krb5int_confounder_verify(const struct krb5_cksumtypes *ctp,
/* Decrypt the input checksum. */
iov.flags = KRB5_CRYPTO_TYPE_DATA;
iov.data = make_data(plaintext, input->length);
- memcpy(plaintext, input->data, input->length);
ret = ctp->enc->decrypt(xorkey, NULL, &iov, 1);
if (ret != 0)
goto cleanup;
diff --git a/src/lib/crypto/krb/derive.c b/src/lib/crypto/krb/derive.c
index 1509f4225..f15fec1a2 100644
--- a/src/lib/crypto/krb/derive.c
+++ b/src/lib/crypto/krb/derive.c
@@ -52,7 +52,7 @@ add_cached_dkey(krb5_key key, const krb5_data *constant,
dkent = malloc(sizeof(*dkent));
if (dkent == NULL)
goto cleanup;
- data = malloc(constant->length);
+ data = k5memdup(constant->data, constant->length, &ret);
if (data == NULL)
goto cleanup;
ret = krb5_k_create_key(NULL, dkeyblock, &dkey);
@@ -60,7 +60,6 @@ add_cached_dkey(krb5_key key, const krb5_data *constant,
goto cleanup;
/* Add the new entry to the list. */
- memcpy(data, constant->data, constant->length);
dkent->dkey = dkey;
dkent->constant.data = data;
dkent->constant.length = constant->length;
diff --git a/src/lib/crypto/krb/enc_old.c b/src/lib/crypto/krb/enc_old.c
index e7160b169..b44a3994f 100644
--- a/src/lib/crypto/krb/enc_old.c
+++ b/src/lib/crypto/krb/enc_old.c
@@ -166,10 +166,9 @@ krb5int_old_decrypt(const struct krb5_keytypes *ktp, krb5_key key,
/* Save the checksum, then zero it out in the plaintext. */
checksum = make_data(header->data.data + enc->block_size, hash->hashsize);
- saved_checksum = k5alloc(hash->hashsize, &ret);
+ saved_checksum = k5memdup(checksum.data, checksum.length, &ret);
if (saved_checksum == NULL)
goto cleanup;
- memcpy(saved_checksum, checksum.data, checksum.length);
memset(checksum.data, 0, checksum.length);
/*
diff --git a/src/lib/gssapi/krb5/gssapi_krb5.c b/src/lib/gssapi/krb5/gssapi_krb5.c
index 31f705d82..04d70a64b 100644
--- a/src/lib/gssapi/krb5/gssapi_krb5.c
+++ b/src/lib/gssapi/krb5/gssapi_krb5.c
@@ -800,16 +800,13 @@ krb5_gss_authorize_localname(OM_uint32 *minor,
return GSS_S_FAILURE;
}
- user = k5alloc(local_user->length + 1, &code);
+ user = k5memdup0(local_user->value, local_user->length, &code);
if (user == NULL) {
*minor = code;
krb5_free_context(context);
return GSS_S_FAILURE;
}
- memcpy(user, local_user->value, local_user->length);
- user[local_user->length] = '\0';
-
user_ok = krb5_kuserok(context, kname->princ, user);
free(user);
diff --git a/src/lib/gssapi/krb5/import_cred.c b/src/lib/gssapi/krb5/import_cred.c
index 4de6fa65e..ad9a1110e 100644
--- a/src/lib/gssapi/krb5/import_cred.c
+++ b/src/lib/gssapi/krb5/import_cred.c
@@ -614,14 +614,12 @@ krb5_gss_import_cred(OM_uint32 *minor_status, gss_buffer_t token,
}
/* Decode token. */
- copy = malloc(token->length + 1);
+ copy = k5memdup0(token->value, token->length, &ret);
if (copy == NULL) {
status = GSS_S_FAILURE;
- *minor_status = ENOMEM;
+ *minor_status = ret;
goto cleanup;
}
- memcpy(copy, token->value, token->length);
- copy[token->length] = '\0';
v = k5_json_decode(copy);
if (v == NULL)
goto invalid;
diff --git a/src/lib/gssapi/krb5/import_name.c b/src/lib/gssapi/krb5/import_name.c
index 394aca4fe..3f5492b99 100644
--- a/src/lib/gssapi/krb5/import_name.c
+++ b/src/lib/gssapi/krb5/import_name.c
@@ -196,14 +196,12 @@ krb5_gss_import_name(minor_status, input_name_buffer,
stringrep = NULL;
- tmp = k5alloc(input_name_buffer->length + 1, &code);
+ tmp = k5memdup0(input_name_buffer->value, input_name_buffer->length,
+ &code);
if (tmp == NULL)
goto cleanup;
tmp2 = NULL;
- memcpy(tmp, input_name_buffer->value, input_name_buffer->length);
- tmp[input_name_buffer->length] = '\0';
-
/* Find the appropriate string rep to pass into parse_name. */
if ((input_name_type == GSS_C_NULL_OID) ||
g_OID_equal(input_name_type, gss_nt_krb5_name) ||
diff --git a/src/lib/gssapi/krb5/naming_exts.c b/src/lib/gssapi/krb5/naming_exts.c
index 535311eb9..f44f0d2cf 100644
--- a/src/lib/gssapi/krb5/naming_exts.c
+++ b/src/lib/gssapi/krb5/naming_exts.c
@@ -162,11 +162,9 @@ kg_acceptor_princ(krb5_context context, krb5_gss_name_t name,
/* If a host was given, we have to use the canonicalized form of it (as
* given by krb5_sname_to_principal) for backward compatibility. */
const krb5_data *d = &name->princ->data[1];
- tmp = k5alloc(d->length + 1, &code);
+ tmp = k5memdup0(d->data, d->length, &code);
if (tmp == NULL)
return ENOMEM;
- memcpy(tmp, d->data, d->length);
- tmp[d->length] = '\0';
host = tmp;
} else /* No host was given; use an empty string. */
host = "";
diff --git a/src/lib/kadm5/srv/svr_principal.c b/src/lib/kadm5/srv/svr_principal.c
index 2000fe441..6d90628dc 100644
--- a/src/lib/kadm5/srv/svr_principal.c
+++ b/src/lib/kadm5/srv/svr_principal.c
@@ -245,12 +245,10 @@ apply_keysalt_policy(kadm5_server_handle_t handle, const char *policy,
ks_tuple = handle->params.keysalts;
}
/* Dup the requested or defaulted keysalt tuples. */
- new_ks_tuple = malloc(n_ks_tuple * sizeof(*new_ks_tuple));
- if (new_ks_tuple == NULL) {
- ret = ENOMEM;
+ new_ks_tuple = k5memdup(ks_tuple, n_ks_tuple * sizeof(*new_ks_tuple),
+ &ret);
+ if (new_ks_tuple == NULL)
goto cleanup;
- }
- memcpy(new_ks_tuple, ks_tuple, n_ks_tuple * sizeof(*new_ks_tuple));
new_n_ks_tuple = n_ks_tuple;
ret = 0;
goto cleanup;
diff --git a/src/lib/kdb/kdb5.c b/src/lib/kdb/kdb5.c
index 2a040fc57..e1ee5f9ff 100644
--- a/src/lib/kdb/kdb5.c
+++ b/src/lib/kdb/kdb5.c
@@ -1167,16 +1167,13 @@ krb5_db_fetch_mkey(krb5_context context, krb5_principal mname,
if (retval)
goto clean_n_exit;
- key->contents = malloc(tmp_key.length);
- if (key->contents == NULL) {
- retval = ENOMEM;
+ key->contents = k5memdup(tmp_key.contents, tmp_key.length, &retval);
+ if (key->contents == NULL)
goto clean_n_exit;
- }
key->magic = tmp_key.magic;
key->enctype = tmp_key.enctype;
key->length = tmp_key.length;
- memcpy(key->contents, tmp_key.contents, tmp_key.length);
}
clean_n_exit:
diff --git a/src/lib/kdb/kdb_default.c b/src/lib/kdb/kdb_default.c
index ee01d9d21..9a7f757f9 100644
--- a/src/lib/kdb/kdb_default.c
+++ b/src/lib/kdb/kdb_default.c
@@ -361,12 +361,12 @@ krb5_db_def_fetch_mkey_keytab(krb5_context context,
* kt_ent will be free'd so need to allocate and copy key contents for
* output to caller.
*/
- if (!(key->contents = (krb5_octet *)malloc(key->length))) {
- retval = ENOMEM;
+ key->contents = k5memdup(kt_ent.key.contents, kt_ent.key.length,
+ &retval);
+ if (key->contents == NULL) {
krb5_kt_free_entry(context, &kt_ent);
goto errout;
}
- memcpy(key->contents, kt_ent.key.contents, kt_ent.key.length);
krb5_kt_free_entry(context, &kt_ent);
}
diff --git a/src/lib/kdb/kdb_log.c b/src/lib/kdb/kdb_log.c
index b9906f0f7..d8d338c7f 100644
--- a/src/lib/kdb/kdb_log.c
+++ b/src/lib/kdb/kdb_log.c
@@ -321,13 +321,10 @@ ulog_replay(krb5_context context, kdb_incr_result_t *incr_ret, char **db_args)
continue;
if (upd->kdb_deleted) {
- dbprincstr = k5alloc(upd->kdb_princ_name.utf8str_t_len + 1,
- &retval);
+ dbprincstr = k5memdup0(upd->kdb_princ_name.utf8str_t_val,
+ upd->kdb_princ_name.utf8str_t_len, &retval);
if (dbprincstr == NULL)
goto cleanup;
- memcpy(dbprincstr, (char *)upd->kdb_princ_name.utf8str_t_val,
- upd->kdb_princ_name.utf8str_t_len);
- dbprincstr[upd->kdb_princ_name.utf8str_t_len] = '\0';
retval = krb5_parse_name(context, dbprincstr, &dbprinc);
free(dbprincstr);
diff --git a/src/lib/krb5/ccache/ccbase.c b/src/lib/krb5/ccache/ccbase.c
index a1fd3aa83..370c9439b 100644
--- a/src/lib/krb5/ccache/ccbase.c
+++ b/src/lib/krb5/ccache/ccbase.c
@@ -221,13 +221,9 @@ krb5_cc_resolve (krb5_context context, const char *name, krb5_ccache *cache)
resid = name;
} else {
resid = name + pfxlen + 1;
-
- pfx = malloc (pfxlen+1);
- if (!pfx)
- return ENOMEM;
-
- memcpy (pfx, name, pfxlen);
- pfx[pfxlen] = '\0';
+ pfx = k5memdup0(name, pfxlen, &err);
+ if (pfx == NULL)
+ return err;
}
*cache = (krb5_ccache) 0;
diff --git a/src/lib/krb5/keytab/kt_srvtab.c b/src/lib/krb5/keytab/kt_srvtab.c
index 2ca616684..7bbb6580d 100644
--- a/src/lib/krb5/keytab/kt_srvtab.c
+++ b/src/lib/krb5/keytab/kt_srvtab.c
@@ -430,12 +430,11 @@ krb5_ktsrvint_read_entry(krb5_context context, krb5_keytab id, krb5_keytab_entry
ret_entry->key.enctype = ENCTYPE_DES_CBC_CRC;
ret_entry->key.magic = KV5M_KEYBLOCK;
ret_entry->key.length = sizeof(key);
- ret_entry->key.contents = malloc(sizeof(key));
- if (!ret_entry->key.contents) {
+ ret_entry->key.contents = k5memdup(key, sizeof(key), &kerror);
+ if (ret_entry->key.contents == NULL) {
krb5_free_principal(context, ret_entry->principal);
- return ENOMEM;
+ return kerror;
}
- memcpy(ret_entry->key.contents, key, sizeof(key));
return 0;
}
diff --git a/src/lib/krb5/keytab/ktbase.c b/src/lib/krb5/keytab/ktbase.c
index 6f29579ce..0f3562f33 100644
--- a/src/lib/krb5/keytab/ktbase.c
+++ b/src/lib/krb5/keytab/ktbase.c
@@ -188,13 +188,9 @@ krb5_kt_resolve (krb5_context context, const char *name, krb5_keytab *ktid)
resid = name;
} else {
resid = name + pfxlen + 1;
-
- pfx = malloc (pfxlen+1);
- if (!pfx)
- return ENOMEM;
-
- memcpy (pfx, name, pfxlen);
- pfx[pfxlen] = '\0';
+ pfx = k5memdup0(name, pfxlen, &err);
+ if (pfx == NULL)
+ return err;
}
*ktid = (krb5_keytab) 0;
diff --git a/src/lib/krb5/krb/copy_tick.c b/src/lib/krb5/krb/copy_tick.c
index c3e33ff82..660d977bb 100644
--- a/src/lib/krb5/krb/copy_tick.c
+++ b/src/lib/krb5/krb/copy_tick.c
@@ -53,16 +53,14 @@ copy_enc_tkt_part(krb5_context context, const krb5_enc_tkt_part *partfrom,
tempto->transited.tr_contents.data = 0;
} else {
tempto->transited.tr_contents.data =
- malloc(partfrom->transited.tr_contents.length);
+ k5memdup(partfrom->transited.tr_contents.data,
+ partfrom->transited.tr_contents.length, &retval);
if (!tempto->transited.tr_contents.data) {
krb5_free_principal(context, tempto->client);
krb5_free_keyblock(context, tempto->session);
free(tempto);
return ENOMEM;
}
- memcpy(tempto->transited.tr_contents.data,
- (char *)partfrom->transited.tr_contents.data,
- partfrom->transited.tr_contents.length);
}
retval = krb5_copy_addresses(context, partfrom->caddrs, &tempto->caddrs);
diff --git a/src/lib/krb5/krb/fwd_tgt.c b/src/lib/krb5/krb/fwd_tgt.c
index 8387cea27..2e55066c7 100644
--- a/src/lib/krb5/krb/fwd_tgt.c
+++ b/src/lib/krb5/krb/fwd_tgt.c
@@ -130,14 +130,11 @@ krb5_fwd_tgt_creds(krb5_context context, krb5_auth_context auth_context,
goto errout;
}
- rhost = malloc(server->data[1].length+1);
- if (!rhost) {
- retval = ENOMEM;
+ rhost = k5memdup0(server->data[1].data, server->data[1].length,
+ &retval);
+ if (rhost == NULL)
goto errout;
- }
free_rhost = 1;
- memcpy(rhost, server->data[1].data, server->data[1].length);
- rhost[server->data[1].length] = '\0';
}
retval = krb5_os_hostaddr(context, rhost, &addrs);
diff --git a/src/lib/krb5/krb/get_in_tkt.c b/src/lib/krb5/krb/get_in_tkt.c
index df1bacf87..c88b67a6e 100644
--- a/src/lib/krb5/krb/get_in_tkt.c
+++ b/src/lib/krb5/krb/get_in_tkt.c
@@ -891,13 +891,11 @@ krb5_init_creds_init(krb5_context context,
/* enctypes */
if (opte->flags & KRB5_GET_INIT_CREDS_OPT_ETYPE_LIST) {
ctx->request->ktype =
- k5alloc((opte->etype_list_length * sizeof(krb5_enctype)),
- &code);
+ k5memdup(opte->etype_list,
+ opte->etype_list_length * sizeof(krb5_enctype), &code);
if (code != 0)
goto cleanup;
ctx->request->nktypes = opte->etype_list_length;
- memcpy(ctx->request->ktype, opte->etype_list,
- ctx->request->nktypes * sizeof(krb5_enctype));
} else if (krb5_get_default_in_tkt_ktypes(context,
&ctx->request->ktype) == 0) {
ctx->request->nktypes = k5_count_etypes(ctx->request->ktype);
diff --git a/src/lib/krb5/krb/pac.c b/src/lib/krb5/krb/pac.c
index 3262d21d8..cc6f200c6 100644
--- a/src/lib/krb5/krb/pac.c
+++ b/src/lib/krb5/krb/pac.c
@@ -186,12 +186,10 @@ krb5_pac_get_buffer(krb5_context context,
if (ret != 0)
return ret;
- data->data = malloc(d.length);
+ data->data = k5memdup(d.data, d.length, &ret);
if (data->data == NULL)
- return ENOMEM;
-
+ return ret;
data->length = d.length;
- memcpy(data->data, d.data, d.length);
return 0;
}
@@ -275,14 +273,12 @@ k5_pac_copy(krb5_context context,
if (pac == NULL)
return ENOMEM;
- pac->pac = (PACTYPE *)malloc(header_len);
+ pac->pac = k5memdup(src->pac, header_len, &code);
if (pac->pac == NULL) {
free(pac);
- return ENOMEM;
+ return code;
}
- memcpy(pac->pac, src->pac, header_len);
-
code = krb5int_copy_data_contents(context, &src->data, &pac->data);
if (code != 0) {
free(pac->pac);
@@ -538,11 +534,9 @@ k5_pac_verify_server_checksum(krb5_context context,
return KRB5KRB_AP_ERR_INAPP_CKSUM;
pac_data.length = pac->data.length;
- pac_data.data = malloc(pac->data.length);
+ pac_data.data = k5memdup(pac->data.data, pac->data.length, &ret);
if (pac_data.data == NULL)
- return ENOMEM;
-
- memcpy(pac_data.data, pac->data.data, pac->data.length);
+ return ret;
/* Zero out both checksum buffers */
ret = k5_pac_zero_signature(context, pac, KRB5_PAC_SERVER_CHECKSUM,
diff --git a/src/lib/krb5/krb/pac_sign.c b/src/lib/krb5/krb/pac_sign.c
index 49e3862b7..20535816d 100644
--- a/src/lib/krb5/krb/pac_sign.c
+++ b/src/lib/krb5/krb/pac_sign.c
@@ -257,13 +257,11 @@ krb5_pac_sign(krb5_context context, krb5_pac pac, krb5_timestamp authtime,
if (ret != 0)
return ret;
- data->data = malloc(pac->data.length);
+ data->data = k5memdup(pac->data.data, pac->data.length, &ret);
if (data->data == NULL)
- return ENOMEM;
-
+ return ret;
data->length = pac->data.length;
- memcpy(data->data, pac->data.data, pac->data.length);
memset(pac->data.data, 0,
PACTYPE_LENGTH + (pac->pac->cBuffers * PAC_INFO_BUFFER_LENGTH));
diff --git a/src/lib/krb5/krb/preauth2.c b/src/lib/krb5/krb/preauth2.c
index ad1618ab6..060f98aa0 100644
--- a/src/lib/krb5/krb/preauth2.c
+++ b/src/lib/krb5/krb/preauth2.c
@@ -802,10 +802,9 @@ copy_cookie(krb5_context context, krb5_pa_data **in_padata,
if (pa == NULL)
return ret;
*pa = *cookie;
- pa->contents = k5alloc(cookie->length, &ret);
+ pa->contents = k5memdup(cookie->contents, cookie->length, &ret);
if (pa->contents == NULL)
goto error;
- memcpy(pa->contents, cookie->contents, cookie->length);
ret = grow_pa_list(out_pa_list, out_pa_list_size, &pa, 1);
if (ret)
goto error;
@@ -841,12 +840,12 @@ add_s4u_x509_user_padata(krb5_context context, krb5_s4u_userid *userid,
s4u_padata->magic = KV5M_PA_DATA;
s4u_padata->pa_type = KRB5_PADATA_S4U_X509_USER;
- s4u_padata->contents = malloc(userid->subject_cert.length);
+ s4u_padata->contents = k5memdup(userid->subject_cert.data,
+ userid->subject_cert.length, &code);
if (s4u_padata->contents == NULL) {
free(s4u_padata);
- return ENOMEM;
+ return code;
}
- memcpy(s4u_padata->contents, userid->subject_cert.data, userid->subject_cert.length);
s4u_padata->length = userid->subject_cert.length;
code = grow_pa_list(out_pa_list, out_pa_list_size, &s4u_padata, 1);
diff --git a/src/lib/krb5/krb/send_tgs.c b/src/lib/krb5/krb/send_tgs.c
index f4187dc04..9a7c261dd 100644
--- a/src/lib/krb5/krb/send_tgs.c
+++ b/src/lib/krb5/krb/send_tgs.c
@@ -239,10 +239,10 @@ k5_make_tgs_req(krb5_context context,
if (padata[0] == NULL)
goto cleanup;
padata[0]->pa_type = KRB5_PADATA_AP_REQ;
- padata[0]->contents = k5alloc(ap_req_asn1->length, &ret);
+ padata[0]->contents = k5memdup(ap_req_asn1->data, ap_req_asn1->length,
+ &ret);
if (padata[0] == NULL)
goto cleanup;
- memcpy(padata[0]->contents, ap_req_asn1->data, ap_req_asn1->length);
padata[0]->length = ap_req_asn1->length;
/* Append copies of any other supplied padata. */
@@ -252,10 +252,10 @@ k5_make_tgs_req(krb5_context context,
goto cleanup;
pa->pa_type = in_padata[i]->pa_type;
pa->length = in_padata[i]->length;
- pa->contents = k5alloc(in_padata[i]->length, &ret);
+ pa->contents = k5memdup(in_padata[i]->contents, in_padata[i]->length,
+ &ret);
if (pa->contents == NULL)
goto cleanup;
- memcpy(pa->contents, in_padata[i]->contents, in_padata[i]->length);
padata[i + 1] = pa;
}
req.padata = padata;
diff --git a/src/lib/krb5/krb/walk_rtree.c b/src/lib/krb5/krb/walk_rtree.c
index 10711f1d6..0aed147f3 100644
--- a/src/lib/krb5/krb/walk_rtree.c
+++ b/src/lib/krb5/krb/walk_rtree.c
@@ -303,19 +303,13 @@ rtree_capath_vals(krb5_context context,
*vals = NULL;
- clientz = calloc(client->length + 1, 1);
- if (clientz == NULL) {
- retval = ENOMEM;
+ clientz = k5memdup0(client->data, client->length, &retval);
+ if (clientz == NULL)
goto error;
- }
- memcpy(clientz, client->data, client->length);
- serverz = calloc(server->length + 1, 1);
- if (serverz == NULL) {
- retval = ENOMEM;
+ serverz = k5memdup0(server->data, server->length, &retval);
+ if (serverz == NULL)
goto error;
- }
- memcpy(serverz, server->data, server->length);
key[0] = "capaths";
key[1] = clientz;
diff --git a/src/lib/krb5/os/an_to_ln.c b/src/lib/krb5/os/an_to_ln.c
index 8108f3478..0f2600c28 100644
--- a/src/lib/krb5/os/an_to_ln.c
+++ b/src/lib/krb5/os/an_to_ln.c
@@ -375,7 +375,6 @@ aname_replacer(char *string, char **contextp, char **result)
krb5_error_code kret;
char *in = NULL, *out = NULL, *rule = NULL, *repl = NULL;
char *cp, *ep, *tp;
- size_t rule_size, repl_size;
int doglobal;
*result = NULL;
@@ -418,24 +417,13 @@ aname_replacer(char *string, char **contextp, char **result)
goto cleanup;
}
- /* Figure out sizes of strings and allocate them */
- rule_size = (size_t) (ep - &cp[2]);
- repl_size = (size_t) (tp - &ep[1]);
- rule = malloc(rule_size + 1);
- if (!rule) {
- kret = ENOMEM;
+ /* Copy the rule and replacement strings. */
+ rule = k5memdup0(&cp[2], ep - &cp[2], &kret);
+ if (rule == NULL)
goto cleanup;
- }
- repl = malloc(repl_size + 1);
- if (!repl) {
- kret = ENOMEM;
+ repl = k5memdup0(&ep[1], tp - &ep[1], &kret);
+ if (repl == NULL)
goto cleanup;
- }
-
- /* Copy the strings */
- memcpy(rule, &cp[2], rule_size);
- memcpy(repl, &ep[1], repl_size);
- rule[rule_size] = repl[repl_size] = '\0';
/* Check for trailing "g" */
doglobal = (tp[1] == 'g') ? 1 : 0;
diff --git a/src/lib/krb5/os/changepw.c b/src/lib/krb5/os/changepw.c
index 4ad8f32eb..46f4f0e5f 100644
--- a/src/lib/krb5/os/changepw.c
+++ b/src/lib/krb5/os/changepw.c
@@ -156,16 +156,11 @@ kpasswd_sendto_msg_callback(struct conn_state *conn,
local_kaddr.magic = addrs[0]->magic;
local_kaddr.addrtype = addrs[0]->addrtype;
local_kaddr.length = addrs[0]->length;
- local_kaddr.contents = malloc(addrs[0]->length);
- if (local_kaddr.contents == NULL && addrs[0]->length != 0) {
- code = ENOMEM;
- krb5_free_addresses(ctx->context, addrs);
- goto cleanup;
- }
- if (addrs[0]->length)
- memcpy(local_kaddr.contents, addrs[0]->contents, addrs[0]->length);
-
+ local_kaddr.contents = k5memdup(addrs[0]->contents, addrs[0]->length,
+ &code);
krb5_free_addresses(ctx->context, addrs);
+ if (local_kaddr.contents == NULL)
+ goto cleanup;
}
diff --git a/src/lib/krb5/os/get_krbhst.c b/src/lib/krb5/os/get_krbhst.c
index 7db973aa2..d60736619 100644
--- a/src/lib/krb5/os/get_krbhst.c
+++ b/src/lib/krb5/os/get_krbhst.c
@@ -103,13 +103,9 @@ krb5_get_krbhst(krb5_context context, const krb5_data *realm, char ***hostlist)
goto cleanup;
}
for (i = 0; i < count; i++) {
- unsigned int len = strlen (values[i]) + 1;
- rethosts[i] = malloc(len);
- if (!rethosts[i]) {
- retval = ENOMEM;
+ rethosts[i] = k5memdup0(values[i], strlen(values[i]), &retval);
+ if (rethosts[i] == NULL)
goto cleanup;
- }
- memcpy (rethosts[i], values[i], len);
}
rethosts[count] = 0;
cleanup:
diff --git a/src/lib/krb5/os/hostaddr.c b/src/lib/krb5/os/hostaddr.c
index 6be2abea8..a38fad5d9 100644
--- a/src/lib/krb5/os/hostaddr.c
+++ b/src/lib/krb5/os/hostaddr.c
@@ -101,12 +101,9 @@ krb5_os_hostaddr(krb5_context context, const char *name,
addrs[i]->magic = KV5M_ADDRESS;
addrs[i]->addrtype = atype;
addrs[i]->length = addrlen;
- addrs[i]->contents = malloc(addrs[i]->length);
- if (!addrs[i]->contents) {
- retval = ENOMEM;
+ addrs[i]->contents = k5memdup(ptr, addrlen, &retval);
+ if (addrs[i]->contents == NULL)
goto errout;
- }
- memcpy (addrs[i]->contents, ptr, addrs[i]->length);
i++;
}
diff --git a/src/lib/krb5/os/locate_kdc.c b/src/lib/krb5/os/locate_kdc.c
index ed8cc641e..5bf77761a 100644
--- a/src/lib/krb5/os/locate_kdc.c
+++ b/src/lib/krb5/os/locate_kdc.c
@@ -400,13 +400,11 @@ module_locate_server(krb5_context ctx, const krb5_data *realm,
krb5int_free_plugin_dir_data(ptrs);
return ENOMEM;
}
- realmz = malloc(realm->length + 1);
+ realmz = k5memdup0(realm->data, realm->length, &code);
if (realmz == NULL) {
krb5int_free_plugin_dir_data(ptrs);
- return ENOMEM;
+ return code;
}
- memcpy(realmz, realm->data, realm->length);
- realmz[realm->length] = '\0';
for (i = 0; ptrs[i]; i++) {
void *blob;
diff --git a/src/lib/krb5/rcache/rc_dfl.c b/src/lib/krb5/rcache/rc_dfl.c
index cc42f461f..2981985ea 100644
--- a/src/lib/krb5/rcache/rc_dfl.c
+++ b/src/lib/krb5/rcache/rc_dfl.c
@@ -419,11 +419,9 @@ check_hash_extension(krb5_donot_replay *rep)
end = strchr(str, ' ');
if (!end)
return 0;
- msghash = malloc(end - str + 1);
+ msghash = k5memdup0(str, end - str, &retval);
if (!msghash)
return KRB5_RC_MALLOC;
- memcpy(msghash, str, end - str);
- msghash[end - str] = '\0';
str = end + 1;
/* Parse out the client and server. */
diff --git a/src/lib/krb5/unicode/ucstr.c b/src/lib/krb5/unicode/ucstr.c
index 625c9de1c..38d8d47d0 100644
--- a/src/lib/krb5/unicode/ucstr.c
+++ b/src/lib/krb5/unicode/ucstr.c
@@ -160,13 +160,9 @@ krb5int_utf8_normalize(
if (i == len) {
newdata->length = len;
- newdata->data = malloc(newdata->length + 1);
- if (newdata->data == NULL) {
- retval = ENOMEM;
+ newdata->data = k5memdup0(s, len, &retval);
+ if (newdata->data == NULL)
goto cleanup;
- }
- memcpy(newdata->data, s, len);
- newdata->data[len] = '\0';
*newdataptr = newdata;
return 0;
}