Coverage Report

Created: 2026-10-22 06:39

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/elfutils/libelf/elf_begin.c
Line
Count
Source
1
/* Create descriptor for processing file.
2
   Copyright (C) 1998-2010, 2012, 2014, 2015, 2016 Red Hat, Inc.
3
   Copyright (C) 2021, 2022 Mark J. Wielaard <mark@klomp.org>
4
   This file is part of elfutils.
5
   Written by Ulrich Drepper <drepper@redhat.com>, 1998.
6
7
   This file is free software; you can redistribute it and/or modify
8
   it under the terms of either
9
10
     * the GNU Lesser General Public License as published by the Free
11
       Software Foundation; either version 3 of the License, or (at
12
       your option) any later version
13
14
   or
15
16
     * the GNU General Public License as published by the Free
17
       Software Foundation; either version 2 of the License, or (at
18
       your option) any later version
19
20
   or both in parallel, as here.
21
22
   elfutils is distributed in the hope that it will be useful, but
23
   WITHOUT ANY WARRANTY; without even the implied warranty of
24
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25
   General Public License for more details.
26
27
   You should have received copies of the GNU General Public License and
28
   the GNU Lesser General Public License along with this program.  If
29
   not, see <http://www.gnu.org/licenses/>.  */
30
31
#ifdef HAVE_CONFIG_H
32
# include <config.h>
33
#endif
34
35
#include <assert.h>
36
#include <ctype.h>
37
#include <errno.h>
38
#include <fcntl.h>
39
#include <stdbool.h>
40
#include <stddef.h>
41
#include <string.h>
42
#include <sys/stat.h>
43
44
#include "libelfP.h"
45
#include "common.h"
46
47
48
/* Create descriptor for archive in memory.  */
49
static inline Elf *
50
file_read_ar (int fildes, void *map_address, off_t offset, size_t maxsize,
51
        Elf_Cmd cmd, Elf *parent)
52
191k
{
53
191k
  Elf *elf;
54
55
  /* Create a descriptor.  */
56
191k
  elf = allocate_elf (fildes, map_address, offset, maxsize, cmd, parent,
57
191k
                      ELF_K_AR, 0);
58
191k
  if (elf != NULL)
59
191k
    {
60
      /* We don't read all the symbol tables in advance.  All this will
61
   happen on demand.  */
62
191k
      elf->state.ar.offset = offset + SARMAG;
63
64
191k
      elf->state.ar.elf_ar_hdr.ar_rawname = elf->state.ar.raw_name;
65
191k
    }
66
67
191k
  return elf;
68
191k
}
69
70
71
static size_t
72
get_shnum (void *map_address, unsigned char *e_ident, int fildes,
73
     int64_t offset, size_t maxsize)
