GNU bug report logs - #40832
alsa-lib cannot find its plugins

Previous Next

Package: guix;

Reported by: Leo Famulari <leo <at> famulari.name>

Date: Fri, 24 Apr 2020 21:38:02 UTC

Severity: normal

Done: Leo Famulari <leo <at> famulari.name>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 40832 in the body.
You can then email your comments to 40832 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-guix <at> gnu.org:
bug#40832; Package guix. (Fri, 24 Apr 2020 21:38:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Leo Famulari <leo <at> famulari.name>:
New bug report received and forwarded. Copy sent to bug-guix <at> gnu.org. (Fri, 24 Apr 2020 21:38:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Leo Famulari <leo <at> famulari.name>
To: bug-guix <at> gnu.org
Subject: Audacity does not work with PulseAudio
Date: Fri, 24 Apr 2020 17:37:27 -0400
Since I can remember, Guix's Audacity doesn't work with PulseAudio on my
foreign distro (Debian).

Debian's Audacity does work correctly in this regard.

In practice, this means that I cannot play or record audio in Audacity
while any other application is using sound on the system. If I close or
stop those other applications, then Audacity is able to select the
'sysdefault' output sound device and can start working.

I found a few discussions about similar issues [0], and it seems that
Audacity needs alsa-plugins in order to make this work.

I tried installing Audacity along side alsa-plugins,
alsa-plugins:pulseaudio, and pulseaudio, as well as building with them
as dependencies, but it still didn't work.

[0] e.g. https://forum.audacityteam.org/viewtopic.php?t=89278




Information forwarded to bug-guix <at> gnu.org:
bug#40832; Package guix. (Fri, 24 Apr 2020 23:16:01 GMT) Full text and rfc822 format available.

Message #8 received at 40832 <at> debbugs.gnu.org (full text, mbox):

From: Leo Famulari <leo <at> famulari.name>
To: 40832 <at> debbugs.gnu.org
Subject: Re: Audacity does not work with PulseAudio
Date: Fri, 24 Apr 2020 19:15:24 -0400
When Audacity starts, it prints this line:

------
ALSA lib conf.c:3683:(snd_config_hooks_call) Cannot open shared library libasound_module_conf_pulse.so (/gnu/store/nyylgcnzmbw8wrn4sna2crl0g7zxxh33-alsa-lib-1.2.2/lib/alsa-lib/libasound_module_conf_pulse.so: libasound_module_conf_pulse.so: cannot open shared object file: No such file or directory)
------

But, this file exists in the "pulseaudio" output of alsa-plugins, not
alsa-lib:

/gnu/store/pwsz9hf66na0s9x3ay9qk02vk8l4v8vi-alsa-plugins-1.2.2-pulseaudio/lib/alsa-lib/libasound_module_conf_pulse.so

On Debian, this library is found at:

/usr/lib/x86_64-linux-gnu/alsa-lib/libasound_module_conf_pulse.so




Information forwarded to bug-guix <at> gnu.org:
bug#40832; Package guix. (Sat, 25 Apr 2020 04:04:02 GMT) Full text and rfc822 format available.

Message #11 received at 40832 <at> debbugs.gnu.org (full text, mbox):

From: Leo Famulari <leo <at> famulari.name>
To: 40832 <at> debbugs.gnu.org
Subject: Re: Audacity does not work with PulseAudio
Date: Sat, 25 Apr 2020 00:03:41 -0400
On Fri, Apr 24, 2020 at 07:15:24PM -0400, Leo Famulari wrote:
> ------
> ALSA lib conf.c:3683:(snd_config_hooks_call) Cannot open shared library libasound_module_conf_pulse.so (/gnu/store/nyylgcnzmbw8wrn4sna2crl0g7zxxh33-alsa-lib-1.2.2/lib/alsa-lib/libasound_module_conf_pulse.so: libasound_module_conf_pulse.so: cannot open shared object file: No such file or directory)
> ------

alsa-lib looks for this based on the compile-time constant
ALSA_PLUGIN_DIR, set during configure using --with-plugindir.

This is tricky because alsa-plugins depends on alsa-lib, and there are
also other packages that can provide plugins, like bluez-alsa.

Nixpkgs used to patch alsa-lib to look things up at runtime with an
environment variable, but stopped for some reason. That discussion even
points back to Guix periodically, but no solutions:

https://github.com/NixOS/nixpkgs/issues/6860




Changed bug title to 'alsa-lib cannot find its plugins' from 'Audacity does not work with PulseAudio' Request was from Leo Famulari <leo <at> famulari.name> to control <at> debbugs.gnu.org. (Sat, 25 Apr 2020 17:49:02 GMT) Full text and rfc822 format available.

Information forwarded to bug-guix <at> gnu.org:
bug#40832; Package guix. (Sun, 26 Apr 2020 20:04:02 GMT) Full text and rfc822 format available.

Message #16 received at 40832 <at> debbugs.gnu.org (full text, mbox):

From: Leo Famulari <leo <at> famulari.name>
To: 40832 <at> debbugs.gnu.org
Subject: Re: alsa-lib cannot find its plugins
Date: Sun, 26 Apr 2020 16:03:34 -0400
I propose we make alsa-lib respect an environment variable
ALSA_PLUGIN_DIRS, and make that a Guix package search path that matches
'lib/alsa-lib'. I think this will do what we need. Any feedback?




Information forwarded to bug-guix <at> gnu.org:
bug#40832; Package guix. (Tue, 28 Apr 2020 21:26:02 GMT) Full text and rfc822 format available.

Message #19 received at 40832 <at> debbugs.gnu.org (full text, mbox):

From: Ludovic Courtès <ludo <at> gnu.org>
To: Leo Famulari <leo <at> famulari.name>
Cc: 40832 <at> debbugs.gnu.org
Subject: Re: bug#40832: Audacity does not work with PulseAudio
Date: Tue, 28 Apr 2020 23:25:32 +0200
Hi,

Leo Famulari <leo <at> famulari.name> skribis:

> When Audacity starts, it prints this line:
>
> ------
> ALSA lib conf.c:3683:(snd_config_hooks_call) Cannot open shared library libasound_module_conf_pulse.so (/gnu/store/nyylgcnzmbw8wrn4sna2crl0g7zxxh33-alsa-lib-1.2.2/lib/alsa-lib/libasound_module_conf_pulse.so: libasound_module_conf_pulse.so: cannot open shared object file: No such file or directory)
> ------
>
> But, this file exists in the "pulseaudio" output of alsa-plugins, not
> alsa-lib:
>
> /gnu/store/pwsz9hf66na0s9x3ay9qk02vk8l4v8vi-alsa-plugins-1.2.2-pulseaudio/lib/alsa-lib/libasound_module_conf_pulse.so

Could it be that the problem is in Audacity and not in alsa-lib?

I can do this with mpg123:

--8<---------------cut here---------------start------------->8---
$ cat ~/.asoundrc
pcm.!default {
    type pulse
}
$ mpg123 -o alsa …
--8<---------------cut here---------------end--------------->8---

and the sound goes through PulseAudio.

Ludo’.




Information forwarded to bug-guix <at> gnu.org:
bug#40832; Package guix. (Tue, 28 Apr 2020 22:40:02 GMT) Full text and rfc822 format available.

Message #22 received at 40832 <at> debbugs.gnu.org (full text, mbox):

From: Leo Famulari <leo <at> famulari.name>
To: Ludovic Courtès <ludo <at> gnu.org>
Cc: 40832 <at> debbugs.gnu.org
Subject: Re: bug#40832: Audacity does not work with PulseAudio
Date: Tue, 28 Apr 2020 18:39:08 -0400
On Tue, Apr 28, 2020 at 11:25:32PM +0200, Ludovic Courtès wrote:
> Could it be that the problem is in Audacity and not in alsa-lib?

I'm not 100% sure but I don't think so.

The function snd_config_hooks_call() is from alsa-lib I can't find any
way in alsa-lib for it work in this case, even though it aims to work by
default on systems with plugins in '/usr/lib/alsa-lib' or similar.

The lookup is performed in alsa-lib's 'src/dlmisc.c', by the function
snd_dlopen(), and it only looks in the hard-coded path provided by the
ALSA_PLUGIN_DIR C object macro, which ends up being alsa-lib's own store
directory.

> I can do this with mpg123:
> 
> --8<---------------cut here---------------start------------->8---
> $ cat ~/.asoundrc
> pcm.!default {
>     type pulse
> }
> $ mpg123 -o alsa …
> --8<---------------cut here---------------end--------------->8---
> 
> and the sound goes through PulseAudio.

Is that on Guix System or another distro? On Guix System, this is
handled by the service alsa-service-type.

On Debian, using mpg123 from Guix, and with your ~/.asoundrc, it fails
in the same way as Audacity:

------
% mpg123 -o alsa ...
High Performance MPEG 1.0/2.0/2.5 Audio Player for Layers 1, 2 and 3
	version 1.25.13; written and copyright by Michael Hipp and others
	free software (LGPL) without any warranty but with best wishes
ALSA lib conf.c:3683:(snd_config_hooks_call) Cannot open shared library libasound_module_conf_pulse.so (/gnu/store/nyylgcnzmbw8wrn4sna2crl0g7zxxh33-alsa-lib-1.2.2/lib/alsa-lib/libasound_module_conf_pulse.so: libasound_module_conf_pulse.so: cannot open shared object file: No such file or directory)
ALSA lib pcm.c:2642:(snd_pcm_open_noupdate) Unknown PCM default
[src/libout123/modules/alsa.c:181] error: cannot open device default
[src/libout123/libout123.c:455] error: Found no driver out of [alsa] working with device <default>.
main: [src/mpg123.c:314] error: out123 error 3: failure loading driver module
------




Information forwarded to bug-guix <at> gnu.org:
bug#40832; Package guix. (Fri, 08 May 2020 22:46:01 GMT) Full text and rfc822 format available.

Message #25 received at 40832 <at> debbugs.gnu.org (full text, mbox):

From: Leo Famulari <leo <at> famulari.name>
To: 40832 <at> debbugs.gnu.org
Subject: Re: bug#40832: Audacity does not work with PulseAudio
Date: Fri, 8 May 2020 18:45:18 -0400
[Message part 1 (text/plain, inline)]
An update on this:

To begin, I installed alsa-plugins and alsa-plugins:pulseaudio and
configured the build of alsa-lib like this:

"--with-plugindir=/var/guix/profiles/per-user/leo/guix-profile/lib/alsa-lib"

Everything worked that way, but obviously it's not a solution.

Now, I am working on making alsa-lib respect ALSA_PLUGIN_DIRS, which
would be a search path specified by packages that provide ALSA plugins,
such as alsa-plugins. However, so far my attempt fails in another part
of alsa-lib, like this:

------
$ mpg123 -o alsa ~/file.mp3
ALSA lib dlmisc.c:204:(snd_dlsym_verify) unable to verify version for symbol conf_pulse_hook_load_if_running
ALSA lib conf.c:3686:(snd_config_hooks_call) symbol conf_pulse_hook_load_if_running is not defined inside libasound_module_conf_pulse.so
ALSA lib pcm.c:2685:(snd_pcm_open_noupdate) Unknown PCM default
[src/libout123/modules/alsa.c:181] error: cannot open device default
[src/libout123/libout123.c:455] error: Found no driver out of [alsa] working with device <default>.
main: [src/mpg123.c:314] error: out123 error 3: failure loading driver module
------

I don't know why snd_dlsym_verify fails with my patch but succeeds when
using '--with-plugindir'.

My current patch is attached...
[alsa-lib-plugin-dirs.patch (text/plain, attachment)]
[signature.asc (application/pgp-signature, inline)]

Information forwarded to bug-guix <at> gnu.org:
bug#40832; Package guix. (Sat, 09 May 2020 05:25:02 GMT) Full text and rfc822 format available.

Message #28 received at 40832 <at> debbugs.gnu.org (full text, mbox):

From: Leo Famulari <leo <at> famulari.name>
To: 40832 <at> debbugs.gnu.org
Subject: Re: bug#40832: Audacity does not work with PulseAudio
Date: Sat, 9 May 2020 01:24:15 -0400
[Message part 1 (text/plain, inline)]
On Fri, May 08, 2020 at 06:45:18PM -0400, Leo Famulari wrote:
> My current patch is attached...

I already found a lot of problems with patch 3/3... Don't look too
closely at it :)
[signature.asc (application/pgp-signature, inline)]

