{"id":1558,"url":"https://patchwork.libcamera.org/api/1.1/patches/1558/?format=json","web_url":"https://patchwork.libcamera.org/patch/1558/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/1.1/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20190701141336.10273-2-paul.elder@ideasonboard.com>","date":"2019-07-01T14:13:36","name":"[libcamera-devel,2/2] libcamera: ipa_module: elfLoadSymbol find symbol regardless of size","commit_ref":null,"pull_url":null,"state":"superseded","archived":false,"hash":"77164d408f92bf48c0fa0e7c125f342d244c262a","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/1.1/people/17/?format=json","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/1558/mbox/","series":[{"id":385,"url":"https://patchwork.libcamera.org/api/1.1/series/385/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=385","date":"2019-07-01T14:13:35","name":"[libcamera-devel,v2,1/2] libcamera: ipa_module: add path to module loading error message","version":2,"mbox":"https://patchwork.libcamera.org/series/385/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/1558/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/1558/checks/","tags":{},"headers":{"Return-Path":"<paul.elder@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6719F60BF8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  1 Jul 2019 16:14:08 +0200 (CEST)","from emerald.jp (p1871204-ipngn14001hodogaya.kanagawa.ocn.ne.jp\n\t[153.220.127.204])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 8797B524;\n\tMon,  1 Jul 2019 16:14:06 +0200 (CEST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1561990448;\n\tbh=6UY9fjbPPQ6nPNlZf6ZDGw/wMiyE0ylE4BSVMmLtvwE=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=CzIva0SN/UfEsWOaladjfs7yXm9UujlDsZtJG+dfOTpukBUoPbLZvwZn2sRYTSAAk\n\t8aSXEDlgCIIA+WIxO/XlAXO1po+8UbMhLcDI5XafBJ3wxxi+p8qv/qCqMApvNfLsja\n\tTloKj9qOLHcvL0osbGWMoWM2kmpIKn5aqAP9QR3o=","From":"Paul Elder <paul.elder@ideasonboard.com>","To":"libcamera-devel@lists.libcamera.org","Date":"Mon,  1 Jul 2019 23:13:36 +0900","Message-Id":"<20190701141336.10273-2-paul.elder@ideasonboard.com>","X-Mailer":"git-send-email 2.17.1","In-Reply-To":"<20190701141336.10273-1-paul.elder@ideasonboard.com>","References":"<20190701141336.10273-1-paul.elder@ideasonboard.com>","Subject":"[libcamera-devel] [PATCH 2/2] libcamera: ipa_module: elfLoadSymbol\n\tfind symbol regardless of size","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","X-List-Received-Date":"Mon, 01 Jul 2019 14:14:08 -0000"},"content":"Make elfLoadSymbol more generic by making the symbol size an output\nrather than an input. Also move the memcpy out of elfLoadSymbol.\n\nIf the size of struct IPAModuleInfo changes between versions, we still\nwant to be able to load it and perhaps do conversions for backwards\ncompatibility. In this case the size should not be a restriction when\nsearching for the symbol.\n\nSigned-off-by: Paul Elder <paul.elder@ideasonboard.com>\n---\n src/libcamera/ipa_module.cpp | 64 ++++++++++++++++++++++--------------\n 1 file changed, 40 insertions(+), 24 deletions(-)","diff":"diff --git a/src/libcamera/ipa_module.cpp b/src/libcamera/ipa_module.cpp\nindex 5a46ec3..d82ac69 100644\n--- a/src/libcamera/ipa_module.cpp\n+++ b/src/libcamera/ipa_module.cpp\n@@ -17,6 +17,8 @@\n #include <sys/types.h>\n #include <unistd.h>\n \n+#include <tuple>\n+\n #include \"log.h\"\n #include \"pipeline_handler.h\"\n \n@@ -81,18 +83,27 @@ int elfVerifyIdent(void *map, size_t soSize)\n \treturn 0;\n }\n \n+/**\n+ * \\brief Retrieve address and size of a symbol from an mmap'ed ELF file\n+ * \\param[in] map Address of mmap'ed ELF file\n+ * \\param[in] soSize Size of mmap'ed ELF file (in bytes)\n+ * \\param[in] symbol Symbol name\n+ *\n+ * \\return zero or error code, address or nullptr, size of symbol or zero,\n+ * respectively\n+ */\n template<class ElfHeader, class SecHeader, class SymHeader>\n-int elfLoadSymbol(void *dst, size_t size, void *map, size_t soSize,\n-\t\t\t  const char *symbol)\n+std::tuple<int, void *, size_t>\n+elfLoadSymbol(void *map, size_t soSize, const char *symbol)\n {\n \tElfHeader *eHdr = elfPointer<ElfHeader>(map, 0, soSize);\n \tif (!eHdr)\n-\t\treturn -ENOEXEC;\n+\t\treturn std::make_tuple(-ENOEXEC, nullptr, 0);\n \n \toff_t offset = eHdr->e_shoff + eHdr->e_shentsize * eHdr->e_shstrndx;\n \tSecHeader *sHdr = elfPointer<SecHeader>(map, offset, soSize);\n \tif (!sHdr)\n-\t\treturn -ENOEXEC;\n+\t\treturn std::make_tuple(-ENOEXEC, nullptr, 0);\n \toff_t shnameoff = sHdr->sh_offset;\n \n \t/* Locate .dynsym section header. */\n@@ -101,12 +112,12 @@ int elfLoadSymbol(void *dst, size_t size, void *map, size_t soSize,\n \t\toffset = eHdr->e_shoff + eHdr->e_shentsize * i;\n \t\tsHdr = elfPointer<SecHeader>(map, offset, soSize);\n \t\tif (!sHdr)\n-\t\t\treturn -ENOEXEC;\n+\t\t\treturn std::make_tuple(-ENOEXEC, nullptr, 0);\n \n \t\toffset = shnameoff + sHdr->sh_name;\n \t\tchar *name = elfPointer<char[8]>(map, offset, soSize);\n \t\tif (!name)\n-\t\t\treturn -ENOEXEC;\n+\t\t\treturn std::make_tuple(-ENOEXEC, nullptr, 0);\n \n \t\tif (sHdr->sh_type == SHT_DYNSYM && !strcmp(name, \".dynsym\")) {\n \t\t\tdynsym = sHdr;\n@@ -116,13 +127,13 @@ int elfLoadSymbol(void *dst, size_t size, void *map, size_t soSize,\n \n \tif (dynsym == nullptr) {\n \t\tLOG(IPAModule, Error) << \"ELF has no .dynsym section\";\n-\t\treturn -ENOEXEC;\n+\t\treturn std::make_tuple(-ENOEXEC, nullptr, 0);\n \t}\n \n \toffset = eHdr->e_shoff + eHdr->e_shentsize * dynsym->sh_link;\n \tsHdr = elfPointer<SecHeader>(map, offset, soSize);\n \tif (!sHdr)\n-\t\treturn -ENOEXEC;\n+\t\treturn std::make_tuple(-ENOEXEC, nullptr, 0);\n \toff_t dynsym_nameoff = sHdr->sh_offset;\n \n \t/* Locate symbol in the .dynsym section. */\n@@ -132,16 +143,16 @@ int elfLoadSymbol(void *dst, size_t size, void *map, size_t soSize,\n \t\toffset = dynsym->sh_offset + dynsym->sh_entsize * i;\n \t\tSymHeader *sym = elfPointer<SymHeader>(map, offset, soSize);\n \t\tif (!sym)\n-\t\t\treturn -ENOEXEC;\n+\t\t\treturn std::make_tuple(-ENOEXEC, nullptr, 0);\n \n \t\toffset = dynsym_nameoff + sym->st_name;\n \t\tchar *name = elfPointer<char>(map, offset, soSize,\n \t\t\t\t\t      strlen(symbol) + 1);\n \t\tif (!name)\n-\t\t\treturn -ENOEXEC;\n+\t\t\treturn std::make_tuple(-ENOEXEC, nullptr, 0);\n \n \t\tif (!strcmp(name, symbol) &&\n-\t\t    sym->st_info & STB_GLOBAL && sym->st_size == size) {\n+\t\t    sym->st_info & STB_GLOBAL) {\n \t\t\ttargetSymbol = sym;\n \t\t\tbreak;\n \t\t}\n@@ -149,24 +160,22 @@ int elfLoadSymbol(void *dst, size_t size, void *map, size_t soSize,\n \n \tif (targetSymbol == nullptr) {\n \t\tLOG(IPAModule, Error) << \"Symbol \" << symbol << \" not found\";\n-\t\treturn -ENOEXEC;\n+\t\treturn std::make_tuple(-ENOEXEC, nullptr, 0);\n \t}\n \n \t/* Locate and return data of symbol. */\n \tif (targetSymbol->st_shndx >= eHdr->e_shnum)\n-\t\treturn -ENOEXEC;\n+\t\treturn std::make_tuple(-ENOEXEC, nullptr, 0);\n \toffset = eHdr->e_shoff + targetSymbol->st_shndx * eHdr->e_shentsize;\n \tsHdr = elfPointer<SecHeader>(map, offset, soSize);\n \tif (!sHdr)\n-\t\treturn -ENOEXEC;\n+\t\treturn std::make_tuple(-ENOEXEC, nullptr, 0);\n \toffset = sHdr->sh_offset + (targetSymbol->st_value - sHdr->sh_addr);\n-\tchar *data = elfPointer<char>(map, offset, soSize, size);\n+\tchar *data = elfPointer<char>(map, offset, soSize, targetSymbol->st_size);\n \tif (!data)\n-\t\treturn -ENOEXEC;\n-\n-\tmemcpy(dst, data, size);\n+\t\treturn std::make_tuple(-ENOEXEC, nullptr, 0);\n \n-\treturn 0;\n+\treturn std::make_tuple(0, data, targetSymbol->st_size);\n }\n \n } /* namespace */\n@@ -257,8 +266,10 @@ int IPAModule::loadIPAModuleInfo()\n \t\treturn ret;\n \t}\n \n-\tsize_t soSize;\n+\tvoid *data;\n+\tsize_t dataSize;\n \tvoid *map;\n+\tsize_t soSize;\n \tstruct stat st;\n \tint ret = fstat(fd, &st);\n \tif (ret < 0)\n@@ -275,11 +286,16 @@ int IPAModule::loadIPAModuleInfo()\n \t\tgoto unmap;\n \n \tif (sizeof(unsigned long) == 4)\n-\t\tret = elfLoadSymbol<Elf32_Ehdr, Elf32_Shdr, Elf32_Sym>\n-\t\t\t\t   (&info_, sizeof(info_), map, soSize, \"ipaModuleInfo\");\n+\t\tstd::tie(ret, data, dataSize) =\n+\t\t\telfLoadSymbol<Elf32_Ehdr, Elf32_Shdr, Elf32_Sym>\n+\t\t\t\t     (map, soSize, \"ipaModuleInfo\");\n \telse\n-\t\tret = elfLoadSymbol<Elf64_Ehdr, Elf64_Shdr, Elf64_Sym>\n-\t\t\t\t   (&info_, sizeof(info_), map, soSize, \"ipaModuleInfo\");\n+\t\tstd::tie(ret, data, dataSize) =\n+\t\t\telfLoadSymbol<Elf64_Ehdr, Elf64_Shdr, Elf64_Sym>\n+\t\t\t\t     (map, soSize, \"ipaModuleInfo\");\n+\n+\tif (!ret && dataSize == sizeof(info_))\n+\t\tmemcpy(&info_, data, dataSize);\n \n \tif (info_.moduleAPIVersion != IPA_MODULE_API_VERSION) {\n \t\tLOG(IPAModule, Error) << \"IPA module API version mismatch\";\n","prefixes":["libcamera-devel","2/2"]}