| From aca4a5152909020e287ce4750a80df9f2578772b Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 10 Mar 2026 16:37:41 -0400 |
| Subject: objtool/klp: fix mkstemp() failure with long paths |
| |
| From: Joe Lawrence <joe.lawrence@redhat.com> |
| |
| [ Upstream commit 28e367a969b0c54c87ca655ec180715fe469fd14 ] |
| |
| The elf_create_file() function fails with EINVAL when the build directory |
| path is long enough to truncate the "XXXXXX" suffix in the 256-byte |
| tmp_name buffer. |
| |
| Simplify the code to remove the unnecessary dirname()/basename() split |
| and concatenation. Instead, allocate the exact number of bytes needed for |
| the path. |
| |
| Acked-by: Song Liu <song@kernel.org> |
| Signed-off-by: Joe Lawrence <joe.lawrence@redhat.com> |
| Link: https://patch.msgid.link/20260310203751.1479229-3-joe.lawrence@redhat.com |
| Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| tools/objtool/elf.c | 23 +++-------------------- |
| 1 file changed, 3 insertions(+), 20 deletions(-) |
| |
| diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c |
| index 3da90686350d7..2ffe3ebfbe37c 100644 |
| --- a/tools/objtool/elf.c |
| +++ b/tools/objtool/elf.c |
| @@ -16,7 +16,6 @@ |
| #include <string.h> |
| #include <unistd.h> |
| #include <errno.h> |
| -#include <libgen.h> |
| #include <ctype.h> |
| #include <linux/align.h> |
| #include <linux/kernel.h> |
| @@ -1189,7 +1188,7 @@ struct elf *elf_open_read(const char *name, int flags) |
| struct elf *elf_create_file(GElf_Ehdr *ehdr, const char *name) |
| { |
| struct section *null, *symtab, *strtab, *shstrtab; |
| - char *dir, *base, *tmp_name; |
| + char *tmp_name; |
| struct symbol *sym; |
| struct elf *elf; |
| |
| @@ -1203,29 +1202,13 @@ struct elf *elf_create_file(GElf_Ehdr *ehdr, const char *name) |
| |
| INIT_LIST_HEAD(&elf->sections); |
| |
| - dir = strdup(name); |
| - if (!dir) { |
| - ERROR_GLIBC("strdup"); |
| - return NULL; |
| - } |
| - |
| - dir = dirname(dir); |
| - |
| - base = strdup(name); |
| - if (!base) { |
| - ERROR_GLIBC("strdup"); |
| - return NULL; |
| - } |
| - |
| - base = basename(base); |
| - |
| - tmp_name = malloc(256); |
| + tmp_name = malloc(strlen(name) + 8); |
| if (!tmp_name) { |
| ERROR_GLIBC("malloc"); |
| return NULL; |
| } |
| |
| - snprintf(tmp_name, 256, "%s/%s.XXXXXX", dir, base); |
| + sprintf(tmp_name, "%s.XXXXXX", name); |
| |
| elf->fd = mkstemp(tmp_name); |
| if (elf->fd == -1) { |
| -- |
| 2.53.0 |
| |