--- tools/debugedit.c | 137 +++++++++++++++++++++++++++--------------------------- 1 file changed, 70 insertions(+), 67 deletions(-) Index: b/tools/debugedit.c =================================================================== --- tools/debugedit.c +++ tools/debugedit.c @@ -471,13 +471,13 @@ has_prefix (const char *str, { int str_len; int prefix_len; - + str_len = strlen (str); prefix_len = strlen (prefix); if (str_len < prefix_len) return 0; - + return strncmp (str, prefix, prefix_len) == 0; } @@ -485,7 +485,7 @@ static int edit_dwarf2_line (DSO *dso, uint_32 off, char *comp_dir, int phase) { unsigned char *ptr = debug_sections[DEBUG_LINE].data, *dir; - unsigned char **dirt; + char **dirt; unsigned char *endsec = ptr + debug_sections[DEBUG_LINE].size; unsigned char *endcu, *endprol; unsigned char opcode_base; @@ -496,9 +496,9 @@ edit_dwarf2_line (DSO *dso, uint_32 off, if (phase != 0) return 0; - + ptr += off; - + endcu = ptr + 4; endcu += read_32 (ptr); if (endcu == ptr + 0xffffffff) @@ -521,7 +521,7 @@ edit_dwarf2_line (DSO *dso, uint_32 off, value); return 1; } - + endprol = ptr + 4; endprol += read_32 (ptr); if (endprol > endcu) @@ -530,26 +530,26 @@ edit_dwarf2_line (DSO *dso, uint_32 off, dso->filename); return 1; } - + opcode_base = ptr[4]; ptr = dir = ptr + 4 + opcode_base; - + /* dir table: */ value = 1; while (*ptr != 0) { - ptr = strchr (ptr, 0) + 1; + ptr = (unsigned char *)strchr ((char *)ptr, 0) + 1; ++value; } - dirt = (unsigned char **) alloca (value * sizeof (unsigned char *)); + dirt = (char **) alloca (value * sizeof (char *)); dirt[0] = "."; dirt_cnt = 1; ptr = dir; while (*ptr != 0) { - dirt[dirt_cnt++] = ptr; - ptr = strchr (ptr, 0) + 1; + dirt[dirt_cnt++] = (char *)ptr; + ptr = (unsigned char *)strchr ((char *)ptr, 0) + 1; } ptr++; @@ -559,8 +559,8 @@ edit_dwarf2_line (DSO *dso, uint_32 off, char *s, *file; size_t file_len, dir_len; - file = ptr; - ptr = strchr (ptr, 0) + 1; + file = (char *)ptr; + ptr = (unsigned char *)strchr ((char *)ptr, 0) + 1; value = read_uleb128 (ptr); if (value >= dirt_cnt) @@ -629,7 +629,7 @@ edit_dwarf2_line (DSO *dso, uint_32 off, } free (s); - + read_uleb128 (ptr); read_uleb128 (ptr); } @@ -661,7 +661,7 @@ edit_dwarf2_line (DSO *dso, uint_32 off, if (dest_dir) { - unsigned char *srcptr, *buf = NULL; + char *srcptr, *srcstart, *buf = NULL; size_t base_len = strlen (base_dir); size_t dest_len = strlen (dest_dir); size_t shrank = 0; @@ -675,12 +675,16 @@ edit_dwarf2_line (DSO *dso, uint_32 off, ptr = dir; } else - ptr = srcptr = dir; - unsigned char *srcstart=srcptr; + { + ptr = dir; + srcptr = (char *)dir; + } + + srcstart = srcptr; while (*srcptr != 0) { - size_t len = strlen (srcptr) + 1; - const unsigned char *readptr = srcptr; + size_t len = strlen (srcptr); + const char *readptr = srcptr; if (*srcptr == '/' && has_prefix (srcptr, base_dir)) { @@ -689,24 +693,28 @@ edit_dwarf2_line (DSO *dso, uint_32 off, memcpy (ptr, dest_dir, dest_len); ptr += dest_len; readptr += base_len; - } + } srcptr += len; shrank += srcptr - readptr; - canonicalize_path (readptr, ptr); - len = strlen (ptr) + 1; + canonicalize_path (readptr, (char *)ptr); + len = strlen ((char *)ptr); + + if ((srcptr - readptr) > len) + error(0, 0,"canonicalization unexpectedly shrank (%lu): \"%s\"\n", + (long unsigned int)(srcptr - readptr) - len, ptr); + shrank -= len; ptr += len; - elf_flagdata (debug_sections[DEBUG_STR].elf_data, - ELF_C_SET, ELF_F_DIRTY); - } + elf_flagdata (debug_sections[DEBUG_STR].elf_data, + ELF_C_SET, ELF_F_DIRTY); + ++ptr; + ++srcptr; + } if (shrank > 0) { - if (--shrank == 0) - error (EXIT_FAILURE, 0, - "canonicalization unexpectedly shrank by one character"); memset (ptr, 'X', shrank); ptr += shrank; *ptr++ = '\0'; @@ -741,17 +749,17 @@ edit_dwarf2_line (DSO *dso, uint_32 off, elf_flagdata (debug_sections[DEBUG_STR].elf_data, ELF_C_SET, ELF_F_DIRTY); } - else if (ptr != srcptr) + else if ((char *)ptr != srcptr) memmove (ptr, srcptr, len); srcptr += len; ptr += len; - dir = srcptr; + dir = (unsigned char *)srcptr; read_uleb128 (srcptr); read_uleb128 (srcptr); read_uleb128 (srcptr); if (ptr != dir) - memmove (ptr, dir, srcptr - dir); - ptr += srcptr - dir; + memmove (ptr, dir, (unsigned char *)srcptr - dir); + ptr += (unsigned char *)srcptr - dir; } *ptr = '\0'; free (buf); @@ -767,17 +775,13 @@ edit_attributes (DSO *dso, unsigned char int i; uint_32 list_offs; int found_list_offs; - unsigned char *comp_dir; - - comp_dir = NULL; - list_offs = 0; - found_list_offs = 0; + char *comp_dir; + for (i = 0; i < t->nattr; ++i) { uint_32 form = t->attr[i].form; uint_32 len = 0; int base_len, dest_len; - while (1) { @@ -791,56 +795,55 @@ edit_attributes (DSO *dso, unsigned char } if (t->attr[i].attr == DW_AT_comp_dir) - { + { if ( form == DW_FORM_string ) - { + { free (comp_dir); - comp_dir = strdup (ptr); - - if (phase == 1 && dest_dir && has_prefix (ptr, base_dir)) - { + comp_dir = strdup ((char *)ptr); + + if (phase == 1 && dest_dir + && has_prefix ((char *)ptr, base_dir)) + { base_len = strlen (base_dir); dest_len = strlen (dest_dir); - + memcpy (ptr, dest_dir, dest_len); if (dest_len < base_len) - { + { memset(ptr + dest_len, '/', base_len - dest_len); - - } + } elf_flagdata (debug_sections[DEBUG_INFO].elf_data, ELF_C_SET, ELF_F_DIRTY); - } - } - + } + } else if (form == DW_FORM_strp && debug_sections[DEBUG_STR].data) - { + { char *dir; - dir = debug_sections[DEBUG_STR].data - + do_read_32_relocated (ptr); + dir = (char *)debug_sections[DEBUG_STR].data + + do_read_32_relocated (ptr); free (comp_dir); comp_dir = strdup (dir); if (phase == 1 && dest_dir && has_prefix (dir, base_dir)) - { + { base_len = strlen (base_dir); dest_len = strlen (dest_dir); - + memcpy (dir, dest_dir, dest_len); if (dest_len < base_len) - { + { memmove (dir + dest_len, dir + base_len, strlen (dir + base_len) + 1); - } + } elf_flagdata (debug_sections[DEBUG_STR].elf_data, ELF_C_SET, ELF_F_DIRTY); - } - } - } + } + } + } else if ((t->tag == DW_TAG_compile_unit || t->tag == DW_TAG_partial_unit) && t->attr[i].attr == DW_AT_name @@ -848,9 +851,9 @@ edit_attributes (DSO *dso, unsigned char && debug_sections[DEBUG_STR].data) { char *name; - - name = debug_sections[DEBUG_STR].data - + do_read_32_relocated (ptr); + + name = (char *)debug_sections[DEBUG_STR].data + + do_read_32_relocated (ptr); if (*name == '/' && comp_dir == NULL) { char *enddir = strrchr (name, '/'); @@ -869,7 +872,7 @@ edit_attributes (DSO *dso, unsigned char { base_len = strlen (base_dir); dest_len = strlen (dest_dir); - + memcpy (name, dest_dir, dest_len); if (dest_len < base_len) { @@ -913,7 +916,7 @@ edit_attributes (DSO *dso, unsigned char ptr += 4; break; case DW_FORM_string: - ptr = strchr (ptr, '\0') + 1; + ptr = (unsigned char *)strchr ((char *)ptr, '\0') + 1; break; case DW_FORM_indirect: form = read_uleb128 (ptr);