X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=bfd%2Fopncls.c;h=a5bc2de3648135e2a304041b169c7c1d827f1b87;hb=a6ad7914429a22d3d835bd998b032212b776a08a;hp=f7696b658ca33f3b025c0722c14a2f6a1b9ae02c;hpb=365f5fb6d0f0da83817431a275e99e6f6babbe04;p=thirdparty%2Fbinutils-gdb.git diff --git a/bfd/opncls.c b/bfd/opncls.c index f7696b658ca..a5bc2de3648 100644 --- a/bfd/opncls.c +++ b/bfd/opncls.c @@ -1,5 +1,5 @@ /* opncls.c -- open and close a BFD. - Copyright (C) 1990-2020 Free Software Foundation, Inc. + Copyright (C) 1990-2022 Free Software Foundation, Inc. Written by Cygnus Support. @@ -89,6 +89,8 @@ _bfd_new_bfd (void) return NULL; } + nbfd->archive_plugin_fd = -1; + return nbfd; } @@ -135,7 +137,7 @@ _bfd_delete_bfd (bfd *abfd) /* Free objalloc memory. */ -bfd_boolean +bool _bfd_free_cached_info (bfd *abfd) { if (abfd->memory) @@ -159,7 +161,7 @@ _bfd_free_cached_info (bfd *abfd) size_t len = strlen (filename) + 1; char *copy = bfd_malloc (len); if (copy == NULL) - return FALSE; + return false; memcpy (copy, filename, len); abfd->filename = copy; } @@ -174,7 +176,7 @@ _bfd_free_cached_info (bfd *abfd) abfd->memory = NULL; } - return TRUE; + return true; } /* @@ -280,14 +282,14 @@ bfd_fopen (const char *filename, const char *target, const char *mode, int fd) _bfd_delete_bfd (nbfd); return NULL; } - nbfd->opened_once = TRUE; + nbfd->opened_once = true; /* If we opened the file by name, mark it cacheable; we can close it and reopen it later. However, if a file descriptor was provided, then it may have been opened with special flags that make it unsafe to close and reopen the file. */ if (fd == -1) - (void) bfd_set_cacheable (nbfd, TRUE); + (void) bfd_set_cacheable (nbfd, true); return nbfd; } @@ -783,7 +785,7 @@ FUNCTION bfd_close SYNOPSIS - bfd_boolean bfd_close (bfd *abfd); + bool bfd_close (bfd *abfd); DESCRIPTION Close a BFD. If the BFD was open for writing, then pending @@ -800,13 +802,13 @@ RETURNS <> is returned if all is ok, otherwise <>. */ -bfd_boolean +bool bfd_close (bfd *abfd) { if (bfd_write_p (abfd)) { if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd))) - return FALSE; + return false; } return bfd_close_all_done (abfd); @@ -817,7 +819,7 @@ FUNCTION bfd_close_all_done SYNOPSIS - bfd_boolean bfd_close_all_done (bfd *); + bool bfd_close_all_done (bfd *); DESCRIPTION Close a BFD. Differs from <> since it does not @@ -834,13 +836,13 @@ RETURNS <> is returned if all is ok, otherwise <>. */ -bfd_boolean +bool bfd_close_all_done (bfd *abfd) { - bfd_boolean ret; + bool ret; if (! BFD_SEND (abfd, _close_and_cleanup, (abfd))) - return FALSE; + return false; ret = abfd->iovec->bclose (abfd) == 0; @@ -896,7 +898,7 @@ FUNCTION bfd_make_writable SYNOPSIS - bfd_boolean bfd_make_writable (bfd *abfd); + bool bfd_make_writable (bfd *abfd); DESCRIPTION Takes a BFD as created by <> and converts it @@ -908,7 +910,7 @@ RETURNS <> is returned if all is ok, otherwise <>. */ -bfd_boolean +bool bfd_make_writable (bfd *abfd) { struct bfd_in_memory *bim; @@ -916,12 +918,12 @@ bfd_make_writable (bfd *abfd) if (abfd->direction != no_direction) { bfd_set_error (bfd_error_invalid_operation); - return FALSE; + return false; } bim = (struct bfd_in_memory *) bfd_malloc (sizeof (struct bfd_in_memory)); if (bim == NULL) - return FALSE; /* bfd_error already set. */ + return false; /* bfd_error already set. */ abfd->iostream = bim; /* bfd_bwrite will grow these as needed. */ bim->size = 0; @@ -933,7 +935,7 @@ bfd_make_writable (bfd *abfd) abfd->direction = write_direction; abfd->where = 0; - return TRUE; + return true; } /* @@ -941,7 +943,7 @@ FUNCTION bfd_make_readable SYNOPSIS - bfd_boolean bfd_make_readable (bfd *abfd); + bool bfd_make_readable (bfd *abfd); DESCRIPTION Takes a BFD as created by <> and @@ -953,20 +955,20 @@ DESCRIPTION RETURNS <> is returned if all is ok, otherwise <>. */ -bfd_boolean +bool bfd_make_readable (bfd *abfd) { if (abfd->direction != write_direction || !(abfd->flags & BFD_IN_MEMORY)) { bfd_set_error (bfd_error_invalid_operation); - return FALSE; + return false; } if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd))) - return FALSE; + return false; if (! BFD_SEND (abfd, _close_and_cleanup, (abfd))) - return FALSE; + return false; abfd->arch_info = &bfd_default_arch_struct; @@ -974,15 +976,15 @@ bfd_make_readable (bfd *abfd) abfd->format = bfd_unknown; abfd->my_archive = NULL; abfd->origin = 0; - abfd->opened_once = FALSE; - abfd->output_has_begun = FALSE; + abfd->opened_once = false; + abfd->output_has_begun = false; abfd->section_count = 0; abfd->usrdata = NULL; - abfd->cacheable = FALSE; + abfd->cacheable = false; abfd->flags |= BFD_IN_MEMORY; - abfd->mtime_set = FALSE; + abfd->mtime_set = false; - abfd->target_defaulted = TRUE; + abfd->target_defaulted = true; abfd->direction = read_direction; abfd->sections = 0; abfd->symcount = 0; @@ -992,7 +994,7 @@ bfd_make_readable (bfd *abfd) bfd_section_list_clear (abfd); bfd_check_format (abfd, bfd_object); - return TRUE; + return true; } /* @@ -1030,6 +1032,8 @@ bfd_alloc (bfd *abfd, bfd_size_type size) ret = objalloc_alloc ((struct objalloc *) abfd->memory, ul_size); if (ret == NULL) bfd_set_error (bfd_error_no_memory); + else + abfd->alloc_size += size; return ret; } @@ -1332,7 +1336,7 @@ INTERNAL_FUNCTION separate_debug_file_exists SYNOPSIS - bfd_boolean separate_debug_file_exists + bool separate_debug_file_exists (char *name, void *crc32_p); DESCRIPTION @@ -1344,10 +1348,10 @@ DESCRIPTION this routine is used as a @code{check_func_type} function. */ -static bfd_boolean +static bool separate_debug_file_exists (const char *name, void *crc32_p) { - static unsigned char buffer [8 * 1024]; + unsigned char buffer[8 * 1024]; unsigned long file_crc = 0; FILE *f; bfd_size_type count; @@ -1360,7 +1364,7 @@ separate_debug_file_exists (const char *name, void *crc32_p) f = _bfd_real_fopen (name, FOPEN_RB); if (f == NULL) - return FALSE; + return false; while ((count = fread (buffer, 1, sizeof (buffer), f)) > 0) file_crc = bfd_calc_gnu_debuglink_crc32 (file_crc, buffer, count); @@ -1375,14 +1379,14 @@ INTERNAL_FUNCTION separate_alt_debug_file_exists SYNOPSIS - bfd_boolean separate_alt_debug_file_exists + bool separate_alt_debug_file_exists (char *name, void *unused); DESCRIPTION Checks to see if @var{name} is a file. */ -static bfd_boolean +static bool separate_alt_debug_file_exists (const char *name, void *unused ATTRIBUTE_UNUSED) { FILE *f; @@ -1391,11 +1395,11 @@ separate_alt_debug_file_exists (const char *name, void *unused ATTRIBUTE_UNUSED) f = _bfd_real_fopen (name, FOPEN_RB); if (f == NULL) - return FALSE; + return false; fclose (f); - return TRUE; + return true; } /* @@ -1404,7 +1408,7 @@ INTERNAL_FUNCTION SYNOPSIS char *find_separate_debug_file - (bfd *abfd, const char *dir, bfd_boolean include_dirs, + (bfd *abfd, const char *dir, bool include_dirs, get_func_type get, check_func_type check, void *data); DESCRIPTION @@ -1427,16 +1431,16 @@ RETURNS Returns NULL if no valid file could be found. */ -typedef char * (* get_func_type) (bfd *, void *); -typedef bfd_boolean (* check_func_type) (const char *, void *); +typedef char * (*get_func_type) (bfd *, void *); +typedef bool (*check_func_type) (const char *, void *); static char * -find_separate_debug_file (bfd * abfd, - const char * debug_file_directory, - bfd_boolean include_dirs, - get_func_type get_func, +find_separate_debug_file (bfd *abfd, + const char *debug_file_directory, + bool include_dirs, + get_func_type get_func, check_func_type check_func, - void * func_data) + void *func_data) { char *base; char *dir; @@ -1616,7 +1620,7 @@ bfd_follow_gnu_debuglink (bfd *abfd, const char *dir) { unsigned long crc32; - return find_separate_debug_file (abfd, dir, TRUE, + return find_separate_debug_file (abfd, dir, true, bfd_get_debug_link_info_1, separate_debug_file_exists, &crc32); } @@ -1663,7 +1667,7 @@ RETURNS char * bfd_follow_gnu_debugaltlink (bfd *abfd, const char *dir) { - return find_separate_debug_file (abfd, dir, TRUE, + return find_separate_debug_file (abfd, dir, true, get_alt_debug_link_info_shim, separate_alt_debug_file_exists, NULL); @@ -1741,7 +1745,7 @@ FUNCTION bfd_fill_in_gnu_debuglink_section SYNOPSIS - bfd_boolean bfd_fill_in_gnu_debuglink_section + bool bfd_fill_in_gnu_debuglink_section (bfd *abfd, struct bfd_section *sect, const char *filename); DESCRIPTION @@ -1755,7 +1759,7 @@ RETURNS and bfd_error is set. */ -bfd_boolean +bool bfd_fill_in_gnu_debuglink_section (bfd *abfd, struct bfd_section *sect, const char *filename) @@ -1765,14 +1769,14 @@ bfd_fill_in_gnu_debuglink_section (bfd *abfd, char * contents; bfd_size_type crc_offset; FILE * handle; - static unsigned char buffer[8 * 1024]; + unsigned char buffer[8 * 1024]; size_t count; size_t filelen; if (abfd == NULL || sect == NULL || filename == NULL) { bfd_set_error (bfd_error_invalid_operation); - return FALSE; + return false; } /* Make sure that we can read the file. @@ -1785,7 +1789,7 @@ bfd_fill_in_gnu_debuglink_section (bfd *abfd, if (handle == NULL) { bfd_set_error (bfd_error_system_call); - return FALSE; + return false; } crc32 = 0; @@ -1807,7 +1811,7 @@ bfd_fill_in_gnu_debuglink_section (bfd *abfd, if (contents == NULL) { /* XXX Should we delete the section from the bfd ? */ - return FALSE; + return false; } crc_offset = debuglink_size - 4; @@ -1820,10 +1824,10 @@ bfd_fill_in_gnu_debuglink_section (bfd *abfd, { /* XXX Should we delete the section from the bfd ? */ free (contents); - return FALSE; + return false; } - return TRUE; + return true; } /* @@ -1904,7 +1908,7 @@ get_build_id (bfd *abfd) if (inote.descsz <= 0 || inote.type != NT_GNU_BUILD_ID || inote.namesz != 4 /* sizeof "GNU" */ - || strncmp (inote.namedata, "GNU", 4) != 0 + || !startswith (inote.namedata, "GNU") || inote.descsz > 0x7ffffffe || size < (12 + BFD_ALIGN (inote.namesz, 4) + inote.descsz)) { @@ -1996,7 +2000,7 @@ INTERNAL_FUNCTION check_build_id_file SYNOPSIS - bfd_boolean check_build_id_file (char *name, void *buildid_p); + bool check_build_id_file (char *name, void *buildid_p); DESCRIPTION Checks to see if @var{name} is a readable file and if its build-id @@ -2008,33 +2012,33 @@ RETURNS @var{build_id_p} (which is really a @code{struct bfd_build_id **}). */ -static bfd_boolean +static bool check_build_id_file (const char *name, void *buildid_p) { struct bfd_build_id *orig_build_id; struct bfd_build_id *build_id; bfd * file; - bfd_boolean result; + bool result; BFD_ASSERT (name); BFD_ASSERT (buildid_p); file = bfd_openr (name, NULL); if (file == NULL) - return FALSE; + return false; /* If the file is an archive, process all of its elements. */ if (! bfd_check_format (file, bfd_object)) { bfd_close (file); - return FALSE; + return false; } build_id = get_build_id (file); if (build_id == NULL) { bfd_close (file); - return FALSE; + return false; } orig_build_id = *(struct bfd_build_id **) buildid_p; @@ -2080,7 +2084,7 @@ bfd_follow_build_id_debuglink (bfd *abfd, const char *dir) { struct bfd_build_id *build_id; - return find_separate_debug_file (abfd, dir, FALSE, + return find_separate_debug_file (abfd, dir, false, get_build_id_name, check_build_id_file, &build_id); } @@ -2103,10 +2107,28 @@ bfd_set_filename (bfd *abfd, const char *filename) { size_t len = strlen (filename) + 1; char *n = bfd_alloc (abfd, len); - if (n) + + if (n == NULL) + return NULL; + + if (abfd->filename != NULL) { - memcpy (n, filename, len); - abfd->filename = n; + /* PR 29389. If we attempt to rename a file that has been closed due + to caching, then we will not be able to reopen it later on. */ + if (abfd->iostream == NULL && (abfd->flags & BFD_CLOSED_BY_CACHE)) + { + bfd_set_error (bfd_error_invalid_operation); + return NULL; + } + + /* Similarly if we attempt to close a renamed file because the + cache is now full, we will not be able to reopen it later on. */ + if (abfd->iostream != NULL) + abfd->cacheable = 0; } + + memcpy (n, filename, len); + abfd->filename = n; + return n; }