]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
boot: modernize mangle_stub_cmdline() a bit + drop leading whitespace
authorLennart Poettering <lennart@poettering.net>
Mon, 21 Aug 2023 16:37:46 +0000 (18:37 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 22 Aug 2023 08:53:25 +0000 (10:53 +0200)
Let's modernize the function a bit, and make it return the string passed
in, as we usually do.

Most importanly though: also drop leading whitespace, not just trailing
whitespace.

src/boot/efi/util.c
src/boot/efi/util.h

index fdd5abac2902c8af071f3e9eb45155f9cf8cdd31..79fa525175c472f553b0559a69228962acd8d4e6 100644 (file)
@@ -265,26 +265,36 @@ char16_t *xstr8_to_path(const char *str8) {
         return path;
 }
 
-void mangle_stub_cmdline(char16_t *cmdline) {
-        char16_t *p = cmdline;
+static bool shall_be_whitespace(char16_t c) {
+        return c <= 0x20U || c == 0x7FU; /* All control characters + space */
+}
+
+char16_t* mangle_stub_cmdline(char16_t *cmdline) {
+        char16_t *p, *q, *e;
 
         if (!cmdline)
-                return;
+                return cmdline;
 
-        for (; *cmdline != '\0'; cmdline++)
-                /* Convert ASCII control characters to spaces. */
-                if (*cmdline <= 0x1F)
-                        *cmdline = ' ';
+        p = q = cmdline;
 
-        /* chomp the trailing whitespaces */
-        while (cmdline != p) {
-                --cmdline;
+        /* Skip initial whitespace */
+        while (shall_be_whitespace(*p))
+                p++;
 
-                if (*cmdline != ' ')
-                        break;
+        /* Turn inner control characters into proper spaces */
+        for (e = p; *p != 0; p++) {
+                if (shall_be_whitespace(*p)) {
+                        *(q++) = ' ';
+                        continue;
+                }
 
-                *cmdline = '\0';
+                *(q++) = *p;
+                e = q; /* remember last non-whitespace char */
         }
+
+        /* Chop off trailing whitespace */
+        *e = 0;
+        return cmdline;
 }
 
 EFI_STATUS chunked_read(EFI_FILE *file, size_t *size, void *buf) {
index 8cb4ed0c1cde69c89f121e56af1841b8e0add257..d190db9f3fcc8e87a57bb5670596f6bc69ec80dd 100644 (file)
@@ -98,7 +98,7 @@ EFI_STATUS efivar_get_boolean_u8(const EFI_GUID *vendor, const char16_t *name, b
 
 void convert_efi_path(char16_t *path);
 char16_t *xstr8_to_path(const char *stra);
-void mangle_stub_cmdline(char16_t *cmdline);
+char16_t *mangle_stub_cmdline(char16_t *cmdline);
 
 EFI_STATUS chunked_read(EFI_FILE *file, size_t *size, void *buf);
 EFI_STATUS file_read(EFI_FILE *dir, const char16_t *name, size_t off, size_t size, char **content, size_t *content_size);