I use a similar patch, I added option -h to enable the functionality.

On Sun, May 1, 2022 at 2:17 PM Aleksander Mazur <dewelo...@wp.pl> wrote:
>
> Hi,
>
> AFAIU ftpd just shares current working directory (unless given a path), no 
> matter who logs in.
> I find it useful to let ftpd chroot or cd to the home directory of a 
> (non-root) user who logs in.
> Please consider attached patch. I hope it won't ruin anybody's setup.
>
> --
> Aleksander Mazur
> _______________________________________________
> busybox mailing list
> busybox@busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox
diff -Nru busybox-1.33.1.orig/networking/ftpd.c busybox-1.33.1/networking/ftpd.c
--- busybox-1.33.1.orig/networking/ftpd.c	2021-01-01 02:52:27.000000000 -0800
+++ busybox-1.33.1/networking/ftpd.c	2021-08-23 22:12:23.582753732 -0700
@@ -1164,9 +1164,10 @@
 #endif
 	BIT_A =        (!BB_MMU) * 2,
 	OPT_A = (1 << (BIT_A + 0)),
-	OPT_v = (1 << (BIT_A + 1)),
-	OPT_S = (1 << (BIT_A + 2)),
-	OPT_w = (1 << (BIT_A + 3)) * ENABLE_FEATURE_FTPD_WRITE,
+	OPT_h = (1 << (BIT_A + 1)),
+	OPT_v = (1 << (BIT_A + 2)),
+	OPT_S = (1 << (BIT_A + 3)),
+	OPT_w = (1 << (BIT_A + 4)) * ENABLE_FEATURE_FTPD_WRITE,
 };
 
 int ftpd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
@@ -1186,7 +1187,7 @@
 	verbose_S = 0;
 	G.timeout = 2 * 60;
 #if BB_MMU
-	opts = getopt32(argv, "^"   "AvS" IF_FEATURE_FTPD_WRITE("w")
+	opts = getopt32(argv, "^"   "AhvS" IF_FEATURE_FTPD_WRITE("w")
 		"t:+T:+" IF_FEATURE_FTPD_AUTHENTICATION("a:")
 		"\0" "vv:SS",
 		&G.timeout, &abs_timeout, IF_FEATURE_FTPD_AUTHENTICATION(&anon_opt,)
@@ -1295,7 +1296,7 @@
 	G.root_fd = -1;
 #endif
 	argv += optind;
-	if (argv[0]) {
+	if (argv[0] && (pw == NULL || !(opts & OPT_h))) {
 		const char *basedir = argv[0];
 #if !BB_MMU
 		G.root_fd = xopen("/", O_RDONLY | O_DIRECTORY);
@@ -1319,8 +1320,14 @@
 	}
 
 #if ENABLE_FEATURE_FTPD_AUTHENTICATION
-	if (pw)
+	if (pw) {
+		const char *basedir = pw->pw_dir;
+		if ((opts & OPT_h) && chroot(pw->pw_dir) == 0)
+			basedir = "/";
 		change_identity(pw);
+		if (opts & OPT_h)
+			xchdir(basedir);
+	}
 	/* else: -A is in effect */
 #endif
 
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to