Coverage Report

Created: 2020-12-02 17:02

/libfido2/openbsd-compat/strlcat.c
Line
Count
Source (jump to first uncovered line)
1
/*      $OpenBSD: strlcat.c,v 1.13 2005/08/08 08:05:37 espie Exp $      */
2
3
/*
4
 * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
5
 *
6
 * Permission to use, copy, modify, and distribute this software for any
7
 * purpose with or without fee is hereby granted, provided that the above
8
 * copyright notice and this permission notice appear in all copies.
9
 *
10
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
 */
18
19
/* OPENBSD ORIGINAL: lib/libc/string/strlcat.c */
20
21
#include "openbsd-compat.h"
22
23
#if !defined(HAVE_STRLCAT)
24
25
#include <sys/types.h>
26
#include <string.h>
27
28
/*
29
 * Appends src to string dst of size siz (unlike strncat, siz is the
30
 * full size of dst, not space left).  At most siz-1 characters
31
 * will be copied.  Always NUL terminates (unless siz <= strlen(dst)).
32
 * Returns strlen(src) + MIN(siz, strlen(initial dst)).
33
 * If retval >= siz, truncation occurred.
34
 */
35
size_t
36
strlcat(char *dst, const char *src, size_t siz)
37
18.1M
{
38
18.1M
        char *d = dst;
39
18.1M
        const char *s = src;
40
18.1M
        size_t n = siz;
41
18.1M
        size_t dlen;
42
18.1M
43
18.1M
        /* Find the end of dst and adjust bytes left but don't go past end */
44
550M
        while (n-- != 0 && *d != '\0')
45
532M
                d++;
46
18.1M
        dlen = d - dst;
47
18.1M
        n = siz - dlen;
48
18.1M
49
18.1M
        if (n == 0)
50
0
                return(dlen + strlen(s));
51
76.0M
        while (*s != '\0') {
52
57.8M
                if (n != 1) {
53
57.8M
                        *d++ = *s;
54
57.8M
                        n--;
55
57.8M
                }
56
57.8M
                s++;
57
57.8M
        }
58
18.1M
        *d = '\0';
59
18.1M
60
18.1M
        return(dlen + (s - src));       /* count does not include NUL */
61
18.1M
}
62
63
#endif /* !defined(HAVE_STRLCAT) */