ALSA: core: fix 64-bit SNDRV_PCM_IOCTL_STATUS ABI breakage
authorClemens Ladisch <clemens@ladisch.de>
Sat, 27 Oct 2012 19:55:27 +0000 (21:55 +0200)
committerTakashi Iwai <tiwai@suse.de>
Sun, 28 Oct 2012 08:52:37 +0000 (09:52 +0100)
Commit 4eeaaeaea (ALSA: core: add hooks for audio timestamps) added the
new audio_tstamp field to struct snd_pcm_status.  However, struct
timespec requires 64-bit alignment, so the 64-bit compiler would insert
32 bits of padding before this field, which broke SNDRV_PCM_IOCTL_STATUS
with error messages like this:

  kernel: unknown ioctl = 0x80984120

To solve this, insert the padding explicitly so that it can be taken
into account when calculating the ABI structure size.

Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/uapi/sound/asound.h
sound/core/pcm_compat.c

index 85b2e4dde8838f195ace2f8be230f2c3f64d4bf9..515b8fcd1ca9a1cb6ea85b51ca530a9bb8428473 100644 (file)
@@ -407,8 +407,9 @@ struct snd_pcm_status {
        snd_pcm_uframes_t avail_max;    /* max frames available on hw since last status */
        snd_pcm_uframes_t overrange;    /* count of ADC (capture) overrange detections from last status */
        snd_pcm_state_t suspended_state; /* suspended stream state */
+       __u32 reserved_alignment;       /* must be filled with zero */
        struct timespec audio_tstamp;   /* from sample counter or wall clock */
-       unsigned char reserved[60-sizeof(struct timespec)]; /* must be filled with zero */
+       unsigned char reserved[56-sizeof(struct timespec)]; /* must be filled with zero */
 };
 
 struct snd_pcm_mmap_status {
index af2a3fdb8828f312e8ccc84214b29675a569a00d..af49721ba0e38310183adbe01dcb1f8acaa3d4ab 100644 (file)
@@ -190,8 +190,9 @@ struct snd_pcm_status32 {
        u32 avail_max;
        u32 overrange;
        s32 suspended_state;
+       u32 reserved_alignment;
        struct compat_timespec audio_tstamp;
-       unsigned char reserved[60-sizeof(struct compat_timespec)];
+       unsigned char reserved[56-sizeof(struct compat_timespec)];
 } __attribute__((packed));