Information forwarded to bug-guix <at> gnu.org:
bug#40832; Package guix. (Sat, 16 May 2020 19:35:01 GMT) Full text and rfc822 format available.

Message #31 received at 40832 <at> debbugs.gnu.org (full text, mbox):

From: Leo Famulari <leo <at> famulari.name>
To: 40832 <at> debbugs.gnu.org
Subject: [PATCH 2/2] gnu: Help alsa-lib find its plugins on foreign distros.
Date: Sat, 16 May 2020 15:34:01 -0400
Fixes <https://bugs.gnu.org/40832>.

* gnu/packages/linux.scm (alsa-lib)[replacement]: New field.
(alsa-lib/fixed): New variable.
* gnu/packages/patches/alsa-lib-plugin-dirs.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
---
 gnu/local.mk                                  |   1 +
 gnu/packages/linux.scm                        |  10 ++
 .../patches/alsa-lib-plugin-dirs.patch        | 149 ++++++++++++++++++
 3 files changed, 160 insertions(+)
 create mode 100644 gnu/packages/patches/alsa-lib-plugin-dirs.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 39267f2765..78e63fe7ff 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -741,6 +741,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/akonadi-not-relocatable.patch		\
   %D%/packages/patches/akonadi-timestamps.patch		\
   %D%/packages/patches/allegro-mesa-18.2.5-and-later.patch	\
