diff options
author | Enrico Scholz <enrico.scholz@sigma-chemnitz.de> | 2022-09-05 10:56:58 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2022-09-13 13:05:09 +0200 |
commit | fc0afbfc7d1a49078563cc0588f342a9b7ea587c (patch) | |
tree | e8863b356220ebc224916e283a6912ab55f28573 | |
parent | 84c2f0cd45a6dff23845a6cf2a5a6798d792eec7 (diff) | |
download | barebox-fc0afbfc7d1a49078563cc0588f342a9b7ea587c.tar.gz barebox-fc0afbfc7d1a49078563cc0588f342a9b7ea587c.tar.xz |
tftp: make read() fail in error case
when tftp transfer goes in error state e.g. due to error packets sent
from the server or (unexpected) internal problems, let the read() fail
instead of ignoring these errors silently and corrupting the output.
Signed-off-by: Enrico Scholz <enrico.scholz@sigma-chemnitz.de>
Tested-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
Link: https://lore.barebox.org/20220905085658.3854939-4-enrico.scholz@sigma-chemnitz.de
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | fs/tftp.c | 14 |
1 files changed, 10 insertions, 4 deletions
@@ -1017,7 +1017,7 @@ static int tftp_read(struct device_d *dev, FILE *f, void *buf, size_t insize) { struct file_priv *priv = f->priv; size_t outsize = 0, now; - int ret; + int ret = 0; pr_vdebug("%s %zu\n", __func__, insize); @@ -1026,8 +1026,11 @@ static int tftp_read(struct device_d *dev, FILE *f, void *buf, size_t insize) outsize += now; buf += now; insize -= now; - if (priv->state == STATE_DONE) - return outsize; + + if (priv->state == STATE_DONE) { + ret = priv->err; + break; + } /* send the ACK only when fifo has been nearly depleted; else, when tftp_read() is called with small 'insize' values, it @@ -1041,9 +1044,12 @@ static int tftp_read(struct device_d *dev, FILE *f, void *buf, size_t insize) if (ret == TFTP_ERR_RESEND) tftp_send(priv); if (ret < 0) - return ret; + break; } + if (ret < 0) + return ret; + return outsize; } |