From 5b4622756447e1a3fcda3e71aaf7a7fcdc1bdfbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Love=20H=C3=B6rnquist=20=C3=85strand?= Date: Thu, 19 May 2005 14:03:16 +0000 Subject: [PATCH] (kt_change): plug memory leak from krb5_kt_remove_entry, print principal on error. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@15184 ec53bebd-3082-4978-b11e-865c3cabbd6b --- admin/change.c | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/admin/change.c b/admin/change.c index 3bbb2424b..bd3d2dd5d 100644 --- a/admin/change.c +++ b/admin/change.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997-2004 Kungliga Tekniska Högskolan + * Copyright (c) 1997-2005 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -78,17 +78,20 @@ change_entry (krb5_context context, krb5_keytab keytab, KADM5_ADMIN_SERVICE, &conf, 0, 0, &kadm_handle); - free (client_name); if (ret) { - krb5_warn (context, ret, "kadm5_c_init_with_skey_ctx"); + krb5_warn (context, ret, + "kadm5_c_init_with_skey_ctx: %s:", client_name); + free (client_name); return ret; } ret = kadm5_randkey_principal (kadm_handle, principal, &keys, &num_keys); kadm5_destroy (kadm_handle); if (ret) { - krb5_warn(context, ret, "kadm5_randkey_principal"); + krb5_warn(context, ret, "kadm5_randkey_principal: %s:", client_name); + free (client_name); return ret; } + free (client_name); for (i = 0; i < num_keys; ++i) { krb5_keytab_entry new_entry; @@ -124,6 +127,7 @@ kt_change (struct change_options *opt, int argc, char **argv) krb5_keytab_entry entry; int i, j, max; struct change_set *changeset; + int errors = 0; if((keytab = ktutil_open_keytab()) == NULL) return 1; @@ -149,8 +153,10 @@ kt_change (struct change_options *opt, int argc, char **argv) break; } } - if (i < j) + if (i < j) { + krb5_kt_free_entry (context, &entry); continue; + } if (argc == 0) { add = 1; @@ -196,8 +202,10 @@ kt_change (struct change_options *opt, int argc, char **argv) } krb5_kt_free_entry (context, &entry); } + krb5_kt_end_seq_get(context, keytab, &cursor); if (ret == KRB5_KT_END) { + ret = 0; for (i = 0; i < j; i++) { if (verbose_flag) { char *client_name; @@ -212,19 +220,21 @@ kt_change (struct change_options *opt, int argc, char **argv) free(client_name); } } - change_entry (context, keytab, - changeset[i].principal, changeset[i].kvno, - opt->realm_string, - opt->admin_server_string, - opt->server_port_integer); + ret = change_entry (context, keytab, + changeset[i].principal, changeset[i].kvno, + opt->realm_string, + opt->admin_server_string, + opt->server_port_integer); + if (ret != 0) + errors = 1; } - } + } else + errors = 1; for (i = 0; i < j; i++) krb5_free_principal (context, changeset[i].principal); free (changeset); - ret = krb5_kt_end_seq_get(context, keytab, &cursor); out: krb5_kt_close(context, keytab); - return ret != 0; + return errors; }