--- /usr/src/libexec/ftpd/ftpd.c.orig	Mon Sep 13 00:55:39 1999
+++ /usr/src/libexec/ftpd/ftpd.c	Mon Sep 13 01:11:18 1999
@@ -1040,6 +1040,31 @@
 			goto bad;
 		}
 	} else if (dochroot) {
+		/*
+		 * The Demon hack chroots to the position marked by the
+		 * characters /./ in the user's home directory.
+		 */
+		char *dot = strstr(pw->pw_dir, "/./");
+		if (dot) {
+			size_t size = dot - pw->pw_dir + 1;
+			/* don't pass "" to chroot() */
+			char *root = malloc(size > 1 ? size : ++size);
+			if (!root) {
+				reply(550, "malloc() failed before chroot.");
+				goto bad;
+			}
+			strlcpy(root, pw->pw_dir, size);
+			/* chdir to path starting at the slash after the dot */
+			if (chroot(root) < 0 || chdir(dot+2) < 0) {
+				reply(550, "Can't change dotted root.");
+				free(root);
+				goto bad;
+			}
+			free(root);
+		} else
+		/*
+		 * End of Demon hack.
+		 */
 		if (chroot(pw->pw_dir) < 0 || chdir("/") < 0) {
 			reply(550, "Can't change root.");
 			goto bad;
