Unverified Commit d864f043 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!9506 usb: gadget: u_audio: Fix race condition use of controls after free during gadget unbind.

parents ad769c03 e5fab04b
Loading
Loading
Loading
Loading
+9 −10
Original line number Diff line number Diff line
@@ -57,13 +57,13 @@ struct uac_rtd_params {

  /* Volume/Mute controls and their state */
  int fu_id; /* Feature Unit ID */
  struct snd_kcontrol *snd_kctl_volume;
  struct snd_kcontrol *snd_kctl_mute;
  struct snd_ctl_elem_id snd_kctl_volume_id;
  struct snd_ctl_elem_id snd_kctl_mute_id;
  s16 volume_min, volume_max, volume_res;
  s16 volume;
  int mute;

	struct snd_kcontrol *snd_kctl_rate; /* read-only current rate */
	struct snd_ctl_elem_id snd_kctl_rate_id; /* read-only current rate */
	int srate; /* selected samplerate */
	int active; /* playback/capture running */

@@ -494,14 +494,13 @@ static inline void free_ep_fback(struct uac_rtd_params *prm, struct usb_ep *ep)
static void set_active(struct uac_rtd_params *prm, bool active)
{
	// notifying through the Rate ctrl
	struct snd_kcontrol *kctl = prm->snd_kctl_rate;
	unsigned long flags;

	spin_lock_irqsave(&prm->lock, flags);
	if (prm->active != active) {
		prm->active = active;
		snd_ctl_notify(prm->uac->card, SNDRV_CTL_EVENT_MASK_VALUE,
				&kctl->id);
				&prm->snd_kctl_rate_id);
	}
	spin_unlock_irqrestore(&prm->lock, flags);
}
@@ -807,7 +806,7 @@ int u_audio_set_volume(struct g_audio *audio_dev, int playback, s16 val)

	if (change)
		snd_ctl_notify(uac->card, SNDRV_CTL_EVENT_MASK_VALUE,
				&prm->snd_kctl_volume->id);
				&prm->snd_kctl_volume_id);

	return 0;
}
@@ -856,7 +855,7 @@ int u_audio_set_mute(struct g_audio *audio_dev, int playback, int val)

	if (change)
		snd_ctl_notify(uac->card, SNDRV_CTL_EVENT_MASK_VALUE,
			       &prm->snd_kctl_mute->id);
			       &prm->snd_kctl_mute_id);

	return 0;
}
@@ -1331,7 +1330,7 @@ int g_audio_setup(struct g_audio *g_audio, const char *pcm_name,
			err = snd_ctl_add(card, kctl);
			if (err < 0)
				goto snd_fail;
			prm->snd_kctl_mute = kctl;
			prm->snd_kctl_mute_id = kctl->id;
			prm->mute = 0;
		}

@@ -1359,7 +1358,7 @@ int g_audio_setup(struct g_audio *g_audio, const char *pcm_name,
			err = snd_ctl_add(card, kctl);
			if (err < 0)
				goto snd_fail;
			prm->snd_kctl_volume = kctl;
			prm->snd_kctl_volume_id = kctl->id;
			prm->volume = fu->volume_max;
			prm->volume_max = fu->volume_max;
			prm->volume_min = fu->volume_min;
@@ -1383,7 +1382,7 @@ int g_audio_setup(struct g_audio *g_audio, const char *pcm_name,
		err = snd_ctl_add(card, kctl);
		if (err < 0)
			goto snd_fail;
		prm->snd_kctl_rate = kctl;
		prm->snd_kctl_rate_id = kctl->id;
	}

	strscpy(card->driver, card_name, sizeof(card->driver));