public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] repo/proj/guru:dev commit in: games-engines/easyrpg-player/, games-engines/easyrpg-player/files/, profiles/
@ 2023-09-26 12:52 Lucio Sauer
  0 siblings, 0 replies; only message in thread
From: Lucio Sauer @ 2023-09-26 12:52 UTC (permalink / raw
  To: gentoo-commits

commit:     0b20fe31ea2dfd92f1164aed4be4308a65d8fd9f
Author:     Lucio Sauer <watermanpaint <AT> posteo <DOT> net>
AuthorDate: Tue Sep 26 12:48:32 2023 +0000
Commit:     Lucio Sauer <watermanpaint <AT> posteo <DOT> net>
CommitDate: Tue Sep 26 12:51:14 2023 +0000
URL:        https://gitweb.gentoo.org/repo/proj/guru.git/commit/?id=0b20fe31

games-engines/easyrpg-player: backport use-after-free fix

Subsequently, unmask fluidsynth USE flag.

Signed-off-by: Lucio Sauer <watermanpaint <AT> posteo.net>

 .../easyrpg-player/easyrpg-player-0.8-r1.ebuild    | 193 +++++++++++++++++++++
 ...er-0.8-backport-use-after-free-fluidsynth.patch | 180 +++++++++++++++++++
 profiles/package.use.mask                          |   4 -
 3 files changed, 373 insertions(+), 4 deletions(-)

diff --git a/games-engines/easyrpg-player/easyrpg-player-0.8-r1.ebuild b/games-engines/easyrpg-player/easyrpg-player-0.8-r1.ebuild
new file mode 100644
index 0000000000..00866eabac
--- /dev/null
+++ b/games-engines/easyrpg-player/easyrpg-player-0.8-r1.ebuild
@@ -0,0 +1,193 @@
+# Copyright 2023 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+inherit cmake readme.gentoo-r1 xdg
+
+DESCRIPTION="RPG Maker 2000/2003 and EasyRPG games interpreter"
+HOMEPAGE="https://easyrpg.org/player/
+	https://github.com/EasyRPG/Player"
+SRC_URI="https://easyrpg.org/downloads/player/${PV}/${P}.tar.xz"
+
+# EasyRPG Player itself is GPLv3+.
+# The program's logos are CC-BY-SA 4.0.
+# --
+# The program bundles several 3rd-party libraries.
+#
+# FMMidi files - licensed under the 3-clause BSD license.
+# Since the files do not end up in the executable due to the configuration,
+# we ignore it.
+# - src/midisequencer.cpp
+# - src/midisequencer.h
+# - src/midisynth.cpp
+# - src/midisynth.h
+#
+# dr_wav files - licensed under (public-domain or MIT-0):
+# - src/external/dr_wav.h
+# rang files - licensed under the Unlicense:
+# - src/external/rang.hpp
+# Note that both dr_wav and rang are un-bundled and replaced with versions
+# provided by Gentoo packages. However, since these are header-only libraries,
+# their licenses are still included in the LICENSE variable.
+#
+# PicoJSON is used only for Emscripten builds (and unbundled before build).
+# --
+# The program also uses a couple of 3rd-party fonts. Since these are not
+# loaded at runtime, but rather baked into the executable at compile time,
+# their licenses are also added to the License tag.
+#
+# Baekmuk files - licensed under the Baekmuk license:
+# - resources/shinonome/korean/
+#
+# Shinonome files - released into the public domain:
+# - resources/shinonome/
+#
+# ttyp0 files - licensed under the ttyp0 license,
+# a variant of the MIT license:
+# - resources/ttyp0/
+#
+# WenQuanYi files - licensed under
+# GPLv2-or-later with Font Embedding Exception:
+# - resources/wenquanyi/
+#
+#
+# The upstream tarball contains also "Teenyicons", under the MIT license,
+# but those are used only for Emscripten builds.
+
+LICENSE="BAEKMUK CC-BY-4.0 GPL-2+-with-font-exception GPL-3+ public-domain
+	TTYP0 Unlicense || ( MIT-0 public-domain )"
+SLOT="0"
+
+KEYWORDS="~amd64"
+
+IUSE="doc fluidsynth harfbuzz +sound truetype +wildmidi"
+REQUIRED_USE="
+	fluidsynth? ( sound )
+	harfbuzz? ( truetype )
+	wildmidi? ( sound )
+"
+
+PATCHES=(
+	"${FILESDIR}"/${P}-backport-unbundle-dr_wav.patch
+	"${FILESDIR}"/${P}-backport-unbundle-rang.patch
+	"${FILESDIR}"/${P}-backport-update-for-fmt10.patch
+	"${FILESDIR}"/${P}-backport-use-after-free-fluidsynth.patch
+	"${FILESDIR}"/${P}-unbundle-picojson.patch
+)
+
+DEPEND="
+	dev-cpp/rang
+	>=dev-games/liblcf-${PV}
+	dev-libs/libfmt:=
+	media-libs/libpng:=
+	>=media-libs/libsdl2-2.0.5[joystick,sound?,video]
+	sys-libs/zlib
+	x11-libs/pixman
+	harfbuzz? ( media-libs/harfbuzz:=[truetype] )
+	truetype? ( media-libs/freetype:= )
+	sound? (
+			 media-libs/dr_wav
+			 media-libs/libsndfile
+			 media-libs/libvorbis
+			 media-libs/opusfile
+			 media-libs/speexdsp
+			 media-sound/mpg123
+			 media-libs/libxmp
+			 fluidsynth? ( media-sound/fluidsynth )
+			 wildmidi? ( media-sound/wildmidi )
+			 !fluidsynth? ( !wildmidi? ( media-libs/alsa-lib ) )
+		   )
+"
+RDEPEND="${DEPEND}
+	fluidsynth? ( media-sound/fluid-soundfont )
+"
+BDEPEND="virtual/pkgconfig
+	doc? (
+		   app-doc/doxygen
+		   media-gfx/graphviz[svg]
+		 )
+"
+
+DOC_CONTENTS="
+EasyRPG Player chooses its library for MIDI output in increasing order:
+1. FluidSynth
+2. WildMIDI
+3. ALSA
+
+With all three enabled, it first tries to send MIDI messages to FluidSynth. If
+that fails it falls back to WildMIDI then to ALSA. Currently, the capability to
+find and configure a suitable MIDI client through ALSA is limited. It is
+recommended to enable one of the other backends, otherwise you are likely to
+have no sound.
+This package enables support for the ALSA backend only if the other two are
+disabled.
+
+For the requirements for suitable ALSA MIDI clients please reference the source
+code at src/platform/linux/midiout_device_alsa.cpp
+"
+
+src_prepare() {
+	# Install prebuilt manpage instead of rebuilding it conditionally.
+	sed -i -e "s/if(ASCIIDOCTOR_EXECUTABLE)/if(FALSE)/" \
+		-e "s/SUPPORT_AUDIO=1/SUPPORT_AUDIO=$(usex sound 1 0)/" CMakeLists.txt || die
+	cmake_src_prepare
+}
+
+src_configure() {
+	local mycmakeargs=(
+		-DPLAYER_BUILD_LIBLCF=OFF
+
+		# Use the first default choice
+		-DPLAYER_WITH_SPEEXDSP=$(usex sound)
+		-DPLAYER_WITH_SAMPLERATE=no
+
+		-DPLAYER_WITH_MPG123=$(usex sound)
+		-DPLAYER_WITH_OGGVORBIS=$(usex sound)
+		-DPLAYER_WITH_OPUS=$(usex sound)
+		-DPLAYER_WITH_XMP=$(usex sound)
+
+		# Avoid vendoring, use FluidSynth or WildMIDI (or ALSA) instead
+		-DPLAYER_ENABLE_FMMIDI=no
+		-DPLAYER_WITH_FLUIDSYNTH=$(usex fluidsynth)
+		-DPLAYER_WITH_WILDMIDI=$(usex wildmidi)
+		-DPLAYER_WITH_NATIVE_MIDI=$(usex sound $(usex fluidsynth no $(usex wildmidi no yes)) no)
+		# Serves as fallback when FluidSynth isn't found
+		-DPLAYER_WITH_FLUIDLITE=no
+		# Enable dr_wav for faster WAV decoding, fall back to libsndfile
+		-DPLAYER_ENABLE_DRWAV=$(usex sound)
+		-DPLAYER_WITH_LIBSNDFILE=$(usex sound)
+
+		# The text shaping engine is strictly dependent on the availability
+		# of TrueType fonts
+		-DPLAYER_WITH_HARFBUZZ=$(usex harfbuzz)
+		-DPLAYER_WITH_FREETYPE=$(usex harfbuzz yes $(usex truetype))
+	)
+	cmake_src_configure
+}
+
+src_compile() {
+	cmake_src_compile
+	if use doc; then
+		einfo "Building the documentation might take a while..."
+		cmake_build doc
+	fi
+}
+
+src_test() {
+	cmake_build check
+}
+
+src_install() {
+	cmake_src_install
+	if use doc; then
+		docinto /usr/share/doc/${PF}/html
+		dodoc -r "${BUILD_DIR}"/doc/*
+	fi
+	readme.gentoo_create_doc
+}
+
+pkg_postinst() {
+	xdg_pkg_postinst
+	readme.gentoo_print_elog
+}

diff --git a/games-engines/easyrpg-player/files/easyrpg-player-0.8-backport-use-after-free-fluidsynth.patch b/games-engines/easyrpg-player/files/easyrpg-player-0.8-backport-use-after-free-fluidsynth.patch
new file mode 100644
index 0000000000..693ee2bd75
--- /dev/null
+++ b/games-engines/easyrpg-player/files/easyrpg-player-0.8-backport-use-after-free-fluidsynth.patch
@@ -0,0 +1,180 @@
+The following commit was fixed and backported from upstream. The fix adds
+a header to audio_generic_midiout.h to provide the missing definition
+of AudioDecoderMidi at compile time.
+Author: Lucio Sauer <watermanpaint@posteo.net>
+
+https://github.com/EasyRPG/Player/issues/3079
+commit 7269d325035f547907ec352bff5d39bc611abc88
+Author: Ghabry <gabriel+github@mastergk.de>
+Date:   Fri Sep 22 20:45:19 2023 +0200
+
+    GenericAudio: Make static variables instance variables
+
+    This way they are destroyed when the DisplayUi is destroyed instead of when the process terminates.
+
+    Fixes a use-after-free in the Fluidsynth Decoder.
+--- a/src/audio_generic.cpp
++++ b/src/audio_generic.cpp
+@@ -20,33 +20,21 @@
+ #include <cstring>
+ #include <cassert>
+ #include <memory>
+-#include "audio_decoder_midi.h"
+ #include "audio_generic.h"
+-#include "audio_generic_midiout.h"
+-#include "filefinder.h"
+ #include "output.h"
+ 
+-GenericAudio::BgmChannel GenericAudio::BGM_Channels[nr_of_bgm_channels];
+-GenericAudio::SeChannel GenericAudio::SE_Channels[nr_of_se_channels];
+-bool GenericAudio::BGM_PlayedOnceIndicator;
+-
+-std::vector<int16_t> GenericAudio::sample_buffer = {};
+-std::vector<uint8_t> GenericAudio::scrap_buffer = {};
+-unsigned GenericAudio::scrap_buffer_size = 0;
+-std::vector<float> GenericAudio::mixer_buffer = {};
+-
+-std::unique_ptr<GenericAudioMidiOut> GenericAudio::midi_thread;
+-
+ GenericAudio::GenericAudio(const Game_ConfigAudio& cfg) : AudioInterface(cfg) {
+ 	int i = 0;
+ 	for (auto& BGM_Channel : BGM_Channels) {
+ 		BGM_Channel.id = i++;
+ 		BGM_Channel.decoder.reset();
++		BGM_Channel.instance = this;
+ 	}
+ 	i = 0;
+ 	for (auto& SE_Channel : SE_Channels) {
+ 		SE_Channel.id = i++;
+ 		SE_Channel.decoder.reset();
++		SE_Channel.instance = this;
+ 	}
+ 	BGM_PlayedOnceIndicator = false;
+ 	midi_thread.reset();
+@@ -492,8 +480,8 @@ void GenericAudio::BgmChannel::Stop() {
+ 	stopped = true;
+ 	if (midi_out_used) {
+ 		midi_out_used = false;
+-		midi_thread->GetMidiOut().Reset();
+-		midi_thread->GetMidiOut().Pause();
++		instance->midi_thread->GetMidiOut().Reset();
++		instance->midi_thread->GetMidiOut().Pause();
+ 	} else if (decoder) {
+ 		decoder.reset();
+ 	}
+@@ -503,16 +491,16 @@ void GenericAudio::BgmChannel::SetPaused(bool newPaused) {
+ 	paused = newPaused;
+ 	if (midi_out_used) {
+ 		if (newPaused) {
+-			midi_thread->GetMidiOut().Pause();
++			instance->midi_thread->GetMidiOut().Pause();
+ 		} else {
+-			midi_thread->GetMidiOut().Resume();
++			instance->midi_thread->GetMidiOut().Resume();
+ 		}
+ 	}
+ }
+ 
+ int GenericAudio::BgmChannel::GetTicks() const {
+ 	if (midi_out_used) {
+-		return midi_thread->GetMidiOut().GetTicks();
++		return instance->midi_thread->GetMidiOut().GetTicks();
+ 	} else if (decoder) {
+ 		return decoder->GetTicks();
+ 	}
+@@ -521,7 +509,7 @@ int GenericAudio::BgmChannel::GetTicks() const {
+ 
+ void GenericAudio::BgmChannel::SetFade(int fade) {
+ 	if (midi_out_used) {
+-		midi_thread->GetMidiOut().SetFade(0, std::chrono::milliseconds(fade));
++		instance->midi_thread->GetMidiOut().SetFade(0, std::chrono::milliseconds(fade));
+ 	} else if (decoder) {
+ 		decoder->SetFade(0, std::chrono::milliseconds(fade));
+ 	}
+@@ -529,7 +517,7 @@ void GenericAudio::BgmChannel::SetFade(int fade) {
+ 
+ void GenericAudio::BgmChannel::SetVolume(int volume) {
+ 	if (midi_out_used) {
+-		midi_thread->GetMidiOut().SetVolume(volume);
++		instance->midi_thread->GetMidiOut().SetVolume(volume);
+ 	} else if (decoder) {
+ 		decoder->SetVolume(volume);
+ 	}
+@@ -537,7 +525,7 @@ void GenericAudio::BgmChannel::SetVolume(int volume) {
+ 
+ void GenericAudio::BgmChannel::SetPitch(int pitch) {
+ 	if (midi_out_used) {
+-		midi_thread->GetMidiOut().SetPitch(pitch);
++		instance->midi_thread->GetMidiOut().SetPitch(pitch);
+ 	} else if (decoder) {
+ 		decoder->SetPitch(pitch);
+ 	}
+old mode 100644
+new mode 100755
+--- a/src/audio_generic.h
++++ b/src/audio_generic.h
+@@ -21,10 +21,9 @@
+ #include "audio.h"
+ #include "audio_secache.h"
+ #include "audio_decoder_base.h"
++#include "audio_generic_midiout.h"
+ #include <memory>
+ 
+-class GenericAudioMidiOut;
+-
+ /**
+  * A software implementation for handling EasyRPG Audio utilizing the
+  * AudioDecoder for BGM and AudioSeCache for fast SE playback.
+@@ -73,6 +72,7 @@ private:
+ 	struct BgmChannel {
+ 		int id;
+ 		std::unique_ptr<AudioDecoderBase> decoder;
++		GenericAudio* instance = nullptr;
+ 		bool paused;
+ 		bool stopped;
+ 		bool midi_out_used = false;
+@@ -87,6 +87,7 @@ private:
+ 	struct SeChannel {
+ 		int id;
+ 		std::unique_ptr<AudioDecoderBase> decoder;
++		GenericAudio* instance = nullptr;
+ 		bool paused;
+ 		bool stopped;
+ 	};
+@@ -103,17 +104,17 @@ private:
+ 	static constexpr unsigned nr_of_se_channels = 31;
+ 	static constexpr unsigned nr_of_bgm_channels = 2;
+ 
+-	static BgmChannel BGM_Channels[nr_of_bgm_channels];
+-	static SeChannel SE_Channels[nr_of_se_channels];
+-	static bool BGM_PlayedOnceIndicator;
+-	static bool Muted;
++	BgmChannel BGM_Channels[nr_of_bgm_channels];
++	SeChannel SE_Channels[nr_of_se_channels];
++	mutable bool BGM_PlayedOnceIndicator;
++	bool Muted;
+ 
+-	static std::vector<int16_t> sample_buffer;
+-	static std::vector<uint8_t> scrap_buffer;
+-	static unsigned scrap_buffer_size;
+-	static std::vector<float> mixer_buffer;
++	std::vector<int16_t> sample_buffer = {};
++	std::vector<uint8_t> scrap_buffer = {};
++	unsigned scrap_buffer_size = 0;
++	std::vector<float> mixer_buffer = {};
+ 
+-	static std::unique_ptr<GenericAudioMidiOut> midi_thread;
++	std::unique_ptr<GenericAudioMidiOut> midi_thread;
+ };
+ 
+ #endif
+--- a/src/audio_generic_midiout.h
++++ b/src/audio_generic_midiout.h
+@@ -19,6 +19,7 @@
+ #define EP_AUDIO_GENERIC_MIDITHREAD_H
+ 
+ #include <memory>
++#include "audio_decoder_midi.h"
+ #include "system.h"
+ 
+ class AudioDecoderMidi;

diff --git a/profiles/package.use.mask b/profiles/package.use.mask
index 32610624a9..fc5de3454a 100644
--- a/profiles/package.use.mask
+++ b/profiles/package.use.mask
@@ -3,10 +3,6 @@
 
 # New entries go on top.
 
-# Lucio Sauer<watermanpaint@posteo.net> (2023-09-01)
-# Segfaults upon termination when run from inside a game folder.
-~games-engines/easyrpg-player-0.8 fluidsynth
-
 # Anna Vyalkova <cyber+gentoo@sysrq.in> (2023-06-17)
 # Broken docs build.
 dev-crystal/crikey doc


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2023-09-26 12:52 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-09-26 12:52 [gentoo-commits] repo/proj/guru:dev commit in: games-engines/easyrpg-player/, games-engines/easyrpg-player/files/, profiles/ Lucio Sauer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox