From dadcf3beb412cd1a1d7912b2872de038bda8f5f0 Mon Sep 17 00:00:00 2001 From: Nicolas Williams Date: Sun, 15 Jul 2012 01:28:47 -0500 Subject: [PATCH] Fix bug in _krb5_expand_path_tokensv() --- lib/krb5/Makefile.am | 1 + lib/krb5/expand_path.c | 22 ++++---- lib/krb5/test_expand_toks.c | 104 ++++++++++++++++++++++++++++++++++++ lib/krb5/version-script.map | 1 + 4 files changed, 118 insertions(+), 10 deletions(-) create mode 100644 lib/krb5/test_expand_toks.c diff --git a/lib/krb5/Makefile.am b/lib/krb5/Makefile.am index 4a9a4dc23..c3b3cd7e2 100644 --- a/lib/krb5/Makefile.am +++ b/lib/krb5/Makefile.am @@ -10,6 +10,7 @@ noinst_PROGRAMS = \ krbhst-test \ test_alname \ test_crypto \ + test_expand_toks \ test_forward \ test_get_addrs \ test_gic \ diff --git a/lib/krb5/expand_path.c b/lib/krb5/expand_path.c index 592457d39..c8a48847d 100644 --- a/lib/krb5/expand_path.c +++ b/lib/krb5/expand_path.c @@ -445,7 +445,8 @@ free_extra_tokens(char **extra_tokens) * * @context A krb5_context * @path_in The path to expand tokens from - * @token Variable number of pairs of strings, the first of each + * @ppath_out The expanded path + * @... 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. * @@ -462,7 +463,7 @@ _krb5_expand_path_tokensv(krb5_context context, char **extra_tokens = NULL; const char *path_left; const char *s; - size_t nextra_tokens = 0; + size_t nargs = 0; size_t len = 0; va_list ap; @@ -475,21 +476,22 @@ _krb5_expand_path_tokensv(krb5_context context, va_start(ap, ppath_out); while ((s = va_arg(ap, const char *))) { - nextra_tokens++; - s = va_arg(ap, const char *); + nargs++; + s = va_arg(ap, const char *); } va_end(ap); + nargs *= 2; /* Get extra tokens */ - if (nextra_tokens) { + if (nargs) { size_t i; - extra_tokens = calloc(nextra_tokens + 2, sizeof (*extra_tokens)); + extra_tokens = calloc(nargs + 1, 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 *); + for (i = 0; i < nargs; i++) { + s = va_arg(ap, const char *); /* token key */ if (s == NULL) break; extra_tokens[i] = strdup(s); @@ -497,9 +499,9 @@ _krb5_expand_path_tokensv(krb5_context context, free_extra_tokens(extra_tokens); return krb5_enomem(context); } - s = va_arg(ap, const char *); + s = va_arg(ap, const char *); /* token value */ if (s == NULL) - break; + s = ""; extra_tokens[i] = strdup(s); if (extra_tokens[i] == NULL) { free_extra_tokens(extra_tokens); diff --git a/lib/krb5/test_expand_toks.c b/lib/krb5/test_expand_toks.c new file mode 100644 index 000000000..9a736e963 --- /dev/null +++ b/lib/krb5/test_expand_toks.c @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2003 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 KTH 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 KTH AND ITS 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 KTH OR ITS 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 "krb5_locl.h" +#include +#include + +static int version_flag = 0; +static int help_flag = 0; + +static struct getargs args[] = { + {"help", 0, arg_flag, &help_flag, + NULL, NULL } +}; + +static void +usage (int ret) +{ + arg_printusage (args, + sizeof(args)/sizeof(*args), + NULL, + ""); + exit (ret); +} + +int +main(int argc, char **argv) +{ + krb5_context context; + krb5_error_code ret; + int optidx = 0; + char *expanded; + + setprogname(argv[0]); + + if (getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) + usage(1); + + if (help_flag) + usage (0); + + if (version_flag){ + print_version(NULL); + exit(0); + } + + argc -= optidx; + argv += optidx; + + ret = krb5_init_context(&context); + if (ret) + errx (1, "krb5_init_context failed: %d", ret); + + ret = _krb5_expand_path_tokensv(context, "/tmp/%{foo}/%{bar}%{baz}/x", + &expanded, + "foo", "abc", + "bar", "dce", + "baz", "fgh", + NULL); + if (ret) + krb5_err(context, ret, 1, "Token expansion failed"); + +#ifdef _WIN32 +#define EXPANDED_SHOULD_BE "\\tmp\\abc\\dcefgh\\x" +#else +#define EXPANDED_SHOULD_BE "/tmp/abc/dcefgh/x" +#endif + + if (strcmp(expanded, EXPANDED_SHOULD_BE)) + krb5_errx(context, 1, "Token expansion incorrect"); + + krb5_free_context(context); + + return 0; +} diff --git a/lib/krb5/version-script.map b/lib/krb5/version-script.map index 23e8b4589..b49c165dd 100644 --- a/lib/krb5/version-script.map +++ b/lib/krb5/version-script.map @@ -765,6 +765,7 @@ HEIMDAL_KRB5_2.0 { _krb5_aes_cts_encrypt; _krb5_n_fold; _krb5_expand_default_cc_name; + _krb5_expand_path_tokensv; # FAST _krb5_fast_cf2;