Changeset 5754c31e in mainline


Ignore:
Timestamp:
2018-04-04T17:01:18Z (6 years ago)
Author:
Jiří Zárevúcky <jiri.zarevucky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
4618998
Parents:
2c4e1cc
git-author:
Jiří Zárevúcky <jiri.zarevucky@…> (2018-04-03 18:23:12)
git-committer:
Jiří Zárevúcky <jiri.zarevucky@…> (2018-04-04 17:01:18)
Message:

We should not attempt to read sections in the ELF file.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/elf/elf_mod.c

    r2c4e1cc r5754c31e  
    7575static unsigned int elf_load_module(elf_ld_t *elf, size_t so_bias);
    7676static int segment_header(elf_ld_t *elf, elf_segment_header_t *entry);
    77 static int section_header(elf_ld_t *elf, elf_section_header_t *entry);
    7877static int load_segment(elf_ld_t *elf, elf_segment_header_t *entry);
    7978
     
    183182        }
    184183
    185         if (header->e_shentsize != sizeof(elf_section_header_t)) {
    186                 DPRINTF("e_shentsize: %u != %zu\n", header->e_shentsize,
    187                     sizeof(elf_section_header_t));
    188                 return EE_INCOMPATIBLE;
    189         }
    190 
    191184        /* Check if the object type is supported. */
    192185        if (header->e_type != ET_EXEC && header->e_type != ET_DYN) {
     
    217210
    218211                ret = segment_header(elf, &segment_hdr);
    219                 if (ret != EE_OK)
    220                         return ret;
    221         }
    222 
    223         DPRINTF("Parse sections.\n");
    224 
    225         /* Inspect all section headers and proccess them. */
    226         for (i = 0; i < header->e_shnum; i++) {
    227                 elf_section_header_t section_hdr;
    228 
    229                 pos = header->e_shoff + i * sizeof(elf_section_header_t);
    230                 rc = vfs_read(elf->fd, &pos, &section_hdr,
    231                     sizeof(elf_section_header_t), &nr);
    232                 if (rc != EOK || nr != sizeof(elf_section_header_t)) {
    233                         DPRINTF("Read error.\n");
    234                         return EE_IO;
    235                 }
    236 
    237                 ret = section_header(elf, &section_hdr);
    238212                if (ret != EE_OK)
    239213                        return ret;
     
    428402}
    429403
    430 /** Process section header.
    431  *
    432  * @param elf   Loader state.
    433  * @param entry Segment header.
    434  *
    435  * @return EE_OK on success, error code otherwise.
    436  */
    437 static int section_header(elf_ld_t *elf, elf_section_header_t *entry)
    438 {
    439         switch (entry->sh_type) {
    440         case SHT_PROGBITS:
    441                 if (entry->sh_flags & SHF_TLS) {
    442                         /* .tdata */
    443                 }
    444                 break;
    445         case SHT_NOBITS:
    446                 if (entry->sh_flags & SHF_TLS) {
    447                         /* .tbss */
    448                 }
    449                 break;
    450         case SHT_DYNAMIC:
    451                 /* Record pointer to dynamic section into info structure */
    452                 elf->info->dynamic =
    453                     (void *)((uint8_t *)entry->sh_addr + elf->bias);
    454                 DPRINTF("Dynamic section found at %p.\n",
    455                     (void *) elf->info->dynamic);
    456                 break;
    457         default:
    458                 break;
    459         }
    460 
    461         return EE_OK;
    462 }
    463 
    464404/** @}
    465405 */
Note: See TracChangeset for help on using the changeset viewer.