Skip to content

Commit

Permalink
safe fix
Browse files Browse the repository at this point in the history
  • Loading branch information
jjolano committed Sep 10, 2013
1 parent 8b37eb9 commit e17649a
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 52 deletions.
53 changes: 23 additions & 30 deletions cmd.cpp
Expand Up @@ -44,13 +44,13 @@ struct ftp_cvars {
map<ftp_client*,ftp_cvars> client_cvar;
map<int,ftp_client*> data_client;

static bool isClientAuthorized(ftp_client* clnt)
bool isClientAuthorized(ftp_client* clnt)
{
map<ftp_client*,ftp_cvars>::iterator it = client_cvar.find(clnt);
return (it != client_cvar.end() ? (it->second).authorized : false);
}

static string getAbsPath(string cwd, string nd)
string getAbsPath(string cwd, string nd)
{
if(nd[0] == '/')
{
Expand All @@ -75,19 +75,19 @@ static string getAbsPath(string cwd, string nd)
return cwd + nd;
}

static bool fileExists(string path)
bool fileExists(string path)
{
sysFSStat stat;
return (sysLv2FsStat(path.c_str(), &stat) == 0);
}

static bool isDirectory(string path)
bool isDirectory(string path)
{
sysFSStat stat;
return (sysLv2FsStat(path.c_str(), &stat) == 0 && S_ISDIR(stat.st_mode));
}

static vector<unsigned short> parsePORT(string args)
vector<unsigned short> parsePORT(string args)
{
vector<unsigned short> vec;
stringstream ss(args);
Expand Down Expand Up @@ -129,11 +129,10 @@ void closedata(ftp_client* clnt)

void data_list(int sock_data)
{
static ftp_client* clnt;
static sysFSDirent entry;
static u64 read;
sysFSDirent entry;
u64 read;

clnt = data_client[sock_data];
ftp_client* clnt = data_client[sock_data];

if(sysLv2FsReadDir(client_cvar[clnt].fd, &entry, &read) == -1)
{
Expand Down Expand Up @@ -163,18 +162,17 @@ void data_list(int sock_data)
}

// obtain file information
static string path;
path = getAbsPath(client_cvar[clnt].cwd, entry.d_name);
string path = getAbsPath(client_cvar[clnt].cwd, entry.d_name);

static sysFSStat stat;
sysFSStat stat;
if(sysLv2FsStat(path.c_str(), &stat) == -1)
{
// skip file that failed to access for whatever reason
return;
}

// prepare data message
static char permissions[11];
char permissions[11];

// file type
if(S_ISDIR(stat.st_mode))
Expand Down Expand Up @@ -203,11 +201,10 @@ void data_list(int sock_data)
permissions[10] = '\0';

// modified
static char tstr[14];
char tstr[14];
strftime(tstr, 13, "%b %e %H:%M", localtime(&stat.st_mtime));

static size_t len;
len = snprintf(client_cvar[clnt].buffer, DATA_BUFFER, "%s %3d %-8d %-8d %10lu %s %s\r\n",
size_t len = snprintf(client_cvar[clnt].buffer, DATA_BUFFER, "%s %3d %-8d %-8d %10lu %s %s\r\n",
permissions, 1, 0, 0, stat.st_size, tstr, entry.d_name);

// send to data socket
Expand All @@ -220,11 +217,10 @@ void data_list(int sock_data)

void data_nlst(int sock_data)
{
static ftp_client* clnt;
static sysFSDirent entry;
static u64 read;
sysFSDirent entry;
u64 read;

clnt = data_client[sock_data];
ftp_client* clnt = data_client[sock_data];

if(sysLv2FsReadDir(client_cvar[clnt].fd, &entry, &read) == -1)
{
Expand All @@ -243,7 +239,7 @@ void data_nlst(int sock_data)
}

// prepare data message
static string data_str;
string data_str;

data_str = entry.d_name;
data_str += '\r';
Expand All @@ -259,16 +255,14 @@ void data_nlst(int sock_data)

void data_stor(int sock_data)
{
static ftp_client* clnt;
static u64 written;
static int read;

clnt = data_client[sock_data];
ftp_client* clnt = data_client[sock_data];

read = recv(clnt->sock_data, client_cvar[clnt].buffer, DATA_BUFFER, 0);
int read = recv(clnt->sock_data, client_cvar[clnt].buffer, DATA_BUFFER, 0);

if(read > 0)
{
u64 written;

// data available, write to disk
if(sysLv2FsWrite(client_cvar[clnt].fd, client_cvar[clnt].buffer, (u64)read, &written) == -1 || written < (u64)read)
{
Expand All @@ -294,10 +288,9 @@ void data_stor(int sock_data)

void data_retr(int sock_data)
{
static ftp_client* clnt;
static u64 read;
u64 read;

clnt = data_client[sock_data];
ftp_client* clnt = data_client[sock_data];

if(sysLv2FsRead(client_cvar[clnt].fd, client_cvar[clnt].buffer, DATA_BUFFER, &read) == -1)
{
Expand Down
48 changes: 27 additions & 21 deletions ftp.cpp
Expand Up @@ -144,6 +144,12 @@ void ftp_client::data_close()
{
// close socket
closesocket(sock_data);

if(datarefs.find(sock_data) != datarefs.end())
{
datarefs.erase(sock_data);
}

sock_data = -1;
}
}
Expand Down Expand Up @@ -199,8 +205,7 @@ void ftpInitialize(void* arg)
{
// apparently libnet's poll is super inefficient, it slows down
// threefold. just gonna use the syscall directly.
static int p;
p = netPoll(&pfd[0], nfds, 250);
int p = netPoll(&pfd[0], nfds, 250);

if(p == -1)
{
Expand All @@ -221,7 +226,7 @@ void ftpInitialize(void* arg)
}

// handle client and data sockets
static u16 i;
u16 i;
for(i = 1; (p > 0 && i < nfds); i++)
{
if(pfd[i].revents == 0)
Expand All @@ -231,22 +236,15 @@ void ftpInitialize(void* arg)

p--;

static int sock_fd;
sock_fd = (pfd[i].fd | SOCKET_FD_MASK);
int sock_fd = (pfd[i].fd | SOCKET_FD_MASK);

// get client info
static ftp_drefs::iterator it;
static ftp_client* clnt;
static bool isData;

it = datarefs.find(sock_fd);
isData = (it != datarefs.end());
clnt = &(client[isData ? it->second : sock_fd]);
ftp_drefs::iterator it = datarefs.find(sock_fd);
bool isData = (it != datarefs.end());
ftp_client* clnt = &(client[isData ? it->second : sock_fd]);

// Disconnect event
if(pfd[i].revents & POLLNVAL
|| pfd[i].revents & POLLHUP
|| pfd[i].revents & POLLERR)
if(pfd[i].revents & (POLLNVAL|POLLHUP|POLLERR))
{
closesocket(sock_fd);

Expand All @@ -260,7 +258,6 @@ void ftpInitialize(void* arg)
{
// data connection
closedata(clnt);
datarefs.erase(sock_fd);
}

pfd.erase(pfd.begin() + i);
Expand All @@ -277,8 +274,6 @@ void ftpInitialize(void* arg)

if(clnt->sock_data == -1)
{
datarefs.erase(sock_fd);

pfd.erase(pfd.begin() + i);
nfds--;
i--;
Expand Down Expand Up @@ -368,13 +363,24 @@ void ftpInitialize(void* arg)
else
{
// Data socket

// check drop
int bytes = recv(sock_fd, data, 1, MSG_PEEK);

if(bytes == 0)
{
closedata(clnt);
pfd.erase(pfd.begin() + i);
nfds--;
i--;
continue;
}

// call data handler
(clnt->data_handler)(sock_fd);

if(clnt->sock_data == -1)
{
datarefs.erase(sock_fd);

pfd.erase(pfd.begin() + i);
nfds--;
i--;
Expand Down Expand Up @@ -416,9 +422,9 @@ void ftpInitialize(void* arg)
}
}

delete [] data;
closesocket(sock_listen);
ftpTerminate(&client);
delete [] data;

datarefs.clear();
client.clear();
Expand Down
2 changes: 1 addition & 1 deletion main.cpp
Expand Up @@ -71,7 +71,7 @@ int main(s32 argc, char* argv[])

// Create thread for server
sys_ppu_thread_t id;
sysThreadCreate(&id, ftpInitialize, GFX, 1500, 0x2000, THREAD_JOINABLE, const_cast<char*>("oftp"));
sysThreadCreate(&id, ftpInitialize, GFX, 1500, 0x4000, THREAD_JOINABLE, const_cast<char*>("oftp"));

// Retrieve detailed connection information (ip address)
net_ctl_info info;
Expand Down

0 comments on commit e17649a

Please sign in to comment.