+cc kirby@ (maintainer)
Stefan Hagen <[email protected]> wrote:
> Abel Abraham Camarillo Ojeda wrote (2022-06-20 08:24 CEST):
> > [...]
> >
> > I now applied the patch correctly, I can no longer reproduce the issue.
> >
> > upstream seems unresponsive about this, any chance of getting it on ports?
>
> The one that rips out all setlocale calls? No.
>
> Here is a better diff, which replaces the setlocale(3) calls with thread
> local (and therefore thread-safe) uselocale(3) calls.
>
> I'm still testing this, because it is not exactly the same as the original.
>
> If it improves the situation on OpenBSD, I'm not opposed to commit these
> patches. Please test and report back.
I don't use rawtherapee, and my understanding of the locale api is
(voluntarely) scarse, but I'm not sure the patch is right.
On OpenBSD there shouldn't be issue, because freelocale (AFAIU) is a
no-op, but on other OSes you need to free the locale returned by
newlocale or duplocale.
See (but not too closely!) the example from the GNU man page for
newlocale:
https://man.voidlinux.org/newlocale
so the patch may be OK for us, but not to fed it to upstream.
> Best Regards,
> Stefan
>
> Index: graphics/rawtherapee/Makefile
> ===================================================================
> RCS file: /home/cvs/ports/graphics/rawtherapee/Makefile,v
> retrieving revision 1.38
> diff -u -p -u -p -r1.38 Makefile
> --- graphics/rawtherapee/Makefile 28 May 2022 06:20:01 -0000 1.38
> +++ graphics/rawtherapee/Makefile 28 Jun 2022 14:49:21 -0000
> @@ -4,7 +4,7 @@ ONLY_FOR_ARCHS = amd64
> COMMENT = RAW image processing application
>
> DISTNAME = rawtherapee-5.8
> -REVISION = 1
> +REVISION = 2
>
> CATEGORIES = graphics
>
> Index: graphics/rawtherapee/patches/patch-rtengine_dcraw_c
> ===================================================================
> RCS file: graphics/rawtherapee/patches/patch-rtengine_dcraw_c
> diff -N graphics/rawtherapee/patches/patch-rtengine_dcraw_c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ graphics/rawtherapee/patches/patch-rtengine_dcraw_c 28 Jun 2022
> 15:45:04 -0000
> @@ -0,0 +1,13 @@
> +Index: rtengine/dcraw.c
> +--- rtengine/dcraw.c.orig
> ++++ rtengine/dcraw.c
> +@@ -9853,8 +9853,7 @@ int CLASS main (int argc, const char **argv)
> + putenv ((char *) "TZ=UTC");
> + #endif
> + #ifdef LOCALEDIR
> +- setlocale (LC_CTYPE, "");
> +- setlocale (LC_MESSAGES, "");
> ++ uselocale (newlocale(LC_CTYPE_MASK | LC_MESSAGES, "",
> duplocale(LC_GLOBAL_LOCALE)));
> + bindtextdomain ("dcraw", LOCALEDIR);
> + textdomain ("dcraw");
> + #endif
> Index: graphics/rawtherapee/patches/patch-rtengine_procparams_cc
> ===================================================================
> RCS file: graphics/rawtherapee/patches/patch-rtengine_procparams_cc
> diff -N graphics/rawtherapee/patches/patch-rtengine_procparams_cc
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ graphics/rawtherapee/patches/patch-rtengine_procparams_cc 28 Jun 2022
> 14:38:58 -0000
> @@ -0,0 +1,13 @@
> +Index: rtengine/procparams.cc
> +--- rtengine/procparams.cc.orig
> ++++ rtengine/procparams.cc
> +@@ -3729,7 +3729,8 @@ int ProcParams::save(const Glib::ustring& fname, const
> +
> + int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited)
> + {
> +- setlocale(LC_NUMERIC, "C"); // to set decimal point to "."
> ++ // to set decimal point to "."
> ++ uselocale(newlocale(LC_NUMERIC_MASK, "C", duplocale(LC_GLOBAL_LOCALE)));
> +
> + if (fname.empty()) {
> + return 1;
> Index: graphics/rawtherapee/patches/patch-rtengine_rtthumbnail_cc
> ===================================================================
> RCS file: graphics/rawtherapee/patches/patch-rtengine_rtthumbnail_cc
> diff -N graphics/rawtherapee/patches/patch-rtengine_rtthumbnail_cc
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ graphics/rawtherapee/patches/patch-rtengine_rtthumbnail_cc 28 Jun
> 2022 15:45:47 -0000
> @@ -0,0 +1,12 @@
> +Index: rtengine/rtthumbnail.cc
> +--- rtengine/rtthumbnail.cc.orig
> ++++ rtengine/rtthumbnail.cc
> +@@ -2013,7 +2013,7 @@ bool Thumbnail::readImage (const Glib::ustring& fname)
> +
> + bool Thumbnail::readData (const Glib::ustring& fname)
> + {
> +- setlocale (LC_NUMERIC, "C"); // to set decimal point to "."
> ++ uselocale (newlocale(LC_NUMERIC_MASK, "C",
> duplocale(LC_GLOBAL_LOCALE)));
> + Glib::KeyFile keyFile;
> +
> + try {
> Index: graphics/rawtherapee/patches/patch-rtexif_rtexif_cc
> ===================================================================
> RCS file: graphics/rawtherapee/patches/patch-rtexif_rtexif_cc
> diff -N graphics/rawtherapee/patches/patch-rtexif_rtexif_cc
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ graphics/rawtherapee/patches/patch-rtexif_rtexif_cc 28 Jun 2022
> 15:37:26 -0000
> @@ -0,0 +1,13 @@
> +Index: rtexif/rtexif.cc
> +--- rtexif/rtexif.cc.orig
> ++++ rtexif/rtexif.cc
> +@@ -2788,7 +2788,8 @@ void ExifManager::parse (bool isRaw, bool skipIgnored,
> + #endif
> + return;
> + }
> +- setlocale (LC_NUMERIC, "C"); // to set decimal point in sscanf
> ++ // to set decimal point in sscanf
> ++ uselocale (newlocale(LC_NUMERIC_MASK, "C",
> duplocale(LC_GLOBAL_LOCALE)));
> +
> + if (order == ByteOrder::UNKNOWN) {
> + // read tiff header
> Index: graphics/rawtherapee/patches/patch-rtgui_cacheimagedata_cc
> ===================================================================
> RCS file: graphics/rawtherapee/patches/patch-rtgui_cacheimagedata_cc
> diff -N graphics/rawtherapee/patches/patch-rtgui_cacheimagedata_cc
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ graphics/rawtherapee/patches/patch-rtgui_cacheimagedata_cc 28 Jun
> 2022 14:37:57 -0000
> @@ -0,0 +1,13 @@
> +Index: rtgui/cacheimagedata.cc
> +--- rtgui/cacheimagedata.cc.orig
> ++++ rtgui/cacheimagedata.cc
> +@@ -65,7 +65,8 @@ CacheImageData::CacheImageData() :
> + */
> + int CacheImageData::load (const Glib::ustring& fname)
> + {
> +- setlocale(LC_NUMERIC, "C"); // to set decimal point to "."
> ++ // to set decimal point to "."
> ++ uselocale(newlocale(LC_NUMERIC_MASK, "C", duplocale(LC_GLOBAL_LOCALE)));
> +
> + Glib::KeyFile keyFile;
> +
> Index: graphics/rawtherapee/patches/patch-rtgui_main-cli_cc
> ===================================================================
> RCS file: graphics/rawtherapee/patches/patch-rtgui_main-cli_cc
> diff -N graphics/rawtherapee/patches/patch-rtgui_main-cli_cc
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ graphics/rawtherapee/patches/patch-rtgui_main-cli_cc 28 Jun 2022
> 14:52:43 -0000
> @@ -0,0 +1,13 @@
> +Index: rtgui/main-cli.cc
> +--- rtgui/main-cli.cc.orig
> ++++ rtgui/main-cli.cc
> +@@ -104,8 +104,7 @@ bool dontLoadCache ( int argc, char **argv );
> +
> + int main (int argc, char **argv)
> + {
> +- setlocale (LC_ALL, "");
> +- setlocale (LC_NUMERIC, "C"); // to set decimal point to "."
> ++ uselocale(newlocale(LC_NUMERIC_MASK, "C", (locale_t)0));
> +
> + Gio::init ();
> +
> Index: graphics/rawtherapee/patches/patch-rtgui_main_cc
> ===================================================================
> RCS file: graphics/rawtherapee/patches/patch-rtgui_main_cc
> diff -N graphics/rawtherapee/patches/patch-rtgui_main_cc
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ graphics/rawtherapee/patches/patch-rtgui_main_cc 28 Jun 2022 14:16:15
> -0000
> @@ -0,0 +1,15 @@
> +Switch to thread safe uselocale(3)
> +
> +Index: rtgui/main.cc
> +--- rtgui/main.cc.orig
> ++++ rtgui/main.cc
> +@@ -366,8 +366,7 @@ void show_gimp_plugin_info_dialog(Gtk::Window *parent)
> +
> + int main (int argc, char **argv)
> + {
> +- setlocale (LC_ALL, "");
> +- setlocale (LC_NUMERIC, "C"); // to set decimal point to "."
> ++ uselocale (newlocale(LC_NUMERIC_MASK, "C", (locale_t) 0));
> +
> + simpleEditor = false;
> + gimpPlugin = false;
> Index: graphics/rawtherapee/patches/patch-rtgui_options_cc
> ===================================================================
> RCS file: graphics/rawtherapee/patches/patch-rtgui_options_cc
> diff -N graphics/rawtherapee/patches/patch-rtgui_options_cc
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ graphics/rawtherapee/patches/patch-rtgui_options_cc 28 Jun 2022
> 14:38:39 -0000
> @@ -0,0 +1,12 @@
> +Index: rtgui/options.cc
> +--- rtgui/options.cc.orig
> ++++ rtgui/options.cc
> +@@ -666,7 +666,7 @@ void Options::filterOutParsedExtensions()
> +
> + void Options::readFromFile(Glib::ustring fname)
> + {
> +- setlocale(LC_NUMERIC, "C"); // to set decimal point to "."
> ++ uselocale(newlocale(LC_NUMERIC_MASK, "C", duplocale(LC_GLOBAL_LOCALE)));
> +
> + Glib::KeyFile keyFile;
> +