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 : 4108 : ADD_ROUTINE_PREFIX(elfw2(LIBELFBITS, ADD_ROUTINE_SUFFIX(getchdr))) (Elf_Scn *scn)
18 : : {
19 : :
20 : 4108 : ElfW2(LIBELFBITS,Shdr) *shdr = ADD_ROUTINE_PREFIX(elfw2(LIBELFBITS, ADD_ROUTINE_SUFFIX(getshdr)))(scn);
21 : :
22 [ + + ]: 4108 : 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 [ - + ]: 4106 : if ((shdr->sh_flags & SHF_ALLOC) != 0)
28 : : {
29 : 0 : __libelf_seterrno (ELF_E_INVALID_SECTION_FLAGS);
30 : 0 : return NULL;
31 : : }
32 : :
33 : 4106 : if (shdr->sh_type == SHT_NULL
34 [ - + ]: 4106 : || shdr->sh_type == SHT_NOBITS)
35 : : {
36 : 0 : __libelf_seterrno (ELF_E_INVALID_SECTION_TYPE);
37 : 0 : return NULL;
38 : : }
39 : :
40 [ + + ]: 4106 : if ((shdr->sh_flags & SHF_COMPRESSED) == 0)
41 : : {
42 : 264 : __libelf_seterrno (ELF_E_NOT_COMPRESSED);
43 : 264 : 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 : 3842 : Elf_Data *d = ADD_ROUTINE_PREFIX(ADD_ROUTINE_SUFFIX(elf_getdata)) (scn, NULL);
49 [ - + ]: 3842 : if (d == NULL)
50 : : return NULL;
51 : :
52 [ + - - + ]: 3842 : 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
|