X-Git-Url: https://git.gag.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Ftarget%2Fimage.c;h=b0d957f8ab62164f7d9a1d63be442655ef2393f0;hb=559d08c19ed838f7bb2a77ce56a5a274641111f8;hp=f8d05292c853cf5189b5337b5fc8c3771d3a2cbd;hpb=c79cca04bed78839a18e73f3996805eb8001a812;p=fw%2Fopenocd diff --git a/src/target/image.c b/src/target/image.c index f8d05292c..b0d957f8a 100644 --- a/src/target/image.c +++ b/src/target/image.c @@ -147,7 +147,7 @@ static int identify_image_type(struct image *image, const char *type_string, con return ERROR_OK; } -static int image_ihex_buffer_complete_inner(struct image *image, char *lpszLine, struct imageection *section) +static int image_ihex_buffer_complete_inner(struct image *image, char *lpszLine, struct imagesection *section) { struct image_ihex *ihex = image->type_private; struct fileio *fileio = &ihex->fileio; @@ -158,7 +158,13 @@ static int image_ihex_buffer_complete_inner(struct image *image, char *lpszLine, /* we can't determine the number of sections that we'll have to create ahead of time, * so we locally hold them until parsing is finished */ - ihex->buffer = malloc(fileio->size >> 1); + int filesize; + int retval; + retval = fileio_size(fileio, &filesize); + if (retval != ERROR_OK) + return retval; + + ihex->buffer = malloc(filesize >> 1); cooked_bytes = 0x0; image->num_sections = 0; section[image->num_sections].private = &ihex->buffer[cooked_bytes]; @@ -230,7 +236,7 @@ static int image_ihex_buffer_complete_inner(struct image *image, char *lpszLine, image->num_sections++; /* copy section information */ - image->sections = malloc(sizeof(struct imageection) * image->num_sections); + image->sections = malloc(sizeof(struct imagesection) * image->num_sections); for (i = 0; i < image->num_sections; i++) { image->sections[i].private = section[i].private; @@ -367,7 +373,7 @@ static int image_ihex_buffer_complete(struct image *image) LOG_ERROR("Out of memory"); return ERROR_FAIL; } - struct imageection *section = malloc(sizeof(struct imageection) * IMAGE_MAX_SECTIONS); + struct imagesection *section = malloc(sizeof(struct imagesection) * IMAGE_MAX_SECTIONS); if (section == NULL) { free(lpszLine); @@ -466,7 +472,7 @@ static int image_elf_read_headers(struct image *image) if ((field32(elf, elf->segments[i].p_type) == PT_LOAD) && (field32(elf, elf->segments[i].p_filesz) != 0)) image->num_sections++; /* alloc and fill sections array with loadable segments */ - image->sections = malloc(image->num_sections * sizeof(struct imageection)); + image->sections = malloc(image->num_sections * sizeof(struct imagesection)); for (i = 0,j = 0;i < elf->segment_count;i++) { if ((field32(elf, elf->segments[i].p_type) == PT_LOAD) && (field32(elf, elf->segments[i].p_filesz) != 0)) @@ -526,7 +532,7 @@ static int image_elf_read_section(struct image *image, int section, uint32_t off return ERROR_OK; } -static int image_mot_buffer_complete_inner(struct image *image, char *lpszLine, struct imageection *section) +static int image_mot_buffer_complete_inner(struct image *image, char *lpszLine, struct imagesection *section) { struct image_mot *mot = image->type_private; struct fileio *fileio = &mot->fileio; @@ -537,7 +543,13 @@ static int image_mot_buffer_complete_inner(struct image *image, char *lpszLine, /* we can't determine the number of sections that we'll have to create ahead of time, * so we locally hold them until parsing is finished */ - mot->buffer = malloc(fileio->size >> 1); + int retval; + int filesize; + retval = fileio_size(fileio, &filesize); + if (retval != ERROR_OK) + return retval; + + mot->buffer = malloc(filesize >> 1); cooked_bytes = 0x0; image->num_sections = 0; section[image->num_sections].private = &mot->buffer[cooked_bytes]; @@ -660,7 +672,7 @@ static int image_mot_buffer_complete_inner(struct image *image, char *lpszLine, image->num_sections++; /* copy section information */ - image->sections = malloc(sizeof(struct imageection) * image->num_sections); + image->sections = malloc(sizeof(struct imagesection) * image->num_sections); for (i = 0; i < image->num_sections; i++) { image->sections[i].private = section[i].private; @@ -706,7 +718,7 @@ static int image_mot_buffer_complete(struct image *image) LOG_ERROR("Out of memory"); return ERROR_FAIL; } - struct imageection *section = malloc(sizeof(struct imageection) * IMAGE_MAX_SECTIONS); + struct imagesection *section = malloc(sizeof(struct imagesection) * IMAGE_MAX_SECTIONS); if (section == NULL) { free(lpszLine); @@ -743,11 +755,18 @@ int image_open(struct image *image, const char *url, const char *type_string) { return retval; } + int filesize; + retval = fileio_size(&image_binary->fileio, &filesize); + if (retval != ERROR_OK) + { + fileio_close(&image_binary->fileio); + return retval; + } image->num_sections = 1; - image->sections = malloc(sizeof(struct imageection)); + image->sections = malloc(sizeof(struct imagesection)); image->sections[0].base_address = 0x0; - image->sections[0].size = image_binary->fileio.size; + image->sections[0].size = filesize; image->sections[0].flags = 0; } else if (image->type == IMAGE_IHEX) @@ -798,7 +817,7 @@ int image_open(struct image *image, const char *url, const char *type_string) struct image_memory *image_memory; image->num_sections = 1; - image->sections = malloc(sizeof(struct imageection)); + image->sections = malloc(sizeof(struct imagesection)); image->sections[0].base_address = 0x0; image->sections[0].size = 0xffffffff; image->sections[0].flags = 0; @@ -954,7 +973,7 @@ int image_read_section(struct image *image, int section, uint32_t offset, uint32 int image_add_section(struct image *image, uint32_t base, uint32_t size, int flags, uint8_t *data) { - struct imageection *section; + struct imagesection *section; /* only image builder supports adding sections */ if (image->type != IMAGE_BUILDER) @@ -978,7 +997,7 @@ int image_add_section(struct image *image, uint32_t base, uint32_t size, int fla /* allocate new section */ image->num_sections++; - image->sections = realloc(image->sections, sizeof(struct imageection) * image->num_sections); + image->sections = realloc(image->sections, sizeof(struct imagesection) * image->num_sections); section = &image->sections[image->num_sections - 1]; section->base_address = base; section->size = size;