boot: Add strlen8/16

This commit is contained in:
Jan Janssen
2022-05-31 14:18:43 +02:00
parent 11f9a32de0
commit 9080ffd4cd
4 changed files with 98 additions and 0 deletions
+37
View File
@@ -0,0 +1,37 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#include <stdbool.h>
#include <stdint.h>
#include "efi-string.h"
/* String functions for both char and char16_t that should behave the same way as their respective
* counterpart in userspace. Where it makes sense, these accept NULL and do something sensible whereas
* userspace does not allow for this (strlen8(NULL) returns 0 like strlen_ptr(NULL) for example). To make it
* easier to tell in code which kind of string they work on, we use 8/16 suffixes. This also makes is easier
* to unit test them. */
#define DEFINE_STRNLEN(type, name) \
size_t name(const type *s, size_t n) { \
if (!s) \
return 0; \
\
size_t len = 0; \
while (len < n && *s) { \
s++; \
len++; \
} \
\
return len; \
}
DEFINE_STRNLEN(char, strnlen8);
DEFINE_STRNLEN(char16_t, strnlen16);
size_t strlen8(const char *s) {
return strnlen8(s, SIZE_MAX);
}
size_t strlen16(const char16_t *s) {
return strnlen16(s, SIZE_MAX);
}
+11
View File
@@ -0,0 +1,11 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once
#include <stddef.h>
#include <uchar.h>
size_t strnlen8(const char *s, size_t n);
size_t strnlen16(const char16_t *s, size_t n);
size_t strlen8(const char *s);
size_t strlen16(const char16_t *s);
+6
View File
@@ -331,6 +331,7 @@ efi_headers = files(
'devicetree.h',
'disk.h',
'drivers.h',
'efi-string.h',
'graphics.h',
'initrd.h',
'linux.h',
@@ -350,6 +351,7 @@ common_sources = files(
'assert.c',
'devicetree.c',
'disk.c',
'efi-string.c',
'graphics.c',
'initrd.c',
'measure.c',
@@ -380,6 +382,10 @@ else
stub_sources += files('linux.c')
endif
tests += [
[files('test-efi-string.c', 'efi-string.c')],
]
# BCD parser only makes sense on arches that Windows supports.
if efi_arch[1] in ['ia32', 'x86_64', 'arm', 'aarch64']
systemd_boot_sources += files('bcd.c')
+44
View File
@@ -0,0 +1,44 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#include "efi-string.h"
#include "tests.h"
TEST(strlen8) {
assert_se(strlen8(NULL) == 0);
assert_se(strlen8("") == 0);
assert_se(strlen8("1") == 1);
assert_se(strlen8("11") == 2);
assert_se(strlen8("123456789") == 9);
assert_se(strlen8("12\0004") == 2);
}
TEST(strlen16) {
assert_se(strlen16(NULL) == 0);
assert_se(strlen16(u"") == 0);
assert_se(strlen16(u"1") == 1);
assert_se(strlen16(u"11") == 2);
assert_se(strlen16(u"123456789") == 9);
assert_se(strlen16(u"12\0004") == 2);
}
TEST(strnlen8) {
assert_se(strnlen8(NULL, 0) == 0);
assert_se(strnlen8(NULL, 10) == 0);
assert_se(strnlen8("", 10) == 0);
assert_se(strnlen8("1", 10) == 1);
assert_se(strnlen8("11", 1) == 1);
assert_se(strnlen8("123456789", 7) == 7);
assert_se(strnlen8("12\0004", 5) == 2);
}
TEST(strnlen16) {
assert_se(strnlen16(NULL, 0) == 0);
assert_se(strnlen16(NULL, 10) == 0);
assert_se(strnlen16(u"", 10) == 0);
assert_se(strnlen16(u"1", 10) == 1);
assert_se(strnlen16(u"11", 1) == 1);
assert_se(strnlen16(u"123456789", 7) == 7);
assert_se(strnlen16(u"12\0004", 5) == 2);
}
DEFINE_TEST_MAIN(LOG_INFO);