All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nick Desaulniers <ndesaulniers@google.com>
To: Tom Rix <trix@redhat.com>
Cc: gregkh@linuxfoundation.org, jirislaby@kernel.org,
	nathan@kernel.org,  peter@hurleysoftware.com,
	linux-serial@vger.kernel.org,  linux-kernel@vger.kernel.org,
	llvm@lists.linux.dev
Subject: Re: [PATCH] serial: core: check if uart_get_info succeeds before using
Date: Mon, 6 Jun 2022 11:29:07 -0700	[thread overview]
Message-ID: <CAKwvOdnvcP4m_+4gjhmjX+xmmU2um6_HGVqQa0euFCkwog6i1A@mail.gmail.com> (raw)
In-Reply-To: <20220529134605.12881-1-trix@redhat.com>

On Sun, May 29, 2022 at 6:46 AM Tom Rix <trix@redhat.com> wrote:
>
> clang static analysis reports this representative issue
> drivers/tty/serial/serial_core.c:2818:9: warning: 3rd function call argument is an uninitialized value [core.CallAndMessage]
>         return sprintf(buf, "%d\n", tmp.iomem_reg_shift);
>                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> uart_get_info() is used the *show() functions.  When uart_get_info() fails, what is reported
> is garbage.  So check if uart_get_info() succeeded.

Hi Tom,
Thanks for the patch. What do you think about throwing __must_check on
the definition of uart_get_info with a comment that members of the
retinfo param will not be initialized if the return value is not zero?

Otherwise, patch LGTM.
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>

