Coverage Report

Created: 2025-10-10 07:01

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