summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorEnrico Scholz <enrico.scholz@sigma-chemnitz.de>2022-08-30 09:38:15 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2022-09-12 12:09:45 +0200
commita21b7ddc5a90868eda665c69004c43b37beea6ca (patch)
tree7af465fe5654ffd7eefb044ac0a088ef1efb04f1 /fs
parent32867e6d6e49cc02057476cd4fbeb726ca1ee9e4 (diff)
downloadbarebox-a21b7ddc5a90868eda665c69004c43b37beea6ca.tar.gz
barebox-a21b7ddc5a90868eda665c69004c43b37beea6ca.tar.xz
tftp: accept OACK + DATA datagrams only in certain states
These packets are valid in certain points of the transfer only and accepting them too early or too late can corrupt internal states. Reject them when they are unexpected. Signed-off-by: Enrico Scholz <enrico.scholz@sigma-chemnitz.de> Link: https://lore.barebox.org/20220830073816.2694734-21-enrico.scholz@sigma-chemnitz.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'fs')
-rw-r--r--fs/tftp.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/fs/tftp.c b/fs/tftp.c
index 37180b8675..ada6ad08de 100644
--- a/fs/tftp.c
+++ b/fs/tftp.c
@@ -717,6 +717,12 @@ static void tftp_recv(struct file_priv *priv,
break;
case TFTP_OACK:
+ if (priv->state != STATE_RRQ && priv->state != STATE_WRQ) {
+ pr_warn("OACK packet in %s state\n",
+ tftp_states[priv->state]);
+ break;
+ }
+
priv->tftp_con->udp->uh_dport = uh_sport;
if (tftp_parse_oack(priv, pkt, len) < 0) {
@@ -745,6 +751,12 @@ static void tftp_recv(struct file_priv *priv,
break;
}
+ if (priv->state != STATE_RDATA) {
+ pr_warn("DATA packet in %s state\n",
+ tftp_states[priv->state]);
+ break;
+ }
+
tftp_handle_data(priv, block, pkt + 2, len);
break;