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