From 52dd7c813178f0472655cfeb688cae0fe76d254a Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 9 Sep 2024 15:46:52 +0200 Subject: [PATCH] efi: add free_and_xstrdup16() helper modelled after free_and_strdup() in userspace --- src/boot/efi/util.c | 21 +++++++++++++++++++++ src/boot/efi/util.h | 2 ++ 2 files changed, 23 insertions(+) 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; -- 2.25.1