[Pkg-alsa-devel] Bug#870396: alsa-lib: fix SIGSEGV on x32 (and a minor typo in the testsuite)

Thorsten Glaser tg at mirbsd.de
Tue Aug 1 16:18:59 UTC 2017


Source: alsa-lib
Version: 1.1.3-5
Severity: important
Tags: patch

I was a bit annoyed I could not play any sound on my x32 desktop
any more and today investigated it. It boils down to that amd64
assembly code was run, which, of course, cannot work.

While the fix for that (0011-distinguish-x32-from-amd64.patch)
turned out to be a one-liner, I recognised further problems that
appear on all “new” 32-bit architectures added to Linux because
of them using a 64-bit time_t, so 0009-fix-format-strings.patch
was added.

Finally, I found a minor typo 0010-fix-testcase-typo.patch while
investigating compiler warnings caused by what is fixed by 0009.

Please apply them all *and* submit them *all* upstream. In the
meantime, I’ve uploaded a package built from the attached debdiff
to unreleased, but that will, of course, unsync M-A, which is not
the desirable thing to have.

Thanks!

This work was sponsored by ⮡ tarent

-- System Information:
Debian Release: buster/sid
  APT prefers unreleased
  APT policy: (500, 'unreleased'), (500, 'buildd-unstable'), (500, 'unstable')
Architecture: x32 (x86_64)
Foreign Architectures: i386, amd64

Kernel: Linux 4.11.0-1-amd64 (SMP w/8 CPU cores)
Locale: LANG=C, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8), LANGUAGE=C (charmap=UTF-8)
Shell: /bin/sh linked to /bin/lksh
Init: sysvinit (via /sbin/init)
-------------- next part --------------
diff -Nru alsa-lib-1.1.3/debian/changelog alsa-lib-1.1.3/debian/changelog
--- alsa-lib-1.1.3/debian/changelog	2017-02-13 20:12:05.000000000 +0100
+++ alsa-lib-1.1.3/debian/changelog	2017-08-01 17:47:16.000000000 +0200
@@ -1,3 +1,10 @@
+alsa-lib (1.1.3-5+x32.1) unreleased; urgency=medium
+
+  * Non-maintainer upload.
+  * Add patches fixing sound on x32.
+
+ -- Thorsten Glaser <tg at mirbsd.de>  Tue, 01 Aug 2017 17:47:16 +0200
+
 alsa-lib (1.1.3-5) unstable; urgency=medium
 
   [ Jordi Mallach ]
