summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2011-04-04 17:08:59 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2011-04-04 17:08:59 +0000
commit425927e16d079c5783054a93fb08d66adeae5143 (patch)
treec69c21cf6bb073ee1298daa1c60a9396b6515bfb
parent2011-04-04 Joel Sherrill <joel.sherrilL@OARcorp.com> (diff)
downloadrtems-425927e16d079c5783054a93fb08d66adeae5143.tar.bz2
2011-04-04 Sebastien Bourdeauducq <sebastien.bourdeauducq@gmail.com>
PR 1722/networking * ftpd/ftpd.c: FTPD fails to parse correctly FTP commands relating to filenames with spaces in them.
-rw-r--r--cpukit/ChangeLog6
-rw-r--r--cpukit/ftpd/ftpd.c39
2 files changed, 27 insertions, 18 deletions
diff --git a/cpukit/ChangeLog b/cpukit/ChangeLog
index a5c3aa70d2..1fe61a91cb 100644
--- a/cpukit/ChangeLog
+++ b/cpukit/ChangeLog
@@ -1,3 +1,9 @@
+2011-04-04 Sebastien Bourdeauducq <sebastien.bourdeauducq@gmail.com>
+
+ PR 1722/networking
+ * ftpd/ftpd.c: FTPD fails to parse correctly FTP commands relating to
+ filenames with spaces in them.
+
2011-03-08 Joel Sherrill <joel.sherrilL@OARcorp.com>
PR 1759/cpukit
diff --git a/cpukit/ftpd/ftpd.c b/cpukit/ftpd/ftpd.c
index da7ae848be..0da5a5bdbf 100644
--- a/cpukit/ftpd/ftpd.c
+++ b/cpukit/ftpd/ftpd.c
@@ -15,6 +15,10 @@
*
* Changes:
*
+ * 2010-12-02 Sebastien Bourdeauducq <sebastien@milkymist.org>
+ *
+ * * Support spaces in filenames
+ *
* 2001-01-31 Sergei Organov <osv@javad.ru>
*
* * Hacks with current dir and root dir removed in favor of new libio
@@ -1671,27 +1675,27 @@ exec_command(FTPD_SessionInfo_t *info, char* cmd, char* args)
}
else if (!strcmp("RETR", cmd))
{
- sscanf(args, "%254s", fname);
+ strncpy(fname, args, 254);
command_retrieve(info, fname);
}
else if (!strcmp("STOR", cmd))
{
- sscanf(args, "%254s", fname);
+ strncpy(fname, args, 254);
command_store(info, fname);
}
else if (!strcmp("LIST", cmd))
{
- sscanf(args, "%254s", fname);
+ strncpy(fname, args, 254);
command_list(info, fname, 1);
}
else if (!strcmp("NLST", cmd))
{
- sscanf(args, "%254s", fname);
+ strncpy(fname, args, 254);
command_list(info, fname, 0);
}
else if (!strcmp("MDTM", cmd))
{
- sscanf(args, "%254s", fname);
+ strncpy(fname, args, 254);
command_mdtm(info, fname);
}
else if (!strcmp("SYST", cmd))
@@ -1727,7 +1731,7 @@ exec_command(FTPD_SessionInfo_t *info, char* cmd, char* args)
send_reply(info, 550, "Access denied.");
}
else if (
- 1 == sscanf(args, "%254s", fname) &&
+ strncpy(fname, args, 254) &&
unlink(fname) == 0)
{
send_reply(info, 257, "DELE successful.");
@@ -1749,15 +1753,14 @@ exec_command(FTPD_SessionInfo_t *info, char* cmd, char* args)
{
send_reply(info, 550, "Access denied.");
}
- else if(
- 2 == sscanf(args, "%o %254s", &mask, fname) &&
- chmod(fname, (mode_t)mask) == 0)
- {
- send_reply(info, 257, "CHMOD successful.");
- }
- else
- {
- send_reply(info, 550, "CHMOD failed.");
+ else {
+ char *c;
+ c = strchr(args, ' ');
+ if((c != NULL) && (sscanf(args, "%o", &mask) == 1) && strncpy(fname, c+1, 254)
+ && (chmod(fname, (mode_t)mask) == 0))
+ send_reply(info, 257, "CHMOD successful.");
+ else
+ send_reply(info, 550, "CHMOD failed.");
}
}
else
@@ -1770,7 +1773,7 @@ exec_command(FTPD_SessionInfo_t *info, char* cmd, char* args)
send_reply(info, 550, "Access denied.");
}
else if (
- 1 == sscanf(args, "%254s", fname) &&
+ strncpy(fname, args, 254) &&
rmdir(fname) == 0)
{
send_reply(info, 257, "RMD successful.");
@@ -1787,7 +1790,7 @@ exec_command(FTPD_SessionInfo_t *info, char* cmd, char* args)
send_reply(info, 550, "Access denied.");
}
else if (
- 1 == sscanf(args, "%254s", fname) &&
+ strncpy(fname, args, 254) &&
mkdir(fname, S_IRWXU | S_IRWXG | S_IRWXO) == 0)
{
send_reply(info, 257, "MKD successful.");
@@ -1799,7 +1802,7 @@ exec_command(FTPD_SessionInfo_t *info, char* cmd, char* args)
}
else if (!strcmp("CWD", cmd))
{
- sscanf(args, "%254s", fname);
+ strncpy(fname, args, 254);
command_cwd(info, fname);
}
else if (!strcmp("CDUP", cmd))