1 /* 2 * lib/krb5/krb/copy_creds.c 3 * 4 * Copyright 1990,1991 by the Massachusetts Institute of Technology. 5 * All Rights Reserved. 6 * 7 * Export of this software from the United States of America may 8 * require a specific license from the United States Government. 9 * It is the responsibility of any person or organization contemplating 10 * export to obtain such a license before exporting. 11 * 12 * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and 13 * distribute this software and its documentation for any purpose and 14 * without fee is hereby granted, provided that the above copyright 15 * notice appear in all copies and that both that copyright notice and 16 * this permission notice appear in supporting documentation, and that 17 * the name of M.I.T. not be used in advertising or publicity pertaining 18 * to distribution of the software without specific, written prior 19 * permission. Furthermore if you modify this software you must label 20 * your software as modified software and not distribute it in such a 21 * fashion that it might be confused with the original M.I.T. software. 22 * M.I.T. makes no representations about the suitability of 23 * this software for any purpose. It is provided "as is" without express 24 * or implied warranty. 25 * 26 * 27 * krb5_copy_cred() 28 */ 29 30 #include "k5-int.h" 31 32 /* 33 * Copy credentials, allocating fresh storage where needed. 34 */ 35 36 krb5_error_code KRB5_CALLCONV 37 krb5_copy_creds(krb5_context context, const krb5_creds *incred, krb5_creds **outcred) 38 { 39 krb5_creds *tempcred; 40 krb5_error_code retval; 41 krb5_data *scratch; 42 43 if (!(tempcred = (krb5_creds *)malloc(sizeof(*tempcred)))) 44 return ENOMEM; 45 46 *tempcred = *incred; 47 retval = krb5_copy_principal(context, incred->client, &tempcred->client); 48 if (retval) 49 goto cleanlast; 50 retval = krb5_copy_principal(context, incred->server, &tempcred->server); 51 if (retval) 52 goto cleanclient; 53 retval = krb5_copy_keyblock_contents(context, &incred->keyblock, 54 &tempcred->keyblock); 55 if (retval) 56 goto cleanserver; 57 retval = krb5_copy_addresses(context, incred->addresses, &tempcred->addresses); 58 if (retval) 59 goto cleanblock; 60 retval = krb5_copy_data(context, &incred->ticket, &scratch); 61 if (retval) 62 goto cleanaddrs; 63 tempcred->ticket = *scratch; 64 krb5_xfree(scratch); 65 retval = krb5_copy_data(context, &incred->second_ticket, &scratch); 66 if (retval) 67 goto cleanticket; 68 69 tempcred->second_ticket = *scratch; 70 krb5_xfree(scratch); 71 72 retval = krb5_copy_authdata(context, incred->authdata,&tempcred->authdata); 73 if (retval) 74 goto clearticket; 75 76 *outcred = tempcred; 77 return 0; 78 79 clearticket: 80 memset(tempcred->ticket.data,0,tempcred->ticket.length); 81 cleanticket: 82 free(tempcred->ticket.data); 83 cleanaddrs: 84 krb5_free_addresses(context, tempcred->addresses); 85 cleanblock: 86 krb5_xfree(tempcred->keyblock.contents); 87 cleanserver: 88 krb5_free_principal(context, tempcred->server); 89 cleanclient: 90 krb5_free_principal(context, tempcred->client); 91 cleanlast: 92 krb5_xfree(tempcred); 93 return retval; 94 } 95