>
> Fixes: 4047b37122d1 ("serial: core: Prevent unsafe uart port access, part 1")
> Signed-off-by: Tom Rix <trix@redhat.com>
> ---
>  drivers/tty/serial/serial_core.c | 52 ++++++++++++++++++++++++--------
>  1 file changed, 39 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
> index 9a85b41caa0a..4160f6711c5d 100644
> --- a/drivers/tty/serial/serial_core.c
> +++ b/drivers/tty/serial/serial_core.c
> @@ -2690,7 +2690,9 @@ static ssize_t uartclk_show(struct device *dev,
>         struct serial_struct tmp;
>         struct tty_port *port = dev_get_drvdata(dev);
>
> -       uart_get_info(port, &tmp);
> +       if (uart_get_info(port, &tmp))
> +               return 0;
> +
>         return sprintf(buf, "%d\n", tmp.baud_base * 16);
>  }
>
> @@ -2700,7 +2702,9 @@ static ssize_t type_show(struct device *dev,
>         struct serial_struct tmp;
>         struct tty_port *port = dev_get_drvdata(dev);
>
> -       uart_get_info(port, &tmp);
> +       if (uart_get_info(port, &tmp))
> +               return 0;
> +
>         return sprintf(buf, "%d\n", tmp.type);
>  }
>
> @@ -2710,7 +2714,9 @@ static ssize_t line_show(struct device *dev,
>         struct serial_struct tmp;
>         struct tty_port *port = dev_get_drvdata(dev);
>
> -       uart_get_info(port, &tmp);
> +       if (uart_get_info(port, &tmp))
> +               return 0;
> +
>         return sprintf(buf, "%d\n", tmp.line);
>  }
>
> @@ -2721,7 +2727,9 @@ static ssize_t port_show(struct device *dev,
>         struct tty_port *port = dev_get_drvdata(dev);
>         unsigned long ioaddr;
>
> -       uart_get_info(port, &tmp);
> +       if (uart_get_info(port, &tmp))
> +               return 0;
> +
>         ioaddr = tmp.port;
>         if (HIGH_BITS_OFFSET)
>                 ioaddr |= (unsigned long)tmp.port_high << HIGH_BITS_OFFSET;
> @@ -2734,7 +2742,9 @@ static ssize_t irq_show(struct device *dev,
>         struct serial_struct tmp;
>         struct tty_port *port = dev_get_drvdata(dev);
>
> -       uart_get_info(port, &tmp);
> +       if (uart_get_info(port, &tmp))
> +               return 0;
> +
>         return sprintf(buf, "%d\n", tmp.irq);
>  }
>
> @@ -2744,7 +2754,9 @@ static ssize_t flags_show(struct device *dev,
>         struct serial_struct tmp;
>         struct tty_port *port = dev_get_drvdata(dev);
>
> -       uart_get_info(port, &tmp);
> +       if (uart_get_info(port, &tmp))
> +               return 0;
> +
>         return sprintf(buf, "0x%X\n", tmp.flags);
>  }
>
> @@ -2754,7 +2766,9 @@ static ssize_t xmit_fifo_size_show(struct device *dev,
>         struct serial_struct tmp;
>         struct tty_port *port = dev_get_drvdata(dev);
>
> -       uart_get_info(port, &tmp);
> +       if (uart_get_info(port, &tmp))
> +               return 0;
> +
>         return sprintf(buf, "%d\n", tmp.xmit_fifo_size);
>  }
>
> @@ -2764,7 +2778,9 @@ static ssize_t close_delay_show(struct device *dev,
>         struct serial_struct tmp;
>         struct tty_port *port = dev_get_drvdata(dev);
>
> -       uart_get_info(port, &tmp);
> +       if (uart_get_info(port, &tmp))
> +               return 0;
> +
>         return sprintf(buf, "%d\n", tmp.close_delay);
>  }
>
> @@ -2774,7 +2790,9 @@ static ssize_t closing_wait_show(struct device *dev,
>         struct serial_struct tmp;
>         struct tty_port *port = dev_get_drvdata(dev);
>
> -       uart_get_info(port, &tmp);
> +       if (uart_get_info(port, &tmp))
> +               return 0;
> +
>         return sprintf(buf, "%d\n", tmp.closing_wait);
>  }
>
> @@ -2784,7 +2802,9 @@ static ssize_t custom_divisor_show(struct device *dev,
>         struct serial_struct tmp;
>         struct tty_port *port = dev_get_drvdata(dev);
>
> -       uart_get_info(port, &tmp);
> +       if (uart_get_info(port, &tmp))
> +               return 0;
> +
>         return sprintf(buf, "%d\n", tmp.custom_divisor);
>  }
>
> @@ -2794,7 +2814,9 @@ static ssize_t io_type_show(struct device *dev,
>         struct serial_struct tmp;
>         struct tty_port *port = dev_get_drvdata(dev);
>
> -       uart_get_info(port, &tmp);
> +       if (uart_get_info(port, &tmp))
> +               return 0;
> +
>         return sprintf(buf, "%d\n", tmp.io_type);
>  }
>
> @@ -2804,7 +2826,9 @@ static ssize_t iomem_base_show(struct device *dev,
>         struct serial_struct tmp;
>         struct tty_port *port = dev_get_drvdata(dev);
>
> -       uart_get_info(port, &tmp);
> +       if (uart_get_info(port, &tmp))
> +               return 0;
> +
>         return sprintf(buf, "0x%lX\n", (unsigned long)tmp.iomem_base);
>  }
>
> @@ -2814,7 +2838,9 @@ static ssize_t iomem_reg_shift_show(struct device *dev,
>         struct serial_struct tmp;
>         struct tty_port *port = dev_get_drvdata(dev);
>
> -       uart_get_info(port, &tmp);
> +       if (uart_get_info(port, &tmp))
> +               return 0;
> +
>         return sprintf(buf, "%d\n", tmp.iomem_reg_shift);
>  }
>
> --
> 2.27.0
>


-- 
Thanks,
~Nick Desaulniers

  reply	other threads:[~2022-06-06 18:29 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-29 13:46 [PATCH] serial: core: check if uart_get_info succeeds before using Tom Rix
2022-06-06 18:29 ` Nick Desaulniers [this message]
2022-06-07 10:15 ` Andy Shevchenko
2022-06-07 13:11 ` Greg KH

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAKwvOdnvcP4m_+4gjhmjX+xmmU2um6_HGVqQa0euFCkwog6i1A@mail.gmail.com \
    --to=ndesaulniers@google.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=jirislaby@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-serial@vger.kernel.org \
    --cc=llvm@lists.linux.dev \
    --cc=nathan@kernel.org \
    --cc=peter@hurleysoftware.com \
    --cc=trix@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.