sys-fs/e4rat: fix memory corruption

It is unsafe to use Config::get<T>(arg)c_str() pointer
directly, since it may be overwritten by later get calls.

Package-Manager: Portage-2.3.3, Repoman-2.3.1
Signed-off-by: Andrew Savchenko <bircoph@gentoo.org>
This commit is contained in:
Andrew Savchenko
2017-02-12 03:05:33 +03:00
parent adb1ff04a2
commit 01bb8c3247
2 changed files with 105 additions and 0 deletions

View File

@@ -0,0 +1,64 @@
# Copyright 1999-2017 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$
EAPI=6
inherit cmake-utils linux-info readme.gentoo-r1
DESCRIPTION="Toolset to accelerate the boot process and application startup"
HOMEPAGE="http://e4rat.sourceforge.net/"
#SRC_URI="mirror://sourceforge/${PN}/${P/-/_}_src.tar.gz"
SRC_URI="https://dev.gentoo.org/~pacho/${PN}/${PN}-0.2.4_pre20141201.tar.xz"
LICENSE="GPL-3"
SLOT="0"
KEYWORDS="~amd64 ~x86"
IUSE=""
RDEPEND="
dev-lang/perl:=
>=dev-libs/boost-1.42:=
sys-fs/e2fsprogs
sys-process/audit[static-libs(+)]
sys-process/lsof
"
DEPEND="${DEPEND}"
CONFIG_CHECK="~AUDITSYSCALL"
PATCHES=(
"${FILESDIR}"/${PN}-0.2.2-shared-build.patch
"${FILESDIR}"/${PN}-0.2.2-libdir.patch
"${FILESDIR}"/${PN}-0.2.4-sysmacros.patch #580534
"${FILESDIR}"/${PN}-0.2.4-gcc6.patch #594046
"${FILESDIR}"/${PN}-0.2.4-strdup.patch
)
pkg_setup() {
check_extra_config
DOC_CONTENTS="
To launch systemd from e4rat you simply need to edit /etc/e4rat.conf
and set:\n
; path to init process binary (DEFAULT: /sbin/init)\n
init /usr/lib/systemd/systemd"
}
src_install() {
cmake-utils_src_install
# relocate binaries to /sbin. If someone knows of a better way to do it
# please do tell me
dodir sbin
find "${D}"/usr/sbin -type f -exec mv {} "${D}"/sbin/. \; \
|| die
readme.gentoo_create_doc
}
pkg_postinst() {
readme.gentoo_print_elog
if has_version sys-apps/preload; then
elog "It appears you have sys-apps/preload installed. This may"
elog "has negative effects on ${PN}. You may want to disable preload"
elog "when using ${PN}."
fi
}

View File

@@ -0,0 +1,41 @@
--- e4rat-0.2.4_pre20141201/src/e4rat-collect.cc.orig 2014-11-24 12:12:12.000000000 +0300
+++ e4rat-0.2.4_pre20141201/src/e4rat-collect.cc 2017-02-12 02:16:25.151757182 +0300
@@ -32,6 +32,7 @@
#include <fcntl.h>
#include <fstream>
#include <signal.h>
+#include <cstring>
/* EXT2_SUPER_MAGIC */
#include <ext2fs/ext2_fs.h>
@@ -361,7 +362,9 @@
{
create_pid_late = true;
- outPath = Config::get<std::string>("startup_log_file").c_str();
+ // It is unsafe to use Config::get<T>(arg)c_str() pointer
+ // directly, since it may be overwritten by later get calls.
+ outPath = strdup(Config::get<std::string>("startup_log_file").c_str());
verbose = 0;
}
else
--- e4rat-0.2.4_pre20141201/src/e4rat-preload.cc.orig 2014-11-24 12:12:12.000000000 +0300
+++ e4rat-0.2.4_pre20141201/src/e4rat-preload.cc 2017-02-12 02:16:38.425552630 +0300
@@ -25,6 +25,7 @@
#include <iostream>
#include <fstream>
+#include <cstring>
#include <sys/types.h>
#include <sys/stat.h>
@@ -227,7 +228,8 @@
try {
if(getpid() == 1)
{
- const char* logfile = Config::get<std::string>("startup_log_file").c_str();
+ // pointer may change, string must be copied
+ const char* logfile = strdup(Config::get<std::string>("startup_log_file").c_str());
notice("Open %s ... ", logfile);
FILE* infile = fopen(logfile, "r");
if(!infile)