summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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;