]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/4.19.31/tpm-unify-the-send-callback-behaviour.patch
Linux 4.19.31
[thirdparty/kernel/stable-queue.git] / releases / 4.19.31 / tpm-unify-the-send-callback-behaviour.patch
1 From f5595f5baa30e009bf54d0d7653a9a0cc465be60 Mon Sep 17 00:00:00 2001
2 From: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
3 Date: Fri, 8 Feb 2019 18:30:58 +0200
4 Subject: tpm: Unify the send callback behaviour
5
6 From: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
7
8 commit f5595f5baa30e009bf54d0d7653a9a0cc465be60 upstream.
9
10 The send() callback should never return length as it does not in every
11 driver except tpm_crb in the success case. The reason is that the main
12 transmit functionality only cares about whether the transmit was
13 successful or not and ignores the count completely.
14
15 Suggested-by: Stefan Berger <stefanb@linux.ibm.com>
16 Cc: stable@vger.kernel.org
17 Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
18 Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
19 Reviewed-by: Jerry Snitselaar <jsnitsel@redhat.com>
20 Tested-by: Alexander Steffen <Alexander.Steffen@infineon.com>
21 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
22
23 ---
24 drivers/char/tpm/st33zp24/st33zp24.c | 2 +-
25 drivers/char/tpm/tpm-interface.c | 11 ++++++++++-
26 drivers/char/tpm/tpm_atmel.c | 2 +-
27 drivers/char/tpm/tpm_i2c_atmel.c | 6 +++++-
28 drivers/char/tpm/tpm_i2c_infineon.c | 2 +-
29 drivers/char/tpm/tpm_i2c_nuvoton.c | 2 +-
30 drivers/char/tpm/tpm_ibmvtpm.c | 8 ++++----
31 drivers/char/tpm/tpm_infineon.c | 2 +-
32 drivers/char/tpm/tpm_nsc.c | 2 +-
33 drivers/char/tpm/tpm_tis_core.c | 2 +-
34 drivers/char/tpm/tpm_vtpm_proxy.c | 3 +--
35 drivers/char/tpm/xen-tpmfront.c | 2 +-
36 12 files changed, 28 insertions(+), 16 deletions(-)
37
38 --- a/drivers/char/tpm/st33zp24/st33zp24.c
39 +++ b/drivers/char/tpm/st33zp24/st33zp24.c
40 @@ -436,7 +436,7 @@ static int st33zp24_send(struct tpm_chip
41 goto out_err;
42 }
43
44 - return len;
45 + return 0;
46 out_err:
47 st33zp24_cancel(chip);
48 release_locality(chip);
49 --- a/drivers/char/tpm/tpm-interface.c
50 +++ b/drivers/char/tpm/tpm-interface.c
51 @@ -495,10 +495,19 @@ static ssize_t tpm_try_transmit(struct t
52 if (rc < 0) {
53 if (rc != -EPIPE)
54 dev_err(&chip->dev,
55 - "%s: tpm_send: error %d\n", __func__, rc);
56 + "%s: send(): error %d\n", __func__, rc);
57 goto out;
58 }
59
60 + /* A sanity check. send() should just return zero on success e.g.
61 + * not the command length.
62 + */
63 + if (rc > 0) {
64 + dev_warn(&chip->dev,
65 + "%s: send(): invalid value %d\n", __func__, rc);
66 + rc = 0;
67 + }
68 +
69 if (chip->flags & TPM_CHIP_FLAG_IRQ)
70 goto out_recv;
71
72 --- a/drivers/char/tpm/tpm_atmel.c
73 +++ b/drivers/char/tpm/tpm_atmel.c
74 @@ -105,7 +105,7 @@ static int tpm_atml_send(struct tpm_chip
75 iowrite8(buf[i], priv->iobase);
76 }
77
78 - return count;
79 + return 0;
80 }
81
82 static void tpm_atml_cancel(struct tpm_chip *chip)
83 --- a/drivers/char/tpm/tpm_i2c_atmel.c
84 +++ b/drivers/char/tpm/tpm_i2c_atmel.c
85 @@ -65,7 +65,11 @@ static int i2c_atmel_send(struct tpm_chi
86 dev_dbg(&chip->dev,
87 "%s(buf=%*ph len=%0zx) -> sts=%d\n", __func__,
88 (int)min_t(size_t, 64, len), buf, len, status);
89 - return status;
90 +
91 + if (status < 0)
92 + return status;
93 +
94 + return 0;
95 }
96
97 static int i2c_atmel_recv(struct tpm_chip *chip, u8 *buf, size_t count)
98 --- a/drivers/char/tpm/tpm_i2c_infineon.c
99 +++ b/drivers/char/tpm/tpm_i2c_infineon.c
100 @@ -587,7 +587,7 @@ static int tpm_tis_i2c_send(struct tpm_c
101 /* go and do it */
102 iic_tpm_write(TPM_STS(tpm_dev.locality), &sts, 1);
103
104 - return len;
105 + return 0;
106 out_err:
107 tpm_tis_i2c_ready(chip);
108 /* The TPM needs some time to clean up here,
109 --- a/drivers/char/tpm/tpm_i2c_nuvoton.c
110 +++ b/drivers/char/tpm/tpm_i2c_nuvoton.c
111 @@ -469,7 +469,7 @@ static int i2c_nuvoton_send(struct tpm_c
112 }
113
114 dev_dbg(dev, "%s() -> %zd\n", __func__, len);
115 - return len;
116 + return 0;
117 }
118
119 static bool i2c_nuvoton_req_canceled(struct tpm_chip *chip, u8 status)
120 --- a/drivers/char/tpm/tpm_ibmvtpm.c
121 +++ b/drivers/char/tpm/tpm_ibmvtpm.c
122 @@ -141,14 +141,14 @@ static int tpm_ibmvtpm_recv(struct tpm_c
123 }
124
125 /**
126 - * tpm_ibmvtpm_send - Send tpm request
127 - *
128 + * tpm_ibmvtpm_send() - Send a TPM command
129 * @chip: tpm chip struct
130 * @buf: buffer contains data to send
131 * @count: size of buffer
132 *
133 * Return:
134 - * Number of bytes sent or < 0 on error.
135 + * 0 on success,
136 + * -errno on error
137 */
138 static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count)
139 {
140 @@ -194,7 +194,7 @@ static int tpm_ibmvtpm_send(struct tpm_c
141 rc = 0;
142 ibmvtpm->tpm_processing_cmd = false;
143 } else
144 - rc = count;
145 + rc = 0;
146
147 spin_unlock(&ibmvtpm->rtce_lock);
148 return rc;
149 --- a/drivers/char/tpm/tpm_infineon.c
150 +++ b/drivers/char/tpm/tpm_infineon.c
151 @@ -354,7 +354,7 @@ static int tpm_inf_send(struct tpm_chip
152 for (i = 0; i < count; i++) {
153 wait_and_send(chip, buf[i]);
154 }
155 - return count;
156 + return 0;
157 }
158
159 static void tpm_inf_cancel(struct tpm_chip *chip)
160 --- a/drivers/char/tpm/tpm_nsc.c
161 +++ b/drivers/char/tpm/tpm_nsc.c
162 @@ -226,7 +226,7 @@ static int tpm_nsc_send(struct tpm_chip
163 }
164 outb(NSC_COMMAND_EOC, priv->base + NSC_COMMAND);
165
166 - return count;
167 + return 0;
168 }
169
170 static void tpm_nsc_cancel(struct tpm_chip *chip)
171 --- a/drivers/char/tpm/tpm_tis_core.c
172 +++ b/drivers/char/tpm/tpm_tis_core.c
173 @@ -485,7 +485,7 @@ static int tpm_tis_send_main(struct tpm_
174 goto out_err;
175 }
176 }
177 - return len;
178 + return 0;
179 out_err:
180 tpm_tis_ready(chip);
181 return rc;
182 --- a/drivers/char/tpm/tpm_vtpm_proxy.c
183 +++ b/drivers/char/tpm/tpm_vtpm_proxy.c
184 @@ -335,7 +335,6 @@ static int vtpm_proxy_is_driver_command(
185 static int vtpm_proxy_tpm_op_send(struct tpm_chip *chip, u8 *buf, size_t count)
186 {
187 struct proxy_dev *proxy_dev = dev_get_drvdata(&chip->dev);
188 - int rc = 0;
189
190 if (count > sizeof(proxy_dev->buffer)) {
191 dev_err(&chip->dev,
192 @@ -366,7 +365,7 @@ static int vtpm_proxy_tpm_op_send(struct
193
194 wake_up_interruptible(&proxy_dev->wq);
195
196 - return rc;
197 + return 0;
198 }
199
200 static void vtpm_proxy_tpm_op_cancel(struct tpm_chip *chip)
201 --- a/drivers/char/tpm/xen-tpmfront.c
202 +++ b/drivers/char/tpm/xen-tpmfront.c
203 @@ -173,7 +173,7 @@ static int vtpm_send(struct tpm_chip *ch
204 return -ETIME;
205 }
206
207 - return count;
208 + return 0;
209 }
210
211 static int vtpm_recv(struct tpm_chip *chip, u8 *buf, size_t count)