74
78.2k
{
75
78.2k
  size_t result;
76
78.2k
  union
77
78.2k
  {
78
78.2k
    Elf32_Ehdr *e32;
79
78.2k
    Elf64_Ehdr *e64;
80
78.2k
    void *p;
81
78.2k
  } ehdr;
82
78.2k
  union
83
78.2k
  {
84
78.2k
    Elf32_Ehdr e32;
85
78.2k
    Elf64_Ehdr e64;
86
78.2k
  } ehdr_mem;
87
78.2k
  bool is32 = e_ident[EI_CLASS] == ELFCLASS32;
88
89
78.2k
  if ((is32 && maxsize < sizeof (Elf32_Ehdr))
90
78.1k
      || (!is32 && maxsize < sizeof (Elf64_Ehdr)))
91
158
    {
92
158
       __libelf_seterrno (ELF_E_INVALID_ELF);
93
158
      return (size_t) -1l;
94
158
    }
95
96
  /* Make the ELF header available.  */
97
78.0k
  if (e_ident[EI_DATA] == MY_ELFDATA
98
43.9k
      && (ALLOW_UNALIGNED
99
0
    || (((size_t) e_ident
100
0
         & ((is32 ? __alignof__ (Elf32_Ehdr) : __alignof__ (Elf64_Ehdr))
101
0
      - 1)) == 0)))
102
43.9k
    ehdr.p = e_ident;
103
34.1k
  else
104
34.1k
    {
105
      /* We already read the ELF header.  We have to copy the header
106
   since we possibly modify the data here and the caller
107
   expects the memory it passes in to be preserved.  */
108
34.1k
      ehdr.p = &ehdr_mem;
109
110
34.1k
      if (is32)
111
28.4k
  {
112
28.4k
    if (ALLOW_UNALIGNED)
113
28.4k
      {
114
28.4k
        ehdr_mem.e32.e_shnum = ((Elf32_Ehdr *) e_ident)->e_shnum;
115
28.4k
        ehdr_mem.e32.e_shoff = ((Elf32_Ehdr *) e_ident)->e_shoff;
116
28.4k
      }
117
0
    else
118
0
      memcpy (&ehdr_mem, e_ident, sizeof (Elf32_Ehdr));
119
120
28.4k
    if (e_ident[EI_DATA] != MY_ELFDATA)
121
28.4k
      {
122
28.4k
        CONVERT (ehdr_mem.e32.e_shnum);
123
28.4k
        CONVERT (ehdr_mem.e32.e_shoff);
124
28.4k
      }
125
28.4k
  }
126
5.72k
      else
127
5.72k
  {
128
5.72k
    if (ALLOW_UNALIGNED)
129
5.72k
      {
130
5.72k
        ehdr_mem.e64.e_shnum = ((Elf64_Ehdr *) e_ident)->e_shnum;
131
5.72k
        ehdr_mem.e64.e_shoff = ((Elf64_Ehdr *) e_ident)->e_shoff;
132
5.72k
      }
133
0
    else
134
0
      memcpy (&ehdr_mem, e_ident, sizeof (Elf64_Ehdr));
135
136
5.72k
    if (e_ident[EI_DATA] != MY_ELFDATA)
137
5.72k
      {
138
5.72k
        CONVERT (ehdr_mem.e64.e_shnum);
139
5.72k
        CONVERT (ehdr_mem.e64.e_shoff);
140
5.72k
      }
141
5.72k
  }
142
34.1k
    }
143
144
78.0k
  if (is32)
145
54.1k
    {
146
      /* Get the number of sections from the ELF header.  */
147
54.1k
      result = ehdr.e32->e_shnum;
148
149
54.1k
      if (unlikely (result == 0) && ehdr.e32->e_shoff != 0)
150
11.2k
  {
151
11.2k
    if (unlikely (ehdr.e32->e_shoff >= maxsize)
152
5.71k
        || unlikely (maxsize - ehdr.e32->e_shoff < sizeof (Elf32_Shdr)))
153
      /* Cannot read the first section header.  */
154
7.13k
      return 0;
155
156
4.16k
    if (likely (map_address != NULL) && e_ident[EI_DATA] == MY_ELFDATA
157
0
        && (ALLOW_UNALIGNED
158
0
      || (((size_t) ((char *) (map_address + ehdr.e32->e_shoff
159
0
             + offset)))
160
0
          & (__alignof__ (Elf32_Shdr) - 1)) == 0))
161
      /* We can directly access the memory.  */
162
1.58k
      result = ((Elf32_Shdr *) ((char *) map_address + ehdr.e32->e_shoff
163
1.58k
              + offset))->sh_size;
164
2.57k
    else
165
2.57k
      {
166
2.57k
        Elf32_Word size;
167
2.57k
        ssize_t r;
168
169
2.57k
        if (likely (map_address != NULL))
170
    /* gcc will optimize the memcpy to a simple memory
171
       access while taking care of alignment issues.  */
172
2.00k
    memcpy (&size, ((char *) map_address
173
2.00k
           + ehdr.e32->e_shoff
174
2.00k
           + offset
175
2.00k
           + offsetof (Elf32_Shdr, sh_size)),
176
2.00k
      sizeof (Elf32_Word));
177
576
        else
178
576
    if (unlikely ((r = pread_retry (fildes, &size,
179
576
            sizeof (Elf32_Word),
180
576
            offset + ehdr.e32->e_shoff
181
576
            + offsetof (Elf32_Shdr,
182
576
                  sh_size)))
183
576
            != sizeof (Elf32_Word)))
184
0
      {
185
0
        if (r < 0)
186
0
          __libelf_seterrno (ELF_E_INVALID_FILE);
187
0
        else
188
0
          __libelf_seterrno (ELF_E_INVALID_ELF);
189
0
        return (size_t) -1l;
190
0
      }
191
192
2.57k
        if (e_ident[EI_DATA] != MY_ELFDATA)
193
2.06k
    CONVERT (size);
194
195
2.57k
        result = size;
196
2.57k
      }
197
4.16k
  }
198
199
      /* If the section headers were truncated, pretend none were there.  */
200
46.9k
      if (ehdr.e32->e_shoff > maxsize
201
38.5k
    || maxsize - ehdr.e32->e_shoff < sizeof (Elf32_Shdr) * result)
202
15.4k
  result = 0;
203
46.9k
    }
204
23.9k
  else
205
23.9k
    {
206
      /* Get the number of sections from the ELF header.  */
207
23.9k
      result = ehdr.e64->e_shnum;
208
209
23.9k
      if (unlikely (result == 0) && ehdr.e64->e_shoff != 0)
210
3.97k
  {
211
3.97k
    if (unlikely (ehdr.e64->e_shoff >= maxsize)
212
1.28k
        || unlikely (ehdr.e64->e_shoff + sizeof (Elf64_Shdr) > maxsize))
213
      /* Cannot read the first section header.  */
214
2.96k
      return 0;
215
216
1.01k
    Elf64_Xword size;
217
1.01k
    if (likely (map_address != NULL) && e_ident[EI_DATA] == MY_ELFDATA
218
0
        && (ALLOW_UNALIGNED
219
0
      || (((size_t) ((char *) (map_address + ehdr.e64->e_shoff
220
0
             + offset)))
221
0
          & (__alignof__ (Elf64_Shdr) - 1)) == 0))
222
      /* We can directly access the memory.  */
223
387
      size = ((Elf64_Shdr *) ((char *) map_address + ehdr.e64->e_shoff
224
387
            + offset))->sh_size;
225
623
    else
226
623
      {
227
623
        ssize_t r;
228
623
        if (likely (map_address != NULL))
229
    /* gcc will optimize the memcpy to a simple memory
230
       access while taking care of alignment issues.  */
231
296
    memcpy (&size, ((char *) map_address
232
296
           + ehdr.e64->e_shoff
233
296
           + offset
234
296
           + offsetof (Elf64_Shdr, sh_size)),
235
296
      sizeof (Elf64_Xword));
236
327
        else
237
327
    if (unlikely ((r = pread_retry (fildes, &size,
238
327
            sizeof (Elf64_Xword),
239
327
            offset + ehdr.e64->e_shoff
240
327
            + offsetof (Elf64_Shdr,
241
327
                  sh_size)))
242
327
            != sizeof (Elf64_Xword)))
243
0
      {
244
0
        if (r < 0)
245
0
          __libelf_seterrno (ELF_E_INVALID_FILE);
246
0
        else
247
0
          __libelf_seterrno (ELF_E_INVALID_ELF);
248
0
        return (size_t) -1l;
249
0
      }
250
251
623
        if (e_ident[EI_DATA] != MY_ELFDATA)
252
548
    CONVERT (size);
253
623
      }
254
255
    /* Although sh_size is an Elf64_Xword and can contain a 64bit
256
       value, we only expect an 32bit value max.  GElf_Word is
257
       32bit unsigned.  */
258
1.01k
    if (size > ~((GElf_Word) 0))
259
502
      {
260
        /* Invalid value, it is too large.  */
261
502
        __libelf_seterrno (ELF_E_INVALID_ELF);
262
502
        return (size_t) -1l;
263
502
      }
264
265
508
    result = size;
266
508
  }
267
268
      /* If the section headers were truncated, pretend none were there.  */
269
20.5k
      if (ehdr.e64->e_shoff > maxsize
270
12.9k
    || maxsize - ehdr.e64->e_shoff < sizeof (Elf64_Shdr) * result)
271
9.02k
  result = 0;
272
20.5k
    }
273
274
67.4k
  return result;
275
78.0k
}
276
277
278
/* Create descriptor for ELF file in memory.  */
279
static Elf *
280
file_read_elf (int fildes, void *map_address, unsigned char *e_ident,
281
         int64_t offset, size_t maxsize, Elf_Cmd cmd, Elf *parent)
