[bug report] ASoC: SOF: ipc4-loader: Support for loading external libraries
Dan Carpenter
dan.carpenter at oracle.com
Tue Oct 25 14:00:33 CEST 2022
Hello Peter Ujfalusi,
The patch 73c091a2fe96: "ASoC: SOF: ipc4-loader: Support for loading
external libraries" from Oct 20, 2022, leads to the following Smatch
static checker warning:
sound/soc/sof/ipc4-loader.c:207 sof_ipc4_load_library_by_uuid()
warn: 'payload_offset' unsigned <= 0
sound/soc/sof/ipc4-loader.c
167 static int sof_ipc4_load_library_by_uuid(struct snd_sof_dev *sdev,
168 unsigned long lib_id, const guid_t *uuid)
169 {
170 struct sof_ipc4_fw_data *ipc4_data = sdev->private;
171 struct sof_ipc4_fw_library *fw_lib;
172 const char *fw_filename;
173 size_t payload_offset;
^^^^^^^^^^^^^^^^^^^^^
174 int ret, i, err;
175
176 if (!sdev->pdata->fw_lib_prefix) {
177 dev_err(sdev->dev,
178 "Library loading is not supported due to not set library path\n");
179 return -EINVAL;
180 }
181
182 if (!ipc4_data->load_library) {
183 dev_err(sdev->dev, "Library loading is not supported on this platform\n");
184 return -EOPNOTSUPP;
185 }
186
187 fw_lib = devm_kzalloc(sdev->dev, sizeof(*fw_lib), GFP_KERNEL);
188 if (!fw_lib)
189 return -ENOMEM;
190
191 fw_filename = kasprintf(GFP_KERNEL, "%s/%pUL.bin",
192 sdev->pdata->fw_lib_prefix, uuid);
193 if (!fw_filename) {
194 ret = -ENOMEM;
195 goto free_fw_lib;
196 }
197
198 ret = request_firmware(&fw_lib->sof_fw.fw, fw_filename, sdev->dev);
199 if (ret < 0) {
200 dev_err(sdev->dev, "Library file '%s' is missing\n", fw_filename);
201 goto free_filename;
202 } else {
203 dev_dbg(sdev->dev, "Library file '%s' loaded\n", fw_filename);
204 }
205
206 payload_offset = sof_ipc4_fw_parse_ext_man(sdev, fw_lib);
--> 207 if (payload_offset <= 0) {
^^^^^^^^^^^^^^^^^^^
sof_ipc4_fw_parse_ext_man() returns negative error codes but as size_t.
It should just return int. If it returns > INT_MAX that can't work on
32bit systems.
208 if (!payload_offset)
209 ret = -EINVAL;
210 else
211 ret = payload_offset;
212
213 goto release;
214 }
215
216 fw_lib->sof_fw.payload_offset = payload_offset;
217 fw_lib->id = lib_id;
218
219 /* Fix up the module ID numbers within the library */
220 for (i = 0; i < fw_lib->num_modules; i++)
221 fw_lib->modules[i].man4_module_entry.id |= (lib_id << SOF_IPC4_MOD_LIB_ID_SHIFT);
222
223 /*
224 * Make sure that the DSP is booted and stays up while attempting the
225 * loading the library for the first time
226 */
227 ret = pm_runtime_resume_and_get(sdev->dev);
228 if (ret < 0 && ret != -EACCES) {
229 dev_err_ratelimited(sdev->dev, "%s: pm_runtime resume failed: %d\n",
230 __func__, ret);
231 goto release;
232 }
233
234 ret = ipc4_data->load_library(sdev, fw_lib, false);
235
236 pm_runtime_mark_last_busy(sdev->dev);
237 err = pm_runtime_put_autosuspend(sdev->dev);
238 if (err < 0)
239 dev_err_ratelimited(sdev->dev, "%s: pm_runtime idle failed: %d\n",
240 __func__, err);
241
242 if (ret)
243 goto release;
244
245 ret = xa_insert(&ipc4_data->fw_lib_xa, lib_id, fw_lib, GFP_KERNEL);
246 if (unlikely(ret))
247 goto release;
248
249 kfree(fw_filename);
250
251 return 0;
252
253 release:
254 release_firmware(fw_lib->sof_fw.fw);
255 /* Allocated within sof_ipc4_fw_parse_ext_man() */
256 devm_kfree(sdev->dev, fw_lib->modules);
257 free_filename:
258 kfree(fw_filename);
259 free_fw_lib:
260 devm_kfree(sdev->dev, fw_lib);
261
262 return ret;
263 }
regards,
dan carpenter
More information about the Alsa-devel
mailing list