diff --git a/net/gerbera/Makefile b/net/gerbera/Makefile index 083c637c9aa9..02d0532ca927 100644 --- a/net/gerbera/Makefile +++ b/net/gerbera/Makefile @@ -1,100 +1,101 @@ PORTNAME= gerbera DISTVERSIONPREFIX= v DISTVERSION= 3.2.1 +PORTREVISION= 1 CATEGORIES= net multimedia MAINTAINER= diizzy@FreeBSD.org COMMENT= Media server compatible with DLNA and UPnP WWW= https://gerbera.io/ LICENSE= GPLv2 LICENSE_FILE= ${WRKSRC}/LICENSE.md BROKEN_i386= error: non-constant-expression cannot be narrowed from type 'rep' (aka 'long long') to 'time_t' (aka 'int') in initializer list BUILD_DEPENDS= cxxopts>0:devel/cxxopts LIB_DEPENDS= libfmt.so:devel/libfmt \ libicui18n.so:devel/icu \ libjsoncpp.so:devel/jsoncpp \ libspdlog.so:devel/spdlog \ libpugixml.so:textproc/pugixml USES= cmake compiler:c++17-lang iconv localbase:ldflags \ pkgconfig sqlite USE_GITHUB= yes USE_RC_SUBR= gerbera USERS= gerbera GROUPS= gerbera SUB_LIST= USER=${USERS} GROUP=${GROUPS} PLIST_SUB= USER=${USERS} GROUP=${GROUPS} CMAKE_OFF= WITH_EXIF WITH_LASTFM WITH_MATROSKA WITH_MYSQL WITH_SYSTEMD \ WITH_ZIP CMAKE_ON= WITH_MAGIC OPTIONS_DEFINE= CURL DEBUG DUKTAPE EXIV2 FFMPEG FFMPEGTHUMBNAILER \ TAGLIB TEST OPTIONS_DEFAULT= CURL DUKTAPE EXIV2 FFMPEG TAGLIB LIBNPUPNP OPTIONS_SINGLE= UPNPLIB OPTIONS_SINGLE_UPNPLIB= LIBNPUPNP LIBUPNP CURL_DESC= Support for online services via cURL DUKTAPE_DESC= Javascript support for custom import scripts FFMPEGTHUMBNAILER_DESC= Support for thumbnail generation LIBNPUPNP_DESC= Use high performance libnpupnp library LIBUPNP_DESC= Use libupnp library TAGLIB_DESC= Extract audio file metadata via taglib CURL_LIB_DEPENDS= libcurl.so:ftp/curl CURL_CMAKE_BOOL= WITH_CURL DEBUG_CMAKE_BOOL= WITH_DEBUG DUKTAPE_LIB_DEPENDS= libduktape.so:lang/duktape-lib DUKTAPE_CMAKE_BOOL= WITH_JS EXIV2_LIB_DEPENDS= libexiv2.so:graphics/exiv2 EXIV2_CMAKE_BOOL= WITH_EXIV2 FFMPEGTHUMBNAILER_LIB_DEPENDS= libffmpegthumbnailer.so:multimedia/ffmpegthumbnailer FFMPEGTHUMBNAILER_CMAKE_BOOL= WITH_FFMPEGTHUMBNAILER FFMPEGTHUMBNAILER_IMPLIES= FFMPEG FFMPEG_LIB_DEPENDS= libavformat.so:multimedia/ffmpeg \ libavutil.so:multimedia/ffmpeg FFMPEG_CMAKE_BOOL= WITH_AVCODEC LIBNPUPNP_LIB_DEPENDS= libnpupnp.so:net/libnpupnp LIBNPUPNP_CMAKE_BOOL= WITH_NPUPNP LIBUPNP_LIB_DEPENDS= libupnp.so:devel/upnp TAGLIB_LIB_DEPENDS= libtag.so:audio/taglib TAGLIB_CMAKE_BOOL= WITH_TAGLIB TEST_BUILD_DEPENDS= googletest>=0:devel/googletest TEST_CMAKE_BOOL= WITH_TESTS TEST_TEST_TARGET= test TEST_IMPLIES= CURL DUKTAPE TEST_ENV= LC_ALL=C.UTF-8 CTEST_PARALLEL_LEVEL=${MAKE_JOBS_NUMBER} .include .if ${OPSYS} == FreeBSD && ${OSVERSION} < 1500050 LIB_DEPENDS+= libinotify.so:devel/libinotify .else EXTRA_PATCHES= ${PATCHDIR}/extra-patch-FreeBSD-15-inotify .endif post-install: ${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/gerbera @${MKDIR} ${STAGEDIR}/var/db/gerbera @${MKDIR} ${STAGEDIR}/var/log/gerbera @${STAGEDIR}${PREFIX}/bin/gerbera -f /var/db/gerbera --create-config > ${STAGEDIR}${PREFIX}/etc/gerbera-config.xml.sample .include diff --git a/net/gerbera/files/patch-git-01-3e73aeb54f5f4be70bc4c74f6c7362287bdbb13f b/net/gerbera/files/patch-git-01-3e73aeb54f5f4be70bc4c74f6c7362287bdbb13f new file mode 100644 index 000000000000..4bd2e0d74895 --- /dev/null +++ b/net/gerbera/files/patch-git-01-3e73aeb54f5f4be70bc4c74f6c7362287bdbb13f @@ -0,0 +1,56 @@ +From 3e73aeb54f5f4be70bc4c74f6c7362287bdbb13f Mon Sep 17 00:00:00 2001 +From: Karlchen +Date: Sun, 7 Jun 2026 00:21:04 +0200 +Subject: [PATCH] Handle url decoding correctly + +--- + ChangeLog.md | 1 + + ReleaseNotes.md | 1 + + src/upnp/compat.h | 5 +++++ + src/util/url_utils.cc | 3 ++- + 4 files changed, 9 insertions(+), 1 deletion(-) + +diff --git a/src/upnp/compat.h b/src/upnp/compat.h +index 3470efe1d..cb1d91b15 100644 +--- src/upnp/compat.h ++++ src/upnp/compat.h +@@ -46,6 +46,9 @@ static constexpr grb_read_t GRB_READ_ERROR = -1; + #define GrbUpnpFileInfoSetContentType(i, mt) (i)->content_type = std::move((mt)) + #define GrbUpnpGetHeaders(i) (i)->request_headers + #define GrbUpnpSetHeaders(i, h) std::copy((h).begin(), (h).end(), std::back_inserter((i)->response_headers)) ++// npupnp reencodes the query arguments to build a parsable URL. We need another ++// decoding layer when using it. ++#define GrbUrlUnescape(u) urlUnescape(urlUnescape(u)) + + #define UPNP_NEEDS_LITERAL_HOST_REDIRECT + extern "C" void UpnpSetAllowLiteralHostRedirection(int); +@@ -80,6 +83,8 @@ void UpnpSetHeadersCompat(const UpnpFileInfo* fileInfo, const std::map 170000 and UPNP_VERSION <= 170110) + // new method added + #define UPNP_NEEDS_CORS +diff --git a/src/util/url_utils.cc b/src/util/url_utils.cc +index 884f23667..3a80e9096 100644 +--- src/util/url_utils.cc ++++ src/util/url_utils.cc +@@ -24,6 +24,7 @@ Gerbera - https://gerbera.io/ + #include "url_utils.h" // API + + #include "exceptions.h" ++#include "upnp/compat.h" + + #include + #if FMT_VERSION >= 100202 +@@ -195,7 +196,7 @@ std::map dictDecode(std::string_view url, bool unEscap + auto key = std::string_view(data, eqPos - data); + auto value = std::string_view(eqPos + 1, ampPos - eqPos - 1); + if (unEscape) { +- dict.try_emplace(urlUnescape(key), urlUnescape(value)); ++ dict.try_emplace(GrbUrlUnescape(key), GrbUrlUnescape(value)); + } else { + dict.emplace(key, value); + }