282
78.2k
{
283
  /* Verify the binary is of the class we can handle.  */
284
78.2k
  if (unlikely ((e_ident[EI_CLASS] != ELFCLASS32
285
78.2k
     && e_ident[EI_CLASS] != ELFCLASS64)
286
    /* We also can only handle two encodings.  */
287
78.2k
    || (e_ident[EI_DATA] != ELFDATA2LSB
288
78.2k
        && e_ident[EI_DATA] != ELFDATA2MSB)))
289
0
    {
290
      /* Cannot handle this.  */
291
0
      __libelf_seterrno (ELF_E_INVALID_ELF);
292
0
      return NULL;
293
0
    }
294
295
  /* Determine the number of sections.  Returns -1 and sets libelf errno
296
     if the file handle or elf file is invalid.  Returns zero if there
297
     are no section headers (or they cannot be read).  */
298
78.2k
  size_t scncnt = get_shnum (map_address, e_ident, fildes, offset, maxsize);
299
78.2k
  if (scncnt == (size_t) -1l)
300
    /* Could not determine the number of sections.  */
301
660
    return NULL;
302
303
  /* Check for too many sections.  */
304
77.5k
  if (e_ident[EI_CLASS] == ELFCLASS32)
305
54.1k
    {
306
54.1k
      if (scncnt > SIZE_MAX / (sizeof (Elf_Scn) + sizeof (Elf32_Shdr)))
307
0
  {
308
0
    __libelf_seterrno (ELF_E_INVALID_ELF);
309
0
    return NULL;
310
0
  }
311
54.1k
    }
312
23.4k
  else if (scncnt > SIZE_MAX / (sizeof (Elf_Scn) + sizeof (Elf64_Shdr)))
313
0
    {
314
0
      __libelf_seterrno (ELF_E_INVALID_ELF);
315
0
      return NULL;
316
0
    }
317
318
  /* We can now allocate the memory.  Even if there are no section headers,
319
     we allocate space for a zeroth section in case we need it later.  */
320
77.5k
  const size_t scnmax = (scncnt ?: (cmd == ELF_C_RDWR || cmd == ELF_C_RDWR_MMAP)
321
40.5k
       ? 1 : 0);
322
77.5k
  Elf *elf = allocate_elf (fildes, map_address, offset, maxsize, cmd, parent,
323
77.5k
         ELF_K_ELF, scnmax * sizeof (Elf_Scn));
324
77.5k
  if (elf == NULL)
325
    /* Not enough memory.  allocate_elf will have set libelf errno.  */
326
0
    return NULL;
327
328
77.5k
  assert ((unsigned int) scncnt == scncnt);
329
77.5k
  assert (offsetof (struct Elf, state.elf32.scns)
330
77.5k
    == offsetof (struct Elf, state.elf64.scns));
331
77.5k
  elf->state.elf32.scns.cnt = scncnt;
332
77.5k
  elf->state.elf32.scns.max = scnmax;
333
334
  /* Some more or less arbitrary value.  */
335
77.5k
  elf->state.elf.scnincr = 10;
336
337
  /* Make the class easily available.  */
338
77.5k
  elf->class = e_ident[EI_CLASS];
339
340
77.5k
  if (e_ident[EI_CLASS] == ELFCLASS32)
341
54.1k
    {
342
      /* This pointer might not be directly usable if the alignment is
343
   not sufficient for the architecture.  */
344
54.1k
      Elf32_Ehdr *ehdr = (Elf32_Ehdr *) ((char *) map_address + offset);
345
346
      /* This is a 32-bit binary.  */
347
54.1k
      if (map_address != NULL && e_ident[EI_DATA] == MY_ELFDATA
348
0
    && (ALLOW_UNALIGNED
349
0
        || (((uintptr_t) ehdr) & (__alignof__ (Elf32_Ehdr) - 1)) == 0))
350
19.3k
  {
351
    /* We can use the mmapped memory.  */
352
19.3k
    elf->state.elf32.ehdr = ehdr;
353
19.3k
  }
354
34.7k
      else
355
34.7k
  {
356
    /* Copy the ELF header.  */
357
34.7k
    elf->state.elf32.ehdr = memcpy (&elf->state.elf32.ehdr_mem, e_ident,
358
34.7k
            sizeof (Elf32_Ehdr));
359
360
34.7k
    if (e_ident[EI_DATA] != MY_ELFDATA)
361
28.4k
      {
362
28.4k
        CONVERT (elf->state.elf32.ehdr_mem.e_type);
363
28.4k
        CONVERT (elf->state.elf32.ehdr_mem.e_machine);
364
28.4k
        CONVERT (elf->state.elf32.ehdr_mem.e_version);
365
28.4k
        CONVERT (elf->state.elf32.ehdr_mem.e_entry);
366
28.4k
        CONVERT (elf->state.elf32.ehdr_mem.e_phoff);
367
28.4k
        CONVERT (elf->state.elf32.ehdr_mem.e_shoff);
368
28.4k
        CONVERT (elf->state.elf32.ehdr_mem.e_flags);
369
28.4k
        CONVERT (elf->state.elf32.ehdr_mem.e_ehsize);
370
28.4k
        CONVERT (elf->state.elf32.ehdr_mem.e_phentsize);
371
28.4k
        CONVERT (elf->state.elf32.ehdr_mem.e_phnum);
372
28.4k
        CONVERT (elf->state.elf32.ehdr_mem.e_shentsize);
373
28.4k
        CONVERT (elf->state.elf32.ehdr_mem.e_shnum);
374
28.4k
        CONVERT (elf->state.elf32.ehdr_mem.e_shstrndx);
375
28.4k
      }
376
34.7k
  }
377
378
      /* Don't precache the phdr pointer here.
379
   elf32_getphdr will validate it against the size when asked.  */
380
381
54.1k
      Elf32_Off e_shoff = elf->state.elf32.ehdr->e_shoff;
382
54.1k
      if (map_address != NULL && e_ident[EI_DATA] == MY_ELFDATA
383
19.3k
    && cmd != ELF_C_READ_MMAP /* We need a copy to be able to write.  */
384
0
    && (ALLOW_UNALIGNED
385
0
        || ((((uintptr_t) ehdr + e_shoff)
386
0
       & (__alignof__ (Elf32_Shdr) - 1)) == 0)))
387
13.7k
  {
388
13.7k
    if (unlikely (scncnt > 0 && e_shoff >= maxsize)
389
13.7k
        || unlikely (maxsize - e_shoff
390
13.7k
         < scncnt * sizeof (Elf32_Shdr)))
391
0
      {
392
0
      free_and_out:
393
0
        free (elf);
394
0
        __libelf_seterrno (ELF_E_INVALID_ELF);
395
0
        return NULL;
396
0
      }
397
398
13.7k
    if (scncnt > 0)
399
5.91k
      elf->state.elf32.shdr
400
5.91k
        = (Elf32_Shdr *) ((char *) ehdr + e_shoff);
401
402
12.1M
    for (size_t cnt = 0; cnt < scncnt; ++cnt)
403
12.1M
      {
404
12.1M
        elf->state.elf32.scns.data[cnt].index = cnt;
405
12.1M
        elf->state.elf32.scns.data[cnt].elf = elf;
406
12.1M
        elf->state.elf32.scns.data[cnt].shdr.e32 =
407
12.1M
    &elf->state.elf32.shdr[cnt];
408
12.1M
        if (likely (elf->state.elf32.shdr[cnt].sh_offset < maxsize)
409
3.15M
      && likely (elf->state.elf32.shdr[cnt].sh_size
410
12.1M
           <= maxsize - elf->state.elf32.shdr[cnt].sh_offset))
411
2.80M
    elf->state.elf32.scns.data[cnt].rawdata_base =
412
2.80M
      elf->state.elf32.scns.data[cnt].data_base =
413
2.80M
      ((char *) map_address + offset
414
2.80M
       + elf->state.elf32.shdr[cnt].sh_offset);
415
12.1M
        elf->state.elf32.scns.data[cnt].list = &elf->state.elf32.scns;
416
417
        /* If this is a section with an extended index add a
418
     reference in the section which uses the extended
419
     index.  */
420
12.1M
        if (elf->state.elf32.shdr[cnt].sh_type == SHT_SYMTAB_SHNDX
421
13.9k
      && elf->state.elf32.shdr[cnt].sh_link < scncnt)
422
5.94k
    elf->state.elf32.scns.data[elf->state.elf32.shdr[cnt].sh_link].shndx_index
423
5.94k
      = cnt;
424
425
        /* Set the own shndx_index field in case it has not yet
426
     been set.  */
427
12.1M
        if (elf->state.elf32.scns.data[cnt].shndx_index == 0)
428
12.1M
    elf->state.elf32.scns.data[cnt].shndx_index = -1;
429
12.1M
      }
430
13.7k
  }
431
40.4k
      else
432
40.4k
  {
433
6.36M
    for (size_t cnt = 0; cnt < scncnt; ++cnt)
434
6.32M
      {
435
6.32M
        elf->state.elf32.scns.data[cnt].index = cnt;
436
6.32M
        elf->state.elf32.scns.data[cnt].elf = elf;
437
6.32M
        elf->state.elf32.scns.data[cnt].list = &elf->state.elf32.scns;
438
6.32M
      }
439
40.4k
  }
440
441
      /* So far only one block with sections.  */
442
54.1k
      elf->state.elf32.scns_last = &elf->state.elf32.scns;
443
54.1k
    }
444
23.4k
  else
445
23.4k
    {
446
      /* This pointer might not be directly usable if the alignment is
447
   not sufficient for the architecture.  */
448
23.4k
      Elf64_Ehdr *ehdr = (Elf64_Ehdr *) ((char *) map_address + offset);
449
450
      /* This is a 64-bit binary.  */
451
23.4k
      if (map_address != NULL && e_ident[EI_DATA] == MY_ELFDATA
452
0
    && (ALLOW_UNALIGNED
453
0
        || (((uintptr_t) ehdr) & (__alignof__ (Elf64_Ehdr) - 1)) == 0))
454
15.4k
  {
455
    /* We can use the mmapped memory.  */
456
15.4k
    elf->state.elf64.ehdr = ehdr;
457
15.4k
  }
458
8.04k
      else
459
8.04k
  {
460
    /* Copy the ELF header.  */
461
8.04k
    elf->state.elf64.ehdr = memcpy (&elf->state.elf64.ehdr_mem, e_ident,
462
8.04k
            sizeof (Elf64_Ehdr));
463
464
8.04k
    if (e_ident[EI_DATA] != MY_ELFDATA)
465
5.34k
      {
466
5.34k
        CONVERT (elf->state.elf64.ehdr_mem.e_type);
467
5.34k
        CONVERT (elf->state.elf64.ehdr_mem.e_machine);
468
5.34k
        CONVERT (elf->state.elf64.ehdr_mem.e_version);
469
5.34k
        CONVERT (elf->state.elf64.ehdr_mem.e_entry);
470
5.34k
        CONVERT (elf->state.elf64.ehdr_mem.e_phoff);
471
5.34k
        CONVERT (elf->state.elf64.ehdr_mem.e_shoff);
472
5.34k
        CONVERT (elf->state.elf64.ehdr_mem.e_flags);
473
5.34k
        CONVERT (elf->state.elf64.ehdr_mem.e_ehsize);
474
5.34k
        CONVERT (elf->state.elf64.ehdr_mem.e_phentsize);
475
5.34k
        CONVERT (elf->state.elf64.ehdr_mem.e_phnum);
476
5.34k
        CONVERT (elf->state.elf64.ehdr_mem.e_shentsize);
477
5.34k
        CONVERT (elf->state.elf64.ehdr_mem.e_shnum);
478
5.34k
        CONVERT (elf->state.elf64.ehdr_mem.e_shstrndx);
479
5.34k
      }
480
8.04k
  }
481
482
      /* Don't precache the phdr pointer here.
483
   elf64_getphdr will validate it against the size when asked.  */
484
485
23.4k
      Elf64_Off e_shoff = elf->state.elf64.ehdr->e_shoff;
486
23.4k
      if (map_address != NULL && e_ident[EI_DATA] == MY_ELFDATA
487
15.4k
    && cmd != ELF_C_READ_MMAP /* We need a copy to be able to write.  */
488
0
    && (ALLOW_UNALIGNED
489
0
        || ((((uintptr_t) ehdr + e_shoff)
490
0
       & (__alignof__ (Elf64_Shdr) - 1)) == 0)))
491
10.8k
  {
492
10.8k
    if (unlikely (scncnt > 0 && e_shoff >= maxsize)
493
10.8k
        || unlikely (maxsize - e_shoff
494
10.8k
         < scncnt * sizeof (Elf64_Shdr)))
495
0
      goto free_and_out;
496
497
10.8k
    if (scncnt > 0)
498
2.50k
      elf->state.elf64.shdr
499
2.50k
        = (Elf64_Shdr *) ((char *) ehdr + e_shoff);
500
501
505k
    for (size_t cnt = 0; cnt < scncnt; ++cnt)
502
494k
      {
503
494k
        elf->state.elf64.scns.data[cnt].index = cnt;
504
494k
        elf->state.elf64.scns.data[cnt].elf = elf;
505
494k
        elf->state.elf64.scns.data[cnt].shdr.e64 =
506
494k
    &elf->state.elf64.shdr[cnt];
507
494k
        if (likely (elf->state.elf64.shdr[cnt].sh_offset < maxsize)
508
334k
      && likely (elf->state.elf64.shdr[cnt].sh_size
509
494k
           <= maxsize - elf->state.elf64.shdr[cnt].sh_offset))
510
329k
    elf->state.elf64.scns.data[cnt].rawdata_base =
511
329k
      elf->state.elf64.scns.data[cnt].data_base =
512
329k
      ((char *) map_address + offset
513
329k
       + elf->state.elf64.shdr[cnt].sh_offset);
514
494k
        elf->state.elf64.scns.data[cnt].list = &elf->state.elf64.scns;
515
516
        /* If this is a section with an extended index add a
517
     reference in the section which uses the extended
518
     index.  */
519
494k
        if (elf->state.elf64.shdr[cnt].sh_type == SHT_SYMTAB_SHNDX
520
1.97k
      && elf->state.elf64.shdr[cnt].sh_link < scncnt)
521
1.04k
    elf->state.elf64.scns.data[elf->state.elf64.shdr[cnt].sh_link].shndx_index
522
1.04k
      = cnt;
523
524
        /* Set the own shndx_index field in case it has not yet
525
     been set.  */
526
494k
        if (elf->state.elf64.scns.data[cnt].shndx_index == 0)
527
494k
    elf->state.elf64.scns.data[cnt].shndx_index = -1;
528
494k
      }
529
10.8k
  }
530
12.6k
      else
531
12.6k
  {
532
2.54M
    for (size_t cnt = 0; cnt < scncnt; ++cnt)
533
2.53M
      {
534
2.53M
        elf->state.elf64.scns.data[cnt].index = cnt;
535
2.53M
        elf->state.elf64.scns.data[cnt].elf = elf;
536
2.53M
        elf->state.elf64.scns.data[cnt].list = &elf->state.elf64.scns;
537
2.53M
      }
538
12.6k
  }
539
540
      /* So far only one block with sections.  */
541
23.4k
      elf->state.elf64.scns_last = &elf->state.elf64.scns;
542
23.4k
    }
543
544
77.5k
  return elf;
545
77.5k
}
546
547
548
Elf *
549
internal_function
550
__libelf_read_mmaped_file (int fildes, void *map_address,  int64_t offset,
551
         size_t maxsize, Elf_Cmd cmd, Elf *parent)
