generic: drop useless binfmt patch fixing compilation warning
The compilation warning was triggered by wrongly set FRAME_WARN to 1024 even for 64bit. This was recently fix by correctly setting the FRAME_WARN to 2048 for 64bit systems. The compilation warning would still be triggered on 32bit system but the actual code is never reached as ARCH_USE_GNU_PROPERTY is only set on arm64 arch. Drop the patch as kmalloc cause perf regression as suggested by upstream maintainers. Fixes:fa79baf4a6("generic: copy backport, hack, pending patch and config from 5.15 to 6.1") Fixes:5913ea1ba2("generic: 5.15: add pending patch fixing binfmt compilation warning") Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
This commit is contained in:
		| @@ -1,94 +0,0 @@ | ||||
| From ca71e00839fcdd26f122fb6d9e97903c9fe198f7 Mon Sep 17 00:00:00 2001 | ||||
| From: Christian Marangi <ansuelsmth@gmail.com> | ||||
| Date: Sat, 6 May 2023 08:08:35 +0200 | ||||
| Subject: [PATCH] binfmt_elf: dynamically allocate note.data in | ||||
|  parse_elf_properties | ||||
|  | ||||
| Dynamically allocate note.data in parse_elf_properties to fix | ||||
| compilation warning on some arch. | ||||
|  | ||||
| On some arch note.data exceet the stack limit for a single function and | ||||
| this cause the following compilation warning: | ||||
| fs/binfmt_elf.c: In function 'parse_elf_properties.isra': | ||||
| fs/binfmt_elf.c:821:1: error: the frame size of 1040 bytes is larger than 1024 bytes [-Werror=frame-larger-than=] | ||||
|   821 | } | ||||
|       | ^ | ||||
| cc1: all warnings being treated as errors | ||||
|  | ||||
| Fix this by dynamically allocating the array. | ||||
|  | ||||
| Fixes: 00e19ceec80b ("ELF: Add ELF program property parsing support") | ||||
| Signed-off-by: Christian Marangi <ansuelsmth@gmail.com> | ||||
| Cc: stable@vger.kernel.org # v5.8+ | ||||
| --- | ||||
|  fs/binfmt_elf.c | 32 +++++++++++++++++++++++--------- | ||||
|  1 file changed, 23 insertions(+), 9 deletions(-) | ||||
|  | ||||
| --- a/fs/binfmt_elf.c | ||||
| +++ b/fs/binfmt_elf.c | ||||
| @@ -768,7 +768,7 @@ static int parse_elf_properties(struct f | ||||
|  { | ||||
|  	union { | ||||
|  		struct elf_note nhdr; | ||||
| -		char data[NOTE_DATA_SZ]; | ||||
| +		char *data; | ||||
|  	} note; | ||||
|  	loff_t pos; | ||||
|  	ssize_t n; | ||||
| @@ -788,26 +788,38 @@ static int parse_elf_properties(struct f | ||||
|  	if (phdr->p_filesz > sizeof(note)) | ||||
|  		return -ENOEXEC; | ||||
|   | ||||
| +	note.data = kcalloc(NOTE_DATA_SZ, sizeof(*note.data), GFP_KERNEL); | ||||
| +	if (!note.data) | ||||
| +		return -ENOMEM; | ||||
| + | ||||
|  	pos = phdr->p_offset; | ||||
|  	n = kernel_read(f, ¬e, phdr->p_filesz, &pos); | ||||
|   | ||||
|  	BUILD_BUG_ON(sizeof(note) < sizeof(note.nhdr) + NOTE_NAME_SZ); | ||||
| -	if (n < 0 || n < sizeof(note.nhdr) + NOTE_NAME_SZ) | ||||
| -		return -EIO; | ||||
| +	if (n < 0 || n < sizeof(note.nhdr) + NOTE_NAME_SZ) { | ||||
| +		ret = -EIO; | ||||
| +		goto exit; | ||||
| +	} | ||||
|   | ||||
|  	if (note.nhdr.n_type != NT_GNU_PROPERTY_TYPE_0 || | ||||
|  	    note.nhdr.n_namesz != NOTE_NAME_SZ || | ||||
|  	    strncmp(note.data + sizeof(note.nhdr), | ||||
| -		    GNU_PROPERTY_TYPE_0_NAME, n - sizeof(note.nhdr))) | ||||
| -		return -ENOEXEC; | ||||
| +		    GNU_PROPERTY_TYPE_0_NAME, n - sizeof(note.nhdr))) { | ||||
| +		ret = -ENOEXEC; | ||||
| +		goto exit; | ||||
| +	} | ||||
|   | ||||
|  	off = round_up(sizeof(note.nhdr) + NOTE_NAME_SZ, | ||||
|  		       ELF_GNU_PROPERTY_ALIGN); | ||||
| -	if (off > n) | ||||
| -		return -ENOEXEC; | ||||
| - | ||||
| -	if (note.nhdr.n_descsz > n - off) | ||||
| -		return -ENOEXEC; | ||||
| +	if (off > n) { | ||||
| +		ret = -ENOEXEC; | ||||
| +		goto exit; | ||||
| +	} | ||||
| + | ||||
| +	if (note.nhdr.n_descsz > n - off) { | ||||
| +		ret = -ENOEXEC; | ||||
| +		goto exit; | ||||
| +	} | ||||
|  	datasz = off + note.nhdr.n_descsz; | ||||
|   | ||||
|  	have_prev_type = false; | ||||
| @@ -817,6 +829,8 @@ static int parse_elf_properties(struct f | ||||
|  		have_prev_type = true; | ||||
|  	} while (!ret); | ||||
|   | ||||
| +exit: | ||||
| +	kfree(note.data); | ||||
|  	return ret == -ENOENT ? 0 : ret; | ||||
|  } | ||||
|   | ||||
| @@ -1,94 +0,0 @@ | ||||
| From ca71e00839fcdd26f122fb6d9e97903c9fe198f7 Mon Sep 17 00:00:00 2001 | ||||
| From: Christian Marangi <ansuelsmth@gmail.com> | ||||
| Date: Sat, 6 May 2023 08:08:35 +0200 | ||||
| Subject: [PATCH] binfmt_elf: dynamically allocate note.data in | ||||
|  parse_elf_properties | ||||
|  | ||||
| Dynamically allocate note.data in parse_elf_properties to fix | ||||
| compilation warning on some arch. | ||||
|  | ||||
| On some arch note.data exceet the stack limit for a single function and | ||||
| this cause the following compilation warning: | ||||
| fs/binfmt_elf.c: In function 'parse_elf_properties.isra': | ||||
| fs/binfmt_elf.c:821:1: error: the frame size of 1040 bytes is larger than 1024 bytes [-Werror=frame-larger-than=] | ||||
|   821 | } | ||||
|       | ^ | ||||
| cc1: all warnings being treated as errors | ||||
|  | ||||
| Fix this by dynamically allocating the array. | ||||
|  | ||||
| Fixes: 00e19ceec80b ("ELF: Add ELF program property parsing support") | ||||
| Signed-off-by: Christian Marangi <ansuelsmth@gmail.com> | ||||
| Cc: stable@vger.kernel.org # v5.8+ | ||||
| --- | ||||
|  fs/binfmt_elf.c | 32 +++++++++++++++++++++++--------- | ||||
|  1 file changed, 23 insertions(+), 9 deletions(-) | ||||
|  | ||||
| --- a/fs/binfmt_elf.c | ||||
| +++ b/fs/binfmt_elf.c | ||||
| @@ -769,7 +769,7 @@ static int parse_elf_properties(struct f | ||||
|  { | ||||
|  	union { | ||||
|  		struct elf_note nhdr; | ||||
| -		char data[NOTE_DATA_SZ]; | ||||
| +		char *data; | ||||
|  	} note; | ||||
|  	loff_t pos; | ||||
|  	ssize_t n; | ||||
| @@ -789,26 +789,38 @@ static int parse_elf_properties(struct f | ||||
|  	if (phdr->p_filesz > sizeof(note)) | ||||
|  		return -ENOEXEC; | ||||
|   | ||||
| +	note.data = kcalloc(NOTE_DATA_SZ, sizeof(*note.data), GFP_KERNEL); | ||||
| +	if (!note.data) | ||||
| +		return -ENOMEM; | ||||
| + | ||||
|  	pos = phdr->p_offset; | ||||
|  	n = kernel_read(f, ¬e, phdr->p_filesz, &pos); | ||||
|   | ||||
|  	BUILD_BUG_ON(sizeof(note) < sizeof(note.nhdr) + NOTE_NAME_SZ); | ||||
| -	if (n < 0 || n < sizeof(note.nhdr) + NOTE_NAME_SZ) | ||||
| -		return -EIO; | ||||
| +	if (n < 0 || n < sizeof(note.nhdr) + NOTE_NAME_SZ) { | ||||
| +		ret = -EIO; | ||||
| +		goto exit; | ||||
| +	} | ||||
|   | ||||
|  	if (note.nhdr.n_type != NT_GNU_PROPERTY_TYPE_0 || | ||||
|  	    note.nhdr.n_namesz != NOTE_NAME_SZ || | ||||
|  	    strncmp(note.data + sizeof(note.nhdr), | ||||
| -		    GNU_PROPERTY_TYPE_0_NAME, n - sizeof(note.nhdr))) | ||||
| -		return -ENOEXEC; | ||||
| +		    GNU_PROPERTY_TYPE_0_NAME, n - sizeof(note.nhdr))) { | ||||
| +		ret = -ENOEXEC; | ||||
| +		goto exit; | ||||
| +	} | ||||
|   | ||||
|  	off = round_up(sizeof(note.nhdr) + NOTE_NAME_SZ, | ||||
|  		       ELF_GNU_PROPERTY_ALIGN); | ||||
| -	if (off > n) | ||||
| -		return -ENOEXEC; | ||||
| - | ||||
| -	if (note.nhdr.n_descsz > n - off) | ||||
| -		return -ENOEXEC; | ||||
| +	if (off > n) { | ||||
| +		ret = -ENOEXEC; | ||||
| +		goto exit; | ||||
| +	} | ||||
| + | ||||
| +	if (note.nhdr.n_descsz > n - off) { | ||||
| +		ret = -ENOEXEC; | ||||
| +		goto exit; | ||||
| +	} | ||||
|  	datasz = off + note.nhdr.n_descsz; | ||||
|   | ||||
|  	have_prev_type = false; | ||||
| @@ -818,6 +830,8 @@ static int parse_elf_properties(struct f | ||||
|  		have_prev_type = true; | ||||
|  	} while (!ret); | ||||
|   | ||||
| +exit: | ||||
| +	kfree(note.data); | ||||
|  	return ret == -ENOENT ? 0 : ret; | ||||
|  } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Christian Marangi
					Christian Marangi