diff options
| author | Greg Hudson <ghudson@mit.edu> | 2013-02-09 00:43:35 -0500 |
|---|---|---|
| committer | Greg Hudson <ghudson@mit.edu> | 2013-02-09 00:43:35 -0500 |
| commit | 7905cd6a2eddbf264242bb2a85f811878b2da7ab (patch) | |
| tree | 72b4028cbe0e399e1d293e2b718530913f0a2673 /src/lib/krb5 | |
| parent | 92e2bac0f38f7f60a8fc74b5964357212c4289e1 (diff) | |
| download | krb5-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/krb5')
| -rw-r--r-- | src/lib/krb5/ccache/ccbase.c | 10 | ||||
| -rw-r--r-- | src/lib/krb5/keytab/kt_srvtab.c | 7 | ||||
| -rw-r--r-- | src/lib/krb5/keytab/ktbase.c | 10 | ||||
| -rw-r--r-- | src/lib/krb5/krb/copy_tick.c | 6 | ||||
| -rw-r--r-- | src/lib/krb5/krb/fwd_tgt.c | 9 | ||||
| -rw-r--r-- | src/lib/krb5/krb/get_in_tkt.c | 6 | ||||
| -rw-r--r-- | src/lib/krb5/krb/pac.c | 18 | ||||
| -rw-r--r-- | src/lib/krb5/krb/pac_sign.c | 6 | ||||
| -rw-r--r-- | src/lib/krb5/krb/preauth2.c | 9 | ||||
| -rw-r--r-- | src/lib/krb5/krb/send_tgs.c | 8 | ||||
| -rw-r--r-- | src/lib/krb5/krb/walk_rtree.c | 14 | ||||
| -rw-r--r-- | src/lib/krb5/os/an_to_ln.c | 22 | ||||
| -rw-r--r-- | src/lib/krb5/os/changepw.c | 13 | ||||
| -rw-r--r-- | src/lib/krb5/os/get_krbhst.c | 8 | ||||
| -rw-r--r-- | src/lib/krb5/os/hostaddr.c | 7 | ||||
| -rw-r--r-- | src/lib/krb5/os/locate_kdc.c | 6 | ||||
| -rw-r--r-- | src/lib/krb5/rcache/rc_dfl.c | 4 | ||||
| -rw-r--r-- | src/lib/krb5/unicode/ucstr.c | 8 |
18 files changed, 54 insertions, 117 deletions
diff --git a/src/lib/krb5/ccache/ccbase.c b/src/lib/krb5/ccache/ccbase.c index a1fd3aa837..370c9439be 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 2ca616684e..7bbb6580dd 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 6f29579ce8..0f3562f339 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 c3e33ff824..660d977bb4 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 8387cea27e..2e55066c7e 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 df1bacf878..c88b67a6e8 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 3262d21d82..cc6f200c69 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 49e3862b7b..20535816d7 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 ad1618ab6e..060f98aa00 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 f4187dc045..9a7c261dd6 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 10711f1d67..0aed147f34 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 8108f3478b..0f2600c28b 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 4ad8f32ebb..46f4f0e5f3 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 7db973aa21..d607366194 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 6be2abea80..a38fad5d97 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 ed8cc641e7..5bf77761a7 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 cc42f461f2..2981985ea5 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 625c9de1c4..38d8d47d02 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; } |