552
260k
{
553
  /* We have to find out what kind of file this is.  We handle ELF
554
     files and archives.  To find out what we have we must look at the
555
     header.  The header for an ELF file is EI_NIDENT bytes in size,
556
     the header for an archive file SARMAG bytes long.  */
557
260k
  unsigned char *e_ident = (unsigned char *) map_address + offset;
558
559
  /* See what kind of object we have here.  */
560
260k
  Elf_Kind kind = determine_kind (e_ident, maxsize);
561
562
260k
  switch (kind)
563
260k
    {
564
59.6k
    case ELF_K_ELF:
565
59.6k
      return file_read_elf (fildes, map_address, e_ident, offset, maxsize,
566
59.6k
          cmd, parent);
567
568
191k
    case ELF_K_AR:
569
191k
      return file_read_ar (fildes, map_address, offset, maxsize, cmd, parent);
570
571
9.10k
    default:
572
9.10k
      break;
573
260k
    }
574
575
  /* This case is easy.  Since we cannot do anything with this file
576
     create a dummy descriptor.  */
577
9.10k
  return allocate_elf (fildes, map_address, offset, maxsize, cmd, parent,
578
9.10k
           ELF_K_NONE, 0);
579
260k
}
580
581
582
static Elf *
583
read_unmmaped_file (int fildes, int64_t offset, size_t maxsize, Elf_Cmd cmd,
584
        Elf *parent)
