--- session.c.orig 2007-02-19 12:10:25.000000000 +0100 +++ session.c 2007-03-12 11:05:27.190012257 +0100 @@ -229,6 +229,11 @@ } } +/* CHROOT patch start */ +char *user_dir; +char *new_root; +/* CHROOT patch end */ + void do_authenticated(Authctxt *authctxt) { @@ -1327,6 +1332,27 @@ if (setlogin(pw->pw_name) < 0) error("setlogin failed: %s", strerror(errno)); + /* CHROOT patch start */ + user_dir = xstrdup(pw->pw_dir); + new_root = user_dir + 1; + + while((new_root = strchr(new_root, '.')) != NULL) { + new_root--; + if(strncmp(new_root, "/./", 3) == 0) { + *new_root = '\0'; + new_root += 2; + debug("chrooting to user directory %s", user_dir); + if(chroot(user_dir) != 0) + fatal("Couldn't chroot to user directory %s", user_dir); + pw->pw_dir = new_root; + if (chdir("/") < 0) + fatal("Couldn't cd to / after chroot to user directory %s: %s", + user_dir, strerror(errno)); + break; + } + new_root += 2; + } + /* CHROOT patch end */ if (setgid(pw->pw_gid) < 0) { perror("setgid"); exit(1);