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---
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.