[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