Re: [PATCH] init/initramfs.c: check the return value of kstrdup()
From: Andrew Morton
Date: Sun Mar 06 2022 - 20:29:11 EST
On Fri, 4 Mar 2022 17:27:34 +0800 xkernel.wang@xxxxxxxxxxx wrote:
> From: Xiaoke Wang <xkernel.wang@xxxxxxxxxxx>
>
> kstrdup() is also a memory allocation function which is similar
> with kmalloc() in some way. Once some internal memory errors
> happen, it will return NULL. It is better to check the return
> value of it so to catch the memory error in time.
>
> ...
>
> --- a/init/initramfs.c
> +++ b/init/initramfs.c
> @@ -139,8 +139,12 @@ static void __init dir_add(const char *name, time64_t mtime)
> struct dir_entry *de = kmalloc(sizeof(struct dir_entry), GFP_KERNEL);
> if (!de)
> panic_show_mem("can't allocate dir_entry buffer");
> - INIT_LIST_HEAD(&de->list);
> de->name = kstrdup(name, GFP_KERNEL);
> + if (!de->name) {
> + kfree(de);
> + panic_show_mem("can't duplicate dir name");
> + }
> + INIT_LIST_HEAD(&de->list);
> de->mtime = mtime;
> list_add(&de->list, &dir_list);
We often assume that memory allocations cannot fail in __init code. If
the kernel runs out of memory at this stage, we have very deep problems
and it's virtually impossible that execution would have got this far.