fs: tftp: Fix writing files to tftp
Copying files to tftp is broken since:
| commit d4f5bb1e01
| Author: Sascha Hauer <s.hauer@pengutronix.de>
| Date: Sat Sep 28 13:12:50 2013 +0200
|
| copy_file: Add missing O_TRUNC
|
| Without it, when copying a smaller file over a larger file the
| resulting file still has the remaining space from the larger file.
|
| Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Since this commit copy_file passes O_TRUNC to open(). This results in the
fs layer calling fsdrv->truncate. tftp returns -ENOSYS here and open returns
with an error. To fix this return 0 for the truncate callback in tftp. Also
enforce the O_TRUNC flag when opening a file for writing on tftp as the files
are always truncated on tftp anyway.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Reported-by: andreas.willig@rafi.de
This commit is contained in:
parent
3df00bd62d
commit
0b1d85af18
10
fs/tftp.c
10
fs/tftp.c
|
@ -110,7 +110,7 @@ static int tftp_rmdir(struct device_d *dev, const char *pathname)
|
||||||
|
|
||||||
static int tftp_truncate(struct device_d *dev, FILE *f, ulong size)
|
static int tftp_truncate(struct device_d *dev, FILE *f, ulong size)
|
||||||
{
|
{
|
||||||
return -ENOSYS;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tftp_send(struct file_priv *priv)
|
static int tftp_send(struct file_priv *priv)
|
||||||
|
@ -393,6 +393,14 @@ static struct file_priv *tftp_do_open(struct device_d *dev,
|
||||||
case O_WRONLY:
|
case O_WRONLY:
|
||||||
priv->push = 1;
|
priv->push = 1;
|
||||||
priv->state = STATE_WRQ;
|
priv->state = STATE_WRQ;
|
||||||
|
if (!(accmode & O_TRUNC)) {
|
||||||
|
/*
|
||||||
|
* TFTP always truncates the existing file, so this
|
||||||
|
* flag is mandatory when opening a file for writing.
|
||||||
|
*/
|
||||||
|
ret = -ENOSYS;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case O_RDWR:
|
case O_RDWR:
|
||||||
ret = -ENOSYS;
|
ret = -ENOSYS;
|
||||||
|
|
Loading…
Reference in New Issue