Coverage Report

Created: 2026-09-03 06:53

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