summaryrefslogtreecommitdiffstats
path: root/src/boot/efi
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2024-09-09 15:46:52 +0200
committerLennart Poettering <lennart@poettering.net>2024-09-10 06:48:38 +0200
commit52dd7c813178f0472655cfeb688cae0fe76d254a (patch)
tree4675ba8747a5bb9a1c5971de6abe2986a52ca8ff /src/boot/efi
parentMerge pull request #34297 from poettering/shell-prompt-extra (diff)
downloadsystemd-52dd7c813178f0472655cfeb688cae0fe76d254a.tar.xz
systemd-52dd7c813178f0472655cfeb688cae0fe76d254a.zip
efi: add free_and_xstrdup16() helper modelled after free_and_strdup() in userspace
Diffstat (limited to '')
-rw-r--r--src/boot/efi/util.c21
-rw-r--r--src/boot/efi/util.h2
2 files changed, 23 insertions, 0 deletions
diff --git a/src/boot/efi/util.c b/src/boot/efi/util.c
index ae605bf5a5..f5f748bc6c 100644
--- a/src/boot/efi/util.c
+++ b/src/boot/efi/util.c
@@ -492,3 +492,24 @@ void *xmalloc(size_t size) {
assert_se(BS->AllocatePool(EfiLoaderData, size, &p) == EFI_SUCCESS);
return p;
}
+
+bool free_and_xstrdup16(char16_t **p, const char16_t *s) {
+ char16_t *t;
+
+ assert(p);
+
+ /* Replaces a string pointer with a strdup()ed new string,
+ * possibly freeing the old one. */
+
+ if (streq_ptr(*p, s))
+ return false;
+
+ if (s)
+ t = xstrdup16(s);
+ else
+ t = NULL;
+
+ free(*p);
+ *p = t;
+ return true;
+}
diff --git a/src/boot/efi/util.h b/src/boot/efi/util.h
index d8d695ea79..50025a34a8 100644
--- a/src/boot/efi/util.h
+++ b/src/boot/efi/util.h
@@ -55,6 +55,8 @@ static inline void* xmemdup(const void *p, size_t l) {
#define xnew(type, n) ((type *) xmalloc_multiply((n), sizeof(type)))
+bool free_and_xstrdup16(char16_t **p, const char16_t *s);
+
typedef struct {
EFI_PHYSICAL_ADDRESS addr;
size_t n_pages;