--- ../openssh-3.1p1/session.c Tue Feb 26 00:48:03 2002 +++ session.c Fri Mar 15 14:04:38 2002 @@ -63,6 +63,8 @@ #define is_winnt (GetVersion() < 0x80000000) #endif +#define CHROOT + /* types */ #define TTYSZ 64 @@ -1102,6 +1104,10 @@ static void do_setusercontext(struct passwd *pw) { +#ifdef CHROOT + char *user_dir; + char *new_root; +#endif /* CHROOT */ #ifdef HAVE_CYGWIN if (is_winnt) { #else /* HAVE_CYGWIN */ @@ -1110,6 +1116,25 @@ #ifdef HAVE_GETUSERATTR set_limits_from_userattr(pw->pw_name); #endif /* HAVE_GETUSERATTR */ +#ifdef CHROOT + 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("chroot to %s, new root is %s", user_dir, new_root); + if(chroot(user_dir) != 0) + fatal("Couldn't chroot to user directory %s", user_dir); + + pw->pw_dir = new_root; + break; + } + new_root += 2; + } +#endif /* CHROOT */ #ifdef HAVE_LOGIN_CAP if (setusercontext(lc, pw, pw->pw_uid, (LOGIN_SETALL & ~LOGIN_SETPATH)) < 0) {