pkgsrc-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: pkg/59858: audio/pavucontrol broken
The following reply was made to PR pkg/59858; it has been noted by GNATS.
From: RVP <rvp%SDF.ORG@localhost>
To: gnats-bugs%netbsd.org@localhost
Cc:
Subject: Re: pkg/59858: audio/pavucontrol broken
Date: Sat, 28 Mar 2026 08:49:50 +0000 (UTC)
Alright, I think I've got the cause of this issue:
On many locales (see list below), the decimal point character is `,'
rather than the `.' in the C/POSIX/US-ASCII locales. This effects how
strtod(3) and *scanf(3) parse floating point number strings.
If the input is from a user, then the locale-specific `,' should (usually)
be used; but, when used internally (like when parsing config. files--which
are _not usually_ internationalized--or when comparing version strings for
feature-checking) the code assumes the decimal point is a dot. But, with a
locale like `es_ES.UTF-8' strtod(3) and friends'll expect a `,' and will
mis-parse a `.' as shown here:
https://mail-index.netbsd.org/tech-userlevel/2026/03/26/msg014917.html
All these locales use `,' as the decimal point char.:
```
$ for f in $(find src/share/locale/numeric/ -name '*.src')
> do grep -v '^#' "$f" 2>/dev/null | head -n1 | fgrep -qx ',' && echo $f
> done
src/share/locale/numeric/af_ZA.UTF-8.src
src/share/locale/numeric/be_BY.UTF-8.src
src/share/locale/numeric/bg_BG.UTF-8.src
src/share/locale/numeric/ca_ES.UTF-8.src
src/share/locale/numeric/cs_CZ.UTF-8.src
src/share/locale/numeric/da_DK.UTF-8.src
src/share/locale/numeric/de_AT.UTF-8.src
src/share/locale/numeric/de_DE.UTF-8.src
src/share/locale/numeric/el_GR.UTF-8.src
src/share/locale/numeric/es_ES.UTF-8.src
src/share/locale/numeric/et_EE.UTF-8.src
src/share/locale/numeric/eu_ES.UTF-8.src
src/share/locale/numeric/fi_FI.UTF-8.src
src/share/locale/numeric/fr_BE.UTF-8.src
src/share/locale/numeric/fr_CA.UTF-8.src
src/share/locale/numeric/fr_FR.UTF-8.src
src/share/locale/numeric/hr_HR.UTF-8.src
src/share/locale/numeric/hu_HU.UTF-8.src
src/share/locale/numeric/hy_AM.UTF-8.src
src/share/locale/numeric/is_IS.UTF-8.src
src/share/locale/numeric/it_IT.UTF-8.src
src/share/locale/numeric/kk_KZ.UTF-8.src
src/share/locale/numeric/lt_LT.UTF-8.src
src/share/locale/numeric/nb_NO.UTF-8.src
src/share/locale/numeric/nl_BE.UTF-8.src
src/share/locale/numeric/nl_NL.UTF-8.src
src/share/locale/numeric/nn_NO.UTF-8.src
src/share/locale/numeric/pl_PL.UTF-8.src
src/share/locale/numeric/pt_BR.UTF-8.src
src/share/locale/numeric/pt_PT.UTF-8.src
src/share/locale/numeric/ro_RO.UTF-8.src
src/share/locale/numeric/ru_BY.UTF-8.src
src/share/locale/numeric/ru_RU.UTF-8.src
src/share/locale/numeric/sk_SK.UTF-8.src
src/share/locale/numeric/sl_SI.UTF-8.src
src/share/locale/numeric/sr_Cyrl_ME.UTF-8.src
src/share/locale/numeric/sr_Cyrl_RS.UTF-8.src
src/share/locale/numeric/sr_Latn_ME.UTF-8.src
src/share/locale/numeric/sr_Latn_RS.UTF-8.src
src/share/locale/numeric/sv_SE.UTF-8.src
src/share/locale/numeric/tr_TR.UTF-8.src
src/share/locale/numeric/uk_UA.UTF-8.src
src/share/locale/numeric/converted/af_ZA.ISO8859-1.src
src/share/locale/numeric/converted/af_ZA.ISO8859-15.src
src/share/locale/numeric/converted/be_BY.CP1251.src
src/share/locale/numeric/converted/be_BY.ISO8859-5.src
src/share/locale/numeric/converted/bg_BG.CP1251.src
src/share/locale/numeric/converted/ca_ES.ISO8859-1.src
src/share/locale/numeric/converted/ca_ES.ISO8859-15.src
src/share/locale/numeric/converted/cs_CZ.ISO8859-2.src
src/share/locale/numeric/converted/da_DK.ISO8859-1.src
src/share/locale/numeric/converted/da_DK.ISO8859-15.src
src/share/locale/numeric/converted/de_AT.ISO8859-1.src
src/share/locale/numeric/converted/de_AT.ISO8859-15.src
src/share/locale/numeric/converted/de_DE.ISO8859-1.src
src/share/locale/numeric/converted/de_DE.ISO8859-15.src
src/share/locale/numeric/converted/el_GR.ISO8859-7.src
src/share/locale/numeric/converted/es_ES.ISO8859-1.src
src/share/locale/numeric/converted/es_ES.ISO8859-15.src
src/share/locale/numeric/converted/et_EE.ISO8859-15.src
src/share/locale/numeric/converted/eu_ES.ISO8859-1.src
src/share/locale/numeric/converted/eu_ES.ISO8859-15.src
src/share/locale/numeric/converted/fi_FI.ISO8859-1.src
src/share/locale/numeric/converted/fi_FI.ISO8859-15.src
src/share/locale/numeric/converted/fr_BE.ISO8859-1.src
src/share/locale/numeric/converted/fr_BE.ISO8859-15.src
src/share/locale/numeric/converted/fr_CA.ISO8859-1.src
src/share/locale/numeric/converted/fr_CA.ISO8859-15.src
src/share/locale/numeric/converted/fr_FR.ISO8859-1.src
src/share/locale/numeric/converted/fr_FR.ISO8859-15.src
src/share/locale/numeric/converted/hr_HR.ISO8859-2.src
src/share/locale/numeric/converted/hu_HU.ISO8859-2.src
src/share/locale/numeric/converted/hy_AM.ARMSCII-8.src
src/share/locale/numeric/converted/is_IS.ISO8859-1.src
src/share/locale/numeric/converted/is_IS.ISO8859-15.src
src/share/locale/numeric/converted/it_IT.ISO8859-1.src
src/share/locale/numeric/converted/it_IT.ISO8859-15.src
src/share/locale/numeric/converted/kk_KZ.PT154.src
src/share/locale/numeric/converted/lt_LT.ISO8859-13.src
src/share/locale/numeric/converted/lt_LT.ISO8859-4.src
src/share/locale/numeric/converted/nb_NO.ISO8859-1.src
src/share/locale/numeric/converted/nb_NO.ISO8859-15.src
src/share/locale/numeric/converted/nl_BE.ISO8859-1.src
src/share/locale/numeric/converted/nl_BE.ISO8859-15.src
src/share/locale/numeric/converted/nl_NL.ISO8859-1.src
src/share/locale/numeric/converted/nl_NL.ISO8859-15.src
src/share/locale/numeric/converted/nn_NO.ISO8859-1.src
src/share/locale/numeric/converted/nn_NO.ISO8859-15.src
src/share/locale/numeric/converted/pl_PL.ISO8859-2.src
src/share/locale/numeric/converted/pt_BR.ISO8859-1.src
src/share/locale/numeric/converted/pt_PT.ISO8859-1.src
src/share/locale/numeric/converted/pt_PT.ISO8859-15.src
src/share/locale/numeric/converted/ro_RO.ISO8859-2.src
src/share/locale/numeric/converted/ru_BY.CP1251.src
src/share/locale/numeric/converted/ru_RU.CP1251.src
src/share/locale/numeric/converted/ru_RU.CP866.src
src/share/locale/numeric/converted/ru_RU.ISO8859-5.src
src/share/locale/numeric/converted/ru_RU.KOI8-R.src
src/share/locale/numeric/converted/sk_SK.ISO8859-2.src
src/share/locale/numeric/converted/sl_SI.ISO8859-2.src
src/share/locale/numeric/converted/sr_Cyrl_ME.ISO8859-5.src
src/share/locale/numeric/converted/sr_Cyrl_RS.ISO8859-5.src
src/share/locale/numeric/converted/sr_Latn_ME.ISO8859-2.src
src/share/locale/numeric/converted/sr_Latn_RS.ISO8859-2.src
src/share/locale/numeric/converted/sv_SE.ISO8859-1.src
src/share/locale/numeric/converted/sv_SE.ISO8859-15.src
src/share/locale/numeric/converted/tr_TR.ISO8859-9.src
src/share/locale/numeric/converted/uk_UA.CP1251.src
src/share/locale/numeric/converted/uk_UA.ISO8859-5.src
src/share/locale/numeric/converted/uk_UA.KOI8-U.src
$
```
There already is code in Mesa3D to handle this, but, it's not being turned on
(see patch). Question is why aren't FreeBSD & OpenBSD users complaining?
Ans:
OpenBSD isn't affected because LC_NUMERIC is always "C" there.
FreeBSD builds using `meson` and `-D_GNU_SOURCE` is enabled by default:
https://gitlab.freedesktop.org/mesa/mesa/-/blob/main/meson.build?ref_type=heads#L1192
BTW, the patch below also fixes the "Firefox not rendering UI elements correctly
on some locales" issue:
https://mail-index.netbsd.org/netbsd-users/2022/09/04/msg028927.html
So, this PR should be re-opened and punted over to the `xsrc' people, so that
they can fix it in -HEAD, 11.0, 10.x, etc.
Build a new distribution (the steps to just build Mesa/gallium is just too
tedious to list) and install it, then remove `~/.cache/mesa_shader_cache` and
all locales should work equally well.
-RVP
PS. `xsrc/external/mit/glu/` might also need a similar fix, but, I couldn't see
any users of that library in the tree (nor in the packages I regularly use).
---START patch NetBSD-11.0-RC2---
diff -urN src.orig/external/mit/xorg/lib/driver.mk src/external/mit/xorg/lib/driver.mk
--- src.orig/external/mit/xorg/lib/driver.mk 2024-07-03 02:40:50.000000000 +0000
+++ src/external/mit/xorg/lib/driver.mk 2026-03-26 07:03:33.000000000 +0000
@@ -64,6 +64,7 @@
-I${X11SRCDIR.Mesa}/src/gallium/include
CPPFLAGS.format_srgb.c+= -I${X11SRCDIR.Mesa}/src/util
CPPFLAGS.u_hash_table.c+= -I${X11SRCDIR.Mesa}/src/gallium/auxiliary
+CPPFLAGS.strtod.c+= -D_GNU_SOURCE -DHAVE_STRTOD_L
BUILDSYMLINKS+= ${X11SRCDIR.Mesa}/src/util/debug.c UTILdebug.c
BUILDSYMLINKS+= ${X11SRCDIR.Mesa}/src/util/log.c UTILlog.c
diff -urN src.orig/external/mit/xorg/lib/driver.old.mk src/external/mit/xorg/lib/driver.old.mk
--- src.orig/external/mit/xorg/lib/driver.old.mk 2021-07-11 20:53:35.000000000 +0000
+++ src/external/mit/xorg/lib/driver.old.mk 2026-03-26 07:03:38.000000000 +0000
@@ -41,6 +41,7 @@
-I${X11SRCDIR.Mesa}/src/mesa \
-I${X11SRCDIR.Mesa}/src \
-I${X11SRCDIR.Mesa}/src/gallium/include
+CPPFLAGS.strtod.c+= -D_GNU_SOURCE -DHAVE_STRTOD_L
BUILDSYMLINKS+= ${X11SRCDIR.Mesa}/src/util/debug.c UTILdebug.c
diff -urN xsrc.orig/external/mit/MesaLib/dist/src/util/strtod.c xsrc/external/mit/MesaLib/dist/src/util/strtod.c
--- xsrc.orig/external/mit/MesaLib/dist/src/util/strtod.c 2019-03-10 03:42:34.000000000 +0000
+++ xsrc/external/mit/MesaLib/dist/src/util/strtod.c 2026-03-26 07:49:24.000000000 +0000
@@ -41,7 +41,7 @@
_mesa_locale_init(void)
{
#if defined(_GNU_SOURCE) && defined(HAVE_STRTOD_L)
- loc = newlocale(LC_CTYPE_MASK, "C", NULL);
+ loc = newlocale(LC_NUMERIC_MASK, "C", NULL); // XXX: upstream?
#endif
}
diff -urN xsrc.orig/external/mit/MesaLib.old/dist/src/util/strtod.c xsrc/external/mit/MesaLib.old/dist/src/util/strtod.c
--- xsrc.orig/external/mit/MesaLib.old/dist/src/util/strtod.c 2021-07-11 20:36:33.000000000 +0000
+++ xsrc/external/mit/MesaLib.old/dist/src/util/strtod.c 2026-03-26 07:49:48.000000000 +0000
@@ -41,7 +41,7 @@
_mesa_locale_init(void)
{
#if defined(_GNU_SOURCE) && defined(HAVE_STRTOD_L)
- loc = newlocale(LC_CTYPE_MASK, "C", NULL);
+ loc = newlocale(LC_NUMERIC_MASK, "C", NULL); // XXX: upstream?
#endif
}
---END patch NetBSD-11.0-RC2---
Home |
Main Index |
Thread Index |
Old Index