Re: pkg/59858: audio/pavucontrol broken
"RVP via gnats" <[email protected]>
| Newsgroups | gmane.os.netbsd.devel.pkgsrc.bugs |
|---|---|
| Message-ID | <[email protected]> |
The following reply was made to PR pkg/59858; it has been noted by GNATS. From: RVP <[email protected]> To: [email protected] 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---