1178828Sdfr/* 2178828Sdfr * Copyright (c) 1997 Kungliga Tekniska H��gskolan 3178828Sdfr * (Royal Institute of Technology, Stockholm, Sweden). 4178828Sdfr * All rights reserved. 5178828Sdfr * 6178828Sdfr * Redistribution and use in source and binary forms, with or without 7178828Sdfr * modification, are permitted provided that the following conditions 8178828Sdfr * are met: 9178828Sdfr * 10178828Sdfr * 1. Redistributions of source code must retain the above copyright 11178828Sdfr * notice, this list of conditions and the following disclaimer. 12178828Sdfr * 13178828Sdfr * 2. Redistributions in binary form must reproduce the above copyright 14178828Sdfr * notice, this list of conditions and the following disclaimer in the 15178828Sdfr * documentation and/or other materials provided with the distribution. 16178828Sdfr * 17178828Sdfr * 3. Neither the name of the Institute nor the names of its contributors 18178828Sdfr * may be used to endorse or promote products derived from this software 19178828Sdfr * without specific prior written permission. 20178828Sdfr * 21178828Sdfr * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 22178828Sdfr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23178828Sdfr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24178828Sdfr * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 25178828Sdfr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26178828Sdfr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27178828Sdfr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28178828Sdfr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29178828Sdfr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30178828Sdfr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31178828Sdfr * SUCH DAMAGE. 32178828Sdfr */ 33178828Sdfr 34178828Sdfr#include "krb5_locl.h" 35178828Sdfr#ifdef HAVE_EXECINFO_H 36178828Sdfr#include <execinfo.h> 37178828Sdfr#endif 38178828Sdfr 39178828SdfrKRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL 40178828Sdfr_krb5_s4u2self_to_checksumdata(krb5_context context, 41178828Sdfr const PA_S4U2Self *self, 42178828Sdfr krb5_data *data) 43178828Sdfr{ 44178828Sdfr krb5_error_code ret; 45178828Sdfr krb5_ssize_t ssize; 46178828Sdfr krb5_storage *sp; 47178828Sdfr size_t size; 48178828Sdfr size_t i; 49178828Sdfr 50297942Spfg sp = krb5_storage_emem(); 51178828Sdfr if (sp == NULL) { 52178828Sdfr krb5_clear_error_message(context); 53178828Sdfr return ENOMEM; 54178828Sdfr } 55178828Sdfr krb5_storage_set_flags(sp, KRB5_STORAGE_BYTEORDER_LE); 56178828Sdfr ret = krb5_store_int32(sp, self->name.name_type); 57178828Sdfr if (ret) 58178828Sdfr goto out; 59178828Sdfr for (i = 0; i < self->name.name_string.len; i++) { 60178828Sdfr size = strlen(self->name.name_string.val[i]); 61178828Sdfr ssize = krb5_storage_write(sp, self->name.name_string.val[i], size); 62178828Sdfr if (ssize != (krb5_ssize_t)size) { 63178828Sdfr ret = ENOMEM; 64178828Sdfr goto out; 65178828Sdfr } 66178828Sdfr } 67178828Sdfr size = strlen(self->realm); 68178828Sdfr ssize = krb5_storage_write(sp, self->realm, size); 69178828Sdfr if (ssize != (krb5_ssize_t)size) { 70178828Sdfr ret = ENOMEM; 71178828Sdfr goto out; 72178828Sdfr } 73178828Sdfr size = strlen(self->auth); 74178828Sdfr ssize = krb5_storage_write(sp, self->auth, size); 75178828Sdfr if (ssize != (krb5_ssize_t)size) { 76178828Sdfr ret = ENOMEM; 77178828Sdfr goto out; 78178828Sdfr } 79178828Sdfr 80178828Sdfr ret = krb5_storage_to_data(sp, data); 81178828Sdfr krb5_storage_free(sp); 82178828Sdfr return ret; 83178828Sdfr 84178828Sdfrout: 85178828Sdfr krb5_clear_error_message(context); 86178828Sdfr return ret; 87178828Sdfr} 88178828Sdfr 89178828Sdfrkrb5_error_code 90178828Sdfrkrb5_enomem(krb5_context context) 91178828Sdfr{ 92178828Sdfr krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); 93178828Sdfr return ENOMEM; 94178828Sdfr} 95178828Sdfr 96178828Sdfrvoid 97178828Sdfr_krb5_debug_backtrace(krb5_context context) 98178828Sdfr{ 99178828Sdfr#if defined(HAVE_BACKTRACE) && !defined(HEIMDAL_SMALLER) 100178828Sdfr void *stack[128]; 101178828Sdfr char **strs = NULL; 102178828Sdfr int i, frames = backtrace(stack, sizeof(stack) / sizeof(stack[0])); 103178828Sdfr if (frames > 0) 104178828Sdfr strs = backtrace_symbols(stack, frames); 105178828Sdfr if (strs) { 106178828Sdfr for (i = 0; i < frames; i++) 107178828Sdfr _krb5_debug(context, 10, "frame %d: %s", i, strs[i]); 108178828Sdfr free(strs); 109178828Sdfr } 110178828Sdfr#endif 111178828Sdfr} 112178828Sdfr 113178828Sdfrkrb5_error_code 114178828Sdfr_krb5_einval(krb5_context context, const char *func, unsigned long argn) 115178828Sdfr{ 116178828Sdfr#ifndef HEIMDAL_SMALLER 117178828Sdfr krb5_set_error_message(context, EINVAL, 118178828Sdfr N_("programmer error: invalid argument to %s argument %lu", 119178828Sdfr "function:line"), 120178828Sdfr func, argn); 121178828Sdfr if (_krb5_have_debug(context, 10)) { 122178828Sdfr _krb5_debug(context, 10, "invalid argument to function %s argument %lu", 123178828Sdfr func, argn); 124178828Sdfr _krb5_debug_backtrace(context); 125178828Sdfr } 126178828Sdfr#endif 127178828Sdfr return EINVAL; 128178828Sdfr} 129178828Sdfr