X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Fvms-alpha.c;h=e31a9e4ca10bca344dab67ea208b0784ffb85458;hb=ebe84f23d2f3c0cb145cc7b3acfb011a4c7df1c9;hp=ac01c4dac8a69e008897d72fbf95fbdda5286397;hpb=96d3b80f5498c0aa40099f37f6384f2041df045f;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/vms-alpha.c b/bfd/vms-alpha.c index ac01c4dac8..e31a9e4ca1 100644 --- a/bfd/vms-alpha.c +++ b/bfd/vms-alpha.c @@ -863,7 +863,7 @@ vms_get_remaining_object_record (bfd *abfd, unsigned int read_so_far) if (to_read > PRIV (recrd.buf_size)) { PRIV (recrd.buf) - = (unsigned char *) bfd_realloc (PRIV (recrd.buf), to_read); + = (unsigned char *) bfd_realloc_or_free (PRIV (recrd.buf), to_read); if (PRIV (recrd.buf) == NULL) return 0; PRIV (recrd.buf_size) = to_read; @@ -1126,7 +1126,7 @@ add_symbol_entry (bfd *abfd, struct vms_symbol_entry *sym) else { PRIV (max_sym_count) *= 2; - PRIV (syms) = bfd_realloc + PRIV (syms) = bfd_realloc_or_free (PRIV (syms), (PRIV (max_sym_count) * sizeof (struct vms_symbol_entry *))); } @@ -1548,40 +1548,62 @@ image_inc_ptr (bfd *abfd, bfd_vma offset) /* Save current DST location counter under specified index. */ -static void +static bfd_boolean dst_define_location (bfd *abfd, unsigned int loc) { vms_debug2 ((4, "dst_define_location (%d)\n", (int)loc)); + if (loc > 1 << 24) + { + /* 16M entries ought to be plenty. */ + bfd_set_error (bfd_error_bad_value); + _bfd_error_handler (_("dst_define_location %u too large"), loc); + return FALSE; + } + /* Grow the ptr offset table if necessary. */ if (loc + 1 > PRIV (dst_ptr_offsets_count)) { - PRIV (dst_ptr_offsets) = bfd_realloc (PRIV (dst_ptr_offsets), - (loc + 1) * sizeof (unsigned int)); + PRIV (dst_ptr_offsets) + = bfd_realloc_or_free (PRIV (dst_ptr_offsets), + (loc + 1) * sizeof (unsigned int)); + if (PRIV (dst_ptr_offsets) == NULL) + return FALSE; PRIV (dst_ptr_offsets_count) = loc + 1; } PRIV (dst_ptr_offsets)[loc] = PRIV (image_offset); + return TRUE; } /* Restore saved DST location counter from specified index. */ -static void +static bfd_boolean dst_restore_location (bfd *abfd, unsigned int loc) { vms_debug2 ((4, "dst_restore_location (%d)\n", (int)loc)); - PRIV (image_offset) = PRIV (dst_ptr_offsets)[loc]; + if (loc < PRIV (dst_ptr_offsets_count)) + { + PRIV (image_offset) = PRIV (dst_ptr_offsets)[loc]; + return TRUE; + } + return FALSE; } /* Retrieve saved DST location counter from specified index. */ -static unsigned int -dst_retrieve_location (bfd *abfd, unsigned int loc) +static bfd_boolean +dst_retrieve_location (bfd *abfd, bfd_vma *loc) { - vms_debug2 ((4, "dst_retrieve_location (%d)\n", (int)loc)); + vms_debug2 ((4, "dst_retrieve_location (%d)\n", (int) *loc)); - return PRIV (dst_ptr_offsets)[loc]; + if (*loc < PRIV (dst_ptr_offsets_count)) + { + *loc = PRIV (dst_ptr_offsets)[*loc]; + return TRUE; + } + return FALSE; } /* Write multiple bytes to section image. */ @@ -1589,26 +1611,35 @@ dst_retrieve_location (bfd *abfd, unsigned int loc) static bfd_boolean image_write (bfd *abfd, unsigned char *ptr, unsigned int size) { + asection *sec = PRIV (image_section); + size_t off = PRIV (image_offset); + + /* Check bounds. */ + if (off > sec->size + || size > sec->size - off) + { + bfd_set_error (bfd_error_bad_value); + return FALSE; + } + #if VMS_DEBUG _bfd_vms_debug (8, "image_write from (%p, %d) to (%ld)\n", ptr, size, - (long)PRIV (image_offset)); + (long) off)); #endif if (PRIV (image_section)->contents != NULL) + memcpy (sec->contents + off, ptr, size); + else { - asection *sec = PRIV (image_section); - size_t off = PRIV (image_offset); - - /* Check bounds. */ - if (off > sec->size - || size > sec->size - off) - { - bfd_set_error (bfd_error_bad_value); - return FALSE; - } - - memcpy (sec->contents + off, ptr, size); + unsigned int i; + for (i = 0; i < size; i++) + if (ptr[i] != 0) + { + bfd_set_error (bfd_error_bad_value); + return FALSE; + } } + #if VMS_DEBUG _bfd_hexdump (9, ptr, size, 0); #endif @@ -1894,11 +1925,12 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) return FALSE; } ptr += 4; + cmd_length -= 4; #if VMS_DEBUG _bfd_vms_debug (4, "etir: %s(%d)\n", _bfd_vms_etir_name (cmd), cmd); - _bfd_hexdump (8, ptr, cmd_length - 4, 0); + _bfd_hexdump (8, ptr, cmd_length, 0); #endif switch (cmd) @@ -1908,7 +1940,7 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) stack 32 bit value of symbol (high bits set to 0). */ case ETIR__C_STA_GBL: - _bfd_vms_get_value (abfd, ptr, maxptr, info, &op1, &h); + _bfd_vms_get_value (abfd, ptr, ptr + cmd_length, info, &op1, &h); if (!_bfd_vms_push (abfd, op1, alpha_vms_sym_to_ctxt (h))) return FALSE; break; @@ -1918,7 +1950,7 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) stack 32 bit value, sign extend to 64 bit. */ case ETIR__C_STA_LW: - if (ptr + 4 > maxptr) + if (cmd_length < 4) goto corrupt_etir; if (!_bfd_vms_push (abfd, bfd_getl32 (ptr), RELC_NONE)) return FALSE; @@ -1929,7 +1961,7 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) stack 64 bit value of symbol. */ case ETIR__C_STA_QW: - if (ptr + 8 > maxptr) + if (cmd_length < 8) goto corrupt_etir; if (!_bfd_vms_push (abfd, bfd_getl64 (ptr), RELC_NONE)) return FALSE; @@ -1945,7 +1977,7 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) { int psect; - if (ptr + 12 > maxptr) + if (cmd_length < 12) goto corrupt_etir; psect = bfd_getl32 (ptr); if ((unsigned int) psect >= PRIV (section_count)) @@ -1976,7 +2008,8 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) return FALSE; if (rel1 != RELC_NONE) goto bad_context; - image_write_b (abfd, (unsigned int) op1 & 0xff); + if (!image_write_b (abfd, (unsigned int) op1 & 0xff)) + return FALSE; break; /* Store word: pop stack, write word @@ -1986,7 +2019,8 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) return FALSE; if (rel1 != RELC_NONE) goto bad_context; - image_write_w (abfd, (unsigned int) op1 & 0xffff); + if (!image_write_w (abfd, (unsigned int) op1 & 0xffff)) + return FALSE; break; /* Store longword: pop stack, write longword @@ -2012,7 +2046,8 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) if (!alpha_vms_add_lw_reloc (info)) return FALSE; } - image_write_l (abfd, op1); + if (!image_write_l (abfd, op1)) + return FALSE; break; /* Store quadword: pop stack, write quadword @@ -2034,7 +2069,8 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) if (!alpha_vms_add_qw_reloc (info)) return FALSE; } - image_write_q (abfd, op1); + if (!image_write_q (abfd, op1)) + return FALSE; break; /* Store immediate repeated: pop stack for repeat count @@ -2044,22 +2080,28 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) { int size; - if (ptr + 4 > maxptr) + if (cmd_length < 4) goto corrupt_etir; size = bfd_getl32 (ptr); + if (size > cmd_length - 4) + goto corrupt_etir; if (!_bfd_vms_pop (abfd, &op1, &rel1)) return FALSE; if (rel1 != RELC_NONE) goto bad_context; + if (size == 0) + break; + op1 &= 0xffffffff; while (op1-- > 0) - image_write (abfd, ptr + 4, size); + if (!image_write (abfd, ptr + 4, size)) + return FALSE; } break; /* Store global: write symbol value arg: cs global symbol name. */ case ETIR__C_STO_GBL: - _bfd_vms_get_value (abfd, ptr, maxptr, info, &op1, &h); + _bfd_vms_get_value (abfd, ptr, ptr + cmd_length, info, &op1, &h); if (h && h->sym) { if (h->sym->typ == EGSD__C_SYMG) @@ -2077,13 +2119,14 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) return FALSE; } } - image_write_q (abfd, op1); + if (!image_write_q (abfd, op1)) + return FALSE; break; /* Store code address: write address of entry point arg: cs global symbol name (procedure). */ case ETIR__C_STO_CA: - _bfd_vms_get_value (abfd, ptr, maxptr, info, &op1, &h); + _bfd_vms_get_value (abfd, ptr, ptr + cmd_length, info, &op1, &h); if (h && h->sym) { if (h->sym->flags & EGSY__V_NORM) @@ -2109,7 +2152,8 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) abort (); } } - image_write_q (abfd, op1); + if (!image_write_q (abfd, op1)) + return FALSE; break; /* Store offset to psect: pop stack, add low 32 bits to base of psect @@ -2123,7 +2167,8 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) op1 = alpha_vms_fix_sec_rel (abfd, info, rel1, op1); rel1 = RELC_REL; - image_write_q (abfd, op1); + if (!image_write_q (abfd, op1)) + return FALSE; break; /* Store immediate @@ -2133,10 +2178,11 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) { unsigned int size; - if (ptr + 4 > maxptr) + if (cmd_length < 4) goto corrupt_etir; size = bfd_getl32 (ptr); - image_write (abfd, ptr + 4, size); + if (!image_write (abfd, ptr + 4, size)) + return FALSE; } break; @@ -2147,11 +2193,12 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) store global longword: store 32bit value of symbol arg: cs symbol name. */ case ETIR__C_STO_GBL_LW: - _bfd_vms_get_value (abfd, ptr, maxptr, info, &op1, &h); + _bfd_vms_get_value (abfd, ptr, ptr + cmd_length, info, &op1, &h); #if 0 abort (); #endif - image_write_l (abfd, op1); + if (!image_write_l (abfd, op1)) + return FALSE; break; case ETIR__C_STO_RB: @@ -2200,7 +2247,9 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) da signature. */ case ETIR__C_STC_LP_PSB: - _bfd_vms_get_value (abfd, ptr + 4, maxptr, info, &op1, &h); + if (cmd_length < 4) + goto corrupt_etir; + _bfd_vms_get_value (abfd, ptr + 4, ptr + cmd_length, info, &op1, &h); if (h && h->sym) { if (h->sym->typ == EGSD__C_SYMG) @@ -2224,8 +2273,9 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) op1 = 0; op2 = 0; } - image_write_q (abfd, op1); - image_write_q (abfd, op2); + if (!image_write_q (abfd, op1) + || !image_write_q (abfd, op2)) + return FALSE; break; /* 205 Store-conditional NOP at address of global @@ -2298,7 +2348,7 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) /* Augment relocation base: increment image location counter by offset arg: lw offset value. */ case ETIR__C_CTL_AUGRB: - if (ptr + 4 > maxptr) + if (cmd_length < 4) goto corrupt_etir; op1 = bfd_getl32 (ptr); image_inc_ptr (abfd, op1); @@ -2311,7 +2361,8 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) return FALSE; if (rel1 != RELC_NONE) goto bad_context; - dst_define_location (abfd, op1); + if (!dst_define_location (abfd, op1)) + return FALSE; break; /* Set location: pop index, restore location counter from index @@ -2321,7 +2372,12 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) return FALSE; if (rel1 != RELC_NONE) goto bad_context; - dst_restore_location (abfd, op1); + if (!dst_restore_location (abfd, op1)) + { + bfd_set_error (bfd_error_bad_value); + _bfd_error_handler (_("invalid %s"), "ETIR__C_CTL_STLOC"); + return FALSE; + } break; /* Stack defined location: pop index, push location counter from index @@ -2331,8 +2387,13 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) return FALSE; if (rel1 != RELC_NONE) goto bad_context; - if (!_bfd_vms_push (abfd, dst_retrieve_location (abfd, op1), - RELC_NONE)) + if (!dst_retrieve_location (abfd, &op1)) + { + bfd_set_error (bfd_error_bad_value); + _bfd_error_handler (_("invalid %s"), "ETIR__C_CTL_STKDL"); + return FALSE; + } + if (!_bfd_vms_push (abfd, op1, RELC_NONE)) return FALSE; break; @@ -2385,8 +2446,11 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) return FALSE; if (rel1 != RELC_NONE || rel2 != RELC_NONE) goto bad_context; - if (op2 == 0) + if (op1 == 0) { + /* Divide by zero is supposed to give a result of zero, + and a non-fatal warning message. */ + _bfd_error_handler (_("%s divide by zero"), "ETIR__C_OPR_DIV"); if (!_bfd_vms_push (abfd, 0, RELC_NONE)) return FALSE; } @@ -2498,7 +2562,7 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info) break; } - ptr += cmd_length - 4; + ptr += cmd_length; } return TRUE; @@ -2609,7 +2673,7 @@ _bfd_vms_slurp_eeom (bfd *abfd) static bfd_boolean _bfd_vms_slurp_object_records (bfd * abfd) { - bfd_boolean err; + bfd_boolean ok; int type; do @@ -2626,27 +2690,27 @@ _bfd_vms_slurp_object_records (bfd * abfd) switch (type) { case EOBJ__C_EMH: - err = _bfd_vms_slurp_ehdr (abfd); + ok = _bfd_vms_slurp_ehdr (abfd); break; case EOBJ__C_EEOM: - err = _bfd_vms_slurp_eeom (abfd); + ok = _bfd_vms_slurp_eeom (abfd); break; case EOBJ__C_EGSD: - err = _bfd_vms_slurp_egsd (abfd); + ok = _bfd_vms_slurp_egsd (abfd); break; case EOBJ__C_ETIR: - err = TRUE; /* _bfd_vms_slurp_etir (abfd); */ + ok = TRUE; /* _bfd_vms_slurp_etir (abfd); */ break; case EOBJ__C_EDBG: - err = _bfd_vms_slurp_edbg (abfd); + ok = _bfd_vms_slurp_edbg (abfd); break; case EOBJ__C_ETBT: - err = _bfd_vms_slurp_etbt (abfd); + ok = _bfd_vms_slurp_etbt (abfd); break; default: - err = FALSE; + ok = FALSE; } - if (!err) + if (!ok) { vms_debug2 ((2, "slurp type %d failed\n", type)); return FALSE; @@ -2702,7 +2766,7 @@ alpha_vms_free_private (bfd *abfd) /* Check the format for a file being read. Return a (bfd_target *) if it's an object file or zero if not. */ -static const struct bfd_target * +static bfd_cleanup alpha_vms_object_p (bfd *abfd) { void *tdata_save = abfd->tdata.any; @@ -2719,7 +2783,7 @@ alpha_vms_object_p (bfd *abfd) } if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET)) - goto err_wrong_format; + goto error_ret; /* The first challenge with VMS is to discover the kind of the file. @@ -2738,27 +2802,17 @@ alpha_vms_object_p (bfd *abfd) 2 bytes size repeated) and 12 bytes for images (4 bytes major id, 4 bytes minor id, 4 bytes length). */ test_len = 12; - - /* Size the main buffer. */ - buf = (unsigned char *) bfd_malloc (test_len); + buf = _bfd_malloc_and_read (abfd, test_len, test_len); if (buf == NULL) goto error_ret; PRIV (recrd.buf) = buf; PRIV (recrd.buf_size) = test_len; - - /* Initialize the record pointer. */ PRIV (recrd.rec) = buf; - if (bfd_bread (buf, test_len, abfd) != test_len) - goto err_wrong_format; - /* Is it an image? */ if ((bfd_getl32 (buf) == EIHD__K_MAJORID) && (bfd_getl32 (buf + 4) == EIHD__K_MINORID)) { - unsigned int to_read; - unsigned int read_so_far; - unsigned int remaining; unsigned int eisd_offset, eihs_offset; /* Extract the header size. */ @@ -2768,44 +2822,25 @@ alpha_vms_object_p (bfd *abfd) if (PRIV (recrd.rec_size) == 0) PRIV (recrd.rec_size) = sizeof (struct vms_eihd); - if (PRIV (recrd.rec_size) > PRIV (recrd.buf_size)) - { - buf = bfd_realloc_or_free (buf, PRIV (recrd.rec_size)); - - if (buf == NULL) - { - PRIV (recrd.buf) = NULL; - goto error_ret; - } - PRIV (recrd.buf) = buf; - PRIV (recrd.buf_size) = PRIV (recrd.rec_size); - } - /* PR 21813: Check for a truncated record. */ - if (PRIV (recrd.rec_size < test_len)) - goto error_ret; - /* Read the remaining record. */ - remaining = PRIV (recrd.rec_size) - test_len; - to_read = MIN (VMS_BLOCK_SIZE - test_len, remaining); - read_so_far = test_len; - - while (remaining > 0) - { - if (bfd_bread (buf + read_so_far, to_read, abfd) != to_read) - goto err_wrong_format; + /* PR 17512: file: 7d7c57c2. */ + if (PRIV (recrd.rec_size) < sizeof (struct vms_eihd)) + goto err_wrong_format; - read_so_far += to_read; - remaining -= to_read; + if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET)) + goto error_ret; - to_read = MIN (VMS_BLOCK_SIZE, remaining); - } + free (PRIV (recrd.buf)); + PRIV (recrd.buf) = NULL; + buf = _bfd_malloc_and_read (abfd, PRIV (recrd.rec_size), + PRIV (recrd.rec_size)); + if (buf == NULL) + goto error_ret; - /* Reset the record pointer. */ + PRIV (recrd.buf) = buf; + PRIV (recrd.buf_size) = PRIV (recrd.rec_size); PRIV (recrd.rec) = buf; - /* PR 17512: file: 7d7c57c2. */ - if (PRIV (recrd.rec_size) < sizeof (struct vms_eihd)) - goto error_ret; vms_debug2 ((2, "file type is image\n")); if (!_bfd_vms_slurp_eihd (abfd, &eisd_offset, &eihs_offset)) @@ -2850,7 +2885,7 @@ alpha_vms_object_p (bfd *abfd) if (! bfd_default_set_arch_mach (abfd, bfd_arch_alpha, 0)) goto err_wrong_format; - return abfd->xvec; + return alpha_vms_free_private; err_wrong_format: bfd_set_error (bfd_error_wrong_format); @@ -2963,17 +2998,23 @@ vector_grow1 (struct vector_type *vec, size_t elsz) if (vec->max_el == 0) { vec->max_el = 16; - vec->els = bfd_malloc2 (vec->max_el, elsz); + vec->els = bfd_malloc (vec->max_el * elsz); } else { + size_t amt; if (vec->max_el > -1u / 2) { bfd_set_error (bfd_error_file_too_big); return NULL; } vec->max_el *= 2; - vec->els = bfd_realloc2 (vec->els, vec->max_el, elsz); + if (_bfd_mul_overflow (vec->max_el, elsz, &amt)) + { + bfd_set_error (bfd_error_file_too_big); + return NULL; + } + vec->els = bfd_realloc_or_free (vec->els, amt); } } if (vec->els == NULL) @@ -4278,7 +4319,7 @@ new_module (bfd *abfd) /* Parse debug info for a module and internalize it. */ -static void +static bfd_boolean parse_module (bfd *abfd, struct module *module, unsigned char *ptr, int length) { @@ -4390,9 +4431,11 @@ parse_module (bfd *abfd, struct module *module, unsigned char *ptr, { module->file_table_count *= 2; module->file_table - = bfd_realloc (module->file_table, - module->file_table_count - * sizeof (struct fileinfo)); + = bfd_realloc_or_free (module->file_table, + module->file_table_count + * sizeof (struct fileinfo)); + if (module->file_table == NULL) + return FALSE; } module->file_table [fileid].name = filename; @@ -4714,6 +4757,7 @@ parse_module (bfd *abfd, struct module *module, unsigned char *ptr, because parsing can be either performed at module creation or deferred until debug info is consumed. */ SET_MODULE_PARSED (module); + return TRUE; } /* Build the list of modules for the specified BFD. */ @@ -4791,7 +4835,8 @@ build_module_list (bfd *abfd) return NULL; module = new_module (abfd); - parse_module (abfd, module, PRIV (dst_section)->contents, -1); + if (!parse_module (abfd, module, PRIV (dst_section)->contents, -1)) + return NULL; list = module; } @@ -4816,17 +4861,19 @@ module_find_nearest_line (bfd *abfd, struct module *module, bfd_vma addr, { unsigned int size = module->size; unsigned int modbeg = PRIV (dst_section)->filepos + module->modbeg; - unsigned char *buffer = (unsigned char *) bfd_malloc (module->size); + unsigned char *buffer; if (bfd_seek (abfd, modbeg, SEEK_SET) != 0 - || bfd_bread (buffer, size, abfd) != size) + || (buffer = _bfd_malloc_and_read (abfd, size, size)) == NULL) { bfd_set_error (bfd_error_no_debug_section); return FALSE; } - parse_module (abfd, module, buffer, size); + ret = parse_module (abfd, module, buffer, size); free (buffer); + if (!ret) + return ret; } /* Find out the function (if any) that contains the address. */ @@ -5300,8 +5347,10 @@ alpha_vms_slurp_relocs (bfd *abfd) else { vms_sec->reloc_max *= 2; - sec->relocation = bfd_realloc + sec->relocation = bfd_realloc_or_free (sec->relocation, vms_sec->reloc_max * sizeof (arelent)); + if (sec->relocation == NULL) + return FALSE; } } reloc = &sec->relocation[sec->reloc_count]; @@ -7143,8 +7192,8 @@ evax_bfd_print_dst (struct bfd *abfd, unsigned int dst_size, FILE *file) dst_size -= len; off += len; len -= sizeof (dsth); - buf = bfd_malloc (len); - if (bfd_bread (buf, len, abfd) != len) + buf = _bfd_malloc_and_read (abfd, len, len); + if (buf == NULL) { fprintf (file, _("cannot read DST symbol\n")); return; @@ -8059,14 +8108,12 @@ evax_bfd_print_image (bfd *abfd, FILE *file) unsigned int codeadroff; unsigned int lpfixoff; unsigned int chgprtoff; + file_ptr f_off = (file_ptr) (eiaf_vbn - 1) * VMS_BLOCK_SIZE; - buf = bfd_malloc (eiaf_size); - - if (bfd_seek (abfd, (file_ptr) (eiaf_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET) - || bfd_bread (buf, eiaf_size, abfd) != eiaf_size) + if (bfd_seek (abfd, f_off, SEEK_SET) != 0 + || (buf = _bfd_malloc_and_read (abfd, eiaf_size, eiaf_size)) == NULL) { fprintf (file, _("cannot read EIHA\n")); - free (buf); return; } eiaf = (struct vms_eiaf *)buf;