Coverage Report

Created: 2025-08-24 06:28

/src/elfutils/libelf/elf32_getshdr.c
Line
Count
Source (jump to first uncovered line)
1
/* Return section header.
2
   Copyright (C) 1998-2002, 2005, 2007, 2009, 2012, 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 <assert.h>
35
#include <errno.h>
36
#include <stdbool.h>
37
38
#include "libelfP.h"
39
#include "common.h"
40
41
#ifndef LIBELFBITS
42
# define LIBELFBITS 32
43
#endif
44
45
46
static ElfW2(LIBELFBITS,Shdr) *
47
load_shdr_wrlock (Elf_Scn *scn)
48
5
{
49
5
  ElfW2(LIBELFBITS,Shdr) *result;
50
51
  /* Read the section header table.  */
52
5
  Elf *elf = scn->elf;
53
5
  ElfW2(LIBELFBITS,Ehdr) *ehdr = elf->state.ELFW(elf,LIBELFBITS).ehdr;
54
55
  /* Try again, maybe the data is there now.  */
56
5
  result = scn->shdr.ELFW(e,LIBELFBITS);
57
5
  if (result != NULL)
58
0
    goto out;
59
60
5
  size_t shnum;
61
5
  if (__elf_getshdrnum_rdlock (elf, &shnum) != 0
62
5
      || shnum > SIZE_MAX / sizeof (ElfW2(LIBELFBITS,Shdr)))
63
0
    goto out;
64
5
  size_t size = shnum * sizeof (ElfW2(LIBELFBITS,Shdr));
65
66
  /* Allocate memory for the section headers.  We know the number
67
     of entries from the ELF header.  */
68
5
  ElfW2(LIBELFBITS,Shdr) *shdr = elf->state.ELFW(elf,LIBELFBITS).shdr =
69
5
    (ElfW2(LIBELFBITS,Shdr) *) malloc (size);
70
5
  if (elf->state.ELFW(elf,LIBELFBITS).shdr == NULL)
71
0
    {
72
0
      __libelf_seterrno (ELF_E_NOMEM);
73
0
      goto out;
74
0
    }
75
5
  elf->state.ELFW(elf,LIBELFBITS).shdr_malloced = 1;
76
77
5
  if (elf->map_address != NULL)
