From mboxrd@z Thu Jan 1 00:00:00 1970 From: Simon Glass Date: Wed, 8 Aug 2018 03:56:01 -0600 Subject: [U-Boot] [PATCH 2/4] serial: protect access to serial rx buffer In-Reply-To: <1533296325-2490-3-git-send-email-patrick.delaunay@st.com> References: <1533296325-2490-1-git-send-email-patrick.delaunay@st.com> <1533296325-2490-3-git-send-email-patrick.delaunay@st.com> Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 3 August 2018 at 05:38, Patrick Delaunay wrote: > Add test to avoid access to rx buffer when this buffer is empty. > In this case directly call getc() function to avoid issue when tstc() > is not called. > > Signed-off-by: Patrick Delaunay > --- > > drivers/serial/serial-uclass.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/drivers/serial/serial-uclass.c b/drivers/serial/serial-uclass.c > index 321d23e..4121a37 100644 > --- a/drivers/serial/serial-uclass.c > +++ b/drivers/serial/serial-uclass.c > @@ -228,6 +228,9 @@ static int _serial_getc(struct udevice *dev) > struct serial_dev_priv *upriv = dev_get_uclass_priv(dev); > char val; > > + if (upriv->rd_ptr == upriv->wr_ptr) > + return __serial_getc(dev); > + > val = upriv->buf[upriv->rd_ptr++]; > upriv->rd_ptr %= CONFIG_SERIAL_RX_BUFFER_SIZE; > > -- > 2.7.4 > Reviewed-by: Simon Glass BTW I think the code in _serial_tstc() is wrong, or at least sub-optimal: /* Read all available chars into the RX buffer */ while (__serial_tstc(dev)) { upriv->buf[upriv->wr_ptr++] = __serial_getc(dev); upriv->wr_ptr %= CONFIG_SERIAL_RX_BUFFER_SIZE; } It should call serial_getc() until it returns -EAGAIN. There should be no need to call __serial_tstc() first, Regards, Simon