Skip to content

Commit

Permalink
Fix FTP/550 (ENODEV) for clients using "LIST -a"
Browse files Browse the repository at this point in the history
The test for additional switches to the LIST command
must be performed before the path is joined. Otherwise,
the path will never be empty and the test will be skipped.
Fixes ENODEV error (FTP/550) on clients using "LIST -a".
  • Loading branch information
eku authored and Maschell committed Nov 23, 2024
1 parent f03f310 commit 7c24b96
Showing 1 changed file with 17 additions and 19 deletions.
36 changes: 17 additions & 19 deletions source/ftpSession.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,6 @@
#include <cerrno>
#include <chrono>
#include <cinttypes>
#ifdef __WIIU__
#include <coreinit/filesystem_fsa.h>
#endif
#include <cstdarg>
#include <cstring>
#include <ctime>
Expand Down Expand Up @@ -1432,21 +1429,28 @@ void FtpSession::xferDir (char const *const args_, XferDirMode const mode_, bool

if (std::strlen (args_) > 0)
{
// work around broken clients that think LIST -a/-l is valid
auto const needWorkaround = workaround_ && args_[0] == '-' &&
(args_[1] == 'a' || args_[1] == 'l') &&
(args_[2] == '\0' || args_[2] == ' ');

// an argument was provided
auto const path = buildResolvedPath (m_cwd, args_);
if (path.empty ())

// work around broken clients that think LIST -a/-l is valid
if (workaround_)
{
if (needWorkaround)
if (args_[0] == '-' && (args_[1] == 'a' || args_[1] == 'l'))
{
xferDir (args_ + 2 + (args_[2] == ' '), mode_, false);
return;
char const *args = &args_[2];
if (*args == '\0' || *args == ' ')
{
if (*args == ' ')
++args;

xferDir (args, mode_, false);
return;
}
}
}

auto const path = buildResolvedPath (m_cwd, args_);
if (path.empty ())
{
sendResponse ("550 %s\r\n", std::strerror (errno));
setState (State::COMMAND, true, true);
return;
Expand All @@ -1455,12 +1459,6 @@ void FtpSession::xferDir (char const *const args_, XferDirMode const mode_, bool
stat_t st;
if (tzStat (path.c_str (), &st) != 0)
{
if (needWorkaround)
{
xferDir (args_ + 2 + (args_[2] == ' '), mode_, false);
return;
}

sendResponse ("550 %s\r\n", std::strerror (errno));
setState (State::COMMAND, true, true);
return;
Expand Down

0 comments on commit 7c24b96

Please sign in to comment.