585
32.1k
{
586
  /* We have to find out what kind of file this is.  We handle ELF
587
     files and archives.  To find out what we have we must read the
588
     header.  The identification header for an ELF file is EI_NIDENT
589
     bytes in size, but we read the whole ELF header since we will
590
     need it anyway later.  For archives the header in SARMAG bytes
591
     long.  Read the maximum of these numbers.
592
593
     XXX We have to change this for the extended `ar' format some day.
594
595
     Use a union to ensure alignment.  We might later access the
596
     memory as a ElfXX_Ehdr.  */
597
32.1k
  union
598
32.1k
  {
599
32.1k
    Elf64_Ehdr ehdr;
600
32.1k
    unsigned char header[MAX (sizeof (Elf64_Ehdr), SARMAG)];
601
32.1k
  } mem;
602
603
  /* Read the head of the file.  */
604
32.1k
  ssize_t nread = pread_retry (fildes, mem.header,
605
32.1k
             MIN (MAX (sizeof (Elf64_Ehdr), SARMAG),
606
32.1k
            maxsize),
607
32.1k
             offset);
608
32.1k
  if (unlikely (nread == -1))
609
13.1k
    {
610
      /* We cannot even read the head of the file.  Maybe FILDES is associated
611
   with an unseekable device.  This is nothing we can handle.  */
612
13.1k
      __libelf_seterrno (ELF_E_INVALID_FILE);
613
13.1k
      return NULL;
614
13.1k
    }
615
616
  /* See what kind of object we have here.  */
617
19.0k
  Elf_Kind kind = determine_kind (mem.header, nread);
618
619
19.0k
  switch (kind)
620
19.0k
    {
621
3
    case ELF_K_AR:
622
3
      return file_read_ar (fildes, NULL, offset, maxsize, cmd, parent);
623
624
18.6k
    case ELF_K_ELF:
625
      /* Make sure at least the ELF header is contained in the file.  */
626
18.6k
      if ((size_t) nread >= (mem.header[EI_CLASS] == ELFCLASS32
627
18.6k
           ? sizeof (Elf32_Ehdr) : sizeof (Elf64_Ehdr)))
628
18.6k
  return file_read_elf (fildes, NULL, mem.header, offset, maxsize, cmd,
629
18.6k
            parent);
630
66
      FALLTHROUGH;
631
632
447
    default:
633
447
      break;
634
19.0k
    }
635
636
  /* This case is easy.  Since we cannot do anything with this file
637
     create a dummy descriptor.  */
638
447
  return allocate_elf (fildes, NULL, offset, maxsize, cmd, parent,
639
447
           ELF_K_NONE, 0);
640
19.0k
}
641
642
643
/* Open a file for reading.  If possible we will try to mmap() the file.  */
644
static struct Elf *
645
read_file (int fildes, int64_t offset, size_t maxsize,
646
     Elf_Cmd cmd, Elf *parent)
