X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Fwasm-module.c;h=66ac2d1874b5bcb71d584772868b95d40cc5b689;hb=fad3d2c1b268735fe6bfa280a8e4e260fb0196a7;hp=315d3effb8db4dd554440cd396c224216a2a2c75;hpb=1f4361a77b18c5ab32baf2f30fefe5e301e017be;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/wasm-module.c b/bfd/wasm-module.c index 315d3effb8..66ac2d1874 100644 --- a/bfd/wasm-module.c +++ b/bfd/wasm-module.c @@ -406,30 +406,33 @@ wasm_scan (bfd *abfd) if (bfdsec == NULL) goto error_return; - bfdsec->vma = vma; - bfdsec->lma = vma; bfdsec->size = wasm_read_leb128 (abfd, &error, &bytes_read, FALSE); if (error) goto error_return; - bfdsec->filepos = bfd_tell (abfd); - bfdsec->alignment_power = 0; } else { bfd_vma payload_len; - file_ptr section_start; bfd_vma namelen; char *name; char *prefix = WASM_SECTION_PREFIX; size_t prefixlen = strlen (prefix); + ufile_ptr filesize; payload_len = wasm_read_leb128 (abfd, &error, &bytes_read, FALSE); if (error) goto error_return; - section_start = bfd_tell (abfd); namelen = wasm_read_leb128 (abfd, &error, &bytes_read, FALSE); - if (error || namelen > payload_len) + if (error || bytes_read > payload_len + || namelen > payload_len - bytes_read) goto error_return; + payload_len -= namelen + bytes_read; + filesize = bfd_get_file_size (abfd); + if (filesize != 0 && namelen > filesize) + { + bfd_set_error (bfd_error_file_truncated); + return FALSE; + } name = bfd_alloc (abfd, namelen + prefixlen + 1); if (!name) goto error_return; @@ -443,21 +446,19 @@ wasm_scan (bfd *abfd) if (bfdsec == NULL) goto error_return; - bfdsec->vma = vma; - bfdsec->lma = vma; - bfdsec->filepos = bfd_tell (abfd); - bfdsec->size = section_start + payload_len - bfdsec->filepos; - bfdsec->alignment_power = 0; + bfdsec->size = payload_len; } + bfdsec->vma = vma; + bfdsec->lma = vma; + bfdsec->alignment_power = 0; + bfdsec->filepos = bfd_tell (abfd); if (bfdsec->size != 0) { - bfdsec->contents = bfd_alloc (abfd, bfdsec->size); + bfdsec->contents = _bfd_alloc_and_read (abfd, bfdsec->size, + bfdsec->size); if (!bfdsec->contents) goto error_return; - - if (bfd_bread (bfdsec->contents, bfdsec->size, abfd) != bfdsec->size) - goto error_return; } vma += bfdsec->size; @@ -733,7 +734,7 @@ wasm_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED, /* Check whether ABFD is a WebAssembly module; if so, scan it. */ -static const bfd_target * +static bfd_cleanup wasm_object_p (bfd *abfd) { bfd_boolean error; @@ -763,7 +764,7 @@ wasm_object_p (bfd *abfd) if (s != NULL && wasm_scan_name_function_section (abfd, s)) abfd->flags |= HAS_SYMS; - return abfd->xvec; + return _bfd_no_cleanup; } /* BFD_JUMP_TABLE_WRITE */