Coverage Report

Created: 2025-11-11 06:45

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
22.3k
{
49
22.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
22.3k
  result = elf->state.ELFW(elf,LIBELFBITS).phdr;
55
22.3k
  if (likely (result != NULL))
56
0
    return result;
57
58
22.3k
  if (elf->class == 0)
59
0
    elf->class = ELFW(ELFCLASS,LIBELFBITS);
60
22.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
22.3k
  if (likely (result == NULL))
68
22.3k
    {
69
      /* Read the section header table.  */
70
22.3k
      ElfW2(LIBELFBITS,Ehdr) *ehdr = elf->state.ELFW(elf,LIBELFBITS).ehdr;
71
72
      /* If no program header exists return NULL.  */
73
22.3k
      size_t phnum;
74
22.3k
      if (__elf_getphdrnum_rdlock (elf, &phnum) != 0)
75
0
  goto out;
76
22.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
22.3k
      size_t size = phnum * sizeof (ElfW2(LIBELFBITS,Phdr));
84
85
22.3k
      if (phnum > SIZE_MAX / sizeof (ElfW2(LIBELFBITS,Phdr))
86
22.3k
    || ehdr->e_phoff > elf->maximum_size
87
22.3k
    || elf->maximum_size - ehdr->e_phoff < size)
88
271
  {
89
271
    __libelf_seterrno (ELF_E_INVALID_DATA);
90
271
    goto out;
91
271
  }
92
93
22.0k
      if (elf->map_address != NULL)
94
22.0k
  {
95
    /* First see whether the information in the ELF header is
96
       valid and it does not ask for too much.  */
97
22.0k
    if (unlikely (ehdr->e_phoff >= elf->maximum_size)
98
22.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
22.0k
    void *file_phdr = ((char *) elf->map_address
107
22.0k
           + elf->start_offset + ehdr->e_phoff);
108
22.0k
    if (ehdr->e_ident[EI_DATA] == MY_ELFDATA
109
11.5k
        && (ALLOW_UNALIGNED
110
0
      || ((uintptr_t) file_phdr
111
0
          & (__alignof__ (ElfW2(LIBELFBITS,Phdr)) - 1)) == 0))
112
      /* Simply use the mapped data.  */
113
11.5k
      elf->state.ELFW(elf,LIBELFBITS).phdr = file_phdr;
114
10.4k
    else
115
10.4k
      {
116
10.4k
        ElfW2(LIBELFBITS,Phdr) *notcvt;
117
10.4k
        ElfW2(LIBELFBITS,Phdr) *phdr;
118
119
        /* Allocate memory for the program headers.  We know the number
120
     of entries from the ELF header.  */
121
10.4k
        phdr = elf->state.ELFW(elf,LIBELFBITS).phdr =
122
10.4k
    (ElfW2(LIBELFBITS,Phdr) *) malloc (size);
123
10.4k
        if (elf->state.ELFW(elf,LIBELFBITS).phdr == NULL)
124
0
    {
125
0
      __libelf_seterrno (ELF_E_NOMEM);
126
0
      goto out;
127
0
    }
128
10.4k
        elf->state.ELFW(elf,LIBELFBITS).phdr_flags |=
129
10.4k
    ELF_F_MALLOCED | ELF_F_DIRTY;
130
131
        /* Now copy the data and at the same time convert the
132
     byte order.  */
133
134
10.4k
        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
10.4k
        else
140
10.4k
    {
141
10.4k
      bool copy = ! (ALLOW_UNALIGNED
142
0
         || ((uintptr_t) file_phdr
143
0
             & (__alignof__ (ElfW2(LIBELFBITS,Phdr))
144
0
          - 1)) == 0);
145
10.4k
      if (! copy)
146
10.4k
        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
2.72M
      for (size_t cnt = 0; cnt < phnum; ++cnt)
159
2.71M
        {
160
2.71M
          CONVERT_TO (phdr[cnt].p_type, notcvt[cnt].p_type);
161
2.71M
          CONVERT_TO (phdr[cnt].p_offset, notcvt[cnt].p_offset);
162
2.71M
          CONVERT_TO (phdr[cnt].p_vaddr, notcvt[cnt].p_vaddr);
163
2.71M
          CONVERT_TO (phdr[cnt].p_paddr, notcvt[cnt].p_paddr);
164
2.71M
          CONVERT_TO (phdr[cnt].p_filesz, notcvt[cnt].p_filesz);
165
2.71M
          CONVERT_TO (phdr[cnt].p_memsz, notcvt[cnt].p_memsz);
166
2.71M
          CONVERT_TO (phdr[cnt].p_flags, notcvt[cnt].p_flags);
167
2.71M
          CONVERT_TO (phdr[cnt].p_align, notcvt[cnt].p_align);
168
2.71M
        }
169
170
10.4k
      if (copy)
171
0
        free (notcvt);
172
10.4k
    }
173
10.4k
      }
174
22.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
22.0k
      result = elf->state.ELFW(elf,LIBELFBITS).phdr;
230
22.0k
    }
231
232
22.3k
 out:
233
22.3k
  return result;
234
22.3k
}
__elf32_getphdr_wrlock
Line
Count
Source
48
12.9k
{
49
12.9k
  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
12.9k
  result = elf->state.ELFW(elf,LIBELFBITS).phdr;
55
12.9k
  if (likely (result != NULL))
56
0
    return result;
57
58
12.9k
  if (elf->class == 0)
59
0
    elf->class = ELFW(ELFCLASS,LIBELFBITS);
60
12.9k
  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
12.9k
  if (likely (result == NULL))
68
12.9k
    {
69
      /* Read the section header table.  */
70
12.9k
      ElfW2(LIBELFBITS,Ehdr) *ehdr = elf->state.ELFW(elf,LIBELFBITS).ehdr;
71
72
      /* If no program header exists return NULL.  */
73
12.9k
      size_t phnum;
74
12.9k
      if (__elf_getphdrnum_rdlock (elf, &phnum) != 0)
75
0
  goto out;
76
12.9k
      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
12.9k
      size_t size = phnum * sizeof (ElfW2(LIBELFBITS,Phdr));
84
85
12.9k
      if (phnum > SIZE_MAX / sizeof (ElfW2(LIBELFBITS,Phdr))
86
12.9k
    || ehdr->e_phoff > elf->maximum_size
87
12.9k
    || elf->maximum_size - ehdr->e_phoff < size)
88
133
  {
89
133
    __libelf_seterrno (ELF_E_INVALID_DATA);
90
133
    goto out;
91
133
  }
92
93
12.7k
      if (elf->map_address != NULL)
94
12.7k
  {
95
    /* First see whether the information in the ELF header is
96
       valid and it does not ask for too much.  */
97
12.7k
    if (unlikely (ehdr->e_phoff >= elf->maximum_size)
98
12.7k
        || 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
12.7k
    void *file_phdr = ((char *) elf->map_address
107
12.7k
           + elf->start_offset + ehdr->e_phoff);
108
12.7k
    if (ehdr->e_ident[EI_DATA] == MY_ELFDATA
109
3.31k
        && (ALLOW_UNALIGNED
110
0
      || ((uintptr_t) file_phdr
111
0
          & (__alignof__ (ElfW2(LIBELFBITS,Phdr)) - 1)) == 0))
112
      /* Simply use the mapped data.  */
113
3.31k
      elf->state.ELFW(elf,LIBELFBITS).phdr = file_phdr;
114
9.47k
    else
115
9.47k
      {
116
9.47k
        ElfW2(LIBELFBITS,Phdr) *notcvt;
117
9.47k
        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.47k
        phdr = elf->state.ELFW(elf,LIBELFBITS).phdr =
122
9.47k
    (ElfW2(LIBELFBITS,Phdr) *) malloc (size);
123
9.47k
        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.47k
        elf->state.ELFW(elf,LIBELFBITS).phdr_flags |=
129
9.47k
    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.47k
        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.47k
        else
140
9.47k
    {
141
9.47k
      bool copy = ! (ALLOW_UNALIGNED
142
0
         || ((uintptr_t) file_phdr
143
0
             & (__alignof__ (ElfW2(LIBELFBITS,Phdr))
144
0
          - 1)) == 0);
145
9.47k
      if (! copy)
146
9.47k
        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.75M
      for (size_t cnt = 0; cnt < phnum; ++cnt)
159
1.74M
        {
160
1.74M
          CONVERT_TO (phdr[cnt].p_type, notcvt[cnt].p_type);
161
1.74M
          CONVERT_TO (phdr[cnt].p_offset, notcvt[cnt].p_offset);
162
1.74M
          CONVERT_TO (phdr[cnt].p_vaddr, notcvt[cnt].p_vaddr);
163
1.74M
          CONVERT_TO (phdr[cnt].p_paddr, notcvt[cnt].p_paddr);
164
1.74M
          CONVERT_TO (phdr[cnt].p_filesz, notcvt[cnt].p_filesz);
165
1.74M
          CONVERT_TO (phdr[cnt].p_memsz, notcvt[cnt].p_memsz);
166
1.74M
          CONVERT_TO (phdr[cnt].p_flags, notcvt[cnt].p_flags);
167
1.74M
          CONVERT_TO (phdr[cnt].p_align, notcvt[cnt].p_align);
168
1.74M
        }
169
170
9.47k
      if (copy)
171
0
        free (notcvt);
172
9.47k
    }
173
9.47k
      }
174
12.7k
  }
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
12.7k
      result = elf->state.ELFW(elf,LIBELFBITS).phdr;
230
12.7k
    }
231
232
12.9k
 out:
233
12.9k
  return result;
234
12.9k
}
__elf64_getphdr_wrlock
Line
Count
Source
48
9.40k
{
49
9.40k
  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
9.40k
  result = elf->state.ELFW(elf,LIBELFBITS).phdr;
55
9.40k
  if (likely (result != NULL))
56
0
    return result;
57
58
9.40k
  if (elf->class == 0)
59
0
    elf->class = ELFW(ELFCLASS,LIBELFBITS);
60
9.40k
  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
9.40k
  if (likely (result == NULL))
68
9.40k
    {
69
      /* Read the section header table.  */
70
9.40k
      ElfW2(LIBELFBITS,Ehdr) *ehdr = elf->state.ELFW(elf,LIBELFBITS).ehdr;
71
72
      /* If no program header exists return NULL.  */
73
9.40k
      size_t phnum;
74
9.40k
      if (__elf_getphdrnum_rdlock (elf, &phnum) != 0)
75
0
  goto out;
76
9.40k
      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
9.40k
      size_t size = phnum * sizeof (ElfW2(LIBELFBITS,Phdr));
84
85
9.40k
      if (phnum > SIZE_MAX / sizeof (ElfW2(LIBELFBITS,Phdr))
86
9.40k
    || ehdr->e_phoff > elf->maximum_size
87
9.40k
    || elf->maximum_size - ehdr->e_phoff < size)
88
138
  {
89
138
    __libelf_seterrno (ELF_E_INVALID_DATA);
90
138
    goto out;
91
138
  }
92
93
9.26k
      if (elf->map_address != NULL)
94
9.26k
  {
95
    /* First see whether the information in the ELF header is
96
       valid and it does not ask for too much.  */
97
9.26k
    if (unlikely (ehdr->e_phoff >= elf->maximum_size)
98
9.26k
        || 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
9.26k
    void *file_phdr = ((char *) elf->map_address
107
9.26k
           + elf->start_offset + ehdr->e_phoff);
108
9.26k
    if (ehdr->e_ident[EI_DATA] == MY_ELFDATA
109
8.28k
        && (ALLOW_UNALIGNED
110
0
      || ((uintptr_t) file_phdr
111
0
          & (__alignof__ (ElfW2(LIBELFBITS,Phdr)) - 1)) == 0))
112
      /* Simply use the mapped data.  */
113
8.28k
      elf->state.ELFW(elf,LIBELFBITS).phdr = file_phdr;
114
986
    else
115
986
      {
116
986
        ElfW2(LIBELFBITS,Phdr) *notcvt;
117
986
        ElfW2(LIBELFBITS,Phdr) *phdr;
118
119
        /* Allocate memory for the program headers.  We know the number
120
     of entries from the ELF header.  */
121
986
        phdr = elf->state.ELFW(elf,LIBELFBITS).phdr =
122
986
    (ElfW2(LIBELFBITS,Phdr) *) malloc (size);
123
986
        if (elf->state.ELFW(elf,LIBELFBITS).phdr == NULL)
124
0
    {
125
0
      __libelf_seterrno (ELF_E_NOMEM);
126
0
      goto out;
127
0
    }
128
986
        elf->state.ELFW(elf,LIBELFBITS).phdr_flags |=
129
986
    ELF_F_MALLOCED | ELF_F_DIRTY;
130
131
        /* Now copy the data and at the same time convert the
132
     byte order.  */
133
134
986
        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
986
        else
140
986
    {
141
986
      bool copy = ! (ALLOW_UNALIGNED
142
0
         || ((uintptr_t) file_phdr
143
0
             & (__alignof__ (ElfW2(LIBELFBITS,Phdr))
144
0
          - 1)) == 0);
145
986
      if (! copy)
146
986
        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
977k
      for (size_t cnt = 0; cnt < phnum; ++cnt)
159
976k
        {
160
976k
          CONVERT_TO (phdr[cnt].p_type, notcvt[cnt].p_type);
161
976k
          CONVERT_TO (phdr[cnt].p_offset, notcvt[cnt].p_offset);
162
976k
          CONVERT_TO (phdr[cnt].p_vaddr, notcvt[cnt].p_vaddr);
163
976k
          CONVERT_TO (phdr[cnt].p_paddr, notcvt[cnt].p_paddr);
164
976k
          CONVERT_TO (phdr[cnt].p_filesz, notcvt[cnt].p_filesz);
165
976k
          CONVERT_TO (phdr[cnt].p_memsz, notcvt[cnt].p_memsz);
166
976k
          CONVERT_TO (phdr[cnt].p_flags, notcvt[cnt].p_flags);
167
976k
          CONVERT_TO (phdr[cnt].p_align, notcvt[cnt].p_align);
168
976k
        }
169
170
986
      if (copy)
171
0
        free (notcvt);
172
986
    }
173
986
      }
174
9.26k
  }
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
9.26k
      result = elf->state.ELFW(elf,LIBELFBITS).phdr;
230
9.26k
    }
231
232
9.40k
 out:
233
9.40k
  return result;
234
9.40k
}
235
236
ElfW2(LIBELFBITS,Phdr) *
237
elfw2(LIBELFBITS,getphdr) (Elf *elf)
238
22.3k
{
239
22.3k
  ElfW2(LIBELFBITS,Phdr) *result;
240
241
22.3k
  if (elf == NULL)
242
0
    return NULL;
243
244
22.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
22.3k
  result = elf->state.ELFW(elf,LIBELFBITS).phdr;
254
22.3k
  if (likely (result != NULL))
255
0
    return result;
256
257
22.3k
  rwlock_wrlock (elf->lock);
258
22.3k
  result = __elfw2(LIBELFBITS,getphdr_wrlock) (elf);
259
22.3k
  rwlock_unlock (elf->lock);
260
261
22.3k
  return result;
262
22.3k
}
elf32_getphdr
Line
Count
Source
238
12.9k
{
239
12.9k
  ElfW2(LIBELFBITS,Phdr) *result;
240
241
12.9k
  if (elf == NULL)
242
0
    return NULL;
243
244
12.9k
  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
12.9k
  result = elf->state.ELFW(elf,LIBELFBITS).phdr;
254
12.9k
  if (likely (result != NULL))
255
0
    return result;
256
257
12.9k
  rwlock_wrlock (elf->lock);
258
12.9k
  result = __elfw2(LIBELFBITS,getphdr_wrlock) (elf);
259
12.9k
  rwlock_unlock (elf->lock);
260
261
12.9k
  return result;
262
12.9k
}
elf64_getphdr
Line
Count
Source
238
9.40k
{
239
9.40k
  ElfW2(LIBELFBITS,Phdr) *result;
240
241
9.40k
  if (elf == NULL)
242
0
    return NULL;
243
244
9.40k
  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
9.40k
  result = elf->state.ELFW(elf,LIBELFBITS).phdr;
254
9.40k
  if (likely (result != NULL))
255
0
    return result;
256
257
9.40k
  rwlock_wrlock (elf->lock);
258
9.40k
  result = __elfw2(LIBELFBITS,getphdr_wrlock) (elf);
259
9.40k
  rwlock_unlock (elf->lock);
260
261
9.40k
  return result;
262
9.40k
}
263
INTDEF(elfw2(LIBELFBITS,getphdr))