Re: [PATCH] s390: Warn if kernel command line contains non-printable EBCDIC characters
David Laight <[email protected]>
| Newsgroups | org.kernel.vger.linux-s390,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <20260826145129.204b6517@pumpkin> |
On Tue, 25 Aug 2026 17:08:08 +0200 Ilya Leoshkevich <[email protected]> wrote: > Users may accidentally add multi-byte UTF-8 characters to zipl.conf > parmline, for example, by copying snippets containing non-breaking > spaces (\xC2\xA0) from web pages. > > The kernel will then interpret the entire command line as EBCDIC, > making it unusable. Distinguish this situation from the legitimate > EBCDIC conversion by looking for non-printable characters and issue > a warning. Would it be better to check for the entire line being printable ebcdic? All of EBCDIC a-zA-Z0-9 have the 0x80 bit set and most of 0x20..0x7f are invalid or control characters (or punctuation). David > > Signed-off-by: Ilya Leoshkevich <[email protected]> > --- > arch/s390/boot/ipl_parm.c | 19 ++++++++++++++++++- > 1 file changed, 18 insertions(+), 1 deletion(-) > > diff --git a/arch/s390/boot/ipl_parm.c b/arch/s390/boot/ipl_parm.c > index 6bc950b92be76..71c0c26d56bba 100644 > --- a/arch/s390/boot/ipl_parm.c > +++ b/arch/s390/boot/ipl_parm.c > @@ -173,12 +173,29 @@ static inline int has_ebcdic_char(const char *str) > return 0; > } > > +static inline int has_nonprintable_char(const char *str) > +{ > + int i; > + > + for (i = 0; str[i]; i++) { > + unsigned char c = (unsigned char)str[i]; > + > + /* isprint() is Latin-1, and we need ASCII here */ > + if (c < 0x20 || c > 0x7e) > + return 1; > + } > + return 0; > +} > + > void setup_boot_command_line(void) > { > parmarea.command_line[COMMAND_LINE_SIZE - 1] = 0; > /* convert arch command line to ascii if necessary */ > - if (has_ebcdic_char(parmarea.command_line)) > + if (has_ebcdic_char(parmarea.command_line)) { > EBCASC(parmarea.command_line, COMMAND_LINE_SIZE); > + if (has_nonprintable_char(parmarea.command_line)) > + boot_warn("Kernel command line was treated as EBCDIC, but contains non-printable characters\n"); > + } > /* copy arch command line */ > strscpy(early_command_line, strim(parmarea.command_line)); >