From f2b7c3c6bc47ba547863a66d558dae7b9ed0ce63 Mon Sep 17 00:00:00 2001 From: TJ Saunders Date: Sun, 13 Jan 2013 16:43:07 -0800 Subject: [PATCH] Add use of the new pr_fsio_set_use_mkdtemp() API, to work around issues seen with mod_vroot due to the fix for Bug#3841. --- mod_vroot.c | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git mod_vroot/mod_vroot.c mod_vroot/mod_vroot.c index e31f11d..2fba410 100644 --- contrib/mod_vroot.c +++ contrib/mod_vroot.c @@ -53,6 +53,8 @@ static pool *vroot_dir_pool = NULL; static pr_table_t *vroot_dirtab = NULL; +static int vroot_use_mkdtemp = FALSE; + static unsigned int vroot_opts = 0; #define VROOT_OPT_ALLOW_SYMLINKS 0x0001 @@ -777,6 +779,28 @@ return res; } +static int vroot_lchown(pr_fs_t *fs, const char *path, uid_t uid, gid_t gid) { + int res; + char vpath[PR_TUNABLE_PATH_MAX + 1]; + + if (session.curr_phase == LOG_CMD || + session.curr_phase == LOG_CMD_ERR || + (session.sf_flags & SF_ABORT) || + *vroot_base == '\0') { + /* NOTE: once stackable FS modules are supported, have this fall through + * to the next module in the stack. + */ + res = lchown(path, uid, gid); + return res; + } + + if (vroot_lookup_path(NULL, vpath, sizeof(vpath)-1, path, 0, NULL) < 0) + return -1; + + res = lchown(vpath, uid, gid); + return res; +} + static int vroot_chroot(pr_fs_t *fs, const char *path) { char *chroot_path = "/", *tmp = NULL; config_rec *c; @@ -1390,6 +1414,26 @@ /* Command handlers */ +MODRET vroot_pre_mkd(cmd_rec *cmd) { + if (vroot_engine == FALSE || + session.chroot_path == NULL) { + return PR_DECLINED(cmd); + } + + vroot_use_mkdtemp = pr_fsio_set_use_mkdtemp(FALSE); + return PR_DECLINED(cmd); +} + +MODRET vroot_post_mkd(cmd_rec *cmd) { + if (vroot_engine == FALSE || + session.chroot_path == NULL) { + return PR_DECLINED(cmd); + } + + pr_fsio_set_use_mkdtemp(vroot_use_mkdtemp); + return PR_DECLINED(cmd); +} + MODRET vroot_pre_pass(cmd_rec *cmd) { pr_fs_t *fs = NULL; unsigned char *use_vroot = NULL; @@ -1433,6 +1477,7 @@ fs->truncate = vroot_truncate; fs->chmod = vroot_chmod; fs->chown = vroot_chown; + fs->lchown = vroot_lchown; fs->chdir = vroot_chdir; fs->chroot = vroot_chroot; fs->opendir = vroot_opendir; @@ -1564,6 +1609,12 @@ { PRE_CMD, C_PASS, G_NONE, vroot_pre_pass, FALSE, FALSE }, { POST_CMD, C_PASS, G_NONE, vroot_post_pass, FALSE, FALSE }, { POST_CMD_ERR, C_PASS, G_NONE, vroot_post_pass_err, FALSE, FALSE }, + { PRE_CMD, C_MKD, G_NONE, vroot_pre_mkd, FALSE, FALSE }, + { POST_CMD, C_MKD, G_NONE, vroot_post_mkd, FALSE, FALSE }, + { POST_CMD_ERR, C_MKD, G_NONE, vroot_post_mkd, FALSE, FALSE }, + { PRE_CMD, C_XMKD, G_NONE, vroot_pre_mkd, FALSE, FALSE }, + { POST_CMD, C_XMKD, G_NONE, vroot_post_mkd, FALSE, FALSE }, + { POST_CMD_ERR, C_XMKD, G_NONE, vroot_post_mkd, FALSE, FALSE }, { 0, NULL } };