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