+  %D%/packages/patches/alsa-lib-plugin-dirs.patch		\
   %D%/packages/patches/amule-crypto-6.patch			\
   %D%/packages/patches/anki-mpv-args.patch			\
   %D%/packages/patches/antiword-CVE-2014-8123.patch			\
diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 4fb29b8490..8ea5bb909a 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -1771,6 +1771,7 @@ intercept and print the system calls executed by the program.")
 (define-public alsa-lib
   (package
     (name "alsa-lib")
+    (replacement alsa-lib/fixed)
     (version "1.2.2")
     (source (origin
              (method url-fetch)
@@ -1792,6 +1793,15 @@ intercept and print the system calls executed by the program.")
 MIDI functionality to the Linux-based operating system.")
     (license license:lgpl2.1+)))
 
+(define alsa-lib/fixed
+  (package
+    (inherit alsa-lib)
+    (source (origin
+              (inherit (package-source alsa-lib))
+              (patches (append
+                         (origin-patches (package-source alsa-lib))
+                         (search-patches "alsa-lib-plugin-dirs.patch")))))))
+
 (define-public alsa-utils
   (package
     (name "alsa-utils")
diff --git a/gnu/packages/patches/alsa-lib-plugin-dirs.patch b/gnu/packages/patches/alsa-lib-plugin-dirs.patch
new file mode 100644
index 0000000000..0d6cb57f4e
--- /dev/null
+++ b/gnu/packages/patches/alsa-lib-plugin-dirs.patch
@@ -0,0 +1,149 @@
+From 5bc1a490fa68187bce15eb9e8305b88ff6fbdbe5 Mon Sep 17 00:00:00 2001
+From: Leo Famulari <leo <at> famulari.name>
+Date: Mon, 27 Apr 2020 13:09:54 -0400
+Subject: [PATCH] Search for plugins in $GUIX_ALSA_PLUGIN_DIRS.
+
+* src/control/control.c (snd_ctl_open_conf): If ALSA plugins cannot be found in
+the default locations, look in the directories in $GUIX_ALSA_PLUGIN_DIRS.
+* src/dlmisc.c (snd_dlopen): Likewise.
+* src/pcm/pcm.c (snd_pcm_open_conf): Likewise.
+---
+ src/control/control.c | 35 ++++++++++++++++++++++++++++++++++-
+ src/dlmisc.c          | 26 +++++++++++++++++++++-----
+ src/pcm/pcm.c         | 35 ++++++++++++++++++++++++++++++++++-
+ 3 files changed, 89 insertions(+), 7 deletions(-)
+
+diff --git a/src/control/control.c b/src/control/control.c
+index 27f42135..108a560b 100644
+--- a/src/control/control.c
++++ b/src/control/control.c
+@@ -1342,8 +1342,41 @@ static int snd_ctl_open_conf(snd_ctl_t **ctlp, const char *name,
+ 				err = -ENOMEM;
+ 				goto _err;
+ 			}
++			sprintf(buf1, "%s/libasound_module_pcm_%s.so", ALSA_PLUGIN_DIR, str);
++			if (access(buf1, F_OK) != 0) {
++				const char *plugindirs = getenv("GUIX_ALSA_PLUGIN_DIRS");
++
++				if (plugindirs) {
++					char *plugindirs_copy = alloca(strlen(plugindirs) + 1);
++					if (plugindirs_copy == NULL) {
++						err = -ENOMEM;
++						goto _err;
++					}
++					strcpy(plugindirs_copy, plugindirs);
++					char *saveptr;
++					while (1) {
++						char *dir_tok = strtok_r(plugindirs_copy, ":", &saveptr);
++						if (dir_tok == NULL)
++							break;
++						char *so_file = malloc(strlen(dir_tok) + 1 + strlen(str) + 32);
++						if (so_file == NULL) {
++							err = -ENOMEM;
++							goto _err;
++						}
++
++						sprintf(so_file, "%s/libasound_module_ctl_%s.so", dir_tok, str);
++
++						if (access(so_file, F_OK) == 0) {
++							buf1 = so_file;
++							break;
++						} else {
++							free (so_file);
++						}
++						plugindirs_copy = NULL;
++					}
++				}
++			}
+ 			lib = buf1;
+-			sprintf(buf1, "%s/libasound_module_ctl_%s.so", ALSA_PLUGIN_DIR, str);
+ 		}
+ 	}
+ #ifndef PIC
+diff --git a/src/dlmisc.c b/src/dlmisc.c
+index 8c8f3ff7..b115447c 100644
+--- a/src/dlmisc.c
++++ b/src/dlmisc.c
+@@ -82,11 +82,27 @@ void *snd_dlopen(const char *name, int mode, char *errbuf, size_t errbuflen)
+ 	char *filename = NULL;
+ 
+ 	if (name && name[0] != '/') {
+-		filename = alloca(sizeof(ALSA_PLUGIN_DIR) + 1 + strlen(name) + 1);
+-		if (filename) {
+-			strcpy(filename, ALSA_PLUGIN_DIR);
+-			strcat(filename, "/");
+-			strcat(filename, name);
++		const char *plugindirs = getenv("GUIX_ALSA_PLUGIN_DIRS");
++		if (plugindirs) {
++			char *plugindirs_copy = alloca(strlen(plugindirs) + 1);
++			if (plugindirs_copy == NULL)
++				goto errpath;
++			strcpy(plugindirs_copy, plugindirs);
++			char *saveptr;
++			while (1) {
++				char *dir_tok = strtok_r(plugindirs_copy, ":", &saveptr);
++				if (dir_tok == NULL)
++					break;
++				char *sofilename = malloc(strlen(dir_tok) + 1 + strlen(name) + 1);
++				sprintf(sofilename, "%s/%s" ,dir_tok, name);
++				if (access(sofilename, F_OK) == 0) {
++					filename = sofilename;
++					break;
++				} else {
++					free (sofilename);
++				}
++				plugindirs_copy = NULL;
++			}
+ 			handle = dlopen(filename, mode);
+ 			if (!handle) {
+ 				/* if the filename exists and cannot be opened */
+diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c
+index 1064044c..90ba00ac 100644
+--- a/src/pcm/pcm.c
++++ b/src/pcm/pcm.c
+@@ -2578,8 +2578,41 @@ static int snd_pcm_open_conf(snd_pcm_t **pcmp, const char *name,
+ 				err = -ENOMEM;
+ 				goto _err;
+ 			}
+-			lib = buf1;
+ 			sprintf(buf1, "%s/libasound_module_pcm_%s.so", ALSA_PLUGIN_DIR, str);
++			if (access(buf1, F_OK) != 0) {
++				const char *plugindirs = getenv("GUIX_ALSA_PLUGIN_DIRS");
++
++				if (plugindirs) {
++					char *plugindirs_copy = alloca(strlen(plugindirs) + 1);
++					if (plugindirs_copy == NULL) {
++						err = -ENOMEM;
++						goto _err;
++					}
++					strcpy(plugindirs_copy, plugindirs);
++					char *saveptr;
++					while (1) {
++						char *dir_tok = strtok_r(plugindirs_copy, ":", &saveptr);
++						if (dir_tok == NULL)
++							break;
++						char *so_file = malloc(strlen(dir_tok) + 1 + strlen(str) + 32);
++						if (so_file == NULL) {
++							err = -ENOMEM;
++							goto _err;
++						}
++
++						sprintf(so_file, "%s/libasound_module_pcm_%s.so", dir_tok, str);
++
++						if (access(so_file, F_OK) == 0) {
++							buf1 = so_file;
++							break;
++						} else {
++							free (so_file);
++						}
++						plugindirs_copy = NULL;
++					}
++				}
++			}
++			lib = buf1;
+ 		}
+ 	}
+ #ifndef PIC
+-- 
+2.26.2
+
-- 
2.26.2





Information forwarded to bug-guix <at> gnu.org:
bug#40832; Package guix. (Sat, 16 May 2020 19:35:02 GMT) Full text and rfc822 format available.

Message #34 received at 40832 <at> debbugs.gnu.org (full text, mbox):

From: Leo Famulari <leo <at> famulari.name>
To: 40832 <at> debbugs.gnu.org
Subject: [PATCH 1/2] gnu: alsa-plugins: Add GUIX_ALSA_PLUGIN_DIRS search path
 specification.
Date: Sat, 16 May 2020 15:34:00 -0400
* gnu/packages/linux.scm (alsa-plugins)[native-search-paths]: New field.
---
 gnu/packages/linux.scm | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 40323a85d6..4fb29b8490 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -1858,6 +1858,10 @@ MIDI functionality to the Linux-based operating system.")
               (base32
                "0z9k3ssbfk2ky2w13avgyf202j1drsz9sv3834bp33cj1i2hc3qw"))))
     (build-system gnu-build-system)
+    (native-search-paths
+      (list (search-path-specification
+              (variable "GUIX_ALSA_PLUGIN_DIRS")
+              (files '("lib/alsa-lib")))))
     ;; TODO: Split libavcodec and speex if possible. It looks like they can not
     ;; be split, there are references to both in files.
     ;; TODO: Remove OSS related plugins, they add support to run native
-- 
2.26.2





Information forwarded to bug-guix <at> gnu.org:
bug#40832; Package guix. (Sat, 16 May 2020 19:35:02 GMT) Full text and rfc822 format available.

Message #37 received at 40832 <at> debbugs.gnu.org (full text, mbox):

From: Leo Famulari <leo <at> famulari.name>
To: 40832 <at> debbugs.gnu.org
Subject: [PATCH 0/2] Help alsa-lib find its plugins
Date: Sat, 16 May 2020 15:33:59 -0400
These patches work well for me on Debian. I'm currently reconfiguring my
Guix System machine to test them here. Feedback welcome

Leo Famulari (2):
  gnu: alsa-plugins: Add GUIX_ALSA_PLUGIN_DIRS search path
    specification.
  gnu: Help alsa-lib find its plugins on foreign distros.

 gnu/local.mk                                  |   1 +
 gnu/packages/linux.scm                        |  14 ++
 .../patches/alsa-lib-plugin-dirs.patch        | 149 ++++++++++++++++++
 3 files changed, 164 insertions(+)
 create mode 100644 gnu/packages/patches/alsa-lib-plugin-dirs.patch

-- 
2.26.2





Information forwarded to bug-guix <at> gnu.org:
bug#40832; Package guix. (Sun, 17 May 2020 18:20:01 GMT) Full text and rfc822 format available.

Message #40 received at 40832 <at> debbugs.gnu.org (full text, mbox):

From: Leo Famulari <leo <at> famulari.name>
To: 40832 <at> debbugs.gnu.org
Subject: Re: [PATCH 0/2] Help alsa-lib find its plugins
Date: Sun, 17 May 2020 14:19:07 -0400
On Sat, May 16, 2020 at 03:33:59PM -0400, Leo Famulari wrote:
> These patches work well for me on Debian. I'm currently reconfiguring my
> Guix System machine to test them here. Feedback welcome

I tested this on Guix System and it does not interfere with the
default alsa-service, which sets up /etc/asound.conf

I'd like to push this to master soon-ish, with a followup ungraft on
staging.




Information forwarded to bug-guix <at> gnu.org:
bug#40832; Package guix. (Tue, 28 Jul 2020 10:54:01 GMT) Full text and rfc822 format available.

Message #43 received at 40832 <at> debbugs.gnu.org (full text, mbox):

From: Danny Milosavljevic <dannym <at> scratchpost.org>
To: 40832 <at> debbugs.gnu.org
Subject: alsa-lib cannot find its plugins
Date: Tue, 28 Jul 2020 12:52:41 +0200
[Message part 1 (text/plain, inline)]
Hi Leo,

some comments on the lastest patch:

* The entire alsa-lib seems to use the idiom "malloc and then strcpy", or
"malloc and then sprintf", or, worse, "malloc, strcpy and multiple strcat".
These are a buffer overflow waiting to happen (when changing part of those
while doing ongoing maintenance;  also the places where they use "+" is not
checked for overflow).  That said, if they do it, we can do it that way, too.
* The environment variable GUIX_ALSA_PLUGIN_DIRS is only checked if the
respective file does not exist in alsa-lib.  That is not how environment
variables usually work--it should be possible to override built-in things
by setting this environment variable, too.
* Instead of alloca and strcpy, can just use strdupa.
* strtok_r man page states that the first argument should be NULL on the
non-first calls.  You do that already, but maybe add a comment why that
is done where it's set to NULL.
* strtok_r man page states that "On some implementations, *saveptr is required
to be NULL on  the first call to strtok_r() that is being used to parse str.".
So I'd use "char* saveptr = NULL;"
* Instead of malloc and sprintf, could just use asprintf.  But they don't,
so let's not either, for easier review.  Also, magical value 32... sigh.
Well, they do it, too.
* If GUIX_ALSA_PLUGIN_DIRS contained for example "a:" then it would search
"a" and "/", right?  OK as long as we want that.

Otherwise LGTM!
[Message part 2 (application/pgp-signature, inline)]

Information forwarded to bug-guix <at> gnu.org:
bug#40832; Package guix. (Tue, 28 Jul 2020 10:57:01 GMT) Full text and rfc822 format available.

Message #46 received at 40832 <at> debbugs.gnu.org (full text, mbox):

From: Danny Milosavljevic <dannym <at> scratchpost.org>
To: 40832 <at> debbugs.gnu.org
Subject: Re: alsa-lib cannot find its plugins
Date: Tue, 28 Jul 2020 12:56:19 +0200
[Message part 1 (text/plain, inline)]
* src/control/control.c patch uses ALSA_PLUGIN_DIR and then, if necessary,
GUIX_ALSA_PLUGIN_DIRS.  But src/dlmisc.c uses only GUIX_ALSA_PLUGIN_DIRS,
no ALSA_PLUGIN_DIR. src/pcm/pcm.c uses ALSA_PLUGIN_DIR and then, if necessary,
GUIX_ALSA_PLUGIN_DIRS.  Is that discrepancy on purpose?
[Message part 2 (application/pgp-signature, inline)]

Information forwarded to bug-guix <at> gnu.org:
bug#40832; Package guix. (Tue, 28 Jul 2020 23:57:01 GMT) Full text and rfc822 format available.

Message #49 received at 40832 <at> debbugs.gnu.org (full text, mbox):

From: Leo Famulari <leo <at> famulari.name>
To: Danny Milosavljevic <dannym <at> scratchpost.org>
Cc: 40832 <at> debbugs.gnu.org
Subject: Re: bug#40832: alsa-lib cannot find its plugins
Date: Tue, 28 Jul 2020 19:56:23 -0400
[Message part 1 (text/plain, inline)]
On Tue, Jul 28, 2020 at 12:52:41PM +0200, Danny Milosavljevic wrote:
> some comments on the lastest patch:

Thank you for reviewing the patch!

> * The entire alsa-lib seems to use the idiom "malloc and then strcpy", or
> "malloc and then sprintf", or, worse, "malloc, strcpy and multiple strcat".
> These are a buffer overflow waiting to happen (when changing part of those
> while doing ongoing maintenance;  also the places where they use "+" is not
> checked for overflow).  That said, if they do it, we can do it that way, too.

This confirms what I felt — it's hard to feel confident about the bounds
checking in this code. It seems to be based on the names of the plugin
libraries not exceeding some magic length. It's hard to balance "doing
the right thing" and using upstream's idioms.

When writing the patch, my investigation into the code made decide that
it would not overflow, but now I don't remember why I thought that.

> * The environment variable GUIX_ALSA_PLUGIN_DIRS is only checked if the
> respective file does not exist in alsa-lib.  That is not how environment
> variables usually work--it should be possible to override built-in things
> by setting this environment variable, too.

Good point. I don't remember now if I specifically decided to do things
this way or if it was a side effect of where I inserted the new code.

> * Instead of alloca and strcpy, can just use strdupa.

I didn't know about this function, thanks.

> * strtok_r man page states that the first argument should be NULL on the
> non-first calls.  You do that already, but maybe add a comment why that
> is done where it's set to NULL.

Right.

> * strtok_r man page states that "On some implementations, *saveptr is required
> to be NULL on  the first call to strtok_r() that is being used to parse str.".
> So I'd use "char* saveptr = NULL;"

My Linux 4.16 man pages from Debian don't contain this note. Good to
know!

> * Instead of malloc and sprintf, could just use asprintf.  But they don't,
> so let's not either, for easier review.  Also, magical value 32... sigh.
> Well, they do it, too.

Right...

> * If GUIX_ALSA_PLUGIN_DIRS contained for example "a:" then it would search
> "a" and "/", right?  OK as long as we want that.

I don't remember how it behaves anymore... I'll look into this and
decide.

Thanks again for the review!
[signature.asc (application/pgp-signature, inline)]

Information forwarded to bug-guix <at> gnu.org:
bug#40832; Package guix. (Tue, 28 Jul 2020 23:57:02 GMT) Full text and rfc822 format available.

Message #52 received at 40832 <at> debbugs.gnu.org (full text, mbox):

From: Leo Famulari <leo <at> famulari.name>
To: Danny Milosavljevic <dannym <at> scratchpost.org>
Cc: 40832 <at> debbugs.gnu.org
Subject: Re: bug#40832: alsa-lib cannot find its plugins
Date: Tue, 28 Jul 2020 19:56:49 -0400
[Message part 1 (text/plain, inline)]
On Tue, Jul 28, 2020 at 12:56:19PM +0200, Danny Milosavljevic wrote:
> * src/control/control.c patch uses ALSA_PLUGIN_DIR and then, if necessary,
> GUIX_ALSA_PLUGIN_DIRS.  But src/dlmisc.c uses only GUIX_ALSA_PLUGIN_DIRS,
> no ALSA_PLUGIN_DIR. src/pcm/pcm.c uses ALSA_PLUGIN_DIR and then, if necessary,
> GUIX_ALSA_PLUGIN_DIRS.  Is that discrepancy on purpose?

I will look into it, thanks for noticing!
[signature.asc (application/pgp-signature, inline)]

Information forwarded to bug-guix <at> gnu.org:
bug#40832; Package guix. (Wed, 29 Jul 2020 11:20:01 GMT) Full text and rfc822 format available.

Message #55 received at 40832 <at> debbugs.gnu.org (full text, mbox):

From: Danny Milosavljevic <dannym <at> scratchpost.org>
To: Leo Famulari <leo <at> famulari.name>
Cc: 40832 <at> debbugs.gnu.org
Subject: Re: bug#40832: alsa-lib cannot find its plugins
Date: Wed, 29 Jul 2020 13:18:44 +0200
[Message part 1 (text/plain, inline)]
Hi Leo,

On Tue, 28 Jul 2020 19:56:23 -0400
Leo Famulari <leo <at> famulari.name> wrote:

> On Tue, Jul 28, 2020 at 12:52:41PM +0200, Danny Milosavljevic wrote:
> > some comments on the lastest patch:  
> 
> Thank you for reviewing the patch!
> 
> > * The entire alsa-lib seems to use the idiom "malloc and then strcpy", or
> > "malloc and then sprintf", or, worse, "malloc, strcpy and multiple strcat".
> > These are a buffer overflow waiting to happen (when changing part of those
> > while doing ongoing maintenance;  also the places where they use "+" is not
> > checked for overflow).  That said, if they do it, we can do it that way, too.  
> 
> This confirms what I felt — it's hard to feel confident about the bounds
> checking in this code. It seems to be based on the names of the plugin
> libraries not exceeding some magic length. It's hard to balance "doing
> the right thing" and using upstream's idioms.

After thinking about it more, I think it's much worse if the thing that is
stuck into the malloced block is the value of an environment variable.

When it's a compile-time variable you basically trust the code and the
distribution package not to have too-long paths in there that could overflow
the "+" in malloc(... + ).  A distribution or upstream could do much worse
things than that, so that is not a credible threat to worry about.

For a runtime variable like the environment variable (that anyone can set to
anything), I am very much in favor of not using malloc(... + ) and instead
using asprintf, in order to prevent an exploitable buffer overflow just by
setting up an environment variable.

> When writing the patch, my investigation into the code made decide that
> it would not overflow, but now I don't remember why I thought that.

Thanks for that remark.  It made me think and I came to the recommendation
above.
[Message part 2 (application/pgp-signature, inline)]

Information forwarded to bug-guix <at> gnu.org:
bug#40832; Package guix. (Tue, 13 Oct 2020 16:04:02 GMT) Full text and rfc822 format available.

Message #58 received at 40832 <at> debbugs.gnu.org (full text, mbox):

From: Leo Famulari <leo <at> famulari.name>
To: Danny Milosavljevic <dannym <at> scratchpost.org>
Cc: 40832 <at> debbugs.gnu.org
Subject: Re: bug#40832: alsa-lib cannot find its plugins
Date: Tue, 13 Oct 2020 12:02:59 -0400
[Message part 1 (text/plain, inline)]
Upstream has implemented (but not yet released) a potential solution:

https://github.com/alsa-project/alsa-lib/commit/8580c081c25678d11278efcb61bd15cf44d0a225

I haven't tested it yet but my understanding is that it supports
specifying a single plugin directory via the ALSA_PLUGIN_DIR environment
variable.
[signature.asc (application/pgp-signature, inline)]

Reply sent to Leo Famulari <leo <at> famulari.name>:
You have taken responsibility. (Mon, 01 Feb 2021 20:52:02 GMT) Full text and rfc822 format available.

Notification sent to Leo Famulari <leo <at> famulari.name>:
bug acknowledged by developer. (Mon, 01 Feb 2021 20:52:02 GMT) Full text and rfc822 format available.

Message #63 received at 40832-done <at> debbugs.gnu.org (full text, mbox):

From: Leo Famulari <leo <at> famulari.name>
To: Danny Milosavljevic <dannym <at> scratchpost.org>
Cc: 40832-done <at> debbugs.gnu.org
Subject: Re: bug#40832: alsa-lib cannot find its plugins
Date: Mon, 1 Feb 2021 15:51:07 -0500
[Message part 1 (text/plain, inline)]
On Tue, Oct 13, 2020 at 12:02:59PM -0400, Leo Famulari wrote:
> Upstream has implemented (but not yet released) a potential solution:
> 
> https://github.com/alsa-project/alsa-lib/commit/8580c081c25678d11278efcb61bd15cf44d0a225
> 
> I haven't tested it yet but my understanding is that it supports
> specifying a single plugin directory via the ALSA_PLUGIN_DIR environment
> variable.

I'm very happy to report that this fix has been deployed for Guix users
in commit ed1c72c3d7d6b6d3b110817fcc037cd5582ac848
[signature.asc (application/pgp-signature, inline)]

bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Tue, 02 Mar 2021 12:24:07 GMT) Full text and rfc822 format available.

This bug report was last modified 3 years and 27 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.