diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2011-04-04 17:08:59 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2011-04-04 17:08:59 +0000 |
commit | 425927e16d079c5783054a93fb08d66adeae5143 (patch) | |
tree | c69c21cf6bb073ee1298daa1c60a9396b6515bfb | |
parent | 2011-04-04 Joel Sherrill <joel.sherrilL@OARcorp.com> (diff) | |
download | rtems-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/ChangeLog | 6 | ||||
-rw-r--r-- | cpukit/ftpd/ftpd.c | 39 |
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)) |