summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEnrico Scholz <enrico.scholz@sigma-chemnitz.de>2022-08-30 09:38:10 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2022-09-12 12:08:07 +0200
commitb878b167cba028d7ab264d100a6c2c4bf3a460f3 (patch)
tree0f90aeaa96acee0f11dd338532c1da911770aabd
parent9e21f4a6184f020dbc89fd0613f57e8519365454 (diff)
downloadbarebox-b878b167cba028d7ab264d100a6c2c4bf3a460f3.tar.gz
barebox-b878b167cba028d7ab264d100a6c2c4bf3a460f3.tar.xz
tftp: detect out-of-memory situations
it should never happen due to the program logic; but detect a failed kfifo_put() just in case... Signed-off-by: Enrico Scholz <enrico.scholz@sigma-chemnitz.de> Link: https://lore.barebox.org/20220830073816.2694734-16-enrico.scholz@sigma-chemnitz.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--fs/tftp.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/fs/tftp.c b/fs/tftp.c
index 5b0dcb2b75..cabe923329 100644
--- a/fs/tftp.c
+++ b/fs/tftp.c
@@ -301,6 +301,8 @@ err:
static void tftp_put_data(struct file_priv *priv, uint16_t block,
void const *pkt, size_t len)
{
+ unsigned int sz;
+
if (len > priv->blocksize) {
pr_warn("tftp: oversized packet (%zu > %d) received\n",
len, priv->blocksize);
@@ -309,9 +311,14 @@ static void tftp_put_data(struct file_priv *priv, uint16_t block,
priv->last_block = block;
- kfifo_put(priv->fifo, pkt, len);
+ sz = kfifo_put(priv->fifo, pkt, len);
- if (len < priv->blocksize) {
+ if (sz != len) {
+ pr_err("tftp: not enough room in kfifo (only %u out of %zu written)\n",
+ sz, len);
+ priv->err = -ENOMEM;
+ priv->state = STATE_DONE;
+ } else if (len < priv->blocksize) {
tftp_send(priv);
priv->err = 0;
priv->state = STATE_DONE;