/* * Copy a principal structure, with fresh allocation. */ krb5_error_code KRB5_CALLCONV krb5_copy_principal(krb5_context context, krb5_const_principal inprinc, krb5_principal *outprinc) { register krb5_principal tempprinc; register int i, nelems; tempprinc = (krb5_principal)malloc(sizeof(krb5_principal_data)); if (tempprinc == 0) return ENOMEM; *tempprinc = *inprinc; nelems = (int) krb5_princ_size(context, inprinc); tempprinc->data = malloc(nelems * sizeof(krb5_data)); if (tempprinc->data == 0) { free((char *)tempprinc); return ENOMEM; } for (i = 0; i < nelems; i++) { if (krb5int_copy_data_contents(context, krb5_princ_component(context, inprinc, i), krb5_princ_component(context, tempprinc, i)) != 0) { while (--i >= 0) free(krb5_princ_component(context, tempprinc, i)->data); free (tempprinc->data); free (tempprinc); return ENOMEM; } } if (krb5int_copy_data_contents_add0(context, &inprinc->realm, &tempprinc->realm) != 0) { for (i = 0; i < nelems; i++) free(krb5_princ_component(context, tempprinc, i)->data); free(tempprinc->data); free(tempprinc); return ENOMEM; } *outprinc = tempprinc; return 0; }
/* * Copy a principal structure, with fresh allocation. */ krb5_error_code KRB5_CALLCONV krb5_copy_principal(krb5_context context, krb5_const_principal inprinc, krb5_principal *outprinc) { krb5_principal tempprinc; krb5_int32 i; tempprinc = (krb5_principal)malloc(sizeof(krb5_principal_data)); if (tempprinc == 0) return ENOMEM; *tempprinc = *inprinc; tempprinc->data = malloc(inprinc->length * sizeof(krb5_data)); if (tempprinc->data == 0) { free(tempprinc); return ENOMEM; } for (i = 0; i < inprinc->length; i++) { if (krb5int_copy_data_contents(context, &inprinc->data[i], &tempprinc->data[i]) != 0) { while (--i >= 0) free(tempprinc->data[i].data); free (tempprinc->data); free (tempprinc); return ENOMEM; } } if (krb5int_copy_data_contents_add0(context, &inprinc->realm, &tempprinc->realm) != 0) { for (i = 0; i < inprinc->length; i++) free(tempprinc->data[i].data); free(tempprinc->data); free(tempprinc); return ENOMEM; } *outprinc = tempprinc; return 0; }