Dear Marco,

In message <49d74e7b....@gmail.com> you wrote:
> Fixed a memory leak in image_verify_header function.
> Used the functions image_get_xxxx() from image.h.
> Fixed two sector boundary misalignment while reading.
...
> +     err = ioctl(fd, MEMGETINFO, &mtdinfo);
> +     if (err < 0) {
> +             fprintf(stderr, "%s: Cannot get MTD information: 
> %s\n",cmdname,strerror(errno));

Line too long (check also rest of file).

> +             exit(EXIT_FAILURE);
> +     }

You probably want to check for unsupported flash types, too - see
example in "tools/env/fw_env.c"

> +     mtdsize = mtdinfo.size;
> +
> +     if (sectorsize * sectorcount != mtdsize) {
> +             fprintf(stderr, "%s: Partition size (%d) incompatible with 
> sector size and count\n", cmdname, mtdsize);
> +             exit(EXIT_FAILURE);
> +     }

Hmm... what happens if an image starts in one of the small sectors in
a bottom boot type flash?

...
> +     buf = malloc(sizeof(char)*dim);

Why not just use a dynamic array on the stack? Get rid of all this
malloc() and free() stuff...

> +     if (!buf) {
> +             fprintf (stderr, "%s: Can't allocate memory: %s\n",
> +             cmdname, strerror(errno));
> +             exit(EXIT_FAILURE);
> +     }
> +
> +     if (sectoroffset != 0)
> +             lseek(fd, sectoroffset*sectorsize, SEEK_SET);

Delete these two lines and mode them into the loop...

> +     printf("Searching....\n");
> +
> +     for (j = sectoroffset; j < sectorcount; ++j) {

i. e. add

                if (lseek(fd, j*sectorsize, SEEK_SET) != j*sectorsize) {
                        error handling goes here
                }

> +             readbyte = read(fd, buf, dim);
> +             if (readbyte != dim) {
> +                     fprintf(stderr, "%s: Can't read from device: %s\n",
> +                     cmdname, strerror(errno));
> +                     exit(EXIT_FAILURE);
> +             }
> +
> +             if (fdt_check_header(buf)) {
> +                     /* old-style image */
> +                     if (image_verify_header(buf, fd)) {
> +                             found = 1;
> +                             image_print_contents((image_header_t *)buf);
> +                     }
> +             } else {
> +                     /* FIT image */
> +                     fit_print_contents(buf);
> +             }
> +
> +             lseek(fd, diff, SEEK_CUR); /* Align to next sector boundary */

Delete this line then, too.

> +void usage()
> +{
> +     fprintf (stderr, "Usage:\n"
> +                      "       %s [-o offset] -s count -c size \n"
> +                      "          -o ==> number of sectors to use as offset\n"
> +                      "          -s ==> number of sectors\n"
> +                      "          -c ==> size of sectors\n",
> +             cmdname);

Usage message is not correct - the device argument is missing.

> +     exit (EXIT_FAILURE);
> +}
> +
> +static int image_verify_header(char *ptr, int fd)
> +{
> +     int len, n;
> +     char *data;
> +     uint32_t checksum;
> +     image_header_t *hdr = (image_header_t *)ptr;
> +
> +     if (image_get_magic(hdr) != IH_MAGIC) {
> +             return 0;
> +     }
> +
> +     data = (char *)hdr;
> +     len  = image_get_header_size();
> +
> +     checksum = image_get_hcrc(hdr);
> +     hdr->ih_hcrc = htonl(0);        /* clear for re-calculation */
> +
> +     if (crc32(0, data, len) != checksum) {
> +             fprintf (stderr,
> +                     "%s: Maybe image found but it has bad header 
> checksum!\n",
> +                     cmdname);
> +             return 0;
> +     }
> +
> +     len = image_get_size(hdr);
> +     data = malloc(len * sizeof(char));

Come on. sizeof(char) ? You must be joking.

> +     if (!data) {
> +             fprintf (stderr, "%s: Can't allocate memory: %s\n",
> +             cmdname, strerror(errno));
> +             exit(EXIT_FAILURE);
> +     }

Get rid of this malloc(), too.

> +     n = read(fd, data, len);
> +     if (n != len) {
> +             fprintf (stderr,
> +                     "%s: Error while reading: %s\n",
> +                     cmdname, strerror(errno));
> +             exit(EXIT_FAILURE);
> +     }
> +
> +     lseek(fd, -len, SEEK_CUR);

Why would this lseek() be needed? [And ifit ws needed, you should
check it's return value.]

> diff -uprN u-boot-2009.03-orig/tools/imls.h u-boot-2009.03/tools/imls.h
> --- u-boot-2009.03-orig/tools/imls.h  1970-01-01 01:00:00.000000000 +0100
> +++ u-boot-2009.03/tools/imls.h       2009-03-29 11:43:31.000000000 +0200
> @@ -0,0 +1,41 @@
...
> +#include <errno.h>
> +#include <fcntl.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <stddef.h>
> +#include <string.h>
> +#include <sys/types.h>
> +#include <sys/ioctl.h>
> +#include <sys/stat.h>
> +#include <unistd.h>
> +
> +#ifdef MTD_OLD
> +# include <stdint.h>
> +# include <linux/mtd/mtd.h>
> +#else
> +# define  __user     /* nothing */
> +# include <mtd/mtd-user.h>
> +#endif
> +
> +#include <sha1.h>
> +#include "fdt_host.h"
> +#include <image.h>

Such a header file makes no sense, especially with just a single user.
Dump it.

> diff -uprN u-boot-2009.03-orig/tools/Makefile u-boot-2009.03/tools/Makefile
> --- u-boot-2009.03-orig/tools/Makefile        2009-03-21 22:04:41.000000000 
> +0100
> +++ u-boot-2009.03/tools/Makefile     2009-03-28 18:47:38.000000000 +0100

Please also rebase against current top of tree.


Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: w...@denx.de
Swap read error.  You lose your mind.
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to