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

Thorsten Glaser tg at debian.org
Sat Dec 22 19:56:22 GMT 2018


(For alsa-devel at alsa-project.org I’ve attached the diffs this
eMail thread has been about, with hope you will apply them in
the next upstream release.)


Elimar Riesebieter dixit:

>it seems that you are an exclusive user of the x32 port ;-) Please

If you actually read that thread you’d know I’m not. (I wrote some
eMails to it, too.)

>Does it really make sense to maintain code for a handful of users?

It’s nothing architecture-specific if I recall, so it will reduce
the chance of problems for all users.

Lemme dissect the patch…

0009-fix-format-strings.patch: fixes, basically, this…

	printf("%ld", some_long_long_value);

… which is always an error, on platforms where time_t is larger
than long (which is currently all *64ilp32 platforms (there’s
x32, amd64ilp32, and a third one I forgot, already in existence),
but *will* encompass all ILP32 architectures as we get closer to
the year 2038).

0010-fix-testcase-typo.patch: not actually x32-related, but
noticed during porting.

0011-distinguish-x32-from-amd64.patch: this is the most important
one, and it’s a frigging oneliner:

-#elif defined(__x86_64__)
+#elif defined(__x86_64__) && !defined(__ILP32__)

This one literally only affects x32, indeed (so what I said above
was proven misremembered) but it’s obviously non-harmful to anything
else and easy to carry and forward.

So I’d wish you’d do that as it’s your duty as maintainer of a Debian
package, but alas… I’ll Cc the eMail address you told me and hope
that someone picks it up.

Blessed yuletide,
//mirabilos
-- 
“It is inappropriate to require that a time represented as
 seconds since the Epoch precisely represent the number of
 seconds between the referenced time and the Epoch.”
	-- IEEE Std 1003.1b-1993 (POSIX) Section B.2.2.2
-------------- next part --------------
# 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
@@ -2257,11 +2257,11 @@ 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 / 1000);
-	snd_output_printf(out, "  tstamp      : %ld.%06ld\n",
-		status->tstamp.tv_sec, status->tstamp.tv_nsec / 1000);
+	snd_output_printf(out, "  trigger_time: %lld.%06ld\n",
+			  (long long)status->trigger_tstamp.tv_sec,
+			  (long)status->trigger_tstamp.tv_nsec / 1000L);
+	snd_output_printf(out, "  tstamp      : %lld.%06ld\n",
+		(long long)status->tstamp.tv_sec, (long)status->tstamp.tv_nsec / 1000L);
 	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) {
-------------- next part --------------
# 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);
-------------- next part --------------
# 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


More information about the Pkg-alsa-devel mailing list