From 3ea6b9a58b29d198395f20033e945b18a52d286e Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Fri, 14 Sep 2007 07:54:10 +0000 Subject: [PATCH] * opncls.c (find_separate_debug_file): Ensure bfd_set_error has been called on all error return paths. (bfd_fill_in_gnu_debuglink_section): Use bfd_malloc, not malloc. Clear padding after filename --- bfd/ChangeLog | 7 +++++++ bfd/opncls.c | 50 +++++++++++++++++++++++++++----------------------- 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index e2fe2f25215..ba33533e5de 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2007-09-14 Alan Modra + + * opncls.c (find_separate_debug_file): Ensure bfd_set_error has + been called on all error return paths. + (bfd_fill_in_gnu_debuglink_section): Use bfd_malloc, not malloc. + Clear padding after filename + 2007-09-14 Alan Modra * format.c (bfd_check_format_matches): Record matching targets even diff --git a/bfd/opncls.c b/bfd/opncls.c index 3d02c32fb66..1ea05575ca5 100644 --- a/bfd/opncls.c +++ b/bfd/opncls.c @@ -1217,46 +1217,48 @@ find_separate_debug_file (bfd *abfd, const char *debug_file_directory) char *debugfile; unsigned long crc32; int i; + size_t dirlen; BFD_ASSERT (abfd); if (debug_file_directory == NULL) debug_file_directory = "."; /* BFD may have been opened from a stream. */ - if (! abfd->filename) - return NULL; + if (abfd->filename == NULL) + { + bfd_set_error (bfd_error_invalid_operation); + return NULL; + } basename = get_debug_link_info (abfd, & crc32); if (basename == NULL) return NULL; - if (strlen (basename) < 1) + if (basename[0] == '\0') { free (basename); + bfd_set_error (bfd_error_no_debug_section); return NULL; } - dir = strdup (abfd->filename); + for (dirlen = strlen (abfd->filename); dirlen > 0; dirlen--) + if (IS_DIR_SEPARATOR (abfd->filename[dirlen - 1])) + break; + + dir = bfd_malloc (dirlen + 1); if (dir == NULL) { free (basename); return NULL; } - BFD_ASSERT (strlen (dir) != 0); - - /* Strip off filename part. */ - for (i = strlen (dir) - 1; i >= 0; i--) - if (IS_DIR_SEPARATOR (dir[i])) - break; - - dir[i + 1] = '\0'; - BFD_ASSERT (dir[i] == '/' || dir[0] == '\0'); - - debugfile = malloc (strlen (debug_file_directory) + 1 - + strlen (dir) - + strlen (".debug/") - + strlen (basename) - + 1); + memcpy (dir, abfd->filename, dirlen); + dir[dirlen] = '\0'; + + debugfile = bfd_malloc (strlen (debug_file_directory) + 1 + + dirlen + + strlen (".debug/") + + strlen (basename) + + 1); if (debugfile == NULL) { free (basename); @@ -1435,6 +1437,7 @@ bfd_fill_in_gnu_debuglink_section (bfd *abfd, FILE * handle; static unsigned char buffer[8 * 1024]; size_t count; + size_t filelen; if (abfd == NULL || sect == NULL || filename == NULL) { @@ -1464,21 +1467,22 @@ bfd_fill_in_gnu_debuglink_section (bfd *abfd, now that we no longer need them. */ filename = lbasename (filename); - debuglink_size = strlen (filename) + 1; + filelen = strlen (filename); + debuglink_size = filelen + 1; debuglink_size += 3; debuglink_size &= ~3; debuglink_size += 4; - contents = malloc (debuglink_size); + contents = bfd_malloc (debuglink_size); if (contents == NULL) { /* XXX Should we delete the section from the bfd ? */ - bfd_set_error (bfd_error_no_memory); return FALSE; } - strcpy (contents, filename); crc_offset = debuglink_size - 4; + memcpy (contents, filename, filelen); + memset (contents + filelen, 0, crc_offset - filelen); bfd_put_32 (abfd, crc32, contents + crc_offset); -- 2.30.2