From fd59581dd555b2d3b0b85bbcdd9e76c5d7a3a5d8 Mon Sep 17 00:00:00 2001 From: Qwinci <32550582+Qwinci@users.noreply.github.com> Date: Fri, 18 Aug 2023 14:44:41 +0300 Subject: [PATCH] rtdl: Return null when non-elf file is dlopened --- options/rtdl/generic/linker.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/options/rtdl/generic/linker.cpp b/options/rtdl/generic/linker.cpp index 7acd190e97..ae76ff138c 100644 --- a/options/rtdl/generic/linker.cpp +++ b/options/rtdl/generic/linker.cpp @@ -249,6 +249,15 @@ SharedObject *ObjectRepository::requestObjectWithName(frg::string_view name, auto object = frg::construct(getAllocator(), name.data(), std::move(chosenPath), false, localScope, rts); + Elf64_Ehdr hdr; + readExactlyOrDie(fd, &hdr, sizeof(Elf64_Ehdr)); + if (hdr.e_ident[0] != 0x7F || hdr.e_ident[1] != 'E' || hdr.e_ident[2] != 'L' || hdr.e_ident[3] != 'F') { + closeOrDie(fd); + return nullptr; + } + off_t dumb; + mlibc::sys_seek(fd, 0, SEEK_SET, &dumb); + _fetchFromFile(object, fd); closeOrDie(fd); @@ -288,6 +297,16 @@ SharedObject *ObjectRepository::requestObjectAtPath(frg::string_view path, int fd; if(mlibc::sys_open((no_prefix + '\0').data(), O_RDONLY, 0, &fd)) return nullptr; // TODO: Free the SharedObject. + + Elf64_Ehdr hdr; + readExactlyOrDie(fd, &hdr, sizeof(Elf64_Ehdr)); + if (hdr.e_ident[0] != 0x7F || hdr.e_ident[1] != 'E' || hdr.e_ident[2] != 'L' || hdr.e_ident[3] != 'F') { + closeOrDie(fd); + return nullptr; + } + off_t dumb; + mlibc::sys_seek(fd, 0, SEEK_SET, &dumb); + _fetchFromFile(object, fd); closeOrDie(fd);