diff options
author | David Wagner <david.wagner@free-electrons.com> | 2012-01-13 13:27:36 +0000 |
---|---|---|
committer | Anatolij Gustschin <agust@denx.de> | 2012-03-27 09:56:25 +0200 |
commit | 3d0f9bd0349712223d5be40aa69f4ca1a1965a3e (patch) | |
tree | c116a00a60d737806bdb3d7d026f224d54f8f68d | |
parent | d1acdae98655af4a9ed1b138325ff172206d1c00 (diff) | |
download | u-boot-3d0f9bd0349712223d5be40aa69f4ca1a1965a3e.tar.gz u-boot-3d0f9bd0349712223d5be40aa69f4ca1a1965a3e.tar.bz2 u-boot-3d0f9bd0349712223d5be40aa69f4ca1a1965a3e.zip |
mkenvimage: More error handling
Verbosly fail if the target environment size or the padding byte are badly
formated.
Verbosly fail if something bad happens when reading from standard input.
Signed-off-by: David Wagner <david.wagner@free-electrons.com>
Acked-by: Mike Frysinger <vapier@gentoo.org>
-rw-r--r-- | tools/mkenvimage.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/tools/mkenvimage.c b/tools/mkenvimage.c index c1915795ea..b6879bcef7 100644 --- a/tools/mkenvimage.c +++ b/tools/mkenvimage.c @@ -63,6 +63,24 @@ static void usage(const char *exec_name) exec_name); } +long int xstrtol(const char *s) +{ + long int tmp; + + errno = 0; + tmp = strtol(s, NULL, 0); + if (!errno) + return tmp; + + if (errno == ERANGE) + fprintf(stderr, "Bad integer format: %s\n", s); + else + fprintf(stderr, "Error while parsing %s: %s\n", s, + strerror(errno)); + + exit(EXIT_FAILURE); +} + int main(int argc, char **argv) { uint32_t crc, targetendian_crc; @@ -92,7 +110,7 @@ int main(int argc, char **argv) while ((option = getopt(argc, argv, ":s:o:rbp:hV")) != -1) { switch (option) { case 's': - datasize = strtol(optarg, NULL, 0); + datasize = xstrtol(optarg); break; case 'o': bin_filename = strdup(optarg); @@ -108,7 +126,7 @@ int main(int argc, char **argv) bigendian = 1; break; case 'p': - padbyte = strtol(optarg, NULL, 0); + padbyte = xstrtol(optarg); break; case 'h': usage(prg); @@ -166,7 +184,16 @@ int main(int argc, char **argv) do { filebuf = realloc(filebuf, readlen); + if (!filebuf) { + fprintf(stderr, "Can't realloc memory for the input file buffer\n"); + return EXIT_FAILURE; + } readbytes = read(txt_fd, filebuf + filesize, readlen); + if (errno) { + fprintf(stderr, "Error while reading stdin: %s\n", + strerror(errno)); + return EXIT_FAILURE; + } filesize += readbytes; } while (readbytes == readlen); |