ALSA: hdsp: fix some memleaks in snd_hdsp_hwdep_ioctl

Message ID 20231224082533.3540468-1-alexious@zju.edu.cn
State New
Headers
Series ALSA: hdsp: fix some memleaks in snd_hdsp_hwdep_ioctl |

Commit Message

Zhipeng Lu Dec. 24, 2023, 8:25 a.m. UTC
  When snd_hdsp_load_firmware_from_cache and snd_hdsp_enable_io fails,
the hdsp->fw_uploaded needs to be free.Or there could be memleaks in
snd_hdsp_hwdep_ioctl.

Fixes: 90caaef6a1ce ("ALSA: hdsp: improve firmware caching")
Signed-off-by: Zhipeng Lu <alexious@zju.edu.cn>
---
 sound/pci/rme9652/hdsp.c | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)
  

Comments

kernel test robot Dec. 25, 2023, 10:50 p.m. UTC | #1
Hi Zhipeng,

kernel test robot noticed the following build warnings:

[auto build test WARNING on tiwai-sound/for-next]
[also build test WARNING on tiwai-sound/for-linus linus/master v6.7-rc7 next-20231222]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Zhipeng-Lu/ALSA-hdsp-fix-some-memleaks-in-snd_hdsp_hwdep_ioctl/20231225-155210
base:   https://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git for-next
patch link:    https://lore.kernel.org/r/20231224082533.3540468-1-alexious%40zju.edu.cn
patch subject: [PATCH] ALSA: hdsp: fix some memleaks in snd_hdsp_hwdep_ioctl
config: i386-buildonly-randconfig-004-20231225 (https://download.01.org/0day-ci/archive/20231226/202312260629.HwV1r2MX-lkp@intel.com/config)
compiler: clang version 16.0.4 (https://github.com/llvm/llvm-project.git ae42196bc493ffe877a7e3dff8be32035dea4d07)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231226/202312260629.HwV1r2MX-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202312260629.HwV1r2MX-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> sound/pci/rme9652/hdsp.c:4917:1: warning: unused label 'err' [-Wunused-label]
   err:
   ^~~~
>> sound/pci/rme9652/hdsp.c:4918:9: warning: variable 'err' is uninitialized when used here [-Wuninitialized]
           return err;
                  ^~~
   sound/pci/rme9652/hdsp.c:4732:9: note: initialize the variable 'err' to silence this warning
           int err;
                  ^
                   = 0
   2 warnings generated.


vim +/err +4917 sound/pci/rme9652/hdsp.c

  4727	
  4728	static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigned int cmd, unsigned long arg)
  4729	{
  4730		struct hdsp *hdsp = hw->private_data;
  4731		void __user *argp = (void __user *)arg;
  4732		int err;
  4733	
  4734		switch (cmd) {
  4735		case SNDRV_HDSP_IOCTL_GET_PEAK_RMS: {
  4736			struct hdsp_peak_rms __user *peak_rms = (struct hdsp_peak_rms __user *)arg;
  4737	
  4738			err = hdsp_check_for_iobox(hdsp);
  4739			if (err < 0)
  4740				return err;
  4741	
  4742			err = hdsp_check_for_firmware(hdsp, 1);
  4743			if (err < 0)
  4744				return err;
  4745	
  4746			if (!(hdsp->state & HDSP_FirmwareLoaded)) {
  4747				dev_err(hdsp->card->dev,
  4748					"firmware needs to be uploaded to the card.\n");
  4749				return -EINVAL;
  4750			}
  4751	
  4752			switch (hdsp->io_type) {
  4753			case H9652:
  4754				return hdsp_9652_get_peak(hdsp, peak_rms);
  4755			case H9632:
  4756				return hdsp_9632_get_peak(hdsp, peak_rms);
  4757			default:
  4758				return hdsp_get_peak(hdsp, peak_rms);
  4759			}
  4760		}
  4761		case SNDRV_HDSP_IOCTL_GET_CONFIG_INFO: {
  4762			struct hdsp_config_info info;
  4763			unsigned long flags;
  4764			int i;
  4765	
  4766			err = hdsp_check_for_iobox(hdsp);
  4767			if (err < 0)
  4768				return err;
  4769	
  4770			err = hdsp_check_for_firmware(hdsp, 1);
  4771			if (err < 0)
  4772				return err;
  4773	
  4774			memset(&info, 0, sizeof(info));
  4775			spin_lock_irqsave(&hdsp->lock, flags);
  4776			info.pref_sync_ref = (unsigned char)hdsp_pref_sync_ref(hdsp);
  4777			info.wordclock_sync_check = (unsigned char)hdsp_wc_sync_check(hdsp);
  4778			if (hdsp->io_type != H9632)
  4779			    info.adatsync_sync_check = (unsigned char)hdsp_adatsync_sync_check(hdsp);
  4780			info.spdif_sync_check = (unsigned char)hdsp_spdif_sync_check(hdsp);
  4781			for (i = 0; i < ((hdsp->io_type != Multiface && hdsp->io_type != RPM && hdsp->io_type != H9632) ? 3 : 1); ++i)
  4782				info.adat_sync_check[i] = (unsigned char)hdsp_adat_sync_check(hdsp, i);
  4783			info.spdif_in = (unsigned char)hdsp_spdif_in(hdsp);
  4784			info.spdif_out = (unsigned char)hdsp_toggle_setting(hdsp,
  4785					HDSP_SPDIFOpticalOut);
  4786			info.spdif_professional = (unsigned char)
  4787				hdsp_toggle_setting(hdsp, HDSP_SPDIFProfessional);
  4788			info.spdif_emphasis = (unsigned char)
  4789				hdsp_toggle_setting(hdsp, HDSP_SPDIFEmphasis);
  4790			info.spdif_nonaudio = (unsigned char)
  4791				hdsp_toggle_setting(hdsp, HDSP_SPDIFNonAudio);
  4792			info.spdif_sample_rate = hdsp_spdif_sample_rate(hdsp);
  4793			info.system_sample_rate = hdsp->system_sample_rate;
  4794			info.autosync_sample_rate = hdsp_external_sample_rate(hdsp);
  4795			info.system_clock_mode = (unsigned char)hdsp_system_clock_mode(hdsp);
  4796			info.clock_source = (unsigned char)hdsp_clock_source(hdsp);
  4797			info.autosync_ref = (unsigned char)hdsp_autosync_ref(hdsp);
  4798			info.line_out = (unsigned char)
  4799				hdsp_toggle_setting(hdsp, HDSP_LineOut);
  4800			if (hdsp->io_type == H9632) {
  4801				info.da_gain = (unsigned char)hdsp_da_gain(hdsp);
  4802				info.ad_gain = (unsigned char)hdsp_ad_gain(hdsp);
  4803				info.phone_gain = (unsigned char)hdsp_phone_gain(hdsp);
  4804				info.xlr_breakout_cable =
  4805					(unsigned char)hdsp_toggle_setting(hdsp,
  4806						HDSP_XLRBreakoutCable);
  4807	
  4808			} else if (hdsp->io_type == RPM) {
  4809				info.da_gain = (unsigned char) hdsp_rpm_input12(hdsp);
  4810				info.ad_gain = (unsigned char) hdsp_rpm_input34(hdsp);
  4811			}
  4812			if (hdsp->io_type == H9632 || hdsp->io_type == H9652)
  4813				info.analog_extension_board =
  4814					(unsigned char)hdsp_toggle_setting(hdsp,
  4815						    HDSP_AnalogExtensionBoard);
  4816			spin_unlock_irqrestore(&hdsp->lock, flags);
  4817			if (copy_to_user(argp, &info, sizeof(info)))
  4818				return -EFAULT;
  4819			break;
  4820		}
  4821		case SNDRV_HDSP_IOCTL_GET_9632_AEB: {
  4822			struct hdsp_9632_aeb h9632_aeb;
  4823	
  4824			if (hdsp->io_type != H9632) return -EINVAL;
  4825			h9632_aeb.aebi = hdsp->ss_in_channels - H9632_SS_CHANNELS;
  4826			h9632_aeb.aebo = hdsp->ss_out_channels - H9632_SS_CHANNELS;
  4827			if (copy_to_user(argp, &h9632_aeb, sizeof(h9632_aeb)))
  4828				return -EFAULT;
  4829			break;
  4830		}
  4831		case SNDRV_HDSP_IOCTL_GET_VERSION: {
  4832			struct hdsp_version hdsp_version;
  4833			int err;
  4834	
  4835			if (hdsp->io_type == H9652 || hdsp->io_type == H9632) return -EINVAL;
  4836			if (hdsp->io_type == Undefined) {
  4837				err = hdsp_get_iobox_version(hdsp);
  4838				if (err < 0)
  4839					return err;
  4840			}
  4841			memset(&hdsp_version, 0, sizeof(hdsp_version));
  4842			hdsp_version.io_type = hdsp->io_type;
  4843			hdsp_version.firmware_rev = hdsp->firmware_rev;
  4844			if (copy_to_user(argp, &hdsp_version, sizeof(hdsp_version)))
  4845				return -EFAULT;
  4846			break;
  4847		}
  4848		case SNDRV_HDSP_IOCTL_UPLOAD_FIRMWARE: {
  4849			struct hdsp_firmware firmware;
  4850			u32 __user *firmware_data;
  4851			int err;
  4852	
  4853			if (hdsp->io_type == H9652 || hdsp->io_type == H9632) return -EINVAL;
  4854			/* SNDRV_HDSP_IOCTL_GET_VERSION must have been called */
  4855			if (hdsp->io_type == Undefined) return -EINVAL;
  4856	
  4857			if (hdsp->state & (HDSP_FirmwareCached | HDSP_FirmwareLoaded))
  4858				return -EBUSY;
  4859	
  4860			dev_info(hdsp->card->dev,
  4861				 "initializing firmware upload\n");
  4862			if (copy_from_user(&firmware, argp, sizeof(firmware)))
  4863				return -EFAULT;
  4864			firmware_data = (u32 __user *)firmware.firmware_data;
  4865	
  4866			if (hdsp_check_for_iobox (hdsp))
  4867				return -EIO;
  4868	
  4869			if (!hdsp->fw_uploaded) {
  4870				hdsp->fw_uploaded = vmalloc(HDSP_FIRMWARE_SIZE);
  4871				if (!hdsp->fw_uploaded)
  4872					return -ENOMEM;
  4873			}
  4874	
  4875			if (copy_from_user(hdsp->fw_uploaded, firmware_data,
  4876					   HDSP_FIRMWARE_SIZE)) {
  4877				err = -EFAULT;
  4878				goto free_fw_uploaded;
  4879			}
  4880	
  4881			hdsp->state |= HDSP_FirmwareCached;
  4882	
  4883			err = snd_hdsp_load_firmware_from_cache(hdsp);
  4884			if (err < 0)
  4885				goto free_fw_uploaded;
  4886	
  4887			if (!(hdsp->state & HDSP_InitializationComplete)) {
  4888				err = snd_hdsp_enable_io(hdsp);
  4889				if (err < 0)
  4890					goto free_fw_uploaded;
  4891	
  4892				snd_hdsp_initialize_channels(hdsp);
  4893				snd_hdsp_initialize_midi_flush(hdsp);
  4894	
  4895				err = snd_hdsp_create_alsa_devices(hdsp->card, hdsp);
  4896				if (err < 0) {
  4897					dev_err(hdsp->card->dev,
  4898						"error creating alsa devices\n");
  4899					goto free_fw_uploaded;
  4900				}
  4901			}
  4902			break;
  4903		}
  4904		case SNDRV_HDSP_IOCTL_GET_MIXER: {
  4905			struct hdsp_mixer __user *mixer = (struct hdsp_mixer __user *)argp;
  4906			if (copy_to_user(mixer->matrix, hdsp->mixer_matrix, sizeof(unsigned short)*HDSP_MATRIX_MIXER_SIZE))
  4907				return -EFAULT;
  4908			break;
  4909		}
  4910		default:
  4911			return -EINVAL;
  4912		}
  4913		return 0;
  4914	free_fw_uploaded:
  4915		vfree(hdsp->fw_uploaded);
  4916		hdsp->fw_uploaded = NULL;
> 4917	err:
> 4918		return err;
  4919	}
  4920
  
kernel test robot Dec. 26, 2023, 12:03 a.m. UTC | #2
Hi Zhipeng,

kernel test robot noticed the following build warnings:

[auto build test WARNING on tiwai-sound/for-next]
[also build test WARNING on tiwai-sound/for-linus linus/master v6.7-rc7 next-20231222]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Zhipeng-Lu/ALSA-hdsp-fix-some-memleaks-in-snd_hdsp_hwdep_ioctl/20231225-155210
base:   https://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git for-next
patch link:    https://lore.kernel.org/r/20231224082533.3540468-1-alexious%40zju.edu.cn
patch subject: [PATCH] ALSA: hdsp: fix some memleaks in snd_hdsp_hwdep_ioctl
config: alpha-allyesconfig (https://download.01.org/0day-ci/archive/20231226/202312260721.mfXz0imt-lkp@intel.com/config)
compiler: alpha-linux-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231226/202312260721.mfXz0imt-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202312260721.mfXz0imt-lkp@intel.com/

All warnings (new ones prefixed by >>):

   sound/pci/rme9652/hdsp.c: In function 'snd_hdsp_hwdep_ioctl':
>> sound/pci/rme9652/hdsp.c:4917:1: warning: label 'err' defined but not used [-Wunused-label]
    4917 | err:
         | ^~~


vim +/err +4917 sound/pci/rme9652/hdsp.c

  4727	
  4728	static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigned int cmd, unsigned long arg)
  4729	{
  4730		struct hdsp *hdsp = hw->private_data;
  4731		void __user *argp = (void __user *)arg;
  4732		int err;
  4733	
  4734		switch (cmd) {
  4735		case SNDRV_HDSP_IOCTL_GET_PEAK_RMS: {
  4736			struct hdsp_peak_rms __user *peak_rms = (struct hdsp_peak_rms __user *)arg;
  4737	
  4738			err = hdsp_check_for_iobox(hdsp);
  4739			if (err < 0)
  4740				return err;
  4741	
  4742			err = hdsp_check_for_firmware(hdsp, 1);
  4743			if (err < 0)
  4744				return err;
  4745	
  4746			if (!(hdsp->state & HDSP_FirmwareLoaded)) {
  4747				dev_err(hdsp->card->dev,
  4748					"firmware needs to be uploaded to the card.\n");
  4749				return -EINVAL;
  4750			}
  4751	
  4752			switch (hdsp->io_type) {
  4753			case H9652:
  4754				return hdsp_9652_get_peak(hdsp, peak_rms);
  4755			case H9632:
  4756				return hdsp_9632_get_peak(hdsp, peak_rms);
  4757			default:
  4758				return hdsp_get_peak(hdsp, peak_rms);
  4759			}
  4760		}
  4761		case SNDRV_HDSP_IOCTL_GET_CONFIG_INFO: {
  4762			struct hdsp_config_info info;
  4763			unsigned long flags;
  4764			int i;
  4765	
  4766			err = hdsp_check_for_iobox(hdsp);
  4767			if (err < 0)
  4768				return err;
  4769	
  4770			err = hdsp_check_for_firmware(hdsp, 1);
  4771			if (err < 0)
  4772				return err;
  4773	
  4774			memset(&info, 0, sizeof(info));
  4775			spin_lock_irqsave(&hdsp->lock, flags);
  4776			info.pref_sync_ref = (unsigned char)hdsp_pref_sync_ref(hdsp);
  4777			info.wordclock_sync_check = (unsigned char)hdsp_wc_sync_check(hdsp);
  4778			if (hdsp->io_type != H9632)
  4779			    info.adatsync_sync_check = (unsigned char)hdsp_adatsync_sync_check(hdsp);
  4780			info.spdif_sync_check = (unsigned char)hdsp_spdif_sync_check(hdsp);
  4781			for (i = 0; i < ((hdsp->io_type != Multiface && hdsp->io_type != RPM && hdsp->io_type != H9632) ? 3 : 1); ++i)
  4782				info.adat_sync_check[i] = (unsigned char)hdsp_adat_sync_check(hdsp, i);
  4783			info.spdif_in = (unsigned char)hdsp_spdif_in(hdsp);
  4784			info.spdif_out = (unsigned char)hdsp_toggle_setting(hdsp,
  4785					HDSP_SPDIFOpticalOut);
  4786			info.spdif_professional = (unsigned char)
  4787				hdsp_toggle_setting(hdsp, HDSP_SPDIFProfessional);
  4788			info.spdif_emphasis = (unsigned char)
  4789				hdsp_toggle_setting(hdsp, HDSP_SPDIFEmphasis);
  4790			info.spdif_nonaudio = (unsigned char)
  4791				hdsp_toggle_setting(hdsp, HDSP_SPDIFNonAudio);
  4792			info.spdif_sample_rate = hdsp_spdif_sample_rate(hdsp);
  4793			info.system_sample_rate = hdsp->system_sample_rate;
  4794			info.autosync_sample_rate = hdsp_external_sample_rate(hdsp);
  4795			info.system_clock_mode = (unsigned char)hdsp_system_clock_mode(hdsp);
  4796			info.clock_source = (unsigned char)hdsp_clock_source(hdsp);
  4797			info.autosync_ref = (unsigned char)hdsp_autosync_ref(hdsp);
  4798			info.line_out = (unsigned char)
  4799				hdsp_toggle_setting(hdsp, HDSP_LineOut);
  4800			if (hdsp->io_type == H9632) {
  4801				info.da_gain = (unsigned char)hdsp_da_gain(hdsp);
  4802				info.ad_gain = (unsigned char)hdsp_ad_gain(hdsp);
  4803				info.phone_gain = (unsigned char)hdsp_phone_gain(hdsp);
  4804				info.xlr_breakout_cable =
  4805					(unsigned char)hdsp_toggle_setting(hdsp,
  4806						HDSP_XLRBreakoutCable);
  4807	
  4808			} else if (hdsp->io_type == RPM) {
  4809				info.da_gain = (unsigned char) hdsp_rpm_input12(hdsp);
  4810				info.ad_gain = (unsigned char) hdsp_rpm_input34(hdsp);
  4811			}
  4812			if (hdsp->io_type == H9632 || hdsp->io_type == H9652)
  4813				info.analog_extension_board =
  4814					(unsigned char)hdsp_toggle_setting(hdsp,
  4815						    HDSP_AnalogExtensionBoard);
  4816			spin_unlock_irqrestore(&hdsp->lock, flags);
  4817			if (copy_to_user(argp, &info, sizeof(info)))
  4818				return -EFAULT;
  4819			break;
  4820		}
  4821		case SNDRV_HDSP_IOCTL_GET_9632_AEB: {
  4822			struct hdsp_9632_aeb h9632_aeb;
  4823	
  4824			if (hdsp->io_type != H9632) return -EINVAL;
  4825			h9632_aeb.aebi = hdsp->ss_in_channels - H9632_SS_CHANNELS;
  4826			h9632_aeb.aebo = hdsp->ss_out_channels - H9632_SS_CHANNELS;
  4827			if (copy_to_user(argp, &h9632_aeb, sizeof(h9632_aeb)))
  4828				return -EFAULT;
  4829			break;
  4830		}
  4831		case SNDRV_HDSP_IOCTL_GET_VERSION: {
  4832			struct hdsp_version hdsp_version;
  4833			int err;
  4834	
  4835			if (hdsp->io_type == H9652 || hdsp->io_type == H9632) return -EINVAL;
  4836			if (hdsp->io_type == Undefined) {
  4837				err = hdsp_get_iobox_version(hdsp);
  4838				if (err < 0)
  4839					return err;
  4840			}
  4841			memset(&hdsp_version, 0, sizeof(hdsp_version));
  4842			hdsp_version.io_type = hdsp->io_type;
  4843			hdsp_version.firmware_rev = hdsp->firmware_rev;
  4844			if (copy_to_user(argp, &hdsp_version, sizeof(hdsp_version)))
  4845				return -EFAULT;
  4846			break;
  4847		}
  4848		case SNDRV_HDSP_IOCTL_UPLOAD_FIRMWARE: {
  4849			struct hdsp_firmware firmware;
  4850			u32 __user *firmware_data;
  4851			int err;
  4852	
  4853			if (hdsp->io_type == H9652 || hdsp->io_type == H9632) return -EINVAL;
  4854			/* SNDRV_HDSP_IOCTL_GET_VERSION must have been called */
  4855			if (hdsp->io_type == Undefined) return -EINVAL;
  4856	
  4857			if (hdsp->state & (HDSP_FirmwareCached | HDSP_FirmwareLoaded))
  4858				return -EBUSY;
  4859	
  4860			dev_info(hdsp->card->dev,
  4861				 "initializing firmware upload\n");
  4862			if (copy_from_user(&firmware, argp, sizeof(firmware)))
  4863				return -EFAULT;
  4864			firmware_data = (u32 __user *)firmware.firmware_data;
  4865	
  4866			if (hdsp_check_for_iobox (hdsp))
  4867				return -EIO;
  4868	
  4869			if (!hdsp->fw_uploaded) {
  4870				hdsp->fw_uploaded = vmalloc(HDSP_FIRMWARE_SIZE);
  4871				if (!hdsp->fw_uploaded)
  4872					return -ENOMEM;
  4873			}
  4874	
  4875			if (copy_from_user(hdsp->fw_uploaded, firmware_data,
  4876					   HDSP_FIRMWARE_SIZE)) {
  4877				err = -EFAULT;
  4878				goto free_fw_uploaded;
  4879			}
  4880	
  4881			hdsp->state |= HDSP_FirmwareCached;
  4882	
  4883			err = snd_hdsp_load_firmware_from_cache(hdsp);
  4884			if (err < 0)
  4885				goto free_fw_uploaded;
  4886	
  4887			if (!(hdsp->state & HDSP_InitializationComplete)) {
  4888				err = snd_hdsp_enable_io(hdsp);
  4889				if (err < 0)
  4890					goto free_fw_uploaded;
  4891	
  4892				snd_hdsp_initialize_channels(hdsp);
  4893				snd_hdsp_initialize_midi_flush(hdsp);
  4894	
  4895				err = snd_hdsp_create_alsa_devices(hdsp->card, hdsp);
  4896				if (err < 0) {
  4897					dev_err(hdsp->card->dev,
  4898						"error creating alsa devices\n");
  4899					goto free_fw_uploaded;
  4900				}
  4901			}
  4902			break;
  4903		}
  4904		case SNDRV_HDSP_IOCTL_GET_MIXER: {
  4905			struct hdsp_mixer __user *mixer = (struct hdsp_mixer __user *)argp;
  4906			if (copy_to_user(mixer->matrix, hdsp->mixer_matrix, sizeof(unsigned short)*HDSP_MATRIX_MIXER_SIZE))
  4907				return -EFAULT;
  4908			break;
  4909		}
  4910		default:
  4911			return -EINVAL;
  4912		}
  4913		return 0;
  4914	free_fw_uploaded:
  4915		vfree(hdsp->fw_uploaded);
  4916		hdsp->fw_uploaded = NULL;
> 4917	err:
  4918		return err;
  4919	}
  4920
  

Patch

diff --git a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c
index e7d1b43471a2..6f6add2f7c42 100644
--- a/sound/pci/rme9652/hdsp.c
+++ b/sound/pci/rme9652/hdsp.c
@@ -4874,21 +4874,20 @@  static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne
 
 		if (copy_from_user(hdsp->fw_uploaded, firmware_data,
 				   HDSP_FIRMWARE_SIZE)) {
-			vfree(hdsp->fw_uploaded);
-			hdsp->fw_uploaded = NULL;
-			return -EFAULT;
+			err = -EFAULT;
+			goto free_fw_uploaded;
 		}
 
 		hdsp->state |= HDSP_FirmwareCached;
 
 		err = snd_hdsp_load_firmware_from_cache(hdsp);
 		if (err < 0)
-			return err;
+			goto free_fw_uploaded;
 
 		if (!(hdsp->state & HDSP_InitializationComplete)) {
 			err = snd_hdsp_enable_io(hdsp);
 			if (err < 0)
-				return err;
+				goto free_fw_uploaded;
 
 			snd_hdsp_initialize_channels(hdsp);
 			snd_hdsp_initialize_midi_flush(hdsp);
@@ -4897,7 +4896,7 @@  static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne
 			if (err < 0) {
 				dev_err(hdsp->card->dev,
 					"error creating alsa devices\n");
-				return err;
+				goto free_fw_uploaded;
 			}
 		}
 		break;
@@ -4912,6 +4911,11 @@  static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne
 		return -EINVAL;
 	}
 	return 0;
+free_fw_uploaded:
+	vfree(hdsp->fw_uploaded);
+	hdsp->fw_uploaded = NULL;
+err:
+	return err;
 }
 
 static const struct snd_pcm_ops snd_hdsp_playback_ops = {