Coverage Report

Created: 2026-08-30 07:12

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/elfutils/libelf/elf32_getphdr.c
Line
Count
Source
1
/* Get ELF program header table.
2
   Copyright (C) 1998-2010, 2014, 2015 Red Hat, Inc.
3
   This file is part of elfutils.
4
   Written by Ulrich Drepper <drepper@redhat.com>, 1998.
5
6
   This file is free software; you can redistribute it and/or modify
7
   it under the terms of either
8
9
     * the GNU Lesser General Public License as published by the Free
10
       Software Foundation; either version 3 of the License, or (at
11
       your option) any later version
12
13
   or
14
15
     * the GNU General Public License as published by the Free
16
       Software Foundation; either version 2 of the License, or (at
17
       your option) any later version
18
19
   or both in parallel, as here.
20
21
   elfutils is distributed in the hope that it will be useful, but
22
   WITHOUT ANY WARRANTY; without even the implied warranty of
23
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24
   General Public License for more details.
25
26
   You should have received copies of the GNU General Public License and
27
   the GNU Lesser General Public License along with this program.  If
28
   not, see <http://www.gnu.org/licenses/>.  */
29
30
#ifdef HAVE_CONFIG_H
31
# include <config.h>
32
#endif
33
34
#include <errno.h>
35
#include <stdbool.h>
36
#include <stdlib.h>
37
#include <assert.h>
38
39
#include "libelfP.h"
40
#include "common.h"
41
42
#ifndef LIBELFBITS
43
# define LIBELFBITS 32
44
#endif
45
46
ElfW2(LIBELFBITS,Phdr) *
47
__elfw2(LIBELFBITS,getphdr_wrlock) (Elf *elf)
48
21.3k
{
49
21.3k
  ElfW2(LIBELFBITS,Phdr) *result;
50
51
  /* If the program header entry has already been filled in the code
52
     below must already have been run.  So the class is set, too.  No
53
     need to waste any more time here.  */
54
21.3k
  result = elf->state.ELFW(elf,LIBELFBITS).phdr;
55
21.3k
  if (likely (result != NULL))
56
0
    return result;
57
58
21.3k
  if (elf->class == 0)
59
0
    elf->class = ELFW(ELFCLASS,LIBELFBITS);
60
21.3k
  else if (elf->class != ELFW(ELFCLASS,LIBELFBITS))
61
0
    {
62
0
      __libelf_seterrno (ELF_E_INVALID_CLASS);
63
0
      result = NULL;
64
0
      goto out;
65
0
    }
66
67
21.3k
  if (likely (result == NULL))
68
21.3k
    {
69
      /* Read the section header table.  */
70
21.3k
      ElfW2(LIBELFBITS,Ehdr) *ehdr = elf->state.ELFW(elf,LIBELFBITS).ehdr;
71
72
      /* If no program header exists return NULL.  */
73
21.3k
      size_t phnum;
74
21.3k
      if (__elf_getphdrnum_rdlock (elf, &phnum) != 0)
75
0
  goto out;
76
21.3k
      if (phnum == 0 || ehdr->e_phoff == 0)
77
0
  {
78
0
    __libelf_seterrno (ELF_E_NO_PHDR);
79
0
    goto out;
80
0
  }
81
82
      /* Check this doesn't overflow.  */
83
21.3k
      size_t size = phnum * sizeof (ElfW2(LIBELFBITS,Phdr));
84
85
21.3k
      if (phnum > SIZE_MAX / sizeof (ElfW2(LIBELFBITS,Phdr))
86
21.3k
    || ehdr->e_phoff > elf->maximum_size
87
21.3k
    || elf->maximum_size - ehdr->e_phoff < size)
88
322
  {
89
322
    __libelf_seterrno (ELF_E_INVALID_DATA);
90
322
    goto out;
91
322
  }
92
93
21.0k
      if (elf->map_address != NULL)
94
21.0k
  {
95
    /* First see whether the information in the ELF header is
96
       valid and it does not ask for too much.  */
97
21.0k
    if (unlikely (ehdr->e_phoff >= elf->maximum_size)
98
21.0k
        || unlikely (elf->maximum_size - ehdr->e_phoff < size))
99
0
      {
100
        /* Something is wrong.  */
101
0
        __libelf_seterrno (ELF_E_INVALID_PHDR);
102
0
        goto out;
103
0
      }
104
105
    /* All the data is already mapped.  Use it.  */
106
21.0k
    void *file_phdr = ((char *) elf->map_address
107
21.0k
           + elf->start_offset + ehdr->e_phoff);
108
21.0k
    if (ehdr->e_ident[EI_DATA] == MY_ELFDATA
109
9.78k
        && (ALLOW_UNALIGNED
110
0
      || ((uintptr_t) file_phdr
111
0
          & (__alignof__ (ElfW2(LIBELFBITS,Phdr)) - 1)) == 0))
112
      /* Simply use the mapped data.  */
113
9.78k
      elf->state.ELFW(elf,LIBELFBITS).phdr = file_phdr;
114
11.2k
    else
115
11.2k
      {
116
11.2k
        ElfW2(LIBELFBITS,Phdr) *notcvt;
117
11.2k
        ElfW2(LIBELFBITS,Phdr) *phdr;
118
119
        /* Allocate memory for the program headers.  We know the number
120
     of entries from the ELF header.  */
121
11.2k
        phdr = elf->state.ELFW(elf,LIBELFBITS).phdr =
122
11.2k
    (ElfW2(LIBELFBITS,Phdr) *) malloc (size);
123
11.2k
        if (elf->state.ELFW(elf,LIBELFBITS).phdr == NULL)
124
0
    {
125
0
      __libelf_seterrno (ELF_E_NOMEM);
126
0
      goto out;
127
0
    }
128
11.2k
        elf->state.ELFW(elf,LIBELFBITS).phdr_flags |=
129
11.2k
    ELF_F_MALLOCED | ELF_F_DIRTY;
130
131
        /* Now copy the data and at the same time convert the
132
     byte order.  */
133
134
11.2k
        if (ehdr->e_ident[EI_DATA] == MY_ELFDATA)
135
0
    {
136
0
      assert (! ALLOW_UNALIGNED);
137
0
      memcpy (phdr, file_phdr, size);
138
0
    }
139
11.2k
        else
140
11.2k
    {
141
11.2k
      bool copy = ! (ALLOW_UNALIGNED
142
0
         || ((uintptr_t) file_phdr
143
0
             & (__alignof__ (ElfW2(LIBELFBITS,Phdr))
144
0
          - 1)) == 0);
145
11.2k
      if (! copy)
146
11.2k
        notcvt = file_phdr;
147
0
      else
148
0
        {
149
0
          notcvt = (ElfW2(LIBELFBITS,Phdr) *) malloc (size);
150
0
          if (unlikely (notcvt == NULL))
151
0
      {
152
0
        __libelf_seterrno (ELF_E_NOMEM);
153
0
        goto out;
154
0
      }
155
0
          memcpy (notcvt, file_phdr, size);
156
0
        }
157
158
3.10M
      for (size_t cnt = 0; cnt < phnum; ++cnt)
159
3.09M
        {
160
3.09M
          CONVERT_TO (phdr[cnt].p_type, notcvt[cnt].p_type);
161
3.09M
          CONVERT_TO (phdr[cnt].p_offset, notcvt[cnt].p_offset);
162
3.09M
          CONVERT_TO (phdr[cnt].p_vaddr, notcvt[cnt].p_vaddr);
163
3.09M
          CONVERT_TO (phdr[cnt].p_paddr, notcvt[cnt].p_paddr);
164
3.09M
          CONVERT_TO (phdr[cnt].p_filesz, notcvt[cnt].p_filesz);
165
3.09M
          CONVERT_TO (phdr[cnt].p_memsz, notcvt[cnt].p_memsz);
166
3.09M
          CONVERT_TO (phdr[cnt].p_flags, notcvt[cnt].p_flags);
167
3.09M
          CONVERT_TO (phdr[cnt].p_align, notcvt[cnt].p_align);
168
3.09M
        }
169
170
11.2k
      if (copy)
171
0
        free (notcvt);
172
11.2k
    }
173
11.2k
      }
174
21.0k
  }
175
0
      else if (likely (elf->fildes != -1))
176
0
  {
177
    /* Allocate memory for the program headers.  We know the number
178
       of entries from the ELF header.  */
179
0
    elf->state.ELFW(elf,LIBELFBITS).phdr =
180
0
      (ElfW2(LIBELFBITS,Phdr) *) malloc (size);
181
0
    if (elf->state.ELFW(elf,LIBELFBITS).phdr == NULL)
182
0
      {
183
0
        __libelf_seterrno (ELF_E_NOMEM);
184
0
        goto out;
185
0
      }
186
0
    elf->state.ELFW(elf,LIBELFBITS).phdr_flags |= ELF_F_MALLOCED;
187
188
    /* Read the header.  */
189
0
    ssize_t n = pread_retry (elf->fildes,
190
0
           elf->state.ELFW(elf,LIBELFBITS).phdr, size,
191
0
           elf->start_offset + ehdr->e_phoff);
192
0
    if (unlikely ((size_t) n != size))
193
0
      {
194
        /* Severe problems.  We cannot read the data.  */
195
0
        __libelf_seterrno (ELF_E_READ_ERROR);
196
0
        free (elf->state.ELFW(elf,LIBELFBITS).phdr);
197
0
        elf->state.ELFW(elf,LIBELFBITS).phdr = NULL;
198
0
        goto out;
199
0
      }
200
201
    /* If the byte order of the file is not the same as the one
202
       of the host convert the data now.  */
203
0
    if (ehdr->e_ident[EI_DATA] != MY_ELFDATA)
204
0
      {
205
0
        ElfW2(LIBELFBITS,Phdr) *phdr
206
0
    = elf->state.ELFW(elf,LIBELFBITS).phdr;
207
208
0
        for (size_t cnt = 0; cnt < phnum; ++cnt)
209
0
    {
210
0
      CONVERT (phdr[cnt].p_type);
211
0
      CONVERT (phdr[cnt].p_offset);
212
0
      CONVERT (phdr[cnt].p_vaddr);
213
0
      CONVERT (phdr[cnt].p_paddr);
214
0
      CONVERT (phdr[cnt].p_filesz);
215
0
      CONVERT (phdr[cnt].p_memsz);
216
0
      CONVERT (phdr[cnt].p_flags);
217
0
      CONVERT (phdr[cnt].p_align);
218
0
    }
219
0
      }
220
0
  }
221
0
      else
222
0
  {
223
    /* The file descriptor was already enabled and not all data was
224
       read.  */
225
0
    __libelf_seterrno (ELF_E_FD_DISABLED);
226
0
    goto out;
227
0
  }
228
229
21.0k
      result = elf->state.ELFW(elf,LIBELFBITS).phdr;
230
21.0k
    }
231
232
21.3k
 out:
233
21.3k
  return result;
234
21.3k
}
__elf32_getphdr_wrlock
Line
Count
Source
48
15.3k
{
49
15.3k
  ElfW2(LIBELFBITS,Phdr) *result;
50
51
  /* If the program header entry has already been filled in the code
52
     below must already have been run.  So the class is set, too.  No
53
     need to waste any more time here.  */
54
15.3k
  result = elf->state.ELFW(elf,LIBELFBITS).phdr;
55
15.3k
  if (likely (result != NULL))
56
0
    return result;
57
58
15.3k
  if (elf->class == 0)
59
0
    elf->class = ELFW(ELFCLASS,LIBELFBITS);
60
15.3k
  else if (elf->class != ELFW(ELFCLASS,LIBELFBITS))
61
0
    {
62
0
      __libelf_seterrno (ELF_E_INVALID_CLASS);
63
0
      result = NULL;
64
0
      goto out;
65
0
    }
66
67
15.3k
  if (likely (result == NULL))
68
15.3k
    {
69
      /* Read the section header table.  */
70
15.3k
      ElfW2(LIBELFBITS,Ehdr) *ehdr = elf->state.ELFW(elf,LIBELFBITS).ehdr;
71
72
      /* If no program header exists return NULL.  */
73
15.3k
      size_t phnum;
74
15.3k
      if (__elf_getphdrnum_rdlock (elf, &phnum) != 0)
75
0
  goto out;
76
15.3k
      if (phnum == 0 || ehdr->e_phoff == 0)
77
0
  {
78
0
    __libelf_seterrno (ELF_E_NO_PHDR);
79
0
    goto out;
80
0
  }
81
82
      /* Check this doesn't overflow.  */
83
15.3k
      size_t size = phnum * sizeof (ElfW2(LIBELFBITS,Phdr));
84
85
15.3k
      if (phnum > SIZE_MAX / sizeof (ElfW2(LIBELFBITS,Phdr))
86
15.3k
    || ehdr->e_phoff > elf->maximum_size
87
15.3k
    || elf->maximum_size - ehdr->e_phoff < size)
88
167
  {
89
167
    __libelf_seterrno (ELF_E_INVALID_DATA);
90
167
    goto out;
91
167
  }
92
93
15.2k
      if (elf->map_address != NULL)
94
15.2k
  {
95
    /* First see whether the information in the ELF header is
96
       valid and it does not ask for too much.  */
97
15.2k
    if (unlikely (ehdr->e_phoff >= elf->maximum_size)
98
15.2k
        || unlikely (elf->maximum_size - ehdr->e_phoff < size))
99
0
      {
100
        /* Something is wrong.  */
101
0
        __libelf_seterrno (ELF_E_INVALID_PHDR);
102
0
        goto out;
103
0
      }
104
105
    /* All the data is already mapped.  Use it.  */
106
15.2k
    void *file_phdr = ((char *) elf->map_address
107
15.2k
           + elf->start_offset + ehdr->e_phoff);
108
15.2k
    if (ehdr->e_ident[EI_DATA] == MY_ELFDATA
109
5.22k
        && (ALLOW_UNALIGNED
110
0
      || ((uintptr_t) file_phdr
111
0
          & (__alignof__ (ElfW2(LIBELFBITS,Phdr)) - 1)) == 0))
112
      /* Simply use the mapped data.  */
113
5.22k
      elf->state.ELFW(elf,LIBELFBITS).phdr = file_phdr;
114
9.99k
    else
115
9.99k
      {
116
9.99k
        ElfW2(LIBELFBITS,Phdr) *notcvt;
117
9.99k
        ElfW2(LIBELFBITS,Phdr) *phdr;
118
119
        /* Allocate memory for the program headers.  We know the number
120
     of entries from the ELF header.  */
121
9.99k
        phdr = elf->state.ELFW(elf,LIBELFBITS).phdr =
122
9.99k
    (ElfW2(LIBELFBITS,Phdr) *) malloc (size);
123
9.99k
        if (elf->state.ELFW(elf,LIBELFBITS).phdr == NULL)
124
0
    {
125
0
      __libelf_seterrno (ELF_E_NOMEM);
126
0
      goto out;
127
0
    }
128
9.99k
        elf->state.ELFW(elf,LIBELFBITS).phdr_flags |=
129
9.99k
    ELF_F_MALLOCED | ELF_F_DIRTY;
130
131
        /* Now copy the data and at the same time convert the
132
     byte order.  */
133
134
9.99k
        if (ehdr->e_ident[EI_DATA] == MY_ELFDATA)
135
0
    {
136
0
      assert (! ALLOW_UNALIGNED);
137
0
      memcpy (phdr, file_phdr, size);
138
0
    }
139
9.99k
        else
140
9.99k
    {
141
9.99k
      bool copy = ! (ALLOW_UNALIGNED
142
0
         || ((uintptr_t) file_phdr
143
0
             & (__alignof__ (ElfW2(LIBELFBITS,Phdr))
144
0
          - 1)) == 0);
145
9.99k
      if (! copy)
146
9.99k
        notcvt = file_phdr;
147
0
      else
148
0
        {
149
0
          notcvt = (ElfW2(LIBELFBITS,Phdr) *) malloc (size);
150
0
          if (unlikely (notcvt == NULL))
151
0
      {
152
0
        __libelf_seterrno (ELF_E_NOMEM);
153
0
        goto out;
154
0
      }
155
0
          memcpy (notcvt, file_phdr, size);
156
0
        }
157
158
1.80M
      for (size_t cnt = 0; cnt < phnum; ++cnt)
159
1.79M
        {
160
1.79M
          CONVERT_TO (phdr[cnt].p_type, notcvt[cnt].p_type);
161
1.79M
          CONVERT_TO (phdr[cnt].p_offset, notcvt[cnt].p_offset);
162
1.79M
          CONVERT_TO (phdr[cnt].p_vaddr, notcvt[cnt].p_vaddr);
163
1.79M
          CONVERT_TO (phdr[cnt].p_paddr, notcvt[cnt].p_paddr);
164
1.79M
          CONVERT_TO (phdr[cnt].p_filesz, notcvt[cnt].p_filesz);
165
1.79M
          CONVERT_TO (phdr[cnt].p_memsz, notcvt[cnt].p_memsz);
166
1.79M
          CONVERT_TO (phdr[cnt].p_flags, notcvt[cnt].p_flags);
167
1.79M
          CONVERT_TO (phdr[cnt].p_align, notcvt[cnt].p_align);
168
1.79M
        }
169
170
9.99k
      if (copy)
171
0
        free (notcvt);
172
9.99k
    }
173
9.99k
      }
174
15.2k
  }
175
0
      else if (likely (elf->fildes != -1))
176
0
  {
177
    /* Allocate memory for the program headers.  We know the number
178
       of entries from the ELF header.  */
179
0
    elf->state.ELFW(elf,LIBELFBITS).phdr =
180
0
      (ElfW2(LIBELFBITS,Phdr) *) malloc (size);
181
0
    if (elf->state.ELFW(elf,LIBELFBITS).phdr == NULL)
182
0
      {
183
0
        __libelf_seterrno (ELF_E_NOMEM);
184
0
        goto out;
185
0
      }
186
0
    elf->state.ELFW(elf,LIBELFBITS).phdr_flags |= ELF_F_MALLOCED;
187
188
    /* Read the header.  */
189
0
    ssize_t n = pread_retry (elf->fildes,
190
0
           elf->state.ELFW(elf,LIBELFBITS).phdr, size,
191
0
           elf->start_offset + ehdr->e_phoff);
192
0
    if (unlikely ((size_t) n != size))
193
0
      {
194
        /* Severe problems.  We cannot read the data.  */
195
0
        __libelf_seterrno (ELF_E_READ_ERROR);
196
0
        free (elf->state.ELFW(elf,LIBELFBITS).phdr);
197
0
        elf->state.ELFW(elf,LIBELFBITS).phdr = NULL;
198
0
        goto out;
199
0
      }
200
201
    /* If the byte order of the file is not the same as the one
202
       of the host convert the data now.  */
203
0
    if (ehdr->e_ident[EI_DATA] != MY_ELFDATA)
204
0
      {
205
0
        ElfW2(LIBELFBITS,Phdr) *phdr
206
0
    = elf->state.ELFW(elf,LIBELFBITS).phdr;
207
208
0
        for (size_t cnt = 0; cnt < phnum; ++cnt)
209
0
    {
210
0
      CONVERT (phdr[cnt].p_type);
211
0
      CONVERT (phdr[cnt].p_offset);
212
0
      CONVERT (phdr[cnt].p_vaddr);
213
0
      CONVERT (phdr[cnt].p_paddr);
214
0
      CONVERT (phdr[cnt].p_filesz);
215
0
      CONVERT (phdr[cnt].p_memsz);
216
0
      CONVERT (phdr[cnt].p_flags);
217
0
      CONVERT (phdr[cnt].p_align);
218
0
    }
219
0
      }
220
0
  }
221
0
      else
222
0
  {
223
    /* The file descriptor was already enabled and not all data was
224
       read.  */
225
0
    __libelf_seterrno (ELF_E_FD_DISABLED);
226
0
    goto out;
227
0
  }
228
229
15.2k
      result = elf->state.ELFW(elf,LIBELFBITS).phdr;
230
15.2k
    }
231
232
15.3k
 out:
233
15.3k
  return result;
234
15.3k
}
__elf64_getphdr_wrlock
Line
Count
Source
48
5.93k
{
49
5.93k
  ElfW2(LIBELFBITS,Phdr) *result;
50
51
  /* If the program header entry has already been filled in the code
52
     below must already have been run.  So the class is set, too.  No
53
     need to waste any more time here.  */
54
5.93k
  result = elf->state.ELFW(elf,LIBELFBITS).phdr;
55
5.93k
  if (likely (result != NULL))
56
0
    return result;
57
58
5.93k
  if (elf->class == 0)
59
0
    elf->class = ELFW(ELFCLASS,LIBELFBITS);
60
5.93k
  else if (elf->class != ELFW(ELFCLASS,LIBELFBITS))
61
0
    {
62
0
      __libelf_seterrno (ELF_E_INVALID_CLASS);
63
0
      result = NULL;
64
0
      goto out;
65
0
    }
66
67
5.93k
  if (likely (result == NULL))
68
5.93k
    {
69
      /* Read the section header table.  */
70
5.93k
      ElfW2(LIBELFBITS,Ehdr) *ehdr = elf->state.ELFW(elf,LIBELFBITS).ehdr;
71
72
      /* If no program header exists return NULL.  */
73
5.93k
      size_t phnum;
74
5.93k
      if (__elf_getphdrnum_rdlock (elf, &phnum) != 0)
75
0
  goto out;
76
5.93k
      if (phnum == 0 || ehdr->e_phoff == 0)
77
0
  {
78
0
    __libelf_seterrno (ELF_E_NO_PHDR);
79
0
    goto out;
80
0
  }
81
82
      /* Check this doesn't overflow.  */
83
5.93k
      size_t size = phnum * sizeof (ElfW2(LIBELFBITS,Phdr));
84
85
5.93k
      if (phnum > SIZE_MAX / sizeof (ElfW2(LIBELFBITS,Phdr))
86
5.93k
    || ehdr->e_phoff > elf->maximum_size
87
5.93k
    || elf->maximum_size - ehdr->e_phoff < size)
88
155
  {
89
155
    __libelf_seterrno (ELF_E_INVALID_DATA);
90
155
    goto out;
91
155
  }
92
93
5.78k
      if (elf->map_address != NULL)
94
5.78k
  {
95
    /* First see whether the information in the ELF header is
96
       valid and it does not ask for too much.  */
97
5.78k
    if (unlikely (ehdr->e_phoff >= elf->maximum_size)
98
5.78k
        || unlikely (elf->maximum_size - ehdr->e_phoff < size))
99
0
      {
100
        /* Something is wrong.  */
101
0
        __libelf_seterrno (ELF_E_INVALID_PHDR);
102
0
        goto out;
103
0
      }
104
105
    /* All the data is already mapped.  Use it.  */
106
5.78k
    void *file_phdr = ((char *) elf->map_address
107
5.78k
           + elf->start_offset + ehdr->e_phoff);
108
5.78k
    if (ehdr->e_ident[EI_DATA] == MY_ELFDATA
109
4.55k
        && (ALLOW_UNALIGNED
110
0
      || ((uintptr_t) file_phdr
111
0
          & (__alignof__ (ElfW2(LIBELFBITS,Phdr)) - 1)) == 0))
112
      /* Simply use the mapped data.  */
113
4.55k
      elf->state.ELFW(elf,LIBELFBITS).phdr = file_phdr;
114
1.22k
    else
115
1.22k
      {
116
1.22k
        ElfW2(LIBELFBITS,Phdr) *notcvt;
117
1.22k
        ElfW2(LIBELFBITS,Phdr) *phdr;
118
119
        /* Allocate memory for the program headers.  We know the number
120
     of entries from the ELF header.  */
121
1.22k
        phdr = elf->state.ELFW(elf,LIBELFBITS).phdr =
122
1.22k
    (ElfW2(LIBELFBITS,Phdr) *) malloc (size);
123
1.22k
        if (elf->state.ELFW(elf,LIBELFBITS).phdr == NULL)
124
0
    {
125
0
      __libelf_seterrno (ELF_E_NOMEM);
126
0
      goto out;
127
0
    }
128
1.22k
        elf->state.ELFW(elf,LIBELFBITS).phdr_flags |=
129
1.22k
    ELF_F_MALLOCED | ELF_F_DIRTY;
130
131
        /* Now copy the data and at the same time convert the
132
     byte order.  */
133
134
1.22k
        if (ehdr->e_ident[EI_DATA] == MY_ELFDATA)
135
0
    {
136
0
      assert (! ALLOW_UNALIGNED);
137
0
      memcpy (phdr, file_phdr, size);
138
0
    }
139
1.22k
        else
140
1.22k
    {
141
1.22k
      bool copy = ! (ALLOW_UNALIGNED
142
0
         || ((uintptr_t) file_phdr
143
0
             & (__alignof__ (ElfW2(LIBELFBITS,Phdr))
144
0
          - 1)) == 0);
145
1.22k
      if (! copy)
146
1.22k
        notcvt = file_phdr;
147
0
      else
148
0
        {
149
0
          notcvt = (ElfW2(LIBELFBITS,Phdr) *) malloc (size);
150
0
          if (unlikely (notcvt == NULL))
151
0
      {
152
0
        __libelf_seterrno (ELF_E_NOMEM);
153
0
        goto out;
154
0
      }
155
0
          memcpy (notcvt, file_phdr, size);
156
0
        }
157
158
1.29M
      for (size_t cnt = 0; cnt < phnum; ++cnt)
159
1.29M
        {
160
1.29M
          CONVERT_TO (phdr[cnt].p_type, notcvt[cnt].p_type);
161
1.29M
          CONVERT_TO (phdr[cnt].p_offset, notcvt[cnt].p_offset);
162
1.29M
          CONVERT_TO (phdr[cnt].p_vaddr, notcvt[cnt].p_vaddr);
163
1.29M
          CONVERT_TO (phdr[cnt].p_paddr, notcvt[cnt].p_paddr);
164
1.29M
          CONVERT_TO (phdr[cnt].p_filesz, notcvt[cnt].p_filesz);
165
1.29M
          CONVERT_TO (phdr[cnt].p_memsz, notcvt[cnt].p_memsz);
166
1.29M
          CONVERT_TO (phdr[cnt].p_flags, notcvt[cnt].p_flags);
167
1.29M
          CONVERT_TO (phdr[cnt].p_align, notcvt[cnt].p_align);
168
1.29M
        }
169
170
1.22k
      if (copy)
171
0
        free (notcvt);
172
1.22k
    }
173
1.22k
      }
174
5.78k
  }
175
0
      else if (likely (elf->fildes != -1))
176
0
  {
177
    /* Allocate memory for the program headers.  We know the number
178
       of entries from the ELF header.  */
179
0
    elf->state.ELFW(elf,LIBELFBITS).phdr =
180
0
      (ElfW2(LIBELFBITS,Phdr) *) malloc (size);
181
0
    if (elf->state.ELFW(elf,LIBELFBITS).phdr == NULL)
182
0
      {
183
0
        __libelf_seterrno (ELF_E_NOMEM);
184
0
        goto out;
185
0
      }
186
0
    elf->state.ELFW(elf,LIBELFBITS).phdr_flags |= ELF_F_MALLOCED;
187
188
    /* Read the header.  */
189
0
    ssize_t n = pread_retry (elf->fildes,
190
0
           elf->state.ELFW(elf,LIBELFBITS).phdr, size,
191
0
           elf->start_offset + ehdr->e_phoff);
192
0
    if (unlikely ((size_t) n != size))
193
0
      {
194
        /* Severe problems.  We cannot read the data.  */
195
0
        __libelf_seterrno (ELF_E_READ_ERROR);
196
0
        free (elf->state.ELFW(elf,LIBELFBITS).phdr);
197
0
        elf->state.ELFW(elf,LIBELFBITS).phdr = NULL;
198
0
        goto out;
199
0
      }
200
201
    /* If the byte order of the file is not the same as the one
202
       of the host convert the data now.  */
203
0
    if (ehdr->e_ident[EI_DATA] != MY_ELFDATA)
204
0
      {
205
0
        ElfW2(LIBELFBITS,Phdr) *phdr
206
0
    = elf->state.ELFW(elf,LIBELFBITS).phdr;
207
208
0
        for (size_t cnt = 0; cnt < phnum; ++cnt)
209
0
    {
210
0
      CONVERT (phdr[cnt].p_type);
211
0
      CONVERT (phdr[cnt].p_offset);
212
0
      CONVERT (phdr[cnt].p_vaddr);
213
0
      CONVERT (phdr[cnt].p_paddr);
214
0
      CONVERT (phdr[cnt].p_filesz);
215
0
      CONVERT (phdr[cnt].p_memsz);
216
0
      CONVERT (phdr[cnt].p_flags);
217
0
      CONVERT (phdr[cnt].p_align);
218
0
    }
219
0
      }
220
0
  }
221
0
      else
222
0
  {
223
    /* The file descriptor was already enabled and not all data was
224
       read.  */
225
0
    __libelf_seterrno (ELF_E_FD_DISABLED);
226
0
    goto out;
227
0
  }
228
229
5.78k
      result = elf->state.ELFW(elf,LIBELFBITS).phdr;
230
5.78k
    }
231
232
5.93k
 out:
233
5.93k
  return result;
234
5.93k
}
235
236
ElfW2(LIBELFBITS,Phdr) *
237
elfw2(LIBELFBITS,getphdr) (Elf *elf)
238
21.3k
{
239
21.3k
  ElfW2(LIBELFBITS,Phdr) *result;
240
241
21.3k
  if (elf == NULL)
242
0
    return NULL;
243
244
21.3k
  if (unlikely (elf->kind != ELF_K_ELF))
245
0
    {
246
0
      __libelf_seterrno (ELF_E_INVALID_HANDLE);
247
0
      return NULL;
248
0
    }
249
250
  /* If the program header entry has already been filled in the code
251
   * in getphdr_wrlock must already have been run.  So the class is
252
   * set, too.  No need to waste any more time here.  */
253
21.3k
  result = elf->state.ELFW(elf,LIBELFBITS).phdr;
254
21.3k
  if (likely (result != NULL))
255
0
    return result;
256
257
21.3k
  rwlock_wrlock (elf->lock);
258
21.3k
  result = __elfw2(LIBELFBITS,getphdr_wrlock) (elf);
259
21.3k
  rwlock_unlock (elf->lock);
260
261
21.3k
  return result;
262
21.3k
}
elf32_getphdr
Line
Count
Source
238
15.3k
{
239
15.3k
  ElfW2(LIBELFBITS,Phdr) *result;
240
241
15.3k
  if (elf == NULL)
242
0
    return NULL;
243
244
15.3k
  if (unlikely (elf->kind != ELF_K_ELF))
245
0
    {
246
0
      __libelf_seterrno (ELF_E_INVALID_HANDLE);
247
0
      return NULL;
248
0
    }
249
250
  /* If the program header entry has already been filled in the code
251
   * in getphdr_wrlock must already have been run.  So the class is
252
   * set, too.  No need to waste any more time here.  */
253
15.3k
  result = elf->state.ELFW(elf,LIBELFBITS).phdr;
254
15.3k
  if (likely (result != NULL))
255
0
    return result;
256
257
15.3k
  rwlock_wrlock (elf->lock);
258
15.3k
  result = __elfw2(LIBELFBITS,getphdr_wrlock) (elf);
259
15.3k
  rwlock_unlock (elf->lock);
260
261
15.3k
  return result;
262
15.3k
}
elf64_getphdr
Line
Count
Source
238
5.93k
{
239
5.93k
  ElfW2(LIBELFBITS,Phdr) *result;
240
241
5.93k
  if (elf == NULL)
242
0
    return NULL;
243
244
5.93k
  if (unlikely (elf->kind != ELF_K_ELF))
245
0
    {
246
0
      __libelf_seterrno (ELF_E_INVALID_HANDLE);
247
0
      return NULL;
248
0
    }
249
250
  /* If the program header entry has already been filled in the code
251
   * in getphdr_wrlock must already have been run.  So the class is
252
   * set, too.  No need to waste any more time here.  */
253
5.93k
  result = elf->state.ELFW(elf,LIBELFBITS).phdr;
254
5.93k
  if (likely (result != NULL))
255
0
    return result;
256
257
5.93k
  rwlock_wrlock (elf->lock);
258
5.93k
  result = __elfw2(LIBELFBITS,getphdr_wrlock) (elf);
259
5.93k
  rwlock_unlock (elf->lock);
260
261
5.93k
  return result;
262
5.93k
}
263
INTDEF(elfw2(LIBELFBITS,getphdr))