summaryrefslogtreecommitdiffstats
path: root/cpukit/ftpd
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/ftpd')
-rw-r--r--cpukit/ftpd/ftpd.c48
1 files changed, 28 insertions, 20 deletions
diff --git a/cpukit/ftpd/ftpd.c b/cpukit/ftpd/ftpd.c
index 8ffd878d2d..3b77b3bf33 100644
--- a/cpukit/ftpd/ftpd.c
+++ b/cpukit/ftpd/ftpd.c
@@ -1914,39 +1914,49 @@ session(rtems_task_argument arg)
while(1)
{
rtems_event_set set;
+ int rv;
rtems_event_receive(FTPD_RTEMS_EVENT, RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT,
&set);
chroot_made = chroot_made || chroot(ftpd_root) == 0;
- errno = 0;
+ rv = chroot_made ? chdir("/") : -1;
- send_reply(info, 220, FTPD_SERVER_MESSAGE);
+ errno = 0;
- while (1)
+ if (rv == 0)
{
- char buf[FTPD_BUFSIZE];
- char *cmd, *opts, *args;
+ send_reply(info, 220, FTPD_SERVER_MESSAGE);
- if (fgets(buf, FTPD_BUFSIZE, info->ctrl_fp) == NULL)
+ while (1)
{
- syslog(LOG_INFO, "ftpd: Connection aborted.");
- break;
- }
+ char buf[FTPD_BUFSIZE];
+ char *cmd, *opts, *args;
- split_command(buf, &cmd, &opts, &args);
+ if (fgets(buf, FTPD_BUFSIZE, info->ctrl_fp) == NULL)
+ {
+ syslog(LOG_INFO, "ftpd: Connection aborted.");
+ break;
+ }
- if (!strcmp("QUIT", cmd))
- {
- send_reply(info, 221, "Goodbye.");
- break;
- }
- else
- {
- exec_command(info, cmd, args);
+ split_command(buf, &cmd, &opts, &args);
+
+ if (!strcmp("QUIT", cmd))
+ {
+ send_reply(info, 221, "Goodbye.");
+ break;
+ }
+ else
+ {
+ exec_command(info, cmd, args);
+ }
}
}
+ else
+ {
+ send_reply(info, 421, "Service not available, closing control connection.");
+ }
/* Close connection and put ourselves back into the task pool. */
close_data_socket(info);
@@ -1954,8 +1964,6 @@ session(rtems_task_argument arg)
free(info->user);
free(info->pass);
task_pool_release(info);
-
- chdir("/");
}
}