pstore/platform: Add check for kstrdup

Add check for the return value of kstrdup() and return the error
if it fails in order to avoid NULL pointer dereference.

Fixes: 563ca40ddf ("pstore/platform: Switch pstore_info::name to const")
Signed-off-by: Jiasheng Jiang <jiasheng@iscas.ac.cn>
Link: https://lore.kernel.org/r/20230623022706.32125-1-jiasheng@iscas.ac.cn
Signed-off-by: Kees Cook <keescook@chromium.org>
This commit is contained in:
Jiasheng Jiang 2023-06-23 10:27:06 +08:00 committed by Kees Cook
parent 5ee1a43047
commit a19d48f7c5

View File

@ -464,6 +464,8 @@ out:
*/ */
int pstore_register(struct pstore_info *psi) int pstore_register(struct pstore_info *psi)
{ {
char *new_backend;
if (backend && strcmp(backend, psi->name)) { if (backend && strcmp(backend, psi->name)) {
pr_warn("backend '%s' already in use: ignoring '%s'\n", pr_warn("backend '%s' already in use: ignoring '%s'\n",
backend, psi->name); backend, psi->name);
@ -484,11 +486,16 @@ int pstore_register(struct pstore_info *psi)
return -EINVAL; return -EINVAL;
} }
new_backend = kstrdup(psi->name, GFP_KERNEL);
if (!new_backend)
return -ENOMEM;
mutex_lock(&psinfo_lock); mutex_lock(&psinfo_lock);
if (psinfo) { if (psinfo) {
pr_warn("backend '%s' already loaded: ignoring '%s'\n", pr_warn("backend '%s' already loaded: ignoring '%s'\n",
psinfo->name, psi->name); psinfo->name, psi->name);
mutex_unlock(&psinfo_lock); mutex_unlock(&psinfo_lock);
kfree(new_backend);
return -EBUSY; return -EBUSY;
} }
@ -521,7 +528,7 @@ int pstore_register(struct pstore_info *psi)
* Update the module parameter backend, so it is visible * Update the module parameter backend, so it is visible
* through /sys/module/pstore/parameters/backend * through /sys/module/pstore/parameters/backend
*/ */
backend = kstrdup(psi->name, GFP_KERNEL); backend = new_backend;
pr_info("Registered %s as persistent store backend\n", psi->name); pr_info("Registered %s as persistent store backend\n", psi->name);