From: Sascha Hauer <s.hauer@pengutronix.de>
To: Clement Leger <cleger@kalray.eu>
Cc: barebox@lists.infradead.org
Subject: Re: [PATCH v2 4/6] common: elf: add elf_open and elf_close
Date: Tue, 28 Apr 2020 08:39:07 +0200 [thread overview]
Message-ID: <20200428063907.GP5877@pengutronix.de> (raw)
In-Reply-To: <20200423081712.4022-5-cleger@kalray.eu>
On Thu, Apr 23, 2020 at 10:17:09AM +0200, Clement Leger wrote:
> When loading an elf file from a mtd device, this allows to parse the
> header and load only the needed data according to the elf size. Without
> that support, loading a elf file from a /dev/mtd would try to read the
> entire partition.
>
> Signed-off-by: Clement Leger <cleger@kalray.eu>
> ---
> common/elf.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++
> include/elf.h | 7 +++++
> 2 files changed, 90 insertions(+)
>
> diff --git a/common/elf.c b/common/elf.c
> index 5534632b2..291f883cb 100644
> --- a/common/elf.c
> +++ b/common/elf.c
> @@ -5,7 +5,12 @@
>
> #include <common.h>
> #include <elf.h>
> +#include <errno.h>
> +#include <fcntl.h>
> +#include <libfile.h>
> #include <memory.h>
> +#include <unistd.h>
> +#include <linux/fs.h>
>
> struct elf_section {
> struct list_head list;
> @@ -158,3 +163,81 @@ void elf_release_image(struct elf_image *elf)
>
> free(elf);
> }
> +
> +static u64 elf_get_size(struct elf_image *elf)
> +{
> + u64 sh_size = elf_hdr_e_shentsize(elf, elf->buf) *
> + elf_hdr_e_shnum(elf, elf->buf);
> +
> + /*
> + * The section header table is located at the end of the elf file thus
> + * we can take the offset and add the size of this table to obtain the
> + * file size.
> + */
> + return elf_hdr_e_shoff(elf, elf->buf) + sh_size;
> +}
> +
> +struct elf_image *elf_open(const char *filename)
> +{
> + int fd, ret;
> + u64 size;
> + struct elf64_hdr hdr;
> + struct elf_image *elf;
> + ssize_t read_ret;
> +
> + fd = open(filename, O_RDONLY);
> + if (fd < 0) {
> + printf("could not open: %s\n", errno_str());
> + return ERR_PTR(-errno);
> + }
> +
> + if (read(fd, &hdr, sizeof(hdr)) < 0) {
> + printf("could not read elf header: %s\n", errno_str());
> + ret = -errno;
> + goto err_close_fd;
> + }
> +
> + elf = xzalloc(sizeof(*elf));
> +
> + ret = elf_check_init(elf, &hdr);
> + if (ret) {
> + ret = -errno;
> + goto err_free_elf;
> + }
> +
> + size = elf_get_size(elf);
> +
> + elf->buf = xmalloc(size);
As said before, please use malloc rather than one of the x-functions.
The regular malloc can fail when we are out of memory and then you have
a chance to fail gracefully.
Sascha
--
Pengutronix e.K. | |
Steuerwalder Str. 21 | http://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
next prev parent reply other threads:[~2020-04-28 6:39 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-23 8:17 [PATCH v2 0/6] elf: add better bootm support Clement Leger
2020-04-23 8:17 ` [PATCH v2 1/6] common: elf: add computation of elf boundaries Clement Leger
2020-04-23 8:17 ` [PATCH v2 2/6] common: elf: fix warning on 32 bits architectures Clement Leger
2020-04-23 8:17 ` [PATCH v2 3/6] common: elf: split init to be reused from other function Clement Leger
2020-04-23 8:17 ` [PATCH v2 4/6] common: elf: add elf_open and elf_close Clement Leger
2020-04-28 6:39 ` Sascha Hauer [this message]
2020-04-28 7:38 ` Clément Leger
2020-04-23 8:17 ` [PATCH v2 5/6] common: bootm: add support for elf file loading Clement Leger
2020-04-23 8:17 ` [PATCH v2 6/6] mips: lib: bootm: use bootm elf loading capabilities Clement Leger
2020-04-28 6:41 ` Sascha Hauer
2020-04-23 8:17 ` [PATCH v2 6/6] mips: lib: bootm: use new data->elf member Clement Leger
2020-04-23 8:20 ` Clément Leger
2020-04-23 10:20 ` [PATCH v2 0/6] elf: add better bootm support Antony Pavlov
2020-04-23 11:06 ` Clément Leger
2020-04-28 12:40 ` Antony Pavlov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200428063907.GP5877@pengutronix.de \
--to=s.hauer@pengutronix.de \
--cc=barebox@lists.infradead.org \
--cc=cleger@kalray.eu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.