commit:     5941cbcb27255f6a84c64ed504221cad3b1bad1c
Author:     Lars Wendler <polynomial-c <AT> gentoo <DOT> org>
AuthorDate: Mon Feb 29 16:08:08 2016 +0000
Commit:     Lars Wendler <polynomial-c <AT> gentoo <DOT> org>
CommitDate: Tue Mar  1 07:54:20 2016 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=5941cbcb

net-dialup/mingetty: Fixed usage of unsafe chroot call (bug #339338).

Package-Manager: portage-2.2.27
Signed-off-by: Lars Wendler <polynomial-c <AT> gentoo.org>

 .../mingetty-1.08-check_chroot_chdir_nice.patch    | 36 ++++++++++++++++++++++
 net-dialup/mingetty/mingetty-1.08-r1.ebuild        | 34 ++++++++++++++++++++
 2 files changed, 70 insertions(+)

diff --git 
a/net-dialup/mingetty/files/mingetty-1.08-check_chroot_chdir_nice.patch 
b/net-dialup/mingetty/files/mingetty-1.08-check_chroot_chdir_nice.patch
new file mode 100644
index 0000000..4c5d2b2
--- /dev/null
+++ b/net-dialup/mingetty/files/mingetty-1.08-check_chroot_chdir_nice.patch
@@ -0,0 +1,36 @@
+Check chdir() on chroot() syscalls (and similar) as chroot without proper
+chdir() allows to escape from changed root.
+
+http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=597382
+http://sourceforge.net/tracker/?func=detail&aid=3095679&group_id=80387&atid=559616
+
+--- mingetty-1.08/mingetty.c
++++ mingetty-1.08/mingetty.c
+@@ -422,12 +422,21 @@
+               while ((logname = get_logname ()) == 0)
+                       /* do nothing */ ;
+ 
+-      if (ch_root)
+-              chroot (ch_root);
+-      if (ch_dir)
+-              chdir (ch_dir);
+-      if (priority)
+-              nice (priority);
++      if (ch_root) {
++              if (chroot (ch_root))
++                      error ("chroot(\"%s\") failed: %s", ch_root, strerror 
(errno));
++              if (chdir("/"))
++                      error ("chdir(\"/\") failed: %s", strerror (errno));
++      }
++      if (ch_dir) {
++              if (chdir (ch_dir))
++                      error ("chdir(\"%s\") failed: %s", ch_dir, strerror 
(errno));
++      }
++      if (priority) {
++              errno = 0; /* see the nice(2) NOTES for why we do this */
++              if ((nice (priority) == -1) && (errno != 0))
++                      error ("nice(%d) failed: %s", priority, strerror 
(errno));
++      }
+ 
+       execl (loginprog, loginprog, autologin? "-f" : "--", logname, NULL);
+       error ("%s: can't exec %s: %s", tty, loginprog, strerror (errno));

diff --git a/net-dialup/mingetty/mingetty-1.08-r1.ebuild 
b/net-dialup/mingetty/mingetty-1.08-r1.ebuild
new file mode 100644
index 0000000..171a299
--- /dev/null
+++ b/net-dialup/mingetty/mingetty-1.08-r1.ebuild
@@ -0,0 +1,34 @@
+# Copyright 1999-2016 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI=6
+
+inherit toolchain-funcs eutils
+
+DESCRIPTION="A compact getty program for virtual consoles only"
+HOMEPAGE="http://sourceforge.net/projects/mingetty";
+SRC_URI="mirror://sourceforge/${PN}/${P}.tar.gz"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sparc ~x86"
+IUSE="unicode"
+
+PATCHES=(
+       "${FILESDIR}/${PN}-1.08-check_chroot_chdir_nice.patch"
+)
+
+src_prepare() {
+       use unicode && eapply "${FILESDIR}"/${PN}-1.08-utf8.patch
+       default
+}
+
+src_compile() {
+       emake CFLAGS="${CFLAGS} -Wall -W -pipe -D_GNU_SOURCE" CC="$(tc-getCC)"
+}
+
+src_install () {
+       dodir /sbin /usr/share/man/man8
+       emake DESTDIR="${D}" install
+}

Reply via email to