Coverage Report

Created: 2025-04-11 06:16

/src/elfutils/libelf/elf32_getphdr.c
Line
Count
Source (jump to first uncovered line)
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
24.1k
{
49
24.1k
  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
24.1k
  result = elf->state.ELFW(elf,LIBELFBITS).phdr;
55
24.1k
  if (likely (result != NULL))
56
0
    return result;
57
58
24.1k
  if (elf->class == 0)
59
0
    elf->class = ELFW(ELFCLASS,LIBELFBITS);
60
24.1k
  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
24.1k
  if (likely (result == NULL))
68
24.1k
    {
69
      /* Read the section header table.  */
70
24.1k
      ElfW2(LIBELFBITS,Ehdr) *ehdr = elf->state.ELFW(elf,LIBELFBITS).ehdr;
71
72
      /* If no program header exists return NULL.  */
73
24.1k
      size_t phnum;
74
24.1k
      if (__elf_getphdrnum_rdlock (elf, &phnum) != 0)
75
0
  goto out;
76
24.1k
      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
24.1k
      size_t size = phnum * sizeof (ElfW2(LIBELFBITS,Phdr));
84
85
24.1k
      if (phnum > SIZE_MAX / sizeof (ElfW2(LIBELFBITS,Phdr))
86
24.1k
    || ehdr->e_phoff > elf->maximum_size
87
24.1k
    || elf->maximum_size - ehdr->e_phoff < size)
88
302
  {
89
302
    __libelf_seterrno (ELF_E_INVALID_DATA);
90
302
    goto out;
91
302
  }
92
93
23.8k
      if (elf->map_address != NULL)
94
23.8k
  {
95
    /* First see whether the information in the ELF header is
96
       valid and it does not ask for too much.  */
97
23.8k
    if (unlikely (ehdr->e_phoff >= elf->maximum_size)
98
23.8k
        || 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
23.8k
    void *file_phdr = ((char *) elf->map_address
107
23.8k
           + elf->start_offset + ehdr->e_phoff);
108
23.8k
    if (ehdr->e_ident[EI_DATA] == MY_ELFDATA
109
23.8k
        && (ALLOW_UNALIGNED
110
13.7k
      || ((uintptr_t) file_phdr
111
0
          & (__alignof__ (ElfW2(LIBELFBITS,Phdr)) - 1)) == 0))
112
      /* Simply use the mapped data.  */
113
13.7k
      elf->state.ELFW(elf,LIBELFBITS).phdr = file_phdr;
114
10.1k
    else
115
10.1k
      {
116
10.1k
        ElfW2(LIBELFBITS,Phdr) *notcvt;
117
10.1k
        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.1k
        phdr = elf->state.ELFW(elf,LIBELFBITS).phdr =
122
10.1k
    (ElfW2(LIBELFBITS,Phdr) *) malloc (size);
123
10.1k
        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.1k
        elf->state.ELFW(elf,LIBELFBITS).phdr_flags |=
129
10.1k
    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.1k
        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.1k
        else
140
10.1k
    {
141
10.1k
      bool copy = ! (ALLOW_UNALIGNED
142
10.1k
         || ((uintptr_t) file_phdr
143
0
             & (__alignof__ (ElfW2(LIBELFBITS,Phdr))
144
0
          - 1)) == 0);
145
10.1k
      if (! copy)
146
10.1k
        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.69M
      for (size_t cnt = 0; cnt < phnum; ++cnt)
159
2.68M
        {
160
2.68M
          CONVERT_TO (phdr[cnt].p_type, notcvt[cnt].p_type);
161
2.68M
          CONVERT_TO (phdr[cnt].p_offset, notcvt[cnt].p_offset);
162
2.68M
          CONVERT_TO (phdr[cnt].p_vaddr, notcvt[cnt].p_vaddr);
163
2.68M
          CONVERT_TO (phdr[cnt].p_paddr, notcvt[cnt].p_paddr);
164
2.68M
          CONVERT_TO (phdr[cnt].p_filesz, notcvt[cnt].p_filesz);
165
2.68M
          CONVERT_TO (phdr[cnt].p_memsz, notcvt[cnt].p_memsz);
166
2.68M
          CONVERT_TO (phdr[cnt].p_flags, notcvt[cnt].p_flags);
167
2.68M
          CONVERT_TO (phdr[cnt].p_align, notcvt[cnt].p_align);
168
2.68M
        }
169
170
10.1k
      if (copy)
171
0
        free (notcvt);
172
10.1k
    }
173
10.1k
      }
174
23.8k
  }
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
23.8k
      result = elf->state.ELFW(elf,LIBELFBITS).phdr;
230
23.8k
    }
231
232
24.1k
 out:
233
24.1k
  return result;
234
24.1k
}
__elf32_getphdr_wrlock
Line
Count
Source
48
12.7k
{
49
12.7k
  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.7k
  result = elf->state.ELFW(elf,LIBELFBITS).phdr;
55
12.7k
  if (likely (result != NULL))
56
0
    return result;
57
58
12.7k
  if (elf->class == 0)
59
0
    elf->class = ELFW(ELFCLASS,LIBELFBITS);
60
12.7k
  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.7k
  if (likely (result == NULL))
68
12.7k
    {
69
      /* Read the section header table.  */
70
12.7k
      ElfW2(LIBELFBITS,Ehdr) *ehdr = elf->state.ELFW(elf,LIBELFBITS).ehdr;
71
72
      /* If no program header exists return NULL.  */
73
12.7k
      size_t phnum;
74
12.7k
      if (__elf_getphdrnum_rdlock (elf, &phnum) != 0)
75
0
  goto out;
76
12.7k
      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.7k
      size_t size = phnum * sizeof (ElfW2(LIBELFBITS,Phdr));
84
85
12.7k
      if (phnum > SIZE_MAX / sizeof (ElfW2(LIBELFBITS,Phdr))
86
12.7k
    || ehdr->e_phoff > elf->maximum_size
87
12.7k
    || elf->maximum_size - ehdr->e_phoff < size)
88
154
  {
89
154
    __libelf_seterrno (ELF_E_INVALID_DATA);
90
154
    goto out;
91
154
  }
92
93
12.5k
      if (elf->map_address != NULL)
94
12.5k
  {
95
    /* First see whether the information in the ELF header is
96
       valid and it does not ask for too much.  */
97
12.5k
    if (unlikely (ehdr->e_phoff >= elf->maximum_size)
98
12.5k
        || 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.5k
    void *file_phdr = ((char *) elf->map_address
107
12.5k
           + elf->start_offset + ehdr->e_phoff);
108
12.5k
    if (ehdr->e_ident[EI_DATA] == MY_ELFDATA
109
12.5k
        && (ALLOW_UNALIGNED
110
3.53k
      || ((uintptr_t) file_phdr
111
0
          & (__alignof__ (ElfW2(LIBELFBITS,Phdr)) - 1)) == 0))
112
      /* Simply use the mapped data.  */
113
3.53k
      elf->state.ELFW(elf,LIBELFBITS).phdr = file_phdr;
114
9.05k
    else
115
9.05k
      {
116
9.05k
        ElfW2(LIBELFBITS,Phdr) *notcvt;
117
9.05k
        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.05k
        phdr = elf->state.ELFW(elf,LIBELFBITS).phdr =
122
9.05k
    (ElfW2(LIBELFBITS,Phdr) *) malloc (size);
123
9.05k
        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.05k
        elf->state.ELFW(elf,LIBELFBITS).phdr_flags |=
129
9.05k
    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.05k
        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.05k
        else
140
9.05k
    {
141
9.05k
      bool copy = ! (ALLOW_UNALIGNED
142
9.05k
         || ((uintptr_t) file_phdr
143
0
             & (__alignof__ (ElfW2(LIBELFBITS,Phdr))
144
0
          - 1)) == 0);
145
9.05k
      if (! copy)
146
9.05k
        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.45M
      for (size_t cnt = 0; cnt < phnum; ++cnt)
159
1.44M
        {
160
1.44M
          CONVERT_TO (phdr[cnt].p_type, notcvt[cnt].p_type);
161
1.44M
          CONVERT_TO (phdr[cnt].p_offset, notcvt[cnt].p_offset);
162
1.44M
          CONVERT_TO (phdr[cnt].p_vaddr, notcvt[cnt].p_vaddr);
163
1.44M
          CONVERT_TO (phdr[cnt].p_paddr, notcvt[cnt].p_paddr);
164
1.44M
          CONVERT_TO (phdr[cnt].p_filesz, notcvt[cnt].p_filesz);
165
1.44M
          CONVERT_TO (phdr[cnt].p_memsz, notcvt[cnt].p_memsz);
166
1.44M
          CONVERT_TO (phdr[cnt].p_flags, notcvt[cnt].p_flags);
167
1.44M
          CONVERT_TO (phdr[cnt].p_align, notcvt[cnt].p_align);
168
1.44M
        }
169
170
9.05k
      if (copy)
171
0
        free (notcvt);
172
9.05k
    }
173
9.05k
      }
174
12.5k
  }
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.5k
      result = elf->state.ELFW(elf,LIBELFBITS).phdr;
230
12.5k
    }
231
232
12.7k
 out:
233
12.7k
  return result;
234
12.7k
}
__elf64_getphdr_wrlock
Line
Count
Source
48
11.4k
{
49
11.4k
  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
11.4k
  result = elf->state.ELFW(elf,LIBELFBITS).phdr;
55
11.4k
  if (likely (result != NULL))
56
0
    return result;
57
58
11.4k
  if (elf->class == 0)
59
0
    elf->class = ELFW(ELFCLASS,LIBELFBITS);
60
11.4k
  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
11.4k
  if (likely (result == NULL))
68
11.4k
    {
69
      /* Read the section header table.  */
70
11.4k
      ElfW2(LIBELFBITS,Ehdr) *ehdr = elf->state.ELFW(elf,LIBELFBITS).ehdr;
71
72
      /* If no program header exists return NULL.  */
73
11.4k
      size_t phnum;
74
11.4k
      if (__elf_getphdrnum_rdlock (elf, &phnum) != 0)
75
0
  goto out;
76
11.4k
      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
11.4k
      size_t size = phnum * sizeof (ElfW2(LIBELFBITS,Phdr));
84
85
11.4k
      if (phnum > SIZE_MAX / sizeof (ElfW2(LIBELFBITS,Phdr))
86
11.4k
    || ehdr->e_phoff > elf->maximum_size
87
11.4k
    || elf->maximum_size - ehdr->e_phoff < size)
88
148
  {
89
148
    __libelf_seterrno (ELF_E_INVALID_DATA);
90
148
    goto out;
91
148
  }
92
93
11.3k
      if (elf->map_address != NULL)
94
11.3k
  {
95
    /* First see whether the information in the ELF header is
96
       valid and it does not ask for too much.  */
97
11.3k
    if (unlikely (ehdr->e_phoff >= elf->maximum_size)
98
11.3k
        || 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
11.3k
    void *file_phdr = ((char *) elf->map_address
107
11.3k
           + elf->start_offset + ehdr->e_phoff);
108
11.3k
    if (ehdr->e_ident[EI_DATA] == MY_ELFDATA
109
11.3k
        && (ALLOW_UNALIGNED
110
10.2k
      || ((uintptr_t) file_phdr
111
0
          & (__alignof__ (ElfW2(LIBELFBITS,Phdr)) - 1)) == 0))
112
      /* Simply use the mapped data.  */
113
10.2k
      elf->state.ELFW(elf,LIBELFBITS).phdr = file_phdr;
114
1.07k
    else
115
1.07k
      {
116
1.07k
        ElfW2(LIBELFBITS,Phdr) *notcvt;
117
1.07k
        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.07k
        phdr = elf->state.ELFW(elf,LIBELFBITS).phdr =
122
1.07k
    (ElfW2(LIBELFBITS,Phdr) *) malloc (size);
123
1.07k
        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.07k
        elf->state.ELFW(elf,LIBELFBITS).phdr_flags |=
129
1.07k
    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.07k
        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.07k
        else
140
1.07k
    {
141
1.07k
      bool copy = ! (ALLOW_UNALIGNED
142
1.07k
         || ((uintptr_t) file_phdr
143
0
             & (__alignof__ (ElfW2(LIBELFBITS,Phdr))
144
0
          - 1)) == 0);
145
1.07k
      if (! copy)
146
1.07k
        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.24M
      for (size_t cnt = 0; cnt < phnum; ++cnt)
159
1.23M
        {
160
1.23M
          CONVERT_TO (phdr[cnt].p_type, notcvt[cnt].p_type);
161
1.23M
          CONVERT_TO (phdr[cnt].p_offset, notcvt[cnt].p_offset);
162
1.23M
          CONVERT_TO (phdr[cnt].p_vaddr, notcvt[cnt].p_vaddr);
163
1.23M
          CONVERT_TO (phdr[cnt].p_paddr, notcvt[cnt].p_paddr);
164
1.23M
          CONVERT_TO (phdr[cnt].p_filesz, notcvt[cnt].p_filesz);
165
1.23M
          CONVERT_TO (phdr[cnt].p_memsz, notcvt[cnt].p_memsz);
166
1.23M
          CONVERT_TO (phdr[cnt].p_flags, notcvt[cnt].p_flags);
167
1.23M
          CONVERT_TO (phdr[cnt].p_align, notcvt[cnt].p_align);
168
1.23M
        }
169
170
1.07k
      if (copy)
171
0
        free (notcvt);
172
1.07k
    }
173
1.07k
      }
174
11.3k
  }
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
11.3k
      result = elf->state.ELFW(elf,LIBELFBITS).phdr;
230
11.3k
    }
231
232
11.4k
 out:
233
11.4k
  return result;
234
11.4k
}
235
236
ElfW2(LIBELFBITS,Phdr) *
237
elfw2(LIBELFBITS,getphdr) (Elf *elf)
238
24.1k
{
239
24.1k
  ElfW2(LIBELFBITS,Phdr) *result;
240
241
24.1k
  if (elf == NULL)
242
0
    return NULL;
243
244
24.1k
  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
24.1k
  result = elf->state.ELFW(elf,LIBELFBITS).phdr;
254
24.1k
  if (likely (result != NULL))
255
0
    return result;
256
257
24.1k
  rwlock_wrlock (elf->lock);
258
24.1k
  result = __elfw2(LIBELFBITS,getphdr_wrlock) (elf);
259
24.1k
  rwlock_unlock (elf->lock);
260
261
24.1k
  return result;
262
24.1k
}
elf32_getphdr
Line
Count
Source
238
12.7k
{
239
12.7k
  ElfW2(LIBELFBITS,Phdr) *result;
240
241
12.7k
  if (elf == NULL)
242
0
    return NULL;
243
244
12.7k
  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.7k
  result = elf->state.ELFW(elf,LIBELFBITS).phdr;
254
12.7k
  if (likely (result != NULL))
255
0
    return result;
256
257
12.7k
  rwlock_wrlock (elf->lock);
258
12.7k
  result = __elfw2(LIBELFBITS,getphdr_wrlock) (elf);
259
12.7k
  rwlock_unlock (elf->lock);
260
261
12.7k
  return result;
262
12.7k
}
elf64_getphdr
Line
Count
Source
238
11.4k
{
239
11.4k
  ElfW2(LIBELFBITS,Phdr) *result;
240
241
11.4k
  if (elf == NULL)
242
0
    return NULL;
243
244
11.4k
  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
11.4k
  result = elf->state.ELFW(elf,LIBELFBITS).phdr;
254
11.4k
  if (likely (result != NULL))
255
0
    return result;
256
257
11.4k
  rwlock_wrlock (elf->lock);
258
11.4k
  result = __elfw2(LIBELFBITS,getphdr_wrlock) (elf);
259
11.4k
  rwlock_unlock (elf->lock);
260
261
11.4k
  return result;
262
11.4k
}
263
INTDEF(elfw2(LIBELFBITS,getphdr))