[alsa-devel] [PATCH] fix segfault on x32, 64-bit time_t-related format strings

Takashi Iwai tiwai at suse.de
Thu Nov 21 09:11:20 CET 2019


On Wed, 20 Nov 2019 21:51:14 +0100,
Thorsten Glaser wrote:
> 
> Hi everyone,
> 
> here are two patches I’ve been rebasing with each new upload
> of alsa-lib to Debian to make things work for my x32 desktop.
> 
> The small one fixes it misdetecting x32 as amd64, which leads
> to an immediate segfault.
> 
> The other one fixes issues related to printing time_t values
> on platforms where time_t is 64 bit wide and long 32 bit wide
> (various BSDs and all new 32-bit and *64ilp32 Linux platforms).
> 
> The Debian packager of alsa-lib hasn’t found it necessary to
> forward them upstream, so I’m doing it with this. I hope they
> can be included in the next releases. The patches were last
> updated for 1.1.8 although I need to update them to 1.1.9 which
> was recently introduced to Debian… usually they apply still.

Could you split these changes to separate patches?  They are for
different purposes.

Also, using time_t would be better if possible.  Unfortunately a cast
is needed for printf usage, but other than that, time_t would leave us
the right size.


thanks,

Takashi


> 
> Thanks in advance,
> //mirabilos
> -- 
> tarent solutions GmbH
> Rochusstraße 2-4, D-53123 Bonn • http://www.tarent.de/
> Tel: +49 228 54881-393 • Fax: +49 228 54881-235
> HRB 5168 (AG Bonn) • USt-ID (VAT): DE122264941
> Geschäftsführer: Dr. Stefan Barth, Kai Ebenrett, Boris Esser, Alexander Steeg
> 
> **********
> 
> Mit der tarent Academy bieten wir auch Trainings und Schulungen in den
> Bereichen Softwareentwicklung, Agiles Arbeiten und Zukunftstechnologien an.
> 
> Besuchen Sie uns auf www.tarent.de/academy. Wir freuen uns auf Ihren Kontakt.
> 
> **********
> # 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) {
> # 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
> @@ -145,7 +145,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
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> https://mailman.alsa-project.org/mailman/listinfo/alsa-devel


More information about the Alsa-devel mailing list