-ee7340860a22f81fb869cc431efc1fd4e5c77d34
+3fe55728404c602884f16126e9cc60fc5a3d8f20
MD2_Update(m, pad, 16);
memcpy(res, m->state, MD2_DIGEST_LENGTH);
- memset(m, 0, sizeof(m));
+ memset(m, 0, sizeof(*m));
}
home = pw->pw_dir;
}
if (home) {
- asprintf(&newfname, "%s%s", home, &fname[1]);
- if (newfname == NULL) {
+ int aret;
+
+ aret = asprintf(&newfname, "%s%s", home, &fname[1]);
+ if (aret == -1 || newfname == NULL) {
krb5_set_error_message(context, ENOMEM,
N_("malloc: out of memory", ""));
return ENOMEM;
struct _krb5_encryption_type _krb5_enctype_aes128_cts_hmac_sha1 = {
ETYPE_AES128_CTS_HMAC_SHA1_96,
"aes128-cts-hmac-sha1-96",
+ "aes128-cts",
16,
1,
16,
struct _krb5_encryption_type _krb5_enctype_aes256_cts_hmac_sha1 = {
ETYPE_AES256_CTS_HMAC_SHA1_96,
"aes256-cts-hmac-sha1-96",
+ "aes256-cts",
16,
1,
16,
return KRB5_PROG_SUMTYPE_NOSUPP; /* XXX */
}
kct = crypto->et->keyed_checksum;
- if (kct != NULL && kct->type != ct->type) {
+ if (kct == NULL || kct->type != ct->type) {
krb5_set_error_message(context, KRB5_PROG_SUMTYPE_NOSUPP,
N_("Checksum type %s is keyed, but "
"the key type %s passed didnt have that checksum "
krb5_enctype *etype)
{
int i;
- for(i = 0; i < _krb5_num_etypes; i++)
+ for(i = 0; i < _krb5_num_etypes; i++) {
if(strcasecmp(_krb5_etypes[i]->name, string) == 0){
*etype = _krb5_etypes[i]->type;
return 0;
}
+ if(_krb5_etypes[i]->alias != NULL &&
+ strcasecmp(_krb5_etypes[i]->alias, string) == 0){
+ *etype = _krb5_etypes[i]->type;
+ return 0;
+ }
+ }
krb5_set_error_message (context, KRB5_PROG_ETYPE_NOSUPP,
N_("encryption type %s not supported", ""),
string);
krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", ""));
return ENOMEM;
}
- if(etype == ETYPE_NULL)
+ if(etype == (krb5_enctype)ETYPE_NULL)
etype = key->keytype;
(*crypto)->et = _krb5_find_enctype(etype);
if((*crypto)->et == NULL || ((*crypto)->et->flags & F_DISABLED)) {
struct _krb5_encryption_type {
krb5_enctype type;
const char *name;
+ const char *alias;
size_t blocksize;
size_t padsize;
size_t confoundersize;
#include "krb5_locl.h"
+#include <stdarg.h>
+
typedef int PTYPE;
#ifdef _WIN32
* temporary directory until the user profile is loaded. In addition,
* the returned path may or may not exist.
*/
-static int
+static krb5_error_code
_expand_temp_folder(krb5_context context, PTYPE param, const char *postfix, char **ret)
{
TCHAR tpath[MAX_PATH];
*ret = strdup(tpath);
- if (*ret == NULL) {
- if (context)
- krb5_set_error_message(context, ENOMEM, "strdup - Out of memory");
- return ENOMEM;
- }
+ if (*ret == NULL)
+ return krb5_enomem(context);
return 0;
}
* "bin" directory is considered to be the directory in which the
* krb5.dll is located.
*/
-static int
+static krb5_error_code
_expand_bin_dir(krb5_context context, PTYPE param, const char *postfix, char **ret)
{
TCHAR path[MAX_PATH];
*ret = strdup(path);
if (*ret == NULL)
- return ENOMEM;
+ return krb5_enomem(context);
return 0;
}
* SecurityIdentification level the call will fail.
*
*/
-static int
+static krb5_error_code
_expand_userid(krb5_context context, PTYPE param, const char *postfix, char **ret)
{
int rv = EINVAL;
* Expand a folder identified by a CSIDL
*/
-static int
+static krb5_error_code
_expand_csidl(krb5_context context, PTYPE folder, const char *postfix, char **ret)
{
TCHAR path[MAX_PATH];
path[len - 1] = '\0';
if (postfix &&
- strlcat(path, postfix, sizeof(path)/sizeof(path[0])) >= sizeof(path)/sizeof(path[0])) {
- return ENOMEM;
- }
+ strlcat(path, postfix, sizeof(path)/sizeof(path[0])) >= sizeof(path)/sizeof(path[0]))
+ return krb5_enomem(context);
*ret = strdup(path);
- if (*ret == NULL) {
- if (context)
- krb5_set_error_message(context, ENOMEM, "Out of memory");
- return ENOMEM;
- }
+ if (*ret == NULL)
+ return krb5_enomem(context);
return 0;
}
#else
-static int
+static krb5_error_code
_expand_path(krb5_context context, PTYPE param, const char *postfix, char **ret)
{
*ret = strdup(postfix);
- if (*ret == NULL) {
- krb5_set_error_message(context, ENOMEM, "malloc - out of memory");
- return ENOMEM;
- }
+ if (*ret == NULL)
+ return krb5_enomem(context);
return 0;
}
-static int
+static krb5_error_code
_expand_temp_folder(krb5_context context, PTYPE param, const char *postfix, char **ret)
{
const char *p = NULL;
else
*ret = strdup("/tmp");
if (*ret == NULL)
- return ENOMEM;
+ return krb5_enomem(context);
return 0;
}
-static int
+static krb5_error_code
_expand_userid(krb5_context context, PTYPE param, const char *postfix, char **str)
{
int ret = asprintf(str, "%ld", (unsigned long)getuid());
if (ret < 0 || *str == NULL)
- return ENOMEM;
+ return krb5_enomem(context);
return 0;
}
#endif /* _WIN32 */
/**
+ * Expand an extra token
+ */
+
+static krb5_error_code
+_expand_extra_token(krb5_context context, const char *value, char **ret)
+{
+ *ret = strdup(value);
+ if (*ret == NULL)
+ return krb5_enomem(context);
+ return 0;
+}
+
+/**
* Expand a %{null} token
*
* The expansion of a %{null} token is always the empty string.
*/
-static int
+static krb5_error_code
_expand_null(krb5_context context, PTYPE param, const char *postfix, char **ret)
{
*ret = strdup("");
- if (*ret == NULL) {
- if (context)
- krb5_set_error_message(context, ENOMEM, "Out of memory");
- return ENOMEM;
- }
+ if (*ret == NULL)
+ return krb5_enomem(context);
return 0;
}
{"null", SPECIAL(_expand_null)}
};
-static int
+static krb5_error_code
_expand_token(krb5_context context,
const char *token,
const char *token_end,
+ char **extra_tokens,
char **ret)
{
size_t i;
+ char **p;
*ret = NULL;
return EINVAL;
}
+ for (p = extra_tokens; p && p[0]; p += 2) {
+ if (strncmp(token+2, p[0], (token_end - token) - 2) == 0)
+ return _expand_extra_token(context, p[1], ret);
+ }
+
for (i = 0; i < sizeof(tokens)/sizeof(tokens[0]); i++) {
if (!strncmp(token+2, tokens[i].tok, (token_end - token) - 2))
return tokens[i].exp_func(context, tokens[i].param,
return EINVAL;
}
+/**
+ * Internal function to expand tokens in paths.
+ *
+ * Inputs:
+ *
+ * @context A krb5_context
+ * @path_in The path to expand tokens from
+ *
+ * Outputs:
+ *
+ * @ppath_out Path with expanded tokens (caller must free() this)
+ */
KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
_krb5_expand_path_tokens(krb5_context context,
const char *path_in,
char **ppath_out)
{
+ return _krb5_expand_path_tokensv(context, path_in, ppath_out, NULL);
+}
+
+static void
+free_extra_tokens(char **extra_tokens)
+{
+ char **p;
+
+ for (p = extra_tokens; p && *p; p++)
+ free(*p);
+ free(extra_tokens);
+}
+
+/**
+ * Internal function to expand tokens in paths.
+ *
+ * Inputs:
+ *
+ * @context A krb5_context
+ * @path_in The path to expand tokens from
+ * @token Variable number of pairs of strings, the first of each
+ * being a token (e.g., "luser") and the second a string to
+ * replace it with. The list is terminated by a NULL.
+ *
+ * Outputs:
+ *
+ * @ppath_out Path with expanded tokens (caller must free() this)
+ */
+KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
+_krb5_expand_path_tokensv(krb5_context context,
+ const char *path_in,
+ char **ppath_out, ...)
+{
char *tok_begin, *tok_end, *append;
+ char **extra_tokens = NULL;
const char *path_left;
+ const char *s;
+ size_t nextra_tokens = 0;
size_t len = 0;
+ va_list ap;
if (path_in == NULL || *path_in == '\0') {
*ppath_out = strdup("");
*ppath_out = NULL;
+ va_start(ap, ppath_out);
+ while ((s = va_arg(ap, const char *))) {
+ nextra_tokens++;
+ s = va_arg(ap, const char *);
+ }
+ va_end(ap);
+
+ /* Get extra tokens */
+ if (nextra_tokens) {
+ size_t i;
+
+ extra_tokens = calloc(nextra_tokens + 2, sizeof (*extra_tokens));
+ if (extra_tokens == NULL)
+ return krb5_enomem(context);
+ va_start(ap, ppath_out);
+ for (i = 0; i < nextra_tokens; i++) {
+ s = va_arg(ap, const char *);
+ if (s == NULL)
+ break;
+ extra_tokens[i] = strdup(s);
+ if (extra_tokens[i++] == NULL) {
+ free_extra_tokens(extra_tokens);
+ return krb5_enomem(context);
+ }
+ s = va_arg(ap, const char *);
+ if (s == NULL)
+ break;
+ extra_tokens[i] = strdup(s);
+ if (extra_tokens[i] == NULL) {
+ free_extra_tokens(extra_tokens);
+ return krb5_enomem(context);
+ }
+ }
+ va_end(ap);
+ }
+
for (path_left = path_in; path_left && *path_left; ) {
tok_begin = strstr(path_left, "%{");
tok_end = strchr(tok_begin, '}');
if (tok_end == NULL) {
+ free_extra_tokens(extra_tokens);
if (*ppath_out)
free(*ppath_out);
*ppath_out = NULL;
return EINVAL;
}
- if (_expand_token(context, tok_begin, tok_end, &append)) {
+ if (_expand_token(context, tok_begin, tok_end, extra_tokens,
+ &append)) {
+ free_extra_tokens(extra_tokens);
if (*ppath_out)
free(*ppath_out);
*ppath_out = NULL;
if (append == NULL) {
+ free_extra_tokens(extra_tokens);
if (*ppath_out)
free(*ppath_out);
*ppath_out = NULL;
- if (context)
- krb5_set_error_message(context, ENOMEM, "malloc - out of memory");
- return ENOMEM;
+ return krb5_enomem(context);
}
char * new_str = realloc(*ppath_out, len + append_len + 1);
if (new_str == NULL) {
+ free_extra_tokens(extra_tokens);
free(append);
if (*ppath_out)
free(*ppath_out);
*ppath_out = NULL;
- if (context)
- krb5_set_error_message(context, ENOMEM, "malloc - out of memory");
- return ENOMEM;
+ return krb5_enomem(context);
}
*ppath_out = new_str;
}
#endif
+ free_extra_tokens(extra_tokens);
return 0;
}
return -1;
}
- p = s = malloc(size * 4 / 3 + 4);
+ p = s = (char *) malloc(size * 4 / 3 + 4);
if (p == NULL) {
*str = NULL;
return -1;
--- /dev/null
+/*
+ * Copyright (c) 2005 Kungliga Tekniska Högskolan
+ * (Royal Institute of Technology, Stockholm, Sweden).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the Institute nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <config.h>
+#undef realloc
+
+#include <stdlib.h>
+#include "roken.h"
+#undef realloc
+
+ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL
+rk_realloc(void *ptr, size_t size)
+{
+ if (ptr == NULL)
+ return malloc(size);
+ return realloc(ptr, size);
+}
/*
* error codes for inet_ntop/inet_pton
*/
-#define EAFNOSUPPORT WSAEAFNOSUPPORT
-
typedef SOCKET rk_socket_t;
#define rk_closesocket(x) closesocket(x)
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL rk_SOCK_IOCTL(SOCKET s, long cmd, int * argp);
-/* Microsoft VC 2010 POSIX definitions */
-#ifndef ENOTSOCK
-#define ENOTSOCK 128
-#endif
-#ifndef ENOTSUP
-#define ENOTSUP 129
-#endif
-#ifndef EOVERFLOW
-#define EOVERFLOW 132
-#endif
-#ifndef ETIMEDOUT
-#define ETIMEDOUT 138
-#endif
-#ifndef EWOULDBLOCK
-#define EWOULDBLOCK 140
-#endif
-
#define rk_SOCK_INIT() rk_WSAStartup()
#define rk_SOCK_EXIT() rk_WSACleanup()
#define rk_SOCK_INIT() 0
#define rk_SOCK_EXIT() do { } while(0)
-#endif
+#endif /* WinSock */
#ifndef IN_LOOPBACKNET
#define IN_LOOPBACKNET 127
#endif
#ifdef _MSC_VER
+#ifndef HAVE_STDINT_H
+#include <intsafe.h>
+#endif
+
/* Declarations for Microsoft Visual C runtime on Windows */
#include<process.h>
S_ISBLK(m)
*/
+#if !defined(ROKEN_NO_DEFINE_ALLOCATORS)
+/* Ensure that a common memory allocator is used by all */
+#define calloc rk_calloc
+#define free rk_free
+#define malloc rk_malloc
+#define realloc rk_realloc
+#endif
+
+ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL
+rk_calloc(size_t, size_t);
+
+ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
+rk_free(void *);
+
+ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL
+rk_malloc(size_t);
+
+ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL
+rk_realloc(void *, size_t);
+
#endif /* _MSC_VER */
#ifdef HAVE_WINSOCK
ROKEN_LIB_FUNCTION struct passwd * ROKEN_LIB_CALL k_getpwuid (uid_t);
#endif
+#ifdef POSIX_GETPWNAM_R
+#define rk_getpwnam_r(_n, _pw, _b, _sz, _pwd) getpwnam_r(_n, _pw, _b, _sz, _pwd)
+#else
+ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
+rk_getpwnam_r(const char *, struct passwd *, char *, size_t, struct passwd **);
+#endif
+
ROKEN_LIB_FUNCTION const char * ROKEN_LIB_CALL get_default_username (void);
#ifndef HAVE_SETEUID
localtime_r(const time_t *, struct tm *);
#endif
+#if !defined(HAVE_STRTOLL) || defined(NEED_STRTOLL_PROTO)
+#ifndef HAVE_STRTOLL
+#define strtoll rk_strtoll
+#endif
+ROKEN_LIB_FUNCTION long long ROKEN_LIB_CALL
+strtoll(const char * __restrict nptr, char ** __restrict endptr, int base);
+#endif
+
+#if !defined(HAVE_STRTOULL) || defined(NEED_STRTOULL_PROTO)
+#ifndef HAVE_STRTOULL
+#define strtoull rk_strtoull
+#endif
+ROKEN_LIB_FUNCTION unsigned long long ROKEN_LIB_CALL
+strtoull(const char * __restrict nptr, char ** __restrict endptr, int base);
+#endif
+
#if !defined(HAVE_STRSVIS) || defined(NEED_STRSVIS_PROTO)
#ifndef HAVE_STRSVIS
#define strsvis rk_strsvis
int ROKEN_LIB_FUNCTION rk_socket(int, int, int);
#endif
+/* Microsoft VC 2010 POSIX definitions */
+#ifndef EAFNOSUPPORT
+#define EAFNOSUPPORT 102
+#endif
+#ifndef ENOTSOCK
+#define ENOTSOCK 128
+#endif
+#ifndef ENOTSUP
+#define ENOTSUP 129
+#endif
+#ifndef EOVERFLOW
+#define EOVERFLOW 132
+#endif
+#ifndef ETIMEDOUT
+#define ETIMEDOUT 138
+#endif
+#ifndef EWOULDBLOCK
+#define EWOULDBLOCK 140
+#endif
+
+
#ifdef SOCKET_WRAPPER_REPLACE
#include <socket_wrapper.h>
#endif
typedef long longest;
#endif
+#ifndef HAVE_UINTPTR_T
+typedef u_longest uintptr_t;
+#endif
+
static size_t
break;
}
case 'p' : {
- u_longest arg = (u_longest)va_arg(ap, void*);
+ uintptr_t arg = (uintptr_t)va_arg(ap, void*);
len += append_number (state, arg, 0x10, "0123456789ABCDEF",
width, prec, flags, 0);
--- /dev/null
+/***********************************************************************
+ * Copyright (c) 2012, Secure Endpoints Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ **********************************************************************/
+#include <config.h>
+#include "roken.h"
+#undef calloc
+#undef malloc
+#undef free
+
+/*
+ * Windows executables and dlls suffer when memory is
+ * allocated with one allocator and deallocated with
+ * another because each allocator is backed by a separate
+ * heap. Reduce the exposure by ensuring that all
+ * binaries that are built using roken will build against
+ * same allocator.
+ */
+
+ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL
+rk_calloc(size_t elements, size_t size)
+{
+ return calloc( elements, size);
+}
+
+ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
+rk_free(void * ptr)
+{
+ free( ptr);
+}
+
+ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL
+rk_malloc(size_t size)
+{
+ return malloc( size);
+}
}
ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
-pidfile(const char *basename)
+pidfile(const char *bname)
{
if(pidfile_path != NULL)
return;
- if(basename == NULL)
- basename = getprogname();
- pidfile_path = pid_file_write(basename);
+ if(bname == NULL)
+ bname = getprogname();
+ pidfile_path = pid_file_write(bname);
#if defined(HAVE_ATEXIT)
atexit(pidfile_cleanup);
#elif defined(HAVE_ON_EXIT)