OSDN Git Service

ASoC: codecs: ad193x: Fix memory corruption on BE 64b systems
authorCodrin Ciubotariu <codrin.ciubotariu@microchip.com>
Wed, 26 Jun 2019 10:49:46 +0000 (13:49 +0300)
committerMark Brown <broonie@kernel.org>
Wed, 26 Jun 2019 11:26:02 +0000 (12:26 +0100)
Since change_bit() requires unsigned long*, making this cast on an
unsigned int variable will change a wrong bit on BE platforms, causing
memory corruption. Replace this function with a simple XOR.

Fixes: 90f6e6803139 ("ASoC: codecs: ad193x: Fix frame polarity for DSP_A format")
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/ad193x.c

index 96d7cb2..16e2d33 100644 (file)
@@ -241,10 +241,8 @@ static int ad193x_set_dai_fmt(struct snd_soc_dai *codec_dai,
        }
 
        /* For DSP_*, LRCLK's polarity must be inverted */
-       if (fmt & SND_SOC_DAIFMT_DSP_A) {
-               change_bit(ffs(AD193X_DAC_LEFT_HIGH) - 1,
-                          (unsigned long *)&dac_fmt);
-       }
+       if (fmt & SND_SOC_DAIFMT_DSP_A)
+               dac_fmt ^= AD193X_DAC_LEFT_HIGH;
 
        switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
        case SND_SOC_DAIFMT_CBM_CFM: /* codec clk & frm master */