diff -Nru alsa-lib-1.1.3/debian/patches/0009-fix-format-strings.patch alsa-lib-1.1.3/debian/patches/0009-fix-format-strings.patch
--- alsa-lib-1.1.3/debian/patches/0009-fix-format-strings.patch	1970-01-01 01:00:00.000000000 +0100
+++ alsa-lib-1.1.3/debian/patches/0009-fix-format-strings.patch	2017-08-01 17:45:18.000000000 +0200
@@ -0,0 +1,71 @@
+# DP: fix long vs. long long confusion when there is a 64-bit time_t
+# DP: on a 32-bit long system, such as all newer 32-bit architectures
+
+--- a/src/pcm/pcm.c
++++ b/src/pcm/pcm.c
+@@ -2188,10 +2188,10 @@ int snd_pcm_status_dump(snd_pcm_status_t
+ {
+ 	assert(status);
+ 	snd_output_printf(out, "  state       : %s\n", snd_pcm_state_name((snd_pcm_state_t) status->state));
+-	snd_output_printf(out, "  trigger_time: %ld.%06ld\n",
+-		status->trigger_tstamp.tv_sec, status->trigger_tstamp.tv_nsec);
+-	snd_output_printf(out, "  tstamp      : %ld.%06ld\n",
+-		status->tstamp.tv_sec, status->tstamp.tv_nsec);
++	snd_output_printf(out, "  trigger_time: %lld.%06ld\n",
++		(long long)status->trigger_tstamp.tv_sec, (long)status->trigger_tstamp.tv_nsec);
++	snd_output_printf(out, "  tstamp      : %lld.%06ld\n",
++		(long long)status->tstamp.tv_sec, (long)status->tstamp.tv_nsec);
+ 	snd_output_printf(out, "  delay       : %ld\n", (long)status->delay);
+ 	snd_output_printf(out, "  avail       : %ld\n", (long)status->avail);
+ 	snd_output_printf(out, "  avail_max   : %ld\n", (long)status->avail_max);
+--- a/test/latency.c
++++ b/test/latency.c
+@@ -325,12 +325,12 @@ void setscheduler(void)
+ 	printf("!!!Scheduler set to Round Robin with priority %i FAILED!!!\n", sched_param.sched_priority);
+ }
+ 
+-long timediff(snd_timestamp_t t1, snd_timestamp_t t2)
++long long timediff(snd_timestamp_t t1, snd_timestamp_t t2)
+ {
+-	signed long l;
++	signed long long l;
+ 
+ 	t1.tv_sec -= t2.tv_sec;
+-	l = (signed long) t1.tv_usec - (signed long) t2.tv_usec;
++	l = (signed long long) t1.tv_usec - (signed long long) t2.tv_usec;
+ 	if (l < 0) {
+ 		t1.tv_sec--;
+ 		l = 1000000 + l;
+@@ -682,10 +682,10 @@ int main(int argc, char *argv[])
+ 		snd_pcm_nonblock(phandle, !block ? 1 : 0);
+ 		if (ok) {
+ #if 1
+-			printf("Playback time = %li.%i, Record time = %li.%i, diff = %li\n",
+-			       p_tstamp.tv_sec,
++			printf("Playback time = %lli.%i, Record time = %lli.%i, diff = %lli\n",
++			       (long long)p_tstamp.tv_sec,
+ 			       (int)p_tstamp.tv_usec,
+-			       c_tstamp.tv_sec,
++			       (long long)c_tstamp.tv_sec,
+ 			       (int)c_tstamp.tv_usec,
+ 			       timediff(p_tstamp, c_tstamp));
+ #endif
+--- a/test/queue_timer.c
++++ b/test/queue_timer.c
+@@ -99,11 +99,11 @@ main(int argc ATTRIBUTE_UNUSED, char **a
+ 	normalize(&diffdiff);
+ 	prevdiff = diff;
+ 
+-	fprintf(stderr, " real time: %12ld sec %8ld usec\nqueue time: %12ld sec %8ld usec\n      diff: %12ld sec %8ld usec\n  diffdiff: %12ld sec %8ld usec\n",
+-		tv.tv_sec, tv.tv_usec,
+-		(long)rtime->tv_sec, (long)rtime->tv_nsec / 1000,
+-		diff.tv_sec, diff.tv_usec,
+-		(long)diffdiff.tv_sec, (long)diffdiff.tv_usec);
++	fprintf(stderr, " real time: %12lld sec %8ld usec\nqueue time: %12lld sec %8ld usec\n      diff: %12lld sec %8ld usec\n  diffdiff: %12lld sec %8ld usec\n",
++		(long long)tv.tv_sec, (long)tv.tv_usec,
++		(long long)rtime->tv_sec, (long)rtime->tv_nsec / 1000,
++		(long long)diff.tv_sec, (long)diff.tv_usec,
++		(long long)diffdiff.tv_sec, (long)diffdiff.tv_usec);
+ 
+ 	if (diffdiff.tv_usec >  5000 ||
+ 	    diffdiff.tv_usec < -5000) {
diff -Nru alsa-lib-1.1.3/debian/patches/0010-fix-testcase-typo.patch alsa-lib-1.1.3/debian/patches/0010-fix-testcase-typo.patch
--- alsa-lib-1.1.3/debian/patches/0010-fix-testcase-typo.patch	1970-01-01 01:00:00.000000000 +0100
+++ alsa-lib-1.1.3/debian/patches/0010-fix-testcase-typo.patch	2017-08-01 17:45:25.000000000 +0200
@@ -0,0 +1,13 @@
+# DP: fix an obvious typo
+
+--- a/test/latency.c
++++ b/test/latency.c
+@@ -673,7 +673,7 @@ int main(int argc, char *argv[])
+ 		printf("Capture:\n");
+ 		showstat(chandle, frames_in);
+ 		showinmax(in_max);
+-		if (p_tstamp.tv_sec == p_tstamp.tv_sec &&
++		if (p_tstamp.tv_sec == c_tstamp.tv_sec &&
+ 		    p_tstamp.tv_usec == c_tstamp.tv_usec)
+ 			printf("Hardware sync\n");
+ 		snd_pcm_drop(chandle);
diff -Nru alsa-lib-1.1.3/debian/patches/0011-distinguish-x32-from-amd64.patch alsa-lib-1.1.3/debian/patches/0011-distinguish-x32-from-amd64.patch
--- alsa-lib-1.1.3/debian/patches/0011-distinguish-x32-from-amd64.patch	1970-01-01 01:00:00.000000000 +0100
+++ alsa-lib-1.1.3/debian/patches/0011-distinguish-x32-from-amd64.patch	2017-08-01 17:47:06.000000000 +0200
@@ -0,0 +1,14 @@
+# DP: fix segmentation fault coming from this using amd64 assembly code
+# DP: on x32 systems
+
+--- a/src/pcm/pcm_dmix.c
++++ b/src/pcm/pcm_dmix.c
+@@ -142,7 +142,7 @@ static void dmix_server_free(snd_pcm_dir
+ #include "pcm_dmix_generic.c"
+ #if defined(__i386__)
+ #include "pcm_dmix_i386.c"
+-#elif defined(__x86_64__)
++#elif defined(__x86_64__) && !defined(__ILP32__)
+ #include "pcm_dmix_x86_64.c"
+ #else
+ #ifndef DOC_HIDDEN
diff -Nru alsa-lib-1.1.3/debian/patches/series alsa-lib-1.1.3/debian/patches/series
--- alsa-lib-1.1.3/debian/patches/series	2017-01-24 17:35:03.000000000 +0100
+++ alsa-lib-1.1.3/debian/patches/series	2017-08-01 17:46:09.000000000 +0200
@@ -6,3 +6,6 @@
 0006-Enabled-extended-namehints-in-alsa.conf.patch
 0007-Add-a-configuration-for-tegra-alc5632-based-cards.patch
 0008-topology-Fix-incorrect-license-in-source-comments.patch
+0009-fix-format-strings.patch
+0010-fix-testcase-typo.patch
+0011-distinguish-x32-from-amd64.patch


More information about the Pkg-alsa-devel mailing list