diff options
Diffstat (limited to 'crypto/heimdal/kuser/klist.c')
-rw-r--r-- | crypto/heimdal/kuser/klist.c | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/crypto/heimdal/kuser/klist.c b/crypto/heimdal/kuser/klist.c index ebeebad..639b3fd 100644 --- a/crypto/heimdal/kuser/klist.c +++ b/crypto/heimdal/kuser/klist.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997-2001 Kungliga Tekniska Högskolan + * Copyright (c) 1997-2002 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -34,7 +34,7 @@ #include "kuser_locl.h" #include "rtbl.h" -RCSID("$Id: klist.c,v 1.64 2001/05/11 19:55:13 assar Exp $"); +RCSID("$Id: klist.c,v 1.67 2002/08/20 09:05:18 joda Exp $"); static char* printable_time(time_t t) @@ -380,7 +380,7 @@ display_v4_tickets (int do_verbose) if (file == NULL) file = TKT_FILE; - printf("v4-ticket file: %s\n", file); + printf("%17s: %s\n", "V4-ticket file", file); ret = krb_get_tf_realm (file, princ.realm); if (ret) { @@ -406,7 +406,7 @@ display_v4_tickets (int do_verbose) return 1; } - printf("Principal:\t%s\n", krb_unparse_name (&princ)); + printf ("%17s: %s\n", "Principal", krb_unparse_name(&princ)); print_time_diff(do_verbose); printf("\n"); @@ -475,7 +475,7 @@ static void display_tokens(int do_verbose) { u_int32_t i; - unsigned char t[128]; + unsigned char t[4096]; struct ViceIoctl parms; parms.in = (void *)&i; @@ -483,7 +483,7 @@ display_tokens(int do_verbose) parms.out = (void *)t; parms.out_size = sizeof(t); - for (i = 0; k_pioctl(NULL, VIOCGETTOK, &parms, 0) == 0; i++) { + for (i = 0;; i++) { int32_t size_secret_tok, size_public_tok; unsigned char *cell; struct ClearToken ct; @@ -491,11 +491,25 @@ display_tokens(int do_verbose) struct timeval tv; char buf1[20], buf2[20]; + if(k_pioctl(NULL, VIOCGETTOK, &parms, 0) < 0) { + if(errno == EDOM) + break; + continue; + } + if(parms.out_size >= sizeof(t)) + continue; + if(parms.out_size < sizeof(size_secret_tok)) + continue; + t[parms.out_size] = 0; memcpy(&size_secret_tok, r, sizeof(size_secret_tok)); /* dont bother about the secret token */ r += size_secret_tok + sizeof(size_secret_tok); + if (parms.out_size < (r - t) + sizeof(size_public_tok)) + continue; memcpy(&size_public_tok, r, sizeof(size_public_tok)); r += sizeof(size_public_tok); + if (parms.out_size < (r - t) + size_public_tok + sizeof(int32_t)) + continue; memcpy(&ct, r, size_public_tok); r += size_public_tok; /* there is a int32_t with length of cellname, but we dont read it */ @@ -504,19 +518,19 @@ display_tokens(int do_verbose) gettimeofday (&tv, NULL); strlcpy (buf1, printable_time(ct.BeginTimestamp), - sizeof(buf1)); + sizeof(buf1)); if (do_verbose || tv.tv_sec < ct.EndTimestamp) strlcpy (buf2, printable_time(ct.EndTimestamp), - sizeof(buf2)); + sizeof(buf2)); else strlcpy (buf2, ">>> Expired <<<", sizeof(buf2)); printf("%s %s ", buf1, buf2); if ((ct.EndTimestamp - ct.BeginTimestamp) & 1) - printf("User's (AFS ID %d) tokens for %s", ct.ViceId, cell); + printf("User's (AFS ID %d) tokens for %s", ct.ViceId, cell); else - printf("Tokens for %s", cell); + printf("Tokens for %s", cell); if (do_verbose) printf(" (%d)", ct.AuthHandle); putchar('\n'); |