647
279k
{
648
279k
  void *map_address = NULL;
649
279k
  int use_mmap = (cmd == ELF_C_READ_MMAP || cmd == ELF_C_RDWR_MMAP
650
247k
      || cmd == ELF_C_WRITE_MMAP
651
247k
      || cmd == ELF_C_READ_MMAP_PRIVATE);
652
653
279k
  if (parent == NULL)
654
71.9k
    {
655
71.9k
      if (maxsize == ~((size_t) 0))
656
71.9k
  {
657
    /* We don't know in the moment how large the file is.
658
       Determine it now.  */
659
71.9k
    struct stat st;
660
661
71.9k
    if (fstat (fildes, &st) == 0
662
71.9k
        && (sizeof (size_t) >= sizeof (st.st_size)
663
0
      || st.st_size <= ~((size_t) 0)))
664
71.9k
      maxsize = (size_t) st.st_size;
665
71.9k
  }
666
71.9k
    }
667
207k
  else
668
207k
    {
669
      /* The parent is already loaded.  Use it.  */
670
207k
      assert (maxsize != ~((size_t) 0));
671
207k
    }
672
673
279k
  if (use_mmap)
674
254k
    {
675
254k
      if (parent == NULL)
676
46.5k
  {
677
    /* We try to map the file ourself.  */
678
46.5k
    map_address = mmap (NULL, maxsize, (cmd == ELF_C_READ_MMAP
679
46.5k
                ? PROT_READ
680
46.5k
                : PROT_READ|PROT_WRITE),
681
46.5k
            cmd == ELF_C_READ_MMAP_PRIVATE
682
32.0k
            || cmd == ELF_C_READ_MMAP
683
46.5k
            ? MAP_PRIVATE : MAP_SHARED,
684
46.5k
            fildes, offset);
685
686
46.5k
    if (map_address == MAP_FAILED)
687
6.76k
      map_address = NULL;
688
46.5k
  }
689
207k
      else
690
207k
  {
691
207k
    map_address = parent->map_address;
692
207k
  }
693
254k
    }
694
695
  /* If we have the file in memory optimize the access.  */
696
279k
  if (map_address != NULL)
697
247k
    {
698
247k
      assert (map_address != MAP_FAILED);
699
700
247k
      struct Elf *result = __libelf_read_mmaped_file (fildes, map_address,
701
247k
                  offset, maxsize, cmd,
702
247k
                  parent);
703
704
      /* If something went wrong during the initialization unmap the
705
   memory if we mmaped here.  */
706
247k
      if (result == NULL
707
255
    && (parent == NULL
708
18
        || parent->map_address != map_address))
709
237
  munmap (map_address, maxsize);
710
247k
      else if (parent == NULL)
711
  /* Remember that we mmap()ed the memory.  */
712
39.5k
  result->flags |= ELF_F_MMAPPED;
713
714
247k
      return result;
715
247k
    }
716
717
  /* Otherwise we have to do it the hard way.  We read as much as necessary
718
     from the file whenever we need information which is not available.  */
719
32.1k
  return read_unmmaped_file (fildes, offset, maxsize, cmd, parent);
720
279k
}
721
722
723
/* Find the entry with the long names for the content of this archive.  */
724
static const char *
725
read_long_names (Elf *elf)
726
1.91k
{
727
1.91k
  off_t offset = SARMAG; /* This is the first entry.  */
728
1.91k
  struct ar_hdr hdrm;
729
1.91k
  struct ar_hdr *hdr;
730
1.91k
  char *newp;
731
1.91k
  size_t len;
732
733
3.92k
  while (1)
734
3.92k
    {
735
3.92k
      if (elf->map_address != NULL)
736
3.92k
  {
737
3.92k
    if ((size_t) offset > elf->maximum_size
738
3.70k
        || elf->maximum_size - offset < sizeof (struct ar_hdr))
739
452
      return NULL;
740
741
    /* The data is mapped.  */
742
3.47k
    hdr = (struct ar_hdr *) (elf->map_address + offset);
743
3.47k
  }
744
0
      else
745
0
  {
746
    /* Read the header from the file.  */
747
0
    if (unlikely (pread_retry (elf->fildes, &hdrm, sizeof (hdrm),
748
0
             elf->start_offset + offset)
749
0
      != sizeof (hdrm)))
750
0
      return NULL;
751
752
0
    hdr = &hdrm;
753
0
  }
754
755
      /* The ar_size is given as a fixed size decimal string, right
756
   padded with spaces.  Make sure we read it properly even if
757
   there is no terminating space.  */
758
3.47k
      char buf[sizeof (hdr->ar_size) + 1];
759
3.47k
      const char *string = hdr->ar_size;
760
3.47k
      if (hdr->ar_size[sizeof (hdr->ar_size) - 1] != ' ')
761
3.36k
  {
762
3.36k
    *((char *) mempcpy (buf, hdr->ar_size, sizeof (hdr->ar_size))) = '\0';
763
3.36k
    string = buf;
764
3.36k
  }
765
766
      /* atol expects to see at least one digit.
767
   It also cannot be negative (-).  */
768
3.47k
      if (!isdigit(string[0]))
769
1.10k
  return NULL;
770
2.37k
      len = atol (string);
771
772
2.37k
      if (memcmp (hdr->ar_name, "//              ", 16) == 0)
773
360
  break;
774
775
2.01k
      offset += sizeof (struct ar_hdr) + ((len + 1) & ~1l);
776
2.01k
    }
777
778
  /* Sanity check len early if we can.  */
779
360
  if (elf->map_address != NULL)
780
360
    {
781
360
      if (len > elf->maximum_size - offset - sizeof (struct ar_hdr))
782
83
  return NULL;
783
360
    }
784
785
  /* Due to the stupid format of the long name table entry (which are not
786
     NUL terminted) we have to provide an appropriate representation anyhow.
787
     Therefore we always make a copy which has the appropriate form.  */
788
277
  newp = malloc (len);
789
277
  if (newp != NULL)
790
277
    {
791
277
      char *runp;
792
793
277
      if (elf->map_address != NULL)
794
277
  {
795
    /* Simply copy it over.  */
796
277
    elf->state.ar.long_names = (char *) memcpy (newp,
797
277
                  elf->map_address + offset
798
277
                  + sizeof (struct ar_hdr),
799
277
                  len);
800
277
  }
801
0
      else
802
0
  {
803
0
    if (unlikely ((size_t) pread_retry (elf->fildes, newp, len,
804
0
                elf->start_offset + offset
805
0
                + sizeof (struct ar_hdr))
806
0
      != len))
807
0
      {
808
        /* We were not able to read all data.  */
809
0
        free (newp);
810
0
        elf->state.ar.long_names = NULL;
811
0
        return NULL;
812
0
      }
813
0
    elf->state.ar.long_names = newp;
814
0
  }
815
816
277
      elf->state.ar.long_names_len = len;
817
818
      /* Now NUL-terminate the strings.  */
819
277
      runp = newp;
820
12.1k
      while (1)
821
12.1k
        {
822
12.1k
    char *startp = runp;
823
12.1k
    runp = (char *) memchr (runp, '/', newp + len - runp);
824
12.1k
    if (runp == NULL)
825
231
      {
826
        /* This was the last entry.  Clear any left overs.  */
827
231
        memset (startp, '\0', newp + len - startp);
828
231
        break;
829
231
      }
830
831
    /* NUL-terminate the string.  */
832
11.8k
    *runp++ = '\0';
833
834
    /* A sanity check.  Somebody might have generated invalid
835
       archive.  */
836
11.8k
    if (runp >= newp + len)
837
46
      break;
838
11.8k
  }
839
277
    }
840
841
277
  return newp;
842
277
}
843
844
845
/* Read the next archive header.  */
846
int
847
internal_function
848
__libelf_next_arhdr_wrlock (Elf *elf)
849
223k
{
850
223k
  struct ar_hdr *ar_hdr;
851
223k
  Elf_Arhdr *elf_ar_hdr;
852
853
223k
  if (elf->map_address != NULL)
854
223k
    {
855
      /* See whether this entry is in the file.  */
856
223k
      if (unlikely ((size_t) elf->state.ar.offset
857
223k
        > elf->start_offset + elf->maximum_size
858
223k
        || (elf->start_offset + elf->maximum_size
859
223k
      - elf->state.ar.offset) < sizeof (struct ar_hdr)))
860
13.1k
  {
861
    /* This record is not anymore in the file.  */
862
13.1k
    __libelf_seterrno (ELF_E_RANGE);
863
13.1k
    return -1;
864
13.1k
  }
865
209k
      ar_hdr = (struct ar_hdr *) (elf->map_address + elf->state.ar.offset);
866
209k
    }
867
0
  else
868
0
    {
869
0
      ar_hdr = &elf->state.ar.ar_hdr;
870
871
0
      if (unlikely (pread_retry (elf->fildes, ar_hdr, sizeof (struct ar_hdr),
872
0
         elf->state.ar.offset)
873
0
        != sizeof (struct ar_hdr)))
874
0
  {
875
    /* Something went wrong while reading the file.  */
876
0
    __libelf_seterrno (ELF_E_RANGE);
877
0
    return -1;
878
0
  }
879
0
    }
880
881
  /* One little consistency check.  */
882
209k
  if (unlikely (memcmp (ar_hdr->ar_fmag, ARFMAG, 2) != 0))
883
449
    {
884
      /* This is no valid archive.  */
885
449
      __libelf_seterrno (ELF_E_ARCHIVE_FMAG);
886
449
      return -1;
887
449
    }
888
889
  /* Copy the raw name over to a NUL terminated buffer.  */
890
209k
  *((char *) mempcpy (elf->state.ar.raw_name, ar_hdr->ar_name, 16)) = '\0';
891
892
209k
  elf_ar_hdr = &elf->state.ar.elf_ar_hdr;
893
894
  /* Now convert the `struct ar_hdr' into `Elf_Arhdr'.
895
     Determine whether this is a special entry.  */
896
209k
  if (ar_hdr->ar_name[0] == '/')
897
3.13k
    {
898
3.13k
      if (ar_hdr->ar_name[1] == ' '
899
303
    && memcmp (ar_hdr->ar_name, "/               ", 16) == 0)
900
  /* This is the index.  */
901
276
  elf_ar_hdr->ar_name = memcpy (elf->state.ar.ar_name, "/", 2);
902
2.85k
      else if (ar_hdr->ar_name[1] == 'S'
903
70
         && memcmp (ar_hdr->ar_name, "/SYM64/         ", 16) == 0)
904
  /* 64-bit index.  */
905
18
  elf_ar_hdr->ar_name = memcpy (elf->state.ar.ar_name, "/SYM64/", 8);
906
2.84k
      else if (ar_hdr->ar_name[1] == '/'
907
579
         && memcmp (ar_hdr->ar_name, "//              ", 16) == 0)
908
  /* This is the array with the long names.  */
909
555
  elf_ar_hdr->ar_name = memcpy (elf->state.ar.ar_name, "//", 3);
910
2.28k
      else if (likely  (isdigit (ar_hdr->ar_name[1])))
911
2.16k
  {
912
2.16k
    size_t offset;
913
914
    /* This is a long name.  First we have to read the long name
915
       table, if this hasn't happened already.  */
916
2.16k
    if (unlikely (elf->state.ar.long_names == NULL
917
2.16k
      && read_long_names (elf) == NULL))
918
1.63k
      {
919
        /* No long name table although it is reference.  The archive is
920
     broken.  */
921
1.63k
        __libelf_seterrno (ELF_E_INVALID_ARCHIVE);
922
1.63k
        return -1;
923
1.63k
      }
924
925
529
    offset = atol (ar_hdr->ar_name + 1);
926
529
    if (unlikely (offset >= elf->state.ar.long_names_len))
927
148
      {
928
        /* The index in the long name table is larger than the table.  */
929
148
        __libelf_seterrno (ELF_E_INVALID_ARCHIVE);
930
148
        return -1;
931
148
      }
932
381
    elf_ar_hdr->ar_name = elf->state.ar.long_names + offset;
933
381
  }
934
120
      else
935
120
  {
936
    /* This is none of the known special entries.  */
937
120
    __libelf_seterrno (ELF_E_INVALID_ARCHIVE);
938
120
    return -1;
939
120
  }
940
3.13k
    }
941
206k
  else
942
206k
    {
943
206k
      char *endp;
944
945
      /* It is a normal entry.  Copy over the name.  */
946
206k
      endp = (char *) memccpy (elf->state.ar.ar_name, ar_hdr->ar_name,
947
206k
             '/', 16);
948
206k
      if (endp != NULL)
949
186k
  endp[-1] = '\0';
950
20.0k
      else
951
20.0k
  {
952
    /* In the old BSD style of archive, there is no / terminator.
953
       Instead, there is space padding at the end of the name.  */
954
20.0k
    size_t i = 15;
955
20.0k
    do
956
37.1k
      elf->state.ar.ar_name[i] = '\0';
957
37.1k
    while (i > 0 && elf->state.ar.ar_name[--i] == ' ');
958
20.0k
  }
959
960
206k
      elf_ar_hdr->ar_name = elf->state.ar.ar_name;
961
206k
    }
962
963
207k
  if (unlikely (ar_hdr->ar_size[0] == ' '))
964
    /* Something is really wrong.  We cannot live without a size for
965
       the member since it will not be possible to find the next
966
       archive member.  */
967
5
    {
968
5
      __libelf_seterrno (ELF_E_INVALID_ARCHIVE);
969
5
      return -1;
970
5
    }
971
972
  /* Since there are no specialized functions to convert ASCII to
973
     time_t, uid_t, gid_t, mode_t, and off_t we use either atol or
974
     atoll depending on the size of the types.  We are also prepared
975
     for the case where the whole field in the `struct ar_hdr' is
976
     filled in which case we cannot simply use atol/l but instead have
977
     to create a temporary copy.  Note that all fields use decimal
978
     encoding, except ar_mode which uses octal.  */
979
980
207k
#define INT_FIELD(FIELD)                  \
981
830k
  do                        \
982
830k
    {                       \
983
830k
      char buf[sizeof (ar_hdr->FIELD) + 1];             \
984
830k
      const char *string = ar_hdr->FIELD;             \
985
830k
      if (ar_hdr->FIELD[sizeof (ar_hdr->FIELD) - 1] != ' ')         \
986
830k
  {                     \
987
665k
    *((char *) mempcpy (buf, ar_hdr->FIELD, sizeof (ar_hdr->FIELD)))  \
988
665k
      = '\0';                   \
989
665k
    string = buf;                   \
990
665k
  }                      \
991
830k
      if (sizeof (elf_ar_hdr->FIELD) <= sizeof (long int))         \
992
830k
  elf_ar_hdr->FIELD = (__typeof (elf_ar_hdr->FIELD)) atol (string);     \
993
830k
      else                      \
994
830k
  elf_ar_hdr->FIELD = (__typeof (elf_ar_hdr->FIELD)) atoll (string);    \
995
830k
    }                       \
996
830k
  while (0)
997
998
207k
#define OCT_FIELD(FIELD)                  \
999
207k
  do                        \
1000
207k
    {                       \
1001
207k
      char buf[sizeof (ar_hdr->FIELD) + 1];             \
1002
207k
      const char *string = ar_hdr->FIELD;             \
1003
207k
      if (ar_hdr->FIELD[sizeof (ar_hdr->FIELD) - 1] != ' ')         \
1004
207k
  {                     \
1005
207k
    *((char *) mempcpy (buf, ar_hdr->FIELD, sizeof (ar_hdr->FIELD)))  \
1006
207k
      = '\0';                   \
1007
207k
    string = buf;                   \
1008
207k
  }                      \
1009
207k
      if (sizeof (elf_ar_hdr->FIELD) <= sizeof (long int))         \
1010
207k
  elf_ar_hdr->FIELD                 \
1011
207k
    = (__typeof (elf_ar_hdr->FIELD)) strtol (string, NULL, 8);       \
1012
207k
      else                      \
1013
207k
  elf_ar_hdr->FIELD                 \
1014
0
    = (__typeof (elf_ar_hdr->FIELD)) strtoll (string, NULL, 8);       \
1015
207k
    }                       \
1016
207k
  while (0)
1017
1018
207k
  INT_FIELD (ar_date);
1019
207k
  INT_FIELD (ar_uid);
1020
207k
  INT_FIELD (ar_gid);
1021
207k
  OCT_FIELD (ar_mode);
1022
207k
  INT_FIELD (ar_size);
1023
1024
207k
  if (elf_ar_hdr->ar_size < 0)
1025
36
    {
1026
36
      __libelf_seterrno (ELF_E_INVALID_ARCHIVE);
1027
36
      return -1;
1028
36
    }
1029
1030
  /* Truncated file?  */
1031
207k
  size_t maxsize;
1032
207k
  maxsize = (elf->start_offset + elf->maximum_size
1033
207k
       - elf->state.ar.offset - sizeof (struct ar_hdr));
1034
207k
  if ((size_t) elf_ar_hdr->ar_size > maxsize)
1035
188k
    elf_ar_hdr->ar_size = maxsize;
1036
1037
207k
  return 0;
1038
207k
}
1039
1040
1041
/* We were asked to return a clone of an existing descriptor.  This
1042
   function must be called with the lock on the parent descriptor
1043
   being held. */
1044
static Elf *
1045
dup_elf (int fildes, Elf_Cmd cmd, Elf *ref)
1046
208k
{
1047
208k
  struct Elf *result;
1048
1049
208k
  if (fildes == -1)
1050
    /* Allow the user to pass -1 as the file descriptor for the new file.  */
1051
249
    fildes = ref->fildes;
1052
  /* The file descriptor better should be the same.  If it was disconnected
1053
     already (using `elf_cntl') we do not test it.  */
1054
207k
  else if (unlikely (ref->fildes != -1 && fildes != ref->fildes))
1055
0
    {
1056
0
      __libelf_seterrno (ELF_E_FD_MISMATCH);
1057
0
      return NULL;
1058
0
    }
1059
1060
  /* The mode must allow reading.  I.e., a descriptor creating with a
1061
     command different then ELF_C_READ, ELF_C_WRITE and ELF_C_RDWR is
1062
     not allowed.  */
1063
208k
  if (unlikely (ref->cmd != ELF_C_READ && ref->cmd != ELF_C_READ_MMAP
1064
208k
    && ref->cmd != ELF_C_WRITE && ref->cmd != ELF_C_WRITE_MMAP
1065
208k
    && ref->cmd != ELF_C_RDWR && ref->cmd != ELF_C_RDWR_MMAP
1066
208k
    && ref->cmd != ELF_C_READ_MMAP_PRIVATE))
1067
0
    {
1068
0
      __libelf_seterrno (ELF_E_INVALID_OP);
1069
0
      return NULL;
1070
0
    }
1071
1072
  /* Now it is time to distinguish between reading normal files and
1073
     archives.  Normal files can easily be handled be incrementing the
1074
     reference counter and return the same descriptor.  */
1075
208k
  if (ref->kind != ELF_K_AR)
1076
0
    {
1077
0
      ++ref->ref_count;
1078
0
      return ref;
1079
0
    }
1080
1081
  /* This is an archive.  We must create a descriptor for the archive
1082
     member the internal pointer of the archive file descriptor is
1083
     pointing to.  First read the header of the next member if this
1084
     has not happened already.  */
1085
208k
  if (ref->state.ar.elf_ar_hdr.ar_name == NULL
1086
191k
      && __libelf_next_arhdr_wrlock (ref) != 0)
1087
    /* Something went wrong.  Maybe there is no member left.  */
1088
414
    return NULL;
1089
1090
  /* We have all the information we need about the next archive member.
1091
     Now create a descriptor for it.  */
1092
207k
  result = read_file (fildes, ref->state.ar.offset + sizeof (struct ar_hdr),
1093
207k
          ref->state.ar.elf_ar_hdr.ar_size, cmd, ref);
1094
1095
  /* Enlist this new descriptor in the list of children.  */
1096
207k
  if (result != NULL)
1097
207k
    {
1098
207k
      result->next = ref->state.ar.children;
1099
207k
      ref->state.ar.children = result;
1100
207k
    }
1101
1102
207k
  return result;
1103
208k
}
1104
1105
1106
/* Return descriptor for empty file ready for writing.  */
1107
static struct Elf *
1108
write_file (int fd, Elf_Cmd cmd)
1109
0
{
1110
  /* We simply create an empty `Elf' structure.  */
1111
0
#define NSCNSALLOC  10
1112
0
  Elf *result = allocate_elf (fd, NULL, 0, 0, cmd, NULL, ELF_K_ELF,
1113
0
            NSCNSALLOC * sizeof (Elf_Scn));
1114
1115
0
  if (result != NULL)
1116
0
    {
1117
      /* We have to write to the file in any case.  */
1118
0
      result->flags = ELF_F_DIRTY;
1119
1120
      /* Some more or less arbitrary value.  */
1121
0
      result->state.elf.scnincr = NSCNSALLOC;
1122
1123
      /* We have allocated room for some sections.  */
1124
0
      assert (offsetof (struct Elf, state.elf32.scns)
1125
0
        == offsetof (struct Elf, state.elf64.scns));
1126
0
      result->state.elf.scns_last = &result->state.elf32.scns;
1127
0
      result->state.elf32.scns.max = NSCNSALLOC;
1128
0
    }
1129
1130
0
  return result;
1131
0
}
1132
1133
/* Lock if necessary before dup an archive.  */
1134
static inline Elf *
1135
lock_dup_elf (int fildes, Elf_Cmd cmd, Elf *ref)
1136
208k
{
1137
  /* We need wrlock to dup an archive.  */
1138
208k
  if (ref->kind == ELF_K_AR)
1139
208k
    {
1140
208k
      rwlock_unlock (ref->lock);
1141
208k
      rwlock_wrlock (ref->lock);
1142
208k
    }
1143
    /* Duplicate the descriptor.  */
1144
208k
  return dup_elf (fildes, cmd, ref);
1145
208k
}
1146
1147
/* Return a descriptor for the file belonging to FILDES.  */
1148
Elf *
1149
elf_begin (int fildes, Elf_Cmd cmd, Elf *ref)
1150
280k
{
1151
280k
  Elf *retval;
1152
1153
280k
  if (unlikely (__libelf_version != EV_CURRENT))
1154
0
    {
1155
      /* Version wasn't set so far.  */
1156
0
      __libelf_seterrno (ELF_E_NO_VERSION);
1157
0
      return NULL;
1158
0
    }
1159
1160
280k
  if (ref != NULL)
1161
    /* Make sure the descriptor is not suddenly going away.  */
1162
208k
    rwlock_rdlock (ref->lock);
1163
71.9k
  else if (unlikely (fcntl (fildes, F_GETFD) == -1 && errno == EBADF))
1164
0
    {
1165
      /* We cannot do anything productive without a file descriptor.  */
1166
0
      __libelf_seterrno (ELF_E_INVALID_FILE);
1167
0
      return NULL;
1168
0
    }
1169
1170
280k
  switch (cmd)
1171
280k
    {
1172
0
    case ELF_C_NULL:
1173
      /* We simply return a NULL pointer.  */
1174
0
      retval = NULL;
1175
0
      break;
1176
1177
222k
    case ELF_C_READ_MMAP_PRIVATE:
1178
      /* If we have a reference it must also be opened this way.  */
1179
222k
      if (unlikely (ref != NULL && ref->cmd != ELF_C_READ_MMAP_PRIVATE))
1180
4
  {
1181
4
    __libelf_seterrno (ELF_E_INVALID_CMD);
1182
4
    retval = NULL;
1183
4
    break;
1184
4
  }
1185
222k
      FALLTHROUGH;
1186
1187
241k
    case ELF_C_READ:
1188
267k
    case ELF_C_READ_MMAP:
1189
267k
      if (ref != NULL)
1190
208k
  retval = lock_dup_elf (fildes, cmd, ref);
1191
59.2k
      else
1192
  /* Create descriptor for existing file.  */
1193
59.2k
  retval = read_file (fildes, 0, ~((size_t) 0), cmd, NULL);
1194
267k
      break;
1195
1196
6.35k
    case ELF_C_RDWR:
1197
12.7k
    case ELF_C_RDWR_MMAP:
1198
      /* If we have a REF object it must also be opened using this
1199
   command.  */
1200
12.7k
      if (ref != NULL)
1201
0
  {
1202
0
    if (unlikely (ref->cmd != ELF_C_RDWR && ref->cmd != ELF_C_RDWR_MMAP
1203
0
      && ref->cmd != ELF_C_WRITE
1204
0
      && ref->cmd != ELF_C_WRITE_MMAP))
1205
0
      {
1206
        /* This is not ok.  REF must also be opened for writing.  */
1207
0
        __libelf_seterrno (ELF_E_INVALID_CMD);
1208
0
        retval = NULL;
1209
0
      }
1210
0
    else
1211
0
      retval = lock_dup_elf (fildes, cmd, ref);
1212
0
  }
1213
12.7k
      else
1214
  /* Create descriptor for existing file.  */
1215
12.7k
  retval = read_file (fildes, 0, ~((size_t) 0), cmd, NULL);
1216
12.7k
      break;
1217
1218
0
    case ELF_C_WRITE:
1219
0
    case ELF_C_WRITE_MMAP:
1220
      /* We ignore REF and prepare a descriptor to write a new file.  */
1221
0
      retval = write_file (fildes, cmd);
1222
0
      break;
1223
1224
0
    default:
1225
0
      __libelf_seterrno (ELF_E_INVALID_CMD);
1226
0
      retval = NULL;
1227
0
      break;
1228
280k
    }
1229
1230
  /* Release the lock.  */
1231
280k
  if (ref != NULL)
1232
208k
    rwlock_unlock (ref->lock);
1233
1234
280k
  return retval;
1235
280k
}
1236
INTDEF(elf_begin)