X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Flibbfd.c;h=3579ddb855a643da28c0edf59b43399da324f894;hb=af2d5cd8e9f81832b04af6cd0e51def4065bbf71;hp=24da441ac13d253d72761bbc69fba1d647efa5f2;hpb=d00dd7dc5e415503de88614bf2ea4aafa2bca819;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/libbfd.c b/bfd/libbfd.c index 24da441ac1..3579ddb855 100644 --- a/bfd/libbfd.c +++ b/bfd/libbfd.c @@ -1,5 +1,5 @@ /* Assorted BFD support routines, only used internally. - Copyright (C) 1990-2018 Free Software Foundation, Inc. + Copyright (C) 1990-2020 Free Software Foundation, Inc. Written by Cygnus Support. This file is part of BFD, the Binary File Descriptor library. @@ -245,7 +245,7 @@ _bfd_nocore_core_file_pid (bfd *ignore_abfd ATTRIBUTE_UNUSED) return 0; } -const bfd_target * +bfd_cleanup _bfd_dummy_target (bfd *ignore_abfd ATTRIBUTE_UNUSED) { bfd_set_error (bfd_error_wrong_format); @@ -254,6 +254,10 @@ _bfd_dummy_target (bfd *ignore_abfd ATTRIBUTE_UNUSED) /* Allocate memory using malloc. */ +#ifndef SSIZE_MAX +#define SSIZE_MAX ((size_t) -1 >> 1) +#endif + void * bfd_malloc (bfd_size_type size) { @@ -262,7 +266,7 @@ bfd_malloc (bfd_size_type size) if (size != sz /* This is to pacify memory checkers like valgrind. */ - || ((signed long) sz) < 0) + || sz > SSIZE_MAX) { bfd_set_error (bfd_error_no_memory); return NULL; @@ -275,24 +279,6 @@ bfd_malloc (bfd_size_type size) return ptr; } -/* Allocate memory using malloc, nmemb * size with overflow checking. */ - -void * -bfd_malloc2 (bfd_size_type nmemb, bfd_size_type size) -{ - if ((nmemb | size) >= HALF_BFD_SIZE_TYPE - && size != 0 - && nmemb > ~(bfd_size_type) 0 / size) - { - bfd_set_error (bfd_error_no_memory); - return NULL; - } - - return bfd_malloc (size * nmemb); -} - -/* Reallocate memory using realloc. */ - void * bfd_realloc (void *ptr, bfd_size_type size) { @@ -304,7 +290,7 @@ bfd_realloc (void *ptr, bfd_size_type size) if (size != sz /* This is to pacify memory checkers like valgrind. */ - || ((signed long) sz) < 0) + || sz > SSIZE_MAX) { bfd_set_error (bfd_error_no_memory); return NULL; @@ -318,22 +304,6 @@ bfd_realloc (void *ptr, bfd_size_type size) return ret; } -/* Reallocate memory using realloc, nmemb * size with overflow checking. */ - -void * -bfd_realloc2 (void *ptr, bfd_size_type nmemb, bfd_size_type size) -{ - if ((nmemb | size) >= HALF_BFD_SIZE_TYPE - && size != 0 - && nmemb > ~(bfd_size_type) 0 / size) - { - bfd_set_error (bfd_error_no_memory); - return NULL; - } - - return bfd_realloc (ptr, size * nmemb); -} - /* Reallocate memory using realloc. If this fails the pointer is freed before returning. */ @@ -361,25 +331,6 @@ bfd_zmalloc (bfd_size_type size) return ptr; } -/* Allocate memory using malloc (nmemb * size) with overflow checking - and clear it. */ - -void * -bfd_zmalloc2 (bfd_size_type nmemb, bfd_size_type size) -{ - void *ptr = bfd_malloc2 (nmemb, size); - - if (ptr != NULL) - { - size_t sz = nmemb * size; - - if (sz > 0) - memset (ptr, 0, sz); - } - - return ptr; -} - /* INTERNAL_FUNCTION bfd_write_bigendian_4byte_int @@ -445,9 +396,9 @@ DESCRIPTION .#define bfd_put_signed_8 \ . bfd_put_8 .#define bfd_get_8(abfd, ptr) \ -. (*(const unsigned char *) (ptr) & 0xff) +. ((bfd_vma) *(const unsigned char *) (ptr) & 0xff) .#define bfd_get_signed_8(abfd, ptr) \ -. (((*(const unsigned char *) (ptr) & 0xff) ^ 0x80) - 0x80) +. ((((bfd_signed_vma) *(const unsigned char *) (ptr) & 0xff) ^ 0x80) - 0x80) . .#define bfd_put_16(abfd, val, ptr) \ . BFD_SEND (abfd, bfd_putx16, ((val),(ptr))) @@ -458,6 +409,20 @@ DESCRIPTION .#define bfd_get_signed_16(abfd, ptr) \ . BFD_SEND (abfd, bfd_getx_signed_16, (ptr)) . +.#define bfd_put_24(abfd, val, ptr) \ +. do \ +. if (bfd_big_endian (abfd)) \ +. bfd_putb24 ((val), (ptr)); \ +. else \ +. bfd_putl24 ((val), (ptr)); \ +. while (0) +. +.bfd_vma bfd_getb24 (const void *p); +.bfd_vma bfd_getl24 (const void *p); +. +.#define bfd_get_24(abfd, ptr) \ +. (bfd_big_endian (abfd) ? bfd_getb24 (ptr) : bfd_getl24 (ptr)) +. .#define bfd_put_32(abfd, val, ptr) \ . BFD_SEND (abfd, bfd_putx32, ((val),(ptr))) .#define bfd_put_signed_32 \ @@ -477,7 +442,7 @@ DESCRIPTION . BFD_SEND (abfd, bfd_getx_signed_64, (ptr)) . .#define bfd_get(bits, abfd, ptr) \ -. ((bits) == 8 ? (bfd_vma) bfd_get_8 (abfd, ptr) \ +. ((bits) == 8 ? bfd_get_8 (abfd, ptr) \ . : (bits) == 16 ? bfd_get_16 (abfd, ptr) \ . : (bits) == 32 ? bfd_get_32 (abfd, ptr) \ . : (bits) == 64 ? bfd_get_64 (abfd, ptr) \ @@ -613,6 +578,48 @@ bfd_putl16 (bfd_vma data, void *p) addr[1] = (data >> 8) & 0xff; } +void +bfd_putb24 (bfd_vma data, void *p) +{ + bfd_byte *addr = (bfd_byte *) p; + addr[0] = (data >> 16) & 0xff; + addr[1] = (data >> 8) & 0xff; + addr[2] = data & 0xff; +} + +void +bfd_putl24 (bfd_vma data, void *p) +{ + bfd_byte *addr = (bfd_byte *) p; + addr[0] = data & 0xff; + addr[1] = (data >> 8) & 0xff; + addr[2] = (data >> 16) & 0xff; +} + +bfd_vma +bfd_getb24 (const void *p) +{ + const bfd_byte *addr = (const bfd_byte *) p; + unsigned long v; + + v = (unsigned long) addr[0] << 16; + v |= (unsigned long) addr[1] << 8; + v |= (unsigned long) addr[2]; + return v; +} + +bfd_vma +bfd_getl24 (const void *p) +{ + const bfd_byte *addr = (const bfd_byte *) p; + unsigned long v; + + v = (unsigned long) addr[0]; + v |= (unsigned long) addr[1] << 8; + v |= (unsigned long) addr[2] << 16; + return v; +} + bfd_vma bfd_getb32 (const void *p) { @@ -874,7 +881,7 @@ _bfd_generic_get_section_contents (bfd *abfd, { _bfd_error_handler /* xgettext:c-format */ - (_("%B: unable to get decompressed section %A"), + (_("%pB: unable to get decompressed section %pA"), abfd, section); bfd_set_error (bfd_error_invalid_operation); return FALSE;