aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2015-03-31 21:46:26 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2015-03-31 21:46:26 +0200
commit9472e8a86fa1837bccec9e25dd18fd3c88c5e209 (patch)
tree77e938c19f0d93d004f35382953ffd9f0432c154
parent379e8e81afed0613271e39e33190c6dfec78b695 (diff)
downloadbusybox-9472e8a86fa1837bccec9e25dd18fd3c88c5e209.tar.gz
ftpd: change_identity() must be after chroot()
Otherwise chroot() doesn't work for non-root Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--networking/ftpd.c41
1 files changed, 21 insertions, 20 deletions
diff --git a/networking/ftpd.c b/networking/ftpd.c
index 0c10e1f25..2351d6dd3 100644
--- a/networking/ftpd.c
+++ b/networking/ftpd.c
@@ -1116,6 +1116,9 @@ int ftpd_main(int argc, char **argv)
int ftpd_main(int argc UNUSED_PARAM, char **argv)
#endif
{
+#if ENABLE_FEATURE_FTP_AUTHENTICATION
+ struct passwd *pw = NULL;
+#endif
unsigned abs_timeout;
unsigned verbose_S;
smallint opts;
@@ -1193,29 +1196,23 @@ int ftpd_main(int argc UNUSED_PARAM, char **argv)
signal(SIGALRM, timeout_handler);
#if ENABLE_FEATURE_FTP_AUTHENTICATION
- {
- struct passwd *pw = NULL;
-
- while (1) {
- uint32_t cmdval = cmdio_get_cmd_and_arg();
-
+ while (1) {
+ uint32_t cmdval = cmdio_get_cmd_and_arg();
if (cmdval == const_USER) {
- pw = getpwnam(G.ftp_arg);
- cmdio_write_raw(STR(FTP_GIVEPWORD)" Please specify password\r\n");
- } else if (cmdval == const_PASS) {
- if (check_password(pw, G.ftp_arg) > 0) {
- break; /* login success */
- }
- cmdio_write_raw(STR(FTP_LOGINERR)" Login failed\r\n");
- pw = NULL;
- } else if (cmdval == const_QUIT) {
- WRITE_OK(FTP_GOODBYE);
- return 0;
- } else {
- cmdio_write_raw(STR(FTP_LOGINERR)" Login with USER and PASS\r\n");
+ pw = getpwnam(G.ftp_arg);
+ cmdio_write_raw(STR(FTP_GIVEPWORD)" Please specify password\r\n");
+ } else if (cmdval == const_PASS) {
+ if (check_password(pw, G.ftp_arg) > 0) {
+ break; /* login success */
}
+ cmdio_write_raw(STR(FTP_LOGINERR)" Login failed\r\n");
+ pw = NULL;
+ } else if (cmdval == const_QUIT) {
+ WRITE_OK(FTP_GOODBYE);
+ return 0;
+ } else {
+ cmdio_write_raw(STR(FTP_LOGINERR)" Login with USER and PASS\r\n");
}
- change_identity(pw);
}
WRITE_OK(FTP_LOGINOK);
#endif
@@ -1233,6 +1230,10 @@ int ftpd_main(int argc UNUSED_PARAM, char **argv)
xchroot(argv[0]);
}
+#if ENABLE_FEATURE_FTP_AUTHENTICATION
+ change_identity(pw);
+#endif
+
/* RFC-959 Section 5.1
* The following commands and options MUST be supported by every
* server-FTP and user-FTP, except in cases where the underlying