~ubuntu-branches/ubuntu/maverick/krb5/maverick

« back to all changes in this revision

Viewing changes to src/util/support/strlcpy.c

  • Committer: Bazaar Package Importer
  • Author(s): Sam Hartman
  • Date: 2009-05-07 16:16:34 UTC
  • mfrom: (13.1.7 sid)
  • Revision ID: james.westby@ubuntu.com-20090507161634-xqyk0s9na0le4flj
Tags: 1.7dfsg~beta1-4
When  decrypting the TGS response fails with the subkey, try with the
session key to work around Heimdal bug, Closes: #527353 

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "k5-platform.h"
 
2
 
 
3
/* Provide strlcpy and strlcat for platforms that don't have them. */
 
4
 
 
5
/*
 
6
 * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
 
7
 *
 
8
 * Permission to use, copy, modify, and distribute this software for any
 
9
 * purpose with or without fee is hereby granted, provided that the above
 
10
 * copyright notice and this permission notice appear in all copies.
 
11
 *
 
12
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 
13
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 
14
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 
15
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 
16
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 
17
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 
18
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
19
 */
 
20
 
 
21
#include <sys/types.h>
 
22
#include <string.h>
 
23
 
 
24
/*
 
25
 * Copy src to string dst of size siz.  At most siz-1 characters
 
26
 * will be copied.  Always NUL terminates (unless siz == 0).
 
27
 * Returns strlen(src); if retval >= siz, truncation occurred.
 
28
 */
 
29
size_t
 
30
krb5int_strlcpy(char *dst, const char *src, size_t siz)
 
31
{
 
32
        char *d = dst;
 
33
        const char *s = src;
 
34
        size_t n = siz;
 
35
 
 
36
        /* Copy as many bytes as will fit */
 
37
        if (n != 0) {
 
38
                while (--n != 0) {
 
39
                        if ((*d++ = *s++) == '\0')
 
40
                                break;
 
41
                }
 
42
        }
 
43
 
 
44
        /* Not enough room in dst, add NUL and traverse rest of src */
 
45
        if (n == 0) {
 
46
                if (siz != 0)
 
47
                        *d = '\0';              /* NUL-terminate dst */
 
48
                while (*s++)
 
49
                        ;
 
50
        }
 
51
 
 
52
        return(s - src - 1);    /* count does not include NUL */
 
53
}
 
54
 
 
55
/*
 
56
 * Appends src to string dst of size siz (unlike strncat, siz is the
 
57
 * full size of dst, not space left).  At most siz-1 characters
 
58
 * will be copied.  Always NUL terminates (unless siz <= strlen(dst)).
 
59
 * Returns strlen(src) + MIN(siz, strlen(initial dst)).
 
60
 * If retval >= siz, truncation occurred.
 
61
 */
 
62
size_t
 
63
krb5int_strlcat(char *dst, const char *src, size_t siz)
 
64
{
 
65
        char *d = dst;
 
66
        const char *s = src;
 
67
        size_t n = siz;
 
68
        size_t dlen;
 
69
 
 
70
        /* Find the end of dst and adjust bytes left but don't go past end */
 
71
        while (n-- != 0 && *d != '\0')
 
72
                d++;
 
73
        dlen = d - dst;
 
74
        n = siz - dlen;
 
75
 
 
76
        if (n == 0)
 
77
                return(dlen + strlen(s));
 
78
        while (*s != '\0') {
 
79
                if (n != 1) {
 
80
                        *d++ = *s;
 
81
                        n--;
 
82
                }
 
83
                s++;
 
84
        }
 
85
        *d = '\0';
 
86
 
 
87
        return(dlen + (s - src));       /* count does not include NUL */
 
88
}