Re: [PATCH] driver: of: Properly truncate command line if too long

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Andy,

Le 4/6/21 à 6:56 PM, Andy Shevchenko a écrit :


On Tuesday, March 16, 2021, Alexandre Ghiti <alex@xxxxxxxx <mailto:alex@xxxxxxxx>> wrote:

    In case the command line given by the user is too long, warn about it
    and truncate it to the last full argument.

    This is what efi already does in commit 80b1bfe1cb2f ("efi/libstub:
    Don't parse overlong command lines").

    Reported-by: Dmitry Vyukov <dvyukov@xxxxxxxxxx
    <mailto:dvyukov@xxxxxxxxxx>>
    Signed-off-by: Alexandre Ghiti <alex@xxxxxxxx <mailto:alex@xxxxxxxx>>
    ---
      drivers/of/fdt.c | 21 ++++++++++++++++++++-
      1 file changed, 20 insertions(+), 1 deletion(-)

    diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
    index dcc1dd96911a..de4c6f9bac39 100644
    --- a/drivers/of/fdt.c
    +++ b/drivers/of/fdt.c
    @@ -25,6 +25,7 @@
      #include <linux/serial_core.h>
      #include <linux/sysfs.h>
      #include <linux/random.h>
    +#include <linux/ctype.h>

      #include <asm/setup.h>  /* for COMMAND_LINE_SIZE */
      #include <asm/page.h>
    @@ -1050,9 +1051,27 @@ int __init early_init_dt_scan_chosen(unsigned
    long node, const char *uname,

             /* Retrieve command line */
             p = of_get_flat_dt_prop(node, "bootargs", &l);
    -       if (p != NULL && l > 0)
    +       if (p != NULL && l > 0) {
                     strlcpy(data, p, min(l, COMMAND_LINE_SIZE));

    +               /*
    +                * If the given command line size is larger than
    +                * COMMAND_LINE_SIZE, truncate it to the last complete
    +                * parameter.
    +                */
    +               if (l > COMMAND_LINE_SIZE) {
    +                       char *cmd_p = (char *)data +
    COMMAND_LINE_SIZE - 1;
    +
    +                       while (!isspace(*cmd_p))
    +                               cmd_p--;


Shouldn’t you check for cmd_p being always bigger than or equal to data?

Yes you're right.


    +
    +                       *cmd_p = '\0';
    +
    +                       pr_err("Command line is too long: truncated
    to %d bytes\n",
    +                              (int)(cmd_p - (char *)data + 1));


Do you really need that casting?

No, I can use %td to print a pointer difference.

I'll send a v2.

Thanks,

Alex


    +               }
    +       }
    +
             /*
              * CONFIG_CMDLINE is meant to be a default in case nothing else
              * managed to set the command line, unless CONFIG_CMDLINE_FORCE
-- 2.20.1



--
With Best Regards,
Andy Shevchenko





[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]


  Powered by Linux