/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 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 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 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 |