78
5
    {
79
      /* First see whether the information in the ELF header is
80
   valid and it does not ask for too much.  */
81
5
      if (unlikely (ehdr->e_shoff >= elf->maximum_size)
82
5
    || unlikely (elf->maximum_size - ehdr->e_shoff < size))
83
0
  {
84
    /* Something is wrong.  */
85
0
    __libelf_seterrno (ELF_E_INVALID_SECTION_HEADER);
86
0
    goto free_and_out;
87
0
  }
88
89
5
      ElfW2(LIBELFBITS,Shdr) *notcvt;
90
91
      /* All the data is already mapped.  If we could use it
92
   directly this would already have happened.  Unless
93
   we allocated the memory ourselves and the ELF_F_MALLOCED
94
   flag is set.  */
95
5
      void *file_shdr = ((char *) elf->map_address
96
5
       + elf->start_offset + ehdr->e_shoff);
97
98
5
      assert ((elf->flags & ELF_F_MALLOCED)
99
5
        || ehdr->e_ident[EI_DATA] != MY_ELFDATA
100
5
        || elf->cmd == ELF_C_READ_MMAP
101
5
        || (! ALLOW_UNALIGNED
102
5
      && ((uintptr_t) file_shdr
103
5
          & (__alignof__ (ElfW2(LIBELFBITS,Shdr)) - 1)) != 0));
104
105
      /* Now copy the data and at the same time convert the byte order.  */
106
5
      if (ehdr->e_ident[EI_DATA] == MY_ELFDATA)
107
0
  {
108
0
    assert ((elf->flags & ELF_F_MALLOCED)
109
0
      || elf->cmd == ELF_C_READ_MMAP
110
0
      || ! ALLOW_UNALIGNED);
111
0
    memcpy (shdr, file_shdr, size);
112
0
  }
113
5
      else
114
5
  {
115
5
    bool copy = ! (ALLOW_UNALIGNED
116
5
       || ((uintptr_t) file_shdr
117
0
           & (__alignof__ (ElfW2(LIBELFBITS,Shdr)) - 1))
118
0
           == 0);
119
5
    if (! copy)
120
5
      notcvt = (ElfW2(LIBELFBITS,Shdr) *)
121
5
        ((char *) elf->map_address
122
5
         + elf->start_offset + ehdr->e_shoff);
123
0
    else
124
0
      {
125
0
        notcvt = (ElfW2(LIBELFBITS,Shdr) *) malloc (size);
126
0
        if (unlikely (notcvt == NULL))
127
0
    {
128
0
      __libelf_seterrno (ELF_E_NOMEM);
129
0
      goto free_and_out;
130
0
    }
131
0
        memcpy (notcvt, ((char *) elf->map_address
132
0
             + elf->start_offset + ehdr->e_shoff),
133
0
          size);
134
0
      }
135
136
2.23k
    for (size_t cnt = 0; cnt < shnum; ++cnt)
137
2.23k
      {
138
2.23k
        CONVERT_TO (shdr[cnt].sh_name, notcvt[cnt].sh_name);
139
2.23k
        CONVERT_TO (shdr[cnt].sh_type, notcvt[cnt].sh_type);
140
2.23k
        CONVERT_TO (shdr[cnt].sh_flags, notcvt[cnt].sh_flags);
141
2.23k
        CONVERT_TO (shdr[cnt].sh_addr, notcvt[cnt].sh_addr);
142
2.23k
        CONVERT_TO (shdr[cnt].sh_offset, notcvt[cnt].sh_offset);
143
2.23k
        CONVERT_TO (shdr[cnt].sh_size, notcvt[cnt].sh_size);
144
2.23k
        CONVERT_TO (shdr[cnt].sh_link, notcvt[cnt].sh_link);
145
2.23k
        CONVERT_TO (shdr[cnt].sh_info, notcvt[cnt].sh_info);
146
2.23k
        CONVERT_TO (shdr[cnt].sh_addralign,
147
2.23k
        notcvt[cnt].sh_addralign);
148
2.23k
        CONVERT_TO (shdr[cnt].sh_entsize, notcvt[cnt].sh_entsize);
149
2.23k
      }
150
151
5
    if (copy)
152
0
      free (notcvt);
153
5
  }
154
5
    }
155
0
  else if (likely (elf->fildes != -1))
156
0
    {
157
      /* Read the header.  */
158
0
      ssize_t n = pread_retry (elf->fildes,
159
0
             elf->state.ELFW(elf,LIBELFBITS).shdr, size,
160
0
             elf->start_offset + ehdr->e_shoff);
161
0
      if (unlikely ((size_t) n != size))
162
0
  {
163
    /* Severe problems.  We cannot read the data.  */
164
0
    __libelf_seterrno (ELF_E_READ_ERROR);
165
0
    goto free_and_out;
166
0
  }
167
168
      /* If the byte order of the file is not the same as the one
169
   of the host convert the data now.  */
170
0
      if (ehdr->e_ident[EI_DATA] != MY_ELFDATA)
171
0
  for (size_t cnt = 0; cnt < shnum; ++cnt)
172
0
    {
173
0
      CONVERT (shdr[cnt].sh_name);
174
0
      CONVERT (shdr[cnt].sh_type);
175
0
      CONVERT (shdr[cnt].sh_flags);
176
0
      CONVERT (shdr[cnt].sh_addr);
177
0
      CONVERT (shdr[cnt].sh_offset);
178
0
      CONVERT (shdr[cnt].sh_size);
179
0
      CONVERT (shdr[cnt].sh_link);
180
0
      CONVERT (shdr[cnt].sh_info);
181
0
      CONVERT (shdr[cnt].sh_addralign);
182
0
      CONVERT (shdr[cnt].sh_entsize);
183
0
    }
184
0
    }
185
0
  else
186
0
    {
187
      /* The file descriptor was already enabled and not all data was
188
   read.  Undo the allocation.  */
189
0
      __libelf_seterrno (ELF_E_FD_DISABLED);
190
191
0
    free_and_out:
192
0
      free (shdr);
193
0
      elf->state.ELFW(elf,LIBELFBITS).shdr = NULL;
194
0
      elf->state.ELFW(elf,LIBELFBITS).shdr_malloced = 0;
195
196
0
      goto out;
197
0
    }
198
199
  /* Set the pointers in the `scn's.  */
200
2.23k
  for (size_t cnt = 0; cnt < shnum; ++cnt)
201
2.23k
    elf->state.ELFW(elf,LIBELFBITS).scns.data[cnt].shdr.ELFW(e,LIBELFBITS)
202
2.23k
      = &elf->state.ELFW(elf,LIBELFBITS).shdr[cnt];
203
204
5
  result = scn->shdr.ELFW(e,LIBELFBITS);
205
5
  assert (result != NULL);
206
207
5
out:
208
5
  return result;
209
5
}
elf32_getshdr.c:load_shdr_wrlock
Line
Count
Source
48
1
{
49
1
  ElfW2(LIBELFBITS,Shdr) *result;
50
51
  /* Read the section header table.  */
52
1
  Elf *elf = scn->elf;
53
1
  ElfW2(LIBELFBITS,Ehdr) *ehdr = elf->state.ELFW(elf,LIBELFBITS).ehdr;
54
55
  /* Try again, maybe the data is there now.  */
56
1
  result = scn->shdr.ELFW(e,LIBELFBITS);
57
1
  if (result != NULL)
58
0
    goto out;
59
60
1
  size_t shnum;
61
1
  if (__elf_getshdrnum_rdlock (elf, &shnum) != 0
62
1
      || shnum > SIZE_MAX / sizeof (ElfW2(LIBELFBITS,Shdr)))
63
0
    goto out;
64
1
  size_t size = shnum * sizeof (ElfW2(LIBELFBITS,Shdr));
65
66
  /* Allocate memory for the section headers.  We know the number
67
     of entries from the ELF header.  */
68
1
  ElfW2(LIBELFBITS,Shdr) *shdr = elf->state.ELFW(elf,LIBELFBITS).shdr =
69
1
    (ElfW2(LIBELFBITS,Shdr) *) malloc (size);
70
1
  if (elf->state.ELFW(elf,LIBELFBITS).shdr == NULL)
71
0
    {
72
0
      __libelf_seterrno (ELF_E_NOMEM);
73
0
      goto out;
74
0
    }
75
1
  elf->state.ELFW(elf,LIBELFBITS).shdr_malloced = 1;
76
77
1
  if (elf->map_address != NULL)
78
1
    {
79
      /* First see whether the information in the ELF header is
80
   valid and it does not ask for too much.  */
81
1
      if (unlikely (ehdr->e_shoff >= elf->maximum_size)
82
1
    || unlikely (elf->maximum_size - ehdr->e_shoff < size))
83
0
  {
84
    /* Something is wrong.  */
85
0
    __libelf_seterrno (ELF_E_INVALID_SECTION_HEADER);
86
0
    goto free_and_out;
87
0
  }
88
89
1
      ElfW2(LIBELFBITS,Shdr) *notcvt;
90
91
      /* All the data is already mapped.  If we could use it
92
   directly this would already have happened.  Unless
93
   we allocated the memory ourselves and the ELF_F_MALLOCED
94
   flag is set.  */
95
1
      void *file_shdr = ((char *) elf->map_address
96
1
       + elf->start_offset + ehdr->e_shoff);
97
98
1
      assert ((elf->flags & ELF_F_MALLOCED)
99
1
        || ehdr->e_ident[EI_DATA] != MY_ELFDATA
100
1
        || elf->cmd == ELF_C_READ_MMAP
101
1
        || (! ALLOW_UNALIGNED
102
1
      && ((uintptr_t) file_shdr
103
1
          & (__alignof__ (ElfW2(LIBELFBITS,Shdr)) - 1)) != 0));
104
105
      /* Now copy the data and at the same time convert the byte order.  */
106
1
      if (ehdr->e_ident[EI_DATA] == MY_ELFDATA)
107
0
  {
108
0
    assert ((elf->flags & ELF_F_MALLOCED)
109
0
      || elf->cmd == ELF_C_READ_MMAP
110
0
      || ! ALLOW_UNALIGNED);
111
0
    memcpy (shdr, file_shdr, size);
112
0
  }
113
1
      else
114
1
  {
115
1
    bool copy = ! (ALLOW_UNALIGNED
116
1
       || ((uintptr_t) file_shdr
117
0
           & (__alignof__ (ElfW2(LIBELFBITS,Shdr)) - 1))
118
0
           == 0);
119
1
    if (! copy)
120
1
      notcvt = (ElfW2(LIBELFBITS,Shdr) *)
121
1
        ((char *) elf->map_address
122
1
         + elf->start_offset + ehdr->e_shoff);
123
0
    else
124
0
      {
125
0
        notcvt = (ElfW2(LIBELFBITS,Shdr) *) malloc (size);
126
0
        if (unlikely (notcvt == NULL))
127
0
    {
128
0
      __libelf_seterrno (ELF_E_NOMEM);
129
0
      goto free_and_out;
130
0
    }
131
0
        memcpy (notcvt, ((char *) elf->map_address
132
0
             + elf->start_offset + ehdr->e_shoff),
133
0
          size);
134
0
      }
135
136
1.53k
    for (size_t cnt = 0; cnt < shnum; ++cnt)
137
1.53k
      {
138
1.53k
        CONVERT_TO (shdr[cnt].sh_name, notcvt[cnt].sh_name);
139
1.53k
        CONVERT_TO (shdr[cnt].sh_type, notcvt[cnt].sh_type);
140
1.53k
        CONVERT_TO (shdr[cnt].sh_flags, notcvt[cnt].sh_flags);
141
1.53k
        CONVERT_TO (shdr[cnt].sh_addr, notcvt[cnt].sh_addr);
142
1.53k
        CONVERT_TO (shdr[cnt].sh_offset, notcvt[cnt].sh_offset);
143
1.53k
        CONVERT_TO (shdr[cnt].sh_size, notcvt[cnt].sh_size);
144
1.53k
        CONVERT_TO (shdr[cnt].sh_link, notcvt[cnt].sh_link);
145
1.53k
        CONVERT_TO (shdr[cnt].sh_info, notcvt[cnt].sh_info);
146
1.53k
        CONVERT_TO (shdr[cnt].sh_addralign,
147
1.53k
        notcvt[cnt].sh_addralign);
148
1.53k
        CONVERT_TO (shdr[cnt].sh_entsize, notcvt[cnt].sh_entsize);
149
1.53k
      }
150
151
1
    if (copy)
152
0
      free (notcvt);
153
1
  }
154
1
    }
155
0
  else if (likely (elf->fildes != -1))
156
0
    {
157
      /* Read the header.  */
158
0
      ssize_t n = pread_retry (elf->fildes,
159
0
             elf->state.ELFW(elf,LIBELFBITS).shdr, size,
160
0
             elf->start_offset + ehdr->e_shoff);
161
0
      if (unlikely ((size_t) n != size))
162
0
  {
163
    /* Severe problems.  We cannot read the data.  */
164
0
    __libelf_seterrno (ELF_E_READ_ERROR);
165
0
    goto free_and_out;
166
0
  }
167
168
      /* If the byte order of the file is not the same as the one
169
   of the host convert the data now.  */
170
0
      if (ehdr->e_ident[EI_DATA] != MY_ELFDATA)
171
0
  for (size_t cnt = 0; cnt < shnum; ++cnt)
172
0
    {
173
0
      CONVERT (shdr[cnt].sh_name);
174
0
      CONVERT (shdr[cnt].sh_type);
175
0
      CONVERT (shdr[cnt].sh_flags);
176
0
      CONVERT (shdr[cnt].sh_addr);
177
0
      CONVERT (shdr[cnt].sh_offset);
178
0
      CONVERT (shdr[cnt].sh_size);
179
0
      CONVERT (shdr[cnt].sh_link);
180
0
      CONVERT (shdr[cnt].sh_info);
181
0
      CONVERT (shdr[cnt].sh_addralign);
182
0
      CONVERT (shdr[cnt].sh_entsize);
183
0
    }
184
0
    }
185
0
  else
186
0
    {
187
      /* The file descriptor was already enabled and not all data was
188
   read.  Undo the allocation.  */
189
0
      __libelf_seterrno (ELF_E_FD_DISABLED);
190
191
0
    free_and_out:
192
0
      free (shdr);
193
0
      elf->state.ELFW(elf,LIBELFBITS).shdr = NULL;
194
0
      elf->state.ELFW(elf,LIBELFBITS).shdr_malloced = 0;
195
196
0
      goto out;
197
0
    }
198
199
  /* Set the pointers in the `scn's.  */
200
1.53k
  for (size_t cnt = 0; cnt < shnum; ++cnt)
201
1.53k
    elf->state.ELFW(elf,LIBELFBITS).scns.data[cnt].shdr.ELFW(e,LIBELFBITS)
202
1.53k
      = &elf->state.ELFW(elf,LIBELFBITS).shdr[cnt];
203
204
1
  result = scn->shdr.ELFW(e,LIBELFBITS);
205
1
  assert (result != NULL);
206
207
1
out:
208
1
  return result;
209
1
}
elf64_getshdr.c:load_shdr_wrlock
Line
Count
Source
48
4
{
49
4
  ElfW2(LIBELFBITS,Shdr) *result;
50
51
  /* Read the section header table.  */
52
4
  Elf *elf = scn->elf;
53
4
  ElfW2(LIBELFBITS,Ehdr) *ehdr = elf->state.ELFW(elf,LIBELFBITS).ehdr;
54
55
  /* Try again, maybe the data is there now.  */
56
4
  result = scn->shdr.ELFW(e,LIBELFBITS);
57
4
  if (result != NULL)
58
0
    goto out;
59
60
4
  size_t shnum;
61
4
  if (__elf_getshdrnum_rdlock (elf, &shnum) != 0
62
4
      || shnum > SIZE_MAX / sizeof (ElfW2(LIBELFBITS,Shdr)))
63
0
    goto out;
64
4
  size_t size = shnum * sizeof (ElfW2(LIBELFBITS,Shdr));
65
66
  /* Allocate memory for the section headers.  We know the number
67
     of entries from the ELF header.  */
68
4
  ElfW2(LIBELFBITS,Shdr) *shdr = elf->state.ELFW(elf,LIBELFBITS).shdr =
69
4
    (ElfW2(LIBELFBITS,Shdr) *) malloc (size);
70
4
  if (elf->state.ELFW(elf,LIBELFBITS).shdr == NULL)
71
0
    {
72
0
      __libelf_seterrno (ELF_E_NOMEM);
73
0
      goto out;
74
0
    }
75
4
  elf->state.ELFW(elf,LIBELFBITS).shdr_malloced = 1;
76
77
4
  if (elf->map_address != NULL)
78
4
    {
79
      /* First see whether the information in the ELF header is
80
   valid and it does not ask for too much.  */
81
4
      if (unlikely (ehdr->e_shoff >= elf->maximum_size)
82
4
    || unlikely (elf->maximum_size - ehdr->e_shoff < size))
83
0
  {
84
    /* Something is wrong.  */
85
0
    __libelf_seterrno (ELF_E_INVALID_SECTION_HEADER);
86
0
    goto free_and_out;
87
0
  }
88
89
4
      ElfW2(LIBELFBITS,Shdr) *notcvt;
90
91
      /* All the data is already mapped.  If we could use it
92
   directly this would already have happened.  Unless
93
   we allocated the memory ourselves and the ELF_F_MALLOCED
94
   flag is set.  */
95
4
      void *file_shdr = ((char *) elf->map_address
96
4
       + elf->start_offset + ehdr->e_shoff);
97
98
4
      assert ((elf->flags & ELF_F_MALLOCED)
99
4
        || ehdr->e_ident[EI_DATA] != MY_ELFDATA
100
4
        || elf->cmd == ELF_C_READ_MMAP
101
4
        || (! ALLOW_UNALIGNED
102
4
      && ((uintptr_t) file_shdr
103
4
          & (__alignof__ (ElfW2(LIBELFBITS,Shdr)) - 1)) != 0));
104
105
      /* Now copy the data and at the same time convert the byte order.  */
106
4
      if (ehdr->e_ident[EI_DATA] == MY_ELFDATA)
107
0
  {
108
0
    assert ((elf->flags & ELF_F_MALLOCED)
109
0
      || elf->cmd == ELF_C_READ_MMAP
110
0
      || ! ALLOW_UNALIGNED);
111
0
    memcpy (shdr, file_shdr, size);
112
0
  }
113
4
      else
114
4
  {
115
4
    bool copy = ! (ALLOW_UNALIGNED
116
4
       || ((uintptr_t) file_shdr
117
0
           & (__alignof__ (ElfW2(LIBELFBITS,Shdr)) - 1))
118
0
           == 0);
119
4
    if (! copy)
120
4
      notcvt = (ElfW2(LIBELFBITS,Shdr) *)
121
4
        ((char *) elf->map_address
122
4
         + elf->start_offset + ehdr->e_shoff);
123
0
    else
124
0
      {
125
0
        notcvt = (ElfW2(LIBELFBITS,Shdr) *) malloc (size);
126
0
        if (unlikely (notcvt == NULL))
127
0
    {
128
0
      __libelf_seterrno (ELF_E_NOMEM);
129
0
      goto free_and_out;
130
0
    }
131
0
        memcpy (notcvt, ((char *) elf->map_address
132
0
             + elf->start_offset + ehdr->e_shoff),
133
0
          size);
134
0
      }
135
136
702
    for (size_t cnt = 0; cnt < shnum; ++cnt)
137
698
      {
138
698
        CONVERT_TO (shdr[cnt].sh_name, notcvt[cnt].sh_name);
139
698
        CONVERT_TO (shdr[cnt].sh_type, notcvt[cnt].sh_type);
140
698
        CONVERT_TO (shdr[cnt].sh_flags, notcvt[cnt].sh_flags);
141
698
        CONVERT_TO (shdr[cnt].sh_addr, notcvt[cnt].sh_addr);
142
698
        CONVERT_TO (shdr[cnt].sh_offset, notcvt[cnt].sh_offset);
143
698
        CONVERT_TO (shdr[cnt].sh_size, notcvt[cnt].sh_size);
144
698
        CONVERT_TO (shdr[cnt].sh_link, notcvt[cnt].sh_link);
145
698
        CONVERT_TO (shdr[cnt].sh_info, notcvt[cnt].sh_info);
146
698
        CONVERT_TO (shdr[cnt].sh_addralign,
147
698
        notcvt[cnt].sh_addralign);
148
698
        CONVERT_TO (shdr[cnt].sh_entsize, notcvt[cnt].sh_entsize);
149
698
      }
150
151
4
    if (copy)
152
0
      free (notcvt);
153
4
  }
154
4
    }
155
0
  else if (likely (elf->fildes != -1))
156
0
    {
157
      /* Read the header.  */
158
0
      ssize_t n = pread_retry (elf->fildes,
159
0
             elf->state.ELFW(elf,LIBELFBITS).shdr, size,
160
0
             elf->start_offset + ehdr->e_shoff);
161
0
      if (unlikely ((size_t) n != size))
162
0
  {
163
    /* Severe problems.  We cannot read the data.  */
164
0
    __libelf_seterrno (ELF_E_READ_ERROR);
165
0
    goto free_and_out;
166
0
  }
167
168
      /* If the byte order of the file is not the same as the one
169
   of the host convert the data now.  */
170
0
      if (ehdr->e_ident[EI_DATA] != MY_ELFDATA)
171
0
  for (size_t cnt = 0; cnt < shnum; ++cnt)
172
0
    {
173
0
      CONVERT (shdr[cnt].sh_name);
174
0
      CONVERT (shdr[cnt].sh_type);
175
0
      CONVERT (shdr[cnt].sh_flags);
176
0
      CONVERT (shdr[cnt].sh_addr);
177
0
      CONVERT (shdr[cnt].sh_offset);
178
0
      CONVERT (shdr[cnt].sh_size);
179
0
      CONVERT (shdr[cnt].sh_link);
180
0
      CONVERT (shdr[cnt].sh_info);
181
0
      CONVERT (shdr[cnt].sh_addralign);
182
0
      CONVERT (shdr[cnt].sh_entsize);
183
0
    }
184
0
    }
185
0
  else
186
0
    {
187
      /* The file descriptor was already enabled and not all data was
188
   read.  Undo the allocation.  */
189
0
      __libelf_seterrno (ELF_E_FD_DISABLED);
190
191
0
    free_and_out:
192
0
      free (shdr);
193
0
      elf->state.ELFW(elf,LIBELFBITS).shdr = NULL;
194
0
      elf->state.ELFW(elf,LIBELFBITS).shdr_malloced = 0;
195
196
0
      goto out;
197
0
    }
198
199
  /* Set the pointers in the `scn's.  */
200
702
  for (size_t cnt = 0; cnt < shnum; ++cnt)
201
698
    elf->state.ELFW(elf,LIBELFBITS).scns.data[cnt].shdr.ELFW(e,LIBELFBITS)
202
698
      = &elf->state.ELFW(elf,LIBELFBITS).shdr[cnt];
203
204
4
  result = scn->shdr.ELFW(e,LIBELFBITS);
205
4
  assert (result != NULL);
206
207
4
out:
208
4
  return result;
209
4
}
210
211
static bool
212
scn_valid (Elf_Scn *scn)
213
5
{
214
5
  if (scn == NULL)
215
0
    return false;
216
217
5
  if (unlikely (scn->elf->state.elf.ehdr == NULL))
218
0
    {
219
0
      __libelf_seterrno (ELF_E_WRONG_ORDER_EHDR);
220
0
      return false;
221
0
    }
222
223
5
  if (unlikely (scn->elf->class != ELFW(ELFCLASS,LIBELFBITS)))
224
0
    {
225
0
      __libelf_seterrno (ELF_E_INVALID_CLASS);
226
0
      return false;
227
0
    }
228
229
5
  return true;
230
5
}
elf32_getshdr.c:scn_valid
Line
Count
Source
213
1
{
214
1
  if (scn == NULL)
215
0
    return false;
216
217
1
  if (unlikely (scn->elf->state.elf.ehdr == NULL))
218
0
    {
219
0
      __libelf_seterrno (ELF_E_WRONG_ORDER_EHDR);
220
0
      return false;
221
0
    }
222
223
1
  if (unlikely (scn->elf->class != ELFW(ELFCLASS,LIBELFBITS)))
224
0
    {
225
0
      __libelf_seterrno (ELF_E_INVALID_CLASS);
226
0
      return false;
227
0
    }
228
229
1
  return true;
230
1
}
elf64_getshdr.c:scn_valid
Line
Count
Source
213
4
{
214
4
  if (scn == NULL)
215
0
    return false;
216
217
4
  if (unlikely (scn->elf->state.elf.ehdr == NULL))
218
0
    {
219
0
      __libelf_seterrno (ELF_E_WRONG_ORDER_EHDR);
220
0
      return false;
221
0
    }
222
223
4
  if (unlikely (scn->elf->class != ELFW(ELFCLASS,LIBELFBITS)))
224
0
    {
225
0
      __libelf_seterrno (ELF_E_INVALID_CLASS);
226
0
      return false;
227
0
    }
228
229
4
  return true;
230
4
}
231
232
ElfW2(LIBELFBITS,Shdr) *
233
internal_function
234
__elfw2(LIBELFBITS,getshdr_rdlock) (Elf_Scn *scn)
235
5
{
236
5
  ElfW2(LIBELFBITS,Shdr) *result;
237
238
5
  if (!scn_valid (scn))
239
0
    return NULL;
240
241
5
  result = scn->shdr.ELFW(e,LIBELFBITS);
242
5
  if (result == NULL)
243
5
    {
244
5
      rwlock_unlock (scn->elf->lock);
245
5
      rwlock_wrlock (scn->elf->lock);
246
5
      result = scn->shdr.ELFW(e,LIBELFBITS);
247
5
      if (result == NULL)
248
5
  result = load_shdr_wrlock (scn);
249
5
    }
250
251
5
  return result;
252
5
}
__elf32_getshdr_rdlock
Line
Count
Source
235
1
{
236
1
  ElfW2(LIBELFBITS,Shdr) *result;
237
238
1
  if (!scn_valid (scn))
239
0
    return NULL;
240
241
1
  result = scn->shdr.ELFW(e,LIBELFBITS);
242
1
  if (result == NULL)
243
1
    {
244
1
      rwlock_unlock (scn->elf->lock);
245
1
      rwlock_wrlock (scn->elf->lock);
246
1
      result = scn->shdr.ELFW(e,LIBELFBITS);
247
1
      if (result == NULL)
248
1
  result = load_shdr_wrlock (scn);
249
1
    }
250
251
1
  return result;
252
1
}
__elf64_getshdr_rdlock
Line
Count
Source
235
4
{
236
4
  ElfW2(LIBELFBITS,Shdr) *result;
237
238
4
  if (!scn_valid (scn))
239
0
    return NULL;
240
241
4
  result = scn->shdr.ELFW(e,LIBELFBITS);
242
4
  if (result == NULL)
243
4
    {
244
4
      rwlock_unlock (scn->elf->lock);
245
4
      rwlock_wrlock (scn->elf->lock);
246
4
      result = scn->shdr.ELFW(e,LIBELFBITS);
247
4
      if (result == NULL)
248
4
  result = load_shdr_wrlock (scn);
249
4
    }
250
251
4
  return result;
252
4
}
253
254
ElfW2(LIBELFBITS,Shdr) *
255
internal_function
256
__elfw2(LIBELFBITS,getshdr_wrlock) (Elf_Scn *scn)
257
0
{
258
0
  ElfW2(LIBELFBITS,Shdr) *result;
259
260
0
  if (!scn_valid (scn))
261
0
    return NULL;
262
263
0
  result = scn->shdr.ELFW(e,LIBELFBITS);
264
0
  if (result == NULL)
265
0
    result = load_shdr_wrlock (scn);
266
267
0
  return result;
268
0
}
Unexecuted instantiation: __elf32_getshdr_wrlock
Unexecuted instantiation: __elf64_getshdr_wrlock
269
270
ElfW2(LIBELFBITS,Shdr) *
271
elfw2(LIBELFBITS,getshdr) (Elf_Scn *scn)
272
0
{
273
0
  ElfW2(LIBELFBITS,Shdr) *result;
274
275
0
  if (!scn_valid (scn))
276
0
    return NULL;
277
278
0
  rwlock_rdlock (scn->elf->lock);
279
0
  result = __elfw2(LIBELFBITS,getshdr_rdlock) (scn);
280
0
  rwlock_unlock (scn->elf->lock);
281
282
0
  return result;
283
0
}
Unexecuted instantiation: elf32_getshdr
Unexecuted instantiation: elf64_getshdr