On Fri, Oct 28, 2016 at 07:28:15PM +0300, Jarkko Sakkinen wrote:
> On Thu, Oct 27, 2016 at 02:50:09PM -0700, Josh Zimmerman wrote:
> > If the TPM we're connecting to uses a static burst count, it will report
> > a burst count of zero throughout the response read. However, get_burstcount
> > assumes that a response of zero indicates that the TPM is not ready to
> > receive more data. In this case, it returns a negative error code, which
> > is passed on to tpm_tis_{write,read}_bytes as a u16, causing
> > them to read/write far too many bytes.
> > 
> > This patch checks for negative return codes and bails out from recv_data
> > and tpm_tis_send_data.
> > 
> > Fixes: 1107d065fdf1 (tpm_tis: Introduce intermediate layer for TPM access)
> > Signed-off-by: Josh Zimmerman <jo...@google.com>
> > 
> > ---
> > Changelog v5:
> >  - Move burstcnt < 0 check to before the min_t() call for enhanced 
> > readability.
> > Changelog v4:
> >  - Add short description to Fixes tag line.
> >  - Remove some unnecessary information in dev_err statements.
> > Changelog v3:
> >  - Add signed-off-by.
> > Changelog v2:
> >  - Fix typo (rc->burstcnt)
> > 
> > ---
> >  drivers/char/tpm/tpm_tis_core.c | 15 +++++++++++++--
> >  1 file changed, 13 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/char/tpm/tpm_tis_core.c 
> > b/drivers/char/tpm/tpm_tis_core.c
> > index e3bf31b..a1ce060 100644
> > --- a/drivers/char/tpm/tpm_tis_core.c
> > +++ b/drivers/char/tpm/tpm_tis_core.c
> > @@ -185,7 +185,12 @@ static int recv_data(struct tpm_chip *chip, u8 *buf, 
> > size_t count)
> >                              TPM_STS_DATA_AVAIL | TPM_STS_VALID,
> >                              chip->timeout_c,
> >                              &priv->read_queue, true) == 0) {
> > -           burstcnt = min_t(int, get_burstcount(chip), count - size);
> > +           burstcnt = get_burstcount(chip);
> > +           if (burstcnt < 0) {
> > +                   dev_err(&chip->dev, "Unable to read burstcount\n");
> > +                   return burstcnt;
> > +           }
> > +           burstcnt = min_t(int, burstcnt, count - size);
> >  
> >             rc = tpm_tis_read_bytes(priv, TPM_DATA_FIFO(priv->locality),
> >                                     burstcnt, buf + size);
> > @@ -271,7 +276,13 @@ static int tpm_tis_send_data(struct tpm_chip *chip, u8 
> > *buf, size_t len)
> >     }
> >  
> >     while (count < len - 1) {
> > -           burstcnt = min_t(int, get_burstcount(chip), len - count - 1);
> > +           burstcnt = get_burstcount(chip);
> > +           if (burstcnt < 0) {
> > +                   dev_err(&chip->dev, "Unable to read burstcount\n");
> > +                   rc = burstcnt;
> > +                   goto out_err;
> > +           }
> > +           burstcnt = min_t(int, burstcnt, len - count - 1);
> >             rc = tpm_tis_write_bytes(priv, TPM_DATA_FIFO(priv->locality),
> >                                      burstcnt, buf + count);
> >             if (rc < 0)
> > -- 
> > 2.8.0.rc3.226.g39d4020
> > 
> 
> LGTM
> 
> Reviewed-by: Jarkko Sakkinen <jarkko.sakki...@linux.intel.com>

I'm sorry for the delay with testing but I cannot test this during this
week. The network connection is terrible at the Linux Plumbers
Conference and also at the hotel. I can barely read my email and LWN.

/Jarkko

------------------------------------------------------------------------------
Developer Access Program for Intel Xeon Phi Processors
Access to Intel Xeon Phi processor-based developer platforms.
With one year of Intel Parallel Studio XE.
Training and support from Colfax.
Order your platform today. http://sdm.link/xeonphi
_______________________________________________
tpmdd-devel mailing list
tpmdd-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tpmdd-devel

Reply via email to