Fix leak in kimpersonate
This commit is contained in:
@@ -56,11 +56,11 @@ static const char *enc_type = "aes256-cts-hmac-sha1-96";
|
|||||||
static const char *session_enc_type = NULL;
|
static const char *session_enc_type = NULL;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
encode_ticket (krb5_context context,
|
encode_ticket(krb5_context context,
|
||||||
EncryptionKey *skey,
|
EncryptionKey *skey,
|
||||||
krb5_enctype etype,
|
krb5_enctype etype,
|
||||||
int skvno,
|
int skvno,
|
||||||
krb5_creds *cred)
|
krb5_creds *cred)
|
||||||
{
|
{
|
||||||
size_t len, size;
|
size_t len, size;
|
||||||
char *buf;
|
char *buf;
|
||||||
@@ -70,8 +70,8 @@ encode_ticket (krb5_context context,
|
|||||||
EncTicketPart et;
|
EncTicketPart et;
|
||||||
Ticket ticket;
|
Ticket ticket;
|
||||||
|
|
||||||
memset (&enc_part, 0, sizeof(enc_part));
|
memset(&enc_part, 0, sizeof(enc_part));
|
||||||
memset (&ticket, 0, sizeof(ticket));
|
memset(&ticket, 0, sizeof(ticket));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up `enc_part'
|
* Set up `enc_part'
|
||||||
@@ -106,7 +106,7 @@ encode_ticket (krb5_context context,
|
|||||||
ret = krb5_crypto_init(context, skey, etype, &crypto);
|
ret = krb5_crypto_init(context, skey, etype, &crypto);
|
||||||
if (ret)
|
if (ret)
|
||||||
krb5_err(context, 1, ret, "krb5_crypto_init");
|
krb5_err(context, 1, ret, "krb5_crypto_init");
|
||||||
ret = krb5_encrypt_EncryptedData (context,
|
ret = krb5_encrypt_EncryptedData(context,
|
||||||
crypto,
|
crypto,
|
||||||
KRB5_KU_TICKET,
|
KRB5_KU_TICKET,
|
||||||
buf,
|
buf,
|
||||||
@@ -129,7 +129,7 @@ encode_ticket (krb5_context context,
|
|||||||
|
|
||||||
ASN1_MALLOC_ENCODE(Ticket, buf, len, &ticket, &size, ret);
|
ASN1_MALLOC_ENCODE(Ticket, buf, len, &ticket, &size, ret);
|
||||||
if(ret)
|
if(ret)
|
||||||
krb5_err (context, 1, ret, "encode_Ticket");
|
krb5_err(context, 1, ret, "encode_Ticket");
|
||||||
|
|
||||||
krb5_data_copy(&cred->ticket, buf, len);
|
krb5_data_copy(&cred->ticket, buf, len);
|
||||||
free(buf);
|
free(buf);
|
||||||
@@ -140,7 +140,7 @@ encode_ticket (krb5_context context,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static int
|
static int
|
||||||
create_krb5_tickets (krb5_context context, krb5_keytab kt)
|
create_krb5_tickets(krb5_context context, krb5_keytab kt)
|
||||||
{
|
{
|
||||||
krb5_error_code ret;
|
krb5_error_code ret;
|
||||||
krb5_keytab_entry entry;
|
krb5_keytab_entry entry;
|
||||||
@@ -149,30 +149,29 @@ create_krb5_tickets (krb5_context context, krb5_keytab kt)
|
|||||||
krb5_enctype session_etype;
|
krb5_enctype session_etype;
|
||||||
krb5_ccache ccache;
|
krb5_ccache ccache;
|
||||||
|
|
||||||
memset (&cred, 0, sizeof(cred));
|
memset(&cred, 0, sizeof(cred));
|
||||||
|
|
||||||
ret = krb5_string_to_enctype (context, enc_type, &etype);
|
ret = krb5_string_to_enctype(context, enc_type, &etype);
|
||||||
if (ret)
|
if (ret)
|
||||||
krb5_err (context, 1, ret, "krb5_string_to_enctype (enc-type)");
|
krb5_err (context, 1, ret, "krb5_string_to_enctype (enc-type)");
|
||||||
ret = krb5_string_to_enctype (context, session_enc_type, &session_etype);
|
ret = krb5_string_to_enctype(context, session_enc_type, &session_etype);
|
||||||
if (ret)
|
if (ret)
|
||||||
krb5_err (context, 1, ret, "krb5_string_to_enctype (session-enc-type)");
|
krb5_err (context, 1, ret, "krb5_string_to_enctype (session-enc-type)");
|
||||||
ret = krb5_kt_get_entry (context, kt, server_principal,
|
ret = krb5_kt_get_entry(context, kt, server_principal, 0, etype, &entry);
|
||||||
0, etype, &entry);
|
|
||||||
if (ret)
|
if (ret)
|
||||||
krb5_err (context, 1, ret, "krb5_kt_get_entry");
|
krb5_err(context, 1, ret, "krb5_kt_get_entry");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* setup cred
|
* setup cred
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
ret = krb5_copy_principal (context, client_principal, &cred.client);
|
ret = krb5_copy_principal(context, client_principal, &cred.client);
|
||||||
if (ret)
|
if (ret)
|
||||||
krb5_err (context, 1, ret, "krb5_copy_principal");
|
krb5_err(context, 1, ret, "krb5_copy_principal");
|
||||||
ret = krb5_copy_principal (context, server_principal, &cred.server);
|
ret = krb5_copy_principal(context, server_principal, &cred.server);
|
||||||
if (ret)
|
if (ret)
|
||||||
krb5_err (context, 1, ret, "krb5_copy_principal");
|
krb5_err(context, 1, ret, "krb5_copy_principal");
|
||||||
krb5_generate_random_keyblock(context, session_etype, &cred.session);
|
krb5_generate_random_keyblock(context, session_etype, &cred.session);
|
||||||
|
|
||||||
cred.times.authtime = time(NULL);
|
cred.times.authtime = time(NULL);
|
||||||
@@ -181,9 +180,9 @@ create_krb5_tickets (krb5_context context, krb5_keytab kt)
|
|||||||
cred.times.renew_till = 0;
|
cred.times.renew_till = 0;
|
||||||
krb5_data_zero(&cred.second_ticket);
|
krb5_data_zero(&cred.second_ticket);
|
||||||
|
|
||||||
ret = krb5_get_all_client_addrs (context, &cred.addresses);
|
ret = krb5_get_all_client_addrs(context, &cred.addresses);
|
||||||
if (ret)
|
if (ret)
|
||||||
krb5_err (context, 1, ret, "krb5_get_all_client_addrs");
|
krb5_err(context, 1, ret, "krb5_get_all_client_addrs");
|
||||||
cred.flags.b = ticket_flags;
|
cred.flags.b = ticket_flags;
|
||||||
|
|
||||||
|
|
||||||
@@ -191,7 +190,8 @@ create_krb5_tickets (krb5_context context, krb5_keytab kt)
|
|||||||
* Encode encrypted part of ticket
|
* Encode encrypted part of ticket
|
||||||
*/
|
*/
|
||||||
|
|
||||||
encode_ticket (context, &entry.keyblock, etype, entry.vno, &cred);
|
encode_ticket(context, &entry.keyblock, etype, entry.vno, &cred);
|
||||||
|
krb5_kt_free_entry(context, &entry);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Write to cc
|
* Write to cc
|
||||||
@@ -200,23 +200,23 @@ create_krb5_tickets (krb5_context context, krb5_keytab kt)
|
|||||||
if (ccache_str) {
|
if (ccache_str) {
|
||||||
ret = krb5_cc_resolve(context, ccache_str, &ccache);
|
ret = krb5_cc_resolve(context, ccache_str, &ccache);
|
||||||
if (ret)
|
if (ret)
|
||||||
krb5_err (context, 1, ret, "krb5_cc_resolve");
|
krb5_err(context, 1, ret, "krb5_cc_resolve");
|
||||||
} else {
|
} else {
|
||||||
ret = krb5_cc_default (context, &ccache);
|
ret = krb5_cc_default(context, &ccache);
|
||||||
if (ret)
|
if (ret)
|
||||||
krb5_err (context, 1, ret, "krb5_cc_default");
|
krb5_err(context, 1, ret, "krb5_cc_default");
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = krb5_cc_initialize (context, ccache, cred.client);
|
ret = krb5_cc_initialize(context, ccache, cred.client);
|
||||||
if (ret)
|
if (ret)
|
||||||
krb5_err (context, 1, ret, "krb5_cc_initialize");
|
krb5_err(context, 1, ret, "krb5_cc_initialize");
|
||||||
|
|
||||||
ret = krb5_cc_store_cred (context, ccache, &cred);
|
ret = krb5_cc_store_cred(context, ccache, &cred);
|
||||||
if (ret)
|
if (ret)
|
||||||
krb5_err (context, 1, ret, "krb5_cc_store_cred");
|
krb5_err(context, 1, ret, "krb5_cc_store_cred");
|
||||||
|
|
||||||
krb5_free_cred_contents (context, &cred);
|
krb5_free_cred_contents(context, &cred);
|
||||||
krb5_cc_close (context, ccache);
|
krb5_cc_close(context, ccache);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -226,28 +226,28 @@ create_krb5_tickets (krb5_context context, krb5_keytab kt)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
setup_env (krb5_context context, krb5_keytab *kt)
|
setup_env(krb5_context context, krb5_keytab *kt)
|
||||||
{
|
{
|
||||||
krb5_error_code ret;
|
krb5_error_code ret;
|
||||||
|
|
||||||
if (keytab_file)
|
if (keytab_file)
|
||||||
ret = krb5_kt_resolve (context, keytab_file, kt);
|
ret = krb5_kt_resolve(context, keytab_file, kt);
|
||||||
else
|
else
|
||||||
ret = krb5_kt_default (context, kt);
|
ret = krb5_kt_default(context, kt);
|
||||||
if (ret)
|
if (ret)
|
||||||
krb5_err (context, 1, ret, "resolving keytab");
|
krb5_err(context, 1, ret, "resolving keytab");
|
||||||
|
|
||||||
if (client_principal_str == NULL)
|
if (client_principal_str == NULL)
|
||||||
krb5_errx (context, 1, "missing client principal");
|
krb5_errx(context, 1, "missing client principal");
|
||||||
ret = krb5_parse_name (context, client_principal_str, &client_principal);
|
ret = krb5_parse_name(context, client_principal_str, &client_principal);
|
||||||
if (ret)
|
if (ret)
|
||||||
krb5_err (context, 1, ret, "resolvning client name");
|
krb5_err(context, 1, ret, "resolvning client name");
|
||||||
|
|
||||||
if (server_principal_str == NULL)
|
if (server_principal_str == NULL)
|
||||||
krb5_errx (context, 1, "missing server principal");
|
krb5_errx(context, 1, "missing server principal");
|
||||||
ret = krb5_parse_name (context, server_principal_str, &server_principal);
|
ret = krb5_parse_name(context, server_principal_str, &server_principal);
|
||||||
if (ret)
|
if (ret)
|
||||||
krb5_err (context, 1, ret, "resolvning server name");
|
krb5_err(context, 1, ret, "resolvning server name");
|
||||||
|
|
||||||
/* If no session-enc-type specified on command line and this is an afs */
|
/* If no session-enc-type specified on command line and this is an afs */
|
||||||
/* service ticket, change default of session_enc_type to DES. */
|
/* service ticket, change default of session_enc_type to DES. */
|
||||||
@@ -261,12 +261,12 @@ setup_env (krb5_context context, krb5_keytab *kt)
|
|||||||
ticket_flags_int = parse_flags(ticket_flags_str,
|
ticket_flags_int = parse_flags(ticket_flags_str,
|
||||||
asn1_TicketFlags_units(), 0);
|
asn1_TicketFlags_units(), 0);
|
||||||
if (ticket_flags_int <= 0) {
|
if (ticket_flags_int <= 0) {
|
||||||
krb5_warnx (context, "bad ticket flags: `%s'", ticket_flags_str);
|
krb5_warnx(context, "bad ticket flags: `%s'", ticket_flags_str);
|
||||||
print_flags_table (asn1_TicketFlags_units(), stderr);
|
print_flags_table(asn1_TicketFlags_units(), stderr);
|
||||||
exit (1);
|
exit(1);
|
||||||
}
|
}
|
||||||
if (ticket_flags_int)
|
if (ticket_flags_int)
|
||||||
ticket_flags = int2TicketFlags (ticket_flags_int);
|
ticket_flags = int2TicketFlags(ticket_flags_int);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -302,26 +302,26 @@ struct getargs args[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
usage (int ret)
|
usage(int ret)
|
||||||
{
|
{
|
||||||
arg_printusage (args,
|
arg_printusage(args,
|
||||||
sizeof(args) / sizeof(args[0]),
|
sizeof(args) / sizeof(args[0]),
|
||||||
NULL,
|
NULL,
|
||||||
"");
|
"");
|
||||||
exit (ret);
|
exit(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int optidx = 0;
|
int optidx = 0;
|
||||||
krb5_error_code ret;
|
krb5_error_code ret;
|
||||||
krb5_context context;
|
krb5_context context;
|
||||||
krb5_keytab kt;
|
krb5_keytab kt;
|
||||||
|
|
||||||
setprogname (argv[0]);
|
setprogname(argv[0]);
|
||||||
|
|
||||||
ret = krb5_init_context (&context);
|
ret = krb5_init_context(&context);
|
||||||
if (ret)
|
if (ret)
|
||||||
errx(1, "krb5_init_context failed: %u", ret);
|
errx(1, "krb5_init_context failed: %u", ret);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user