summaryrefslogtreecommitdiff
path: root/ftp/proftpd/files/patch-8-src-fsio.c
diff options
context:
space:
mode:
Diffstat (limited to 'ftp/proftpd/files/patch-8-src-fsio.c')
-rw-r--r--ftp/proftpd/files/patch-8-src-fsio.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/ftp/proftpd/files/patch-8-src-fsio.c b/ftp/proftpd/files/patch-8-src-fsio.c
new file mode 100644
index 000000000000..3b085be7283c
--- /dev/null
+++ b/ftp/proftpd/files/patch-8-src-fsio.c
@@ -0,0 +1,44 @@
+--- src/fsio.c.orig 2010-04-12 21:00:00.000000000 +0200
++++ src/fsio.c 2011-12-29 21:51:33.844925577 +0100
+@@ -50,6 +50,10 @@
+ # include <acl/libacl.h>
+ #endif
+
++#if defined(__FreeBSD__)
++#include <dlfcn.h>
++#endif
++
+ typedef struct fsopendir fsopendir_t;
+
+ struct fsopendir {
+@@ -284,7 +288,30 @@
+ #endif
+ }
+
++#if defined(__FreeBSD__)
++static int
++enter_freebsd_restricted_mode()
++{
++ typedef void frmode_t();
++ frmode_t *frmode;
++
++ frmode = (frmode_t *)dlfunc(
++ RTLD_NEXT, "__FreeBSD_libc_enter_restricted_mode");
++ if (frmode == NULL) {
++ pr_log_pri(PR_LOG_ERR,
++ "error: FreeBSD with vulnerable chroot (FreeBSD-SA-11:07.chroot)");
++ return 1;
++ }
++ frmode();
++ return 0;
++}
++#endif
++
+ static int sys_chroot(pr_fs_t *fs, const char *path) {
++#if defined(__FreeBSD__)
++ if (enter_freebsd_restricted_mode() != 0)
++ return -1;
++#endif
+ if (chroot(path) < 0)
+ return -1;
+