@@ -1716,7 +1716,8 @@ void ElfFile<ElfFileParamNames>::cleanDependencySymbolVersions()
1716
1716
auto shdrVersym = findSectionHeader (" .gnu.version" );
1717
1717
auto shdrVersymR = findSectionHeader (" .gnu.version_r" );
1718
1718
1719
- auto versyms = (Elf_Versym *)(fileContents->data () + rdi (shdrVersym.sh_offset ));
1719
+ auto versyms = reinterpret_cast <Elf_Versym *>(fileContents->data () + rdi (shdrVersym.sh_offset ));
1720
+ checkPointer (fileContents, versyms, sizeof (Elf_Versym));
1720
1721
size_t count = rdi (shdrVersym.sh_size ) / sizeof (Elf_Versym);
1721
1722
1722
1723
/* Set of versions actually used. */
@@ -1728,17 +1729,24 @@ void ElfFile<ElfFileParamNames>::cleanDependencySymbolVersions()
1728
1729
1729
1730
/* Strings associated with .gnu_version_r section: used for debug only. */
1730
1731
Elf_Shdr & shdrVersionRStrings = shdrs.at (rdi (shdrVersymR.sh_link ));
1731
- char * verStrTab = ( char *) fileContents->data () + rdi (shdrVersionRStrings.sh_offset );
1732
+ char * verStrTab = reinterpret_cast < char *>( fileContents->data () + rdi (shdrVersionRStrings.sh_offset ) );
1732
1733
1734
+ auto ver_r = reinterpret_cast <Elf_Verneed *>(fileContents->data () + rdi (shdrVersymR.sh_offset ));
1735
+ checkPointer (fileContents, ver_r, sizeof (Elf_Verneed));
1733
1736
1734
- auto ver_r = (Elf_Verneed *)(fileContents->data () + rdi (shdrVersymR.sh_offset ));
1735
1737
while (true ) {
1736
1738
auto prev = (Elf_Vernaux *)nullptr ;
1737
- auto vern_aux = (Elf_Vernaux *)((char *)ver_r + rdi (ver_r->vn_aux ));
1739
+ auto vern_aux = reinterpret_cast <Elf_Vernaux *>((char *)ver_r + rdi (ver_r->vn_aux ));
1740
+ checkPointer (fileContents, vern_aux, sizeof (Elf_Vernaux));
1741
+
1738
1742
char * file = verStrTab + rdi (ver_r->vn_file );
1739
1743
for (size_t j = 0 ; j < ver_r->vn_cnt ; j++) {
1740
1744
char * ver_name = verStrTab + rdi (vern_aux->vna_name );
1741
- auto next = (Elf_Vernaux *)((char *)vern_aux + rdi (vern_aux->vna_next ));
1745
+ // FIXME: add proper check for null-terminated string
1746
+ checkPointer (fileContents, ver_name, sizeof (char ));
1747
+
1748
+ auto next = reinterpret_cast <Elf_Vernaux *>((char *)vern_aux + rdi (vern_aux->vna_next ));
1749
+ checkPointer (fileContents, next, sizeof (Elf_Vernaux));
1742
1750
1743
1751
if (!allVersions.count (rdi (vern_aux->vna_other ) & ~0x8000 )) {
1744
1752
debug (" Removing version identifier %d %s@%s\n " , rdi (vern_aux->vna_other ), file, ver_name);
@@ -1769,7 +1777,8 @@ void ElfFile<ElfFileParamNames>::cleanDependencySymbolVersions()
1769
1777
break ;
1770
1778
}
1771
1779
1772
- ver_r = (Elf_Verneed *) (((char *) ver_r) + rdi (ver_r->vn_next ));
1780
+ ver_r = reinterpret_cast <Elf_Verneed *>(((char *) ver_r) + rdi (ver_r->vn_next ));
1781
+ checkPointer (fileContents, ver_r, sizeof (Elf_Verneed));
1773
1782
}
1774
1783
1775
1784
changed = true ;
0 commit comments