Branch data Line data Source code
1 : : #undef ADD_ROUTINE_PREFIX 2 : : #undef ADD_ROUTINE_SUFFIX 3 : : 4 : : #if ELF_WRLOCK_HELD 5 : : #define CONCAT(x,y) x##y 6 : : #define ADD_ROUTINE_PREFIX(y) CONCAT(__,y) 7 : : #define ADD_ROUTINE_SUFFIX(x) x ## _wrlock 8 : : #define INTERNAL internal_function 9 : : #else 10 : : #define ADD_ROUTINE_PREFIX(y) y 11 : : #define ADD_ROUTINE_SUFFIX(x) x 12 : : #define INTERNAL 13 : : #endif 14 : : 15 : : ElfW2(LIBELFBITS,Chdr) * 16 : : INTERNAL 17 : 3990 : ADD_ROUTINE_PREFIX(elfw2(LIBELFBITS, ADD_ROUTINE_SUFFIX(getchdr))) (Elf_Scn *scn) 18 : : { 19 : : 20 : 3990 : ElfW2(LIBELFBITS,Shdr) *shdr = ADD_ROUTINE_PREFIX(elfw2(LIBELFBITS, ADD_ROUTINE_SUFFIX(getshdr)))(scn); 21 : : 22 [ + + ]: 3990 : if (shdr == NULL) 23 : : return NULL; 24 : : 25 : : /* Must have SHF_COMPRESSED flag set. Allocated or no bits sections 26 : : can never be compressed. */ 27 [ - + ]: 3988 : if ((shdr->sh_flags & SHF_ALLOC) != 0) 28 : : { 29 : 0 : __libelf_seterrno (ELF_E_INVALID_SECTION_FLAGS); 30 : 0 : return NULL; 31 : : } 32 : : 33 : 3988 : if (shdr->sh_type == SHT_NULL 34 [ - + ]: 3988 : || shdr->sh_type == SHT_NOBITS) 35 : : { 36 : 0 : __libelf_seterrno (ELF_E_INVALID_SECTION_TYPE); 37 : 0 : return NULL; 38 : : } 39 : : 40 [ + + ]: 3988 : if ((shdr->sh_flags & SHF_COMPRESSED) == 0) 41 : : { 42 : 244 : __libelf_seterrno (ELF_E_NOT_COMPRESSED); 43 : 244 : return NULL; 44 : : } 45 : : 46 : : /* This makes sure the data is in the correct format, so we don't 47 : : need to swap fields. */ 48 : 3744 : Elf_Data *d = ADD_ROUTINE_PREFIX(ADD_ROUTINE_SUFFIX(elf_getdata)) (scn, NULL); 49 [ - + ]: 3744 : if (d == NULL) 50 : : return NULL; 51 : : 52 [ + - - + ]: 3744 : if (d->d_size < sizeof (ElfW2(LIBELFBITS,Chdr)) || d->d_buf == NULL) 53 : : { 54 : 0 : __libelf_seterrno (ELF_E_INVALID_DATA); 55 : 0 : return NULL; 56 : : } 57 : : 58 : : return (ElfW2(LIBELFBITS,Chdr) *) d->d_buf; 59 : : } 60 : : #undef INTERNAL 61 : : #undef ELF_WRLOCK_HELD