use CALL_COMMAND_HANDLER instead of direct calls
[fw/openocd] / src / target / image.c
index 0ffa5fd3d9b6d96d394b5d19fb869a82826e491a..cf7e11ab1c45442ed9106d366e39dfd7d8a659f1 100644 (file)
@@ -2,12 +2,15 @@
  *   Copyright (C) 2007 by Dominic Rath                                    *
  *   Dominic.Rath@gmx.de                                                   *
  *                                                                         *
- *   Copyright (C) 2007,2008 Øyvind Harboe                                 *
+ *   Copyright (C) 2007,2008 Øyvind Harboe                                 *
  *   oyvind.harboe@zylin.com                                               *
  *                                                                         *
  *   Copyright (C) 2008 by Spencer Oliver                                  *
  *   spen@spen-soft.co.uk                                                  *
  *                                                                         *
+ *   Copyright (C) 2009 by Franck Hereson                                  *
+ *   franck.hereson@secad.fr                                               *
+ *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU General Public License as published by  *
  *   the Free Software Foundation; either version 2 of the License, or     *
@@ -41,7 +44,7 @@
        ((elf->endianness == ELFDATA2LSB)? \
                le_to_h_u32((uint8_t*)&field):be_to_h_u32((uint8_t*)&field))
 
-static int autodetect_image_type(image_t *image, char *url)
+static int autodetect_image_type(image_t *image, const char *url)
 {
        int retval;
        fileio_t fileio;
@@ -103,7 +106,7 @@ static int autodetect_image_type(image_t *image, char *url)
        return ERROR_OK;
 }
 
-static int identify_image_type(image_t *image, char *type_string, char *url)
+static int identify_image_type(image_t *image, const char *type_string, const char *url)
 {
        if (type_string)
        {
@@ -196,6 +199,12 @@ static int image_ihex_buffer_complete(image_t *image)
                                if (section[image->num_sections].size != 0)
                                {
                                        image->num_sections++;
+                                       if (image->num_sections >= IMAGE_MAX_SECTIONS)
+                                       {
+                                               /* too many sections */
+                                               LOG_ERROR("Too many sections found in IHEX file");
+                                               return ERROR_IMAGE_FORMAT_ERROR;
+                                       }
                                        section[image->num_sections].size = 0x0;
                                        section[image->num_sections].flags = 0;
                                        section[image->num_sections].private = &ihex->buffer[cooked_bytes];
@@ -252,6 +261,12 @@ static int image_ihex_buffer_complete(image_t *image)
                                if (section[image->num_sections].size != 0)
                                {
                                        image->num_sections++;
+                                       if (image->num_sections >= IMAGE_MAX_SECTIONS)
+                                       {
+                                               /* too many sections */
+                                               LOG_ERROR("Too many sections found in IHEX file");
+                                               return ERROR_IMAGE_FORMAT_ERROR;
+                                       }
                                        section[image->num_sections].size = 0x0;
                                        section[image->num_sections].flags = 0;
                                        section[image->num_sections].private = &ihex->buffer[cooked_bytes];
@@ -292,6 +307,12 @@ static int image_ihex_buffer_complete(image_t *image)
                                if (section[image->num_sections].size != 0)
                                {
                                        image->num_sections++;
+                                       if (image->num_sections >= IMAGE_MAX_SECTIONS)
+                                       {
+                                               /* too many sections */
+                                               LOG_ERROR("Too many sections found in IHEX file");
+                                               return ERROR_IMAGE_FORMAT_ERROR;
+                                       }
                                        section[image->num_sections].size = 0x0;
                                        section[image->num_sections].flags = 0;
                                        section[image->num_sections].private = &ihex->buffer[cooked_bytes];
@@ -533,7 +554,7 @@ static int image_mot_buffer_complete(image_t *image)
                }
                else if (record_type >= 1 && record_type <= 3)
                {
-                       switch ( record_type )
+                       switch (record_type)
                        {
                                case 1:
                                        /* S1 - 16 bit address data record */
@@ -636,7 +657,7 @@ static int image_mot_buffer_complete(image_t *image)
                cal_checksum += (uint8_t)checksum;
                bytes_read += 2;
 
-               if ( cal_checksum != 0xFF )
+               if (cal_checksum != 0xFF)
                {
                        /* checksum failed */
                        LOG_ERROR("incorrect record checksum found in S19 file");
@@ -648,7 +669,7 @@ static int image_mot_buffer_complete(image_t *image)
        return ERROR_IMAGE_FORMAT_ERROR;
 }
 
-int image_open(image_t *image, char *url, char *type_string)
+int image_open(image_t *image, const char *url, const char *type_string)
 {
        int retval = ERROR_OK;
 
@@ -852,7 +873,7 @@ int image_read_section(image_t *image, int section, uint32_t offset, uint32_t si
                        memcpy(buffer + *size_read,
                                image_memory->cache + (address - image_memory->cache_address),
                                (size_in_cache > size) ? size : size_in_cache
-                               );
+);
 
                        *size_read += (size_in_cache > size) ? size : size_in_cache;
                        address += (size_in_cache > size) ? size : size_in_cache;