Coverage Report

Created: 2025-07-09 06:39

/src/systemd/src/boot/efi-string.h
Line
Count
Source (jump to first uncovered line)
1
/* SPDX-License-Identifier: LGPL-2.1-or-later */
2
#pragma once
3
4
#include "efi.h"
5
6
size_t strnlen8(const char *s, size_t n);
7
size_t strnlen16(const char16_t *s, size_t n);
8
9
12.5k
static inline size_t strlen8(const char *s) {
10
12.5k
        return strnlen8(s, SIZE_MAX);
11
12.5k
}
Unexecuted instantiation: fuzz-efi-osrel.c:strlen8
efi-string.c:strlen8
Line
Count
Source
9
33
static inline size_t strlen8(const char *s) {
10
33
        return strnlen8(s, SIZE_MAX);
11
33
}
Unexecuted instantiation: fuzz-efi-printf.c:strlen8
Unexecuted instantiation: fuzz-efi-string.c:strlen8
bcd.c:strlen8
Line
Count
Source
9
12.4k
static inline size_t strlen8(const char *s) {
10
12.4k
        return strnlen8(s, SIZE_MAX);
11
12.4k
}
12
13
0
static inline size_t strlen16(const char16_t *s) {
14
0
        return strnlen16(s, SIZE_MAX);
15
0
}
Unexecuted instantiation: fuzz-efi-osrel.c:strlen16
Unexecuted instantiation: efi-string.c:strlen16
Unexecuted instantiation: fuzz-efi-printf.c:strlen16
Unexecuted instantiation: fuzz-efi-string.c:strlen16
Unexecuted instantiation: bcd.c:strlen16
16
17
0
static inline size_t strsize8(const char *s) {
18
0
        return s ? (strlen8(s) + 1) * sizeof(*s) : 0;
19
0
}
Unexecuted instantiation: fuzz-efi-osrel.c:strsize8
Unexecuted instantiation: efi-string.c:strsize8
Unexecuted instantiation: fuzz-efi-printf.c:strsize8
Unexecuted instantiation: fuzz-efi-string.c:strsize8
Unexecuted instantiation: bcd.c:strsize8
20
21
0
static inline size_t strsize16(const char16_t *s) {
22
0
        return s ? (strlen16(s) + 1) * sizeof(*s) : 0;
23
0
}
Unexecuted instantiation: fuzz-efi-osrel.c:strsize16
Unexecuted instantiation: efi-string.c:strsize16
Unexecuted instantiation: fuzz-efi-printf.c:strsize16
Unexecuted instantiation: fuzz-efi-string.c:strsize16
Unexecuted instantiation: bcd.c:strsize16
24
25
char* strtolower8(char *s);
26
char16_t* strtolower16(char16_t *s);
27
28
int strncmp8(const char *s1, const char *s2, size_t n);
29
int strncmp16(const char16_t *s1, const char16_t *s2, size_t n);
30
int strncasecmp8(const char *s1, const char *s2, size_t n);
31
int strncasecmp16(const char16_t *s1, const char16_t *s2, size_t n);
32
33
0
static inline int strcmp8(const char *s1, const char *s2) {
34
0
        return strncmp8(s1, s2, SIZE_MAX);
35
0
}
Unexecuted instantiation: fuzz-efi-osrel.c:strcmp8
Unexecuted instantiation: efi-string.c:strcmp8
Unexecuted instantiation: fuzz-efi-printf.c:strcmp8
Unexecuted instantiation: fuzz-efi-string.c:strcmp8
Unexecuted instantiation: bcd.c:strcmp8
36
37
0
static inline int strcmp16(const char16_t *s1, const char16_t *s2) {
38
0
        return strncmp16(s1, s2, SIZE_MAX);
39
0
}
Unexecuted instantiation: fuzz-efi-osrel.c:strcmp16
Unexecuted instantiation: efi-string.c:strcmp16
Unexecuted instantiation: fuzz-efi-printf.c:strcmp16
Unexecuted instantiation: fuzz-efi-string.c:strcmp16
Unexecuted instantiation: bcd.c:strcmp16
40
41
0
static inline int strcasecmp8(const char *s1, const char *s2) {
42
0
        return strncasecmp8(s1, s2, SIZE_MAX);
43
0
}
Unexecuted instantiation: fuzz-efi-osrel.c:strcasecmp8
Unexecuted instantiation: efi-string.c:strcasecmp8
Unexecuted instantiation: fuzz-efi-printf.c:strcasecmp8
Unexecuted instantiation: fuzz-efi-string.c:strcasecmp8
Unexecuted instantiation: bcd.c:strcasecmp8
44
45
0
static inline int strcasecmp16(const char16_t *s1, const char16_t *s2) {
46
0
        return strncasecmp16(s1, s2, SIZE_MAX);
47
0
}
Unexecuted instantiation: fuzz-efi-osrel.c:strcasecmp16
Unexecuted instantiation: efi-string.c:strcasecmp16
Unexecuted instantiation: fuzz-efi-printf.c:strcasecmp16
Unexecuted instantiation: fuzz-efi-string.c:strcasecmp16
Unexecuted instantiation: bcd.c:strcasecmp16
48
49
0
static inline bool strneq8(const char *s1, const char *s2, size_t n) {
50
0
        return strncmp8(s1, s2, n) == 0;
51
0
}
Unexecuted instantiation: fuzz-efi-osrel.c:strneq8
Unexecuted instantiation: efi-string.c:strneq8
Unexecuted instantiation: fuzz-efi-printf.c:strneq8
Unexecuted instantiation: fuzz-efi-string.c:strneq8
Unexecuted instantiation: bcd.c:strneq8
52
53
0
static inline bool strneq16(const char16_t *s1, const char16_t *s2, size_t n) {
54
0
        return strncmp16(s1, s2, n) == 0;
55
0
}
Unexecuted instantiation: fuzz-efi-osrel.c:strneq16
Unexecuted instantiation: efi-string.c:strneq16
Unexecuted instantiation: fuzz-efi-printf.c:strneq16
Unexecuted instantiation: fuzz-efi-string.c:strneq16
Unexecuted instantiation: bcd.c:strneq16
56
57
0
static inline bool streq8(const char *s1, const char *s2) {
58
0
        return strcmp8(s1, s2) == 0;
59
0
}
Unexecuted instantiation: fuzz-efi-osrel.c:streq8
Unexecuted instantiation: efi-string.c:streq8
Unexecuted instantiation: fuzz-efi-printf.c:streq8
Unexecuted instantiation: fuzz-efi-string.c:streq8
Unexecuted instantiation: bcd.c:streq8
60
61
0
static inline bool streq16(const char16_t *s1, const char16_t *s2) {
62
0
        return strcmp16(s1, s2) == 0;
63
0
}
Unexecuted instantiation: fuzz-efi-osrel.c:streq16
Unexecuted instantiation: efi-string.c:streq16
Unexecuted instantiation: fuzz-efi-printf.c:streq16
Unexecuted instantiation: fuzz-efi-string.c:streq16
Unexecuted instantiation: bcd.c:streq16
64
65
135k
static inline int strncaseeq8(const char *s1, const char *s2, size_t n) {
66
135k
        return strncasecmp8(s1, s2, n) == 0;
67
135k
}
Unexecuted instantiation: fuzz-efi-osrel.c:strncaseeq8
Unexecuted instantiation: efi-string.c:strncaseeq8
Unexecuted instantiation: fuzz-efi-printf.c:strncaseeq8
Unexecuted instantiation: fuzz-efi-string.c:strncaseeq8
bcd.c:strncaseeq8
Line
Count
Source
65
135k
static inline int strncaseeq8(const char *s1, const char *s2, size_t n) {
66
135k
        return strncasecmp8(s1, s2, n) == 0;
67
135k
}
68
69
0
static inline int strncaseeq16(const char16_t *s1, const char16_t *s2, size_t n) {
70
0
        return strncasecmp16(s1, s2, n) == 0;
71
0
}
Unexecuted instantiation: fuzz-efi-osrel.c:strncaseeq16
Unexecuted instantiation: efi-string.c:strncaseeq16
Unexecuted instantiation: fuzz-efi-printf.c:strncaseeq16
Unexecuted instantiation: fuzz-efi-string.c:strncaseeq16
Unexecuted instantiation: bcd.c:strncaseeq16
72
73
0
static inline bool strcaseeq8(const char *s1, const char *s2) {
74
0
        return strcasecmp8(s1, s2) == 0;
75
0
}
Unexecuted instantiation: fuzz-efi-osrel.c:strcaseeq8
Unexecuted instantiation: efi-string.c:strcaseeq8
Unexecuted instantiation: fuzz-efi-printf.c:strcaseeq8
Unexecuted instantiation: fuzz-efi-string.c:strcaseeq8
Unexecuted instantiation: bcd.c:strcaseeq8
76
77
0
static inline bool strcaseeq16(const char16_t *s1, const char16_t *s2) {
78
0
        return strcasecmp16(s1, s2) == 0;
79
0
}
Unexecuted instantiation: fuzz-efi-osrel.c:strcaseeq16
Unexecuted instantiation: efi-string.c:strcaseeq16
Unexecuted instantiation: fuzz-efi-printf.c:strcaseeq16
Unexecuted instantiation: fuzz-efi-string.c:strcaseeq16
Unexecuted instantiation: bcd.c:strcaseeq16
80
81
char* strcpy8(char * restrict dest, const char * restrict src);
82
char16_t *strcpy16(char16_t * restrict dest, const char16_t * restrict src);
83
84
char* strchr8(const char *s, char c);
85
char16_t *strchr16(const char16_t *s, char16_t c);
86
87
char* xstrndup8(const char *s, size_t n);
88
char16_t *xstrndup16(const char16_t *s, size_t n);
89
90
0
static inline char* xstrdup8(const char *s) {
91
0
        return xstrndup8(s, SIZE_MAX);
92
0
}
Unexecuted instantiation: fuzz-efi-osrel.c:xstrdup8
Unexecuted instantiation: efi-string.c:xstrdup8
Unexecuted instantiation: fuzz-efi-printf.c:xstrdup8
Unexecuted instantiation: fuzz-efi-string.c:xstrdup8
Unexecuted instantiation: bcd.c:xstrdup8
93
94
0
static inline char16_t *xstrdup16(const char16_t *s) {
95
0
        return xstrndup16(s, SIZE_MAX);
96
0
}
Unexecuted instantiation: fuzz-efi-osrel.c:xstrdup16
Unexecuted instantiation: efi-string.c:xstrdup16
Unexecuted instantiation: fuzz-efi-printf.c:xstrdup16
Unexecuted instantiation: fuzz-efi-string.c:xstrdup16
Unexecuted instantiation: bcd.c:xstrdup16
97
98
char16_t *xstrn8_to_16(const char *str8, size_t n);
99
0
static inline char16_t *xstr8_to_16(const char *str8) {
100
0
        return xstrn8_to_16(str8, SIZE_MAX);
101
0
}
Unexecuted instantiation: fuzz-efi-osrel.c:xstr8_to_16
Unexecuted instantiation: efi-string.c:xstr8_to_16
Unexecuted instantiation: fuzz-efi-printf.c:xstr8_to_16
Unexecuted instantiation: fuzz-efi-string.c:xstr8_to_16
Unexecuted instantiation: bcd.c:xstr8_to_16
102
103
char *xstrn16_to_ascii(const char16_t *str16, size_t n);
104
0
static inline char *xstr16_to_ascii(const char16_t *str16) {
105
0
        return xstrn16_to_ascii(str16, SIZE_MAX);
106
0
}
Unexecuted instantiation: fuzz-efi-osrel.c:xstr16_to_ascii
Unexecuted instantiation: efi-string.c:xstr16_to_ascii
Unexecuted instantiation: fuzz-efi-printf.c:xstr16_to_ascii
Unexecuted instantiation: fuzz-efi-string.c:xstr16_to_ascii
Unexecuted instantiation: bcd.c:xstr16_to_ascii
107
108
char* startswith8(const char *s, const char *prefix);
109
110
size_t strspn16(const char16_t *p, const char16_t *good);
111
size_t strcspn16(const char16_t *p, const char16_t *bad);
112
113
bool efi_fnmatch(const char16_t *pattern, const char16_t *haystack);
114
115
bool parse_number8(const char *s, uint64_t *ret_u, const char **ret_tail);
116
bool parse_number16(const char16_t *s, uint64_t *ret_u, const char16_t **ret_tail);
117
118
bool parse_boolean(const char *v, bool *ret);
119
120
char* line_get_key_value(char *s, const char *sep, size_t *pos, char **ret_key, char **ret_value);
121
122
char16_t *hexdump(const void *data, size_t size);
123
124
#ifdef __clang__
125
#  define _gnu_printf_(a, b) _printf_(a, b)
126
#else
127
#  define _gnu_printf_(a, b) __attribute__((format(gnu_printf, a, b)))
128
#endif
129
130
_gnu_printf_(2, 3) void printf_status(EFI_STATUS status, const char *format, ...);
131
_gnu_printf_(2, 0) void vprintf_status(EFI_STATUS status, const char *format, va_list ap);
132
_gnu_printf_(2, 3) _warn_unused_result_ char16_t *xasprintf_status(EFI_STATUS status, const char *format, ...);
133
_gnu_printf_(2, 0) _warn_unused_result_ char16_t *xvasprintf_status(EFI_STATUS status, const char *format, va_list ap);
134
135
#if SD_BOOT
136
#  define printf(...) printf_status(EFI_SUCCESS, __VA_ARGS__)
137
#  define xasprintf(...) xasprintf_status(EFI_SUCCESS, __VA_ARGS__)
138
139
/* inttypes.h is provided by libc instead of the compiler and is not supposed to be used in freestanding
140
 * environments. We could use clang __*_FMT*__ constants for this, bug gcc does not have them. :( */
141
142
#  if defined(__ILP32__) || defined(__arm__) || defined(__i386__)
143
#    define PRI64_PREFIX "ll"
144
#  elif defined(__LP64__)
145
#    define PRI64_PREFIX "l"
146
#  elif defined(__LLP64__) || (__SIZEOF_LONG__ == 4 && __SIZEOF_POINTER__ == 8)
147
#    define PRI64_PREFIX "ll"
148
#  else
149
#    error Unknown 64-bit data model
150
#  endif
151
152
#  define PRIi32 "i"
153
#  define PRIu32 "u"
154
#  define PRIx32 "x"
155
#  define PRIX32 "X"
156
#  define PRIiPTR "zi"
157
#  define PRIuPTR "zu"
158
#  define PRIxPTR "zx"
159
#  define PRIXPTR "zX"
160
#  define PRIi64 PRI64_PREFIX "i"
161
#  define PRIu64 PRI64_PREFIX "u"
162
#  define PRIx64 PRI64_PREFIX "x"
163
#  define PRIX64 PRI64_PREFIX "X"
164
165
/* The compiler normally has knowledge about standard functions such as memcmp, but this is not the case when
166
 * compiling with -ffreestanding. By referring to builtins, the compiler can check arguments and do
167
 * optimizations again. Note that we still need to provide implementations as the compiler is free to not
168
 * inline its own implementation and instead issue a library call. */
169
#  define memchr __builtin_memchr
170
#  define memcmp __builtin_memcmp
171
#  define memcpy __builtin_memcpy
172
#  define memset __builtin_memset
173
174
static inline void *mempcpy(void * restrict dest, const void * restrict src, size_t n) {
175
        if (!dest || !src || n == 0)
176
                return dest;
177
        memcpy(dest, src, n);
178
        return (uint8_t *) dest + n;
179
}
180
181
#else
182
/* For unit testing. */
183
void *efi_memchr(const void *p, int c, size_t n);
184
int efi_memcmp(const void *p1, const void *p2, size_t n);
185
void *efi_memcpy(void * restrict dest, const void * restrict src, size_t n);
186
void *efi_memset(void *p, int c, size_t n);
187
#endif