Coverage Report

Created: 2026-07-25 10:20

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/binutils-gdb/libctf/ctf-open.c
Line
Count
Source
1
/* Opening CTF files.
2
   Copyright (C) 2019-2026 Free Software Foundation, Inc.
3
4
   This file is part of libctf.
5
6
   libctf is free software; you can redistribute it and/or modify it under
7
   the terms of the GNU General Public License as published by the Free
8
   Software Foundation; either version 3, or (at your option) any later
9
   version.
10
11
   This program is distributed in the hope that it will be useful, but
12
   WITHOUT ANY WARRANTY; without even the implied warranty of
13
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14
   See the GNU General Public License for more details.
15
16
   You should have received a copy of the GNU General Public License
17
   along with this program; see the file COPYING.  If not see
18
   <http://www.gnu.org/licenses/>.  */
19
20
#include <ctf-impl.h>
21
#include <stddef.h>
22
#include <string.h>
23
#include <sys/types.h>
24
#include <elf.h>
25
#include "swap.h"
26
#include <bfd.h>
27
#include <zlib.h>
28
29
static const ctf_dmodel_t _libctf_models[] = {
30
  {"ILP32", CTF_MODEL_ILP32, 4, 1, 2, 4, 4},
31
  {"LP64", CTF_MODEL_LP64, 8, 1, 2, 4, 8},
32
  {NULL, 0, 0, 0, 0, 0, 0}
33
};
34
35
const char _CTF_SECTION[] = ".ctf";
36
const char _CTF_NULLSTR[] = "";
37
38
/* Version-sensitive accessors.  */
39
40
static uint32_t
41
get_kind_v1 (uint32_t info)
42
0
{
43
0
  return (CTF_V1_INFO_KIND (info));
44
0
}
45
46
static uint32_t
47
get_root_v1 (uint32_t info)
48
0
{
49
0
  return (CTF_V1_INFO_ISROOT (info));
50
0
}
51
52
static uint32_t
53
get_vlen_v1 (uint32_t info)
54
0
{
55
0
  return (CTF_V1_INFO_VLEN (info));
56
0
}
57
58
static uint32_t
59
get_kind_v2 (uint32_t info)
60
0
{
61
0
  return (CTF_V2_INFO_KIND (info));
62
0
}
63
64
static uint32_t
65
get_root_v2 (uint32_t info)
66
0
{
67
0
  return (CTF_V2_INFO_ISROOT (info));
68
0
}
69
70
static uint32_t
71
get_vlen_v2 (uint32_t info)
72
0
{
73
0
  return (CTF_V2_INFO_VLEN (info));
74
0
}
75
76
static inline ssize_t
77
get_ctt_size_common (const ctf_dict_t *fp _libctf_unused_,
78
         const ctf_type_t *tp _libctf_unused_,
79
         ssize_t *sizep, ssize_t *incrementp, size_t lsize,
80
         size_t csize, size_t ctf_type_size,
81
         size_t ctf_stype_size, size_t ctf_lsize_sent)
82
0
{
83
0
  ssize_t size, increment;
84
85
0
  if (csize == ctf_lsize_sent)
86
0
    {
87
0
      size = lsize;
88
0
      increment = ctf_type_size;
89
0
    }
90
0
  else
91
0
    {
92
0
      size = csize;
93
0
      increment = ctf_stype_size;
94
0
    }
95
96
0
  if (sizep)
97
0
    *sizep = size;
98
0
  if (incrementp)
99
0
    *incrementp = increment;
100
101
0
  return size;
102
0
}
103
104
static ssize_t
105
get_ctt_size_v1 (const ctf_dict_t *fp, const ctf_type_t *tp,
106
     ssize_t *sizep, ssize_t *incrementp)
107
0
{
108
0
  ctf_type_v1_t *t1p = (ctf_type_v1_t *) tp;
109
110
0
  return (get_ctt_size_common (fp, tp, sizep, incrementp,
111
0
             CTF_TYPE_LSIZE (t1p), t1p->ctt_size,
112
0
             sizeof (ctf_type_v1_t), sizeof (ctf_stype_v1_t),
113
0
             CTF_LSIZE_SENT_V1));
114
0
}
115
116
/* Return the size that a v1 will be once it is converted to v2.  */
117
118
static ssize_t
119
get_ctt_size_v2_unconverted (const ctf_dict_t *fp, const ctf_type_t *tp,
120
           ssize_t *sizep, ssize_t *incrementp)
121
0
{
122
0
  ctf_type_v1_t *t1p = (ctf_type_v1_t *) tp;
123
124
0
  return (get_ctt_size_common (fp, tp, sizep, incrementp,
125
0
             CTF_TYPE_LSIZE (t1p), t1p->ctt_size,
126
0
             sizeof (ctf_type_t), sizeof (ctf_stype_t),
127
0
             CTF_LSIZE_SENT));
128
0
}
129
130
static ssize_t
131
get_ctt_size_v2 (const ctf_dict_t *fp, const ctf_type_t *tp,
132
     ssize_t *sizep, ssize_t *incrementp)
133
0
{
134
0
  return (get_ctt_size_common (fp, tp, sizep, incrementp,
135
0
             CTF_TYPE_LSIZE (tp), tp->ctt_size,
136
0
             sizeof (ctf_type_t), sizeof (ctf_stype_t),
137
0
             CTF_LSIZE_SENT));
138
0
}
139
140
static ssize_t
141
get_vbytes_common (ctf_dict_t *fp, unsigned short kind,
142
       ssize_t size _libctf_unused_, size_t vlen)
143
0
{
144
0
  switch (kind)
145
0
    {
146
0
    case CTF_K_INTEGER:
147
0
    case CTF_K_FLOAT:
148
0
      return (sizeof (uint32_t));
149
0
    case CTF_K_SLICE:
150
0
      return (sizeof (ctf_slice_t));
151
0
    case CTF_K_ENUM:
152
0
      return (sizeof (ctf_enum_t) * vlen);
153
0
    case CTF_K_FORWARD:
154
0
    case CTF_K_UNKNOWN:
155
0
    case CTF_K_POINTER:
156
0
    case CTF_K_TYPEDEF:
157
0
    case CTF_K_VOLATILE:
158
0
    case CTF_K_CONST:
159
0
    case CTF_K_RESTRICT:
160
0
      return 0;
161
0
    default:
162
0
      ctf_set_errno (fp, ECTF_CORRUPT);
163
0
      ctf_err_warn (fp, 0, 0, _("detected invalid CTF kind: %x"), kind);
164
0
      return -1;
165
0
    }
166
0
}
167
168
static ssize_t
169
get_vbytes_v1 (ctf_dict_t *fp, unsigned short kind, ssize_t size, size_t vlen)
170
0
{
171
0
  switch (kind)
172
0
    {
173
0
    case CTF_K_ARRAY:
174
0
      return (sizeof (ctf_array_v1_t));
175
0
    case CTF_K_FUNCTION:
176
0
      return (sizeof (unsigned short) * (vlen + (vlen & 1)));
177
0
    case CTF_K_STRUCT:
178
0
    case CTF_K_UNION:
179
0
      if (size < CTF_LSTRUCT_THRESH_V1)
180
0
  return (sizeof (ctf_member_v1_t) * vlen);
181
0
      else
182
0
  return (sizeof (ctf_lmember_v1_t) * vlen);
183
0
    }
184
185
0
  return (get_vbytes_common (fp, kind, size, vlen));
186
0
}
187
188
static ssize_t
189
get_vbytes_v2 (ctf_dict_t *fp, unsigned short kind, ssize_t size, size_t vlen)
190
0
{
191
0
  switch (kind)
192
0
    {
193
0
    case CTF_K_ARRAY:
194
0
      return (sizeof (ctf_array_t));
195
0
    case CTF_K_FUNCTION:
196
0
      return (sizeof (uint32_t) * (vlen + (vlen & 1)));
197
0
    case CTF_K_STRUCT:
198
0
    case CTF_K_UNION:
199
0
      if (size < CTF_LSTRUCT_THRESH)
200
0
  return (sizeof (ctf_member_t) * vlen);
201
0
      else
202
0
  return (sizeof (ctf_lmember_t) * vlen);
203
0
    }
204
205
0
  return (get_vbytes_common (fp, kind, size, vlen));
206
0
}
207
208
static const ctf_dictops_t ctf_dictops[] = {
209
  {NULL, NULL, NULL, NULL, NULL},
210
  /* CTF_VERSION_1 */
211
  {get_kind_v1, get_root_v1, get_vlen_v1, get_ctt_size_v1, get_vbytes_v1},
212
  /* CTF_VERSION_1_UPGRADED_3 */
213
  {get_kind_v2, get_root_v2, get_vlen_v2, get_ctt_size_v2, get_vbytes_v2},
214
  /* CTF_VERSION_2 */
215
  {get_kind_v2, get_root_v2, get_vlen_v2, get_ctt_size_v2, get_vbytes_v2},
216
  /* CTF_VERSION_3, identical to 2: only new type kinds */
217
  {get_kind_v2, get_root_v2, get_vlen_v2, get_ctt_size_v2, get_vbytes_v2},
218
};
219
220
/* Initialize the symtab translation table as appropriate for its indexing
221
   state.  For unindexed symtypetabs, fill each entry with the offset of the CTF
222
   type or function data corresponding to each STT_FUNC or STT_OBJECT entry in
223
   the symbol table.  For indexed symtypetabs, do nothing: the needed
224
   initialization for indexed lookups may be quite expensive, so it is done only
225
   as needed, when lookups happen.  (In particular, the majority of indexed
226
   symtypetabs come from the compiler, and all the linker does is iteration over
227
   all entries, which doesn't need this initialization.)
228
229
   The SP symbol table section may be NULL if there is no symtab.
230
231
   If init_symtab works on one call, it cannot fail on future calls to the same
232
   fp: ctf_symsect_endianness relies on this.  */
233
234
static int
235
init_symtab (ctf_dict_t *fp, const ctf_header_t *hp, const ctf_sect_t *sp)
236
0
{
237
0
  const unsigned char *symp;
238
0
  int skip_func_info = 0;
239
0
  int i;
240
0
  uint32_t *xp = fp->ctf_sxlate;
241
0
  uint32_t *xend = PTR_ADD (xp, fp->ctf_nsyms);
242
243
0
  uint32_t objtoff = hp->cth_objtoff;
244
0
  uint32_t funcoff = hp->cth_funcoff;
245
246
  /* If the CTF_F_NEWFUNCINFO flag is not set, pretend the func info section
247
     is empty: this compiler is too old to emit a function info section we
248
     understand.  */
249
250
0
  if (!(hp->cth_flags & CTF_F_NEWFUNCINFO))
251
0
    skip_func_info = 1;
252
253
0
  if (hp->cth_objtidxoff < hp->cth_funcidxoff)
254
0
    fp->ctf_objtidx_names = (uint32_t *) (fp->ctf_buf + hp->cth_objtidxoff);
255
0
  if (hp->cth_funcidxoff < hp->cth_varoff && !skip_func_info)
256
0
    fp->ctf_funcidx_names = (uint32_t *) (fp->ctf_buf + hp->cth_funcidxoff);
257
258
  /* Don't bother doing the rest if everything is indexed, or if we don't have a
259
     symbol table: we will never use it.  */
260
0
  if ((fp->ctf_objtidx_names && fp->ctf_funcidx_names) || !sp || !sp->cts_data)
261
0
    return 0;
262
263
  /* The CTF data object and function type sections are ordered to match the
264
     relative order of the respective symbol types in the symtab, unless there
265
     is an index section, in which case the order is arbitrary and the index
266
     gives the mapping.  If no type information is available for a symbol table
267
     entry, a pad is inserted in the CTF section.  As a further optimization,
268
     anonymous or undefined symbols are omitted from the CTF data.  If an
269
     index is available for function symbols but not object symbols, or vice
270
     versa, we populate the xslate table for the unindexed symbols only.  */
271
272
0
  for (i = 0, symp = sp->cts_data; xp < xend; xp++, symp += sp->cts_entsize,
273
0
   i++)
274
0
    {
275
0
      ctf_link_sym_t sym;
276
277
0
      switch (sp->cts_entsize)
278
0
  {
279
0
  case sizeof (Elf64_Sym):
280
0
    {
281
0
      const Elf64_Sym *symp64 = (Elf64_Sym *) (uintptr_t) symp;
282
0
      ctf_elf64_to_link_sym (fp, &sym, symp64, i);
283
0
    }
284
0
    break;
285
0
  case sizeof (Elf32_Sym):
286
0
    {
287
0
      const Elf32_Sym *symp32 = (Elf32_Sym *) (uintptr_t) symp;
288
0
      ctf_elf32_to_link_sym (fp, &sym, symp32, i);
289
0
    }
290
0
    break;
291
0
  default:
292
0
    return ECTF_SYMTAB;
293
0
  }
294
295
      /* This call may be led astray if our idea of the symtab's endianness is
296
   wrong, but when this is fixed by a call to ctf_symsect_endianness,
297
   init_symtab will be called again with the right endianness in
298
   force.  */
299
0
      if (ctf_symtab_skippable (&sym))
300
0
  {
301
0
    *xp = -1u;
302
0
    continue;
303
0
  }
304
305
0
      switch (sym.st_type)
306
0
  {
307
0
  case STT_OBJECT:
308
0
    if (fp->ctf_objtidx_names || objtoff >= hp->cth_funcoff)
309
0
      {
310
0
        *xp = -1u;
311
0
        break;
312
0
      }
313
314
0
    *xp = objtoff;
315
0
    objtoff += sizeof (uint32_t);
316
0
    break;
317
318
0
  case STT_FUNC:
319
0
    if (fp->ctf_funcidx_names || funcoff >= hp->cth_objtidxoff
320
0
        || skip_func_info)
321
0
      {
322
0
        *xp = -1u;
323
0
        break;
324
0
      }
325
326
0
    *xp = funcoff;
327
0
    funcoff += sizeof (uint32_t);
328
0
    break;
329
330
0
  default:
331
0
    *xp = -1u;
332
0
    break;
333
0
  }
334
0
    }
335
336
0
  ctf_dprintf ("loaded %lu symtab entries\n", fp->ctf_nsyms);
337
0
  return 0;
338
0
}
339
340
/* Reset the CTF base pointer and derive the buf pointer from it, initializing
341
   everything in the ctf_dict that depends on the base or buf pointers.
342
343
   The original gap between the buf and base pointers, if any -- the original,
344
   unconverted CTF header -- is kept, but its contents are not specified and are
345
   never used.  */
346
347
static void
348
ctf_set_base (ctf_dict_t *fp, const ctf_header_t *hp, unsigned char *base)
349
0
{
350
0
  fp->ctf_buf = base + (fp->ctf_buf - fp->ctf_base);
351
0
  fp->ctf_base = base;
352
0
  fp->ctf_vars = (ctf_varent_t *) ((const char *) fp->ctf_buf +
353
0
           hp->cth_varoff);
354
0
  fp->ctf_nvars = (hp->cth_typeoff - hp->cth_varoff) / sizeof (ctf_varent_t);
355
356
0
  fp->ctf_str[CTF_STRTAB_0].cts_strs = (const char *) fp->ctf_buf
357
0
    + hp->cth_stroff;
358
0
  fp->ctf_str[CTF_STRTAB_0].cts_len = hp->cth_strlen;
359
360
  /* If we have a parent dict name and label, store the relocated string
361
     pointers in the CTF dict for easy access later. */
362
363
  /* Note: before conversion, these will be set to values that will be
364
     immediately invalidated by the conversion process, but the conversion
365
     process will call ctf_set_base() again to fix things up.  */
366
367
0
  if (hp->cth_parlabel != 0)
368
0
    fp->ctf_parlabel = ctf_strptr (fp, hp->cth_parlabel);
369
0
  if (hp->cth_parname != 0)
370
0
    fp->ctf_parname = ctf_strptr (fp, hp->cth_parname);
371
0
  if (hp->cth_cuname != 0)
372
0
    fp->ctf_cuname = ctf_strptr (fp, hp->cth_cuname);
373
374
0
  if (fp->ctf_cuname)
375
0
    ctf_dprintf ("ctf_set_base: CU name %s\n", fp->ctf_cuname);
376
0
  if (fp->ctf_parname)
377
0
    ctf_dprintf ("ctf_set_base: parent name %s (label %s)\n",
378
0
         fp->ctf_parname,
379
0
         fp->ctf_parlabel ? fp->ctf_parlabel : "<NULL>");
380
0
}
381
382
/* Set the version of the CTF file. */
383
384
/* When this is reset, LCTF_* changes behaviour, but there is no guarantee that
385
   the variable data list associated with each type has been upgraded: the
386
   caller must ensure this has been done in advance.  */
387
388
static void
389
ctf_set_version (ctf_dict_t *fp, ctf_header_t *cth, int ctf_version)
390
0
{
391
0
  fp->ctf_version = ctf_version;
392
0
  cth->cth_version = ctf_version;
393
0
  fp->ctf_dictops = &ctf_dictops[ctf_version];
394
0
}
395
396
397
/* Upgrade the header to CTF_VERSION_3.  The upgrade is done in-place.  */
398
static void
399
upgrade_header (ctf_header_t *hp)
400
0
{
401
0
  ctf_header_v2_t *oldhp = (ctf_header_v2_t *) hp;
402
403
0
  hp->cth_strlen = oldhp->cth_strlen;
404
0
  hp->cth_stroff = oldhp->cth_stroff;
405
0
  hp->cth_typeoff = oldhp->cth_typeoff;
406
0
  hp->cth_varoff = oldhp->cth_varoff;
407
0
  hp->cth_funcidxoff = hp->cth_varoff;    /* No index sections.  */
408
0
  hp->cth_objtidxoff = hp->cth_funcidxoff;
409
0
  hp->cth_funcoff = oldhp->cth_funcoff;
410
0
  hp->cth_objtoff = oldhp->cth_objtoff;
411
0
  hp->cth_lbloff = oldhp->cth_lbloff;
412
0
  hp->cth_cuname = 0;       /* No CU name.  */
413
0
}
414
415
/* Upgrade the type table to CTF_VERSION_3 (really CTF_VERSION_1_UPGRADED_3)
416
   from CTF_VERSION_1.
417
418
   The upgrade is not done in-place: the ctf_base is moved.  ctf_strptr() must
419
   not be called before reallocation is complete.
420
421
   Sections not checked here due to nonexistence or nonpopulated state in older
422
   formats: objtidx, funcidx.
423
424
   Type kinds not checked here due to nonexistence in older formats:
425
      CTF_K_SLICE.  */
426
static int
427
upgrade_types_v1 (ctf_dict_t *fp, ctf_header_t *cth)
428
0
{
429
0
  const ctf_type_v1_t *tbuf;
430
0
  const ctf_type_v1_t *tend;
431
0
  unsigned char *ctf_base, *old_ctf_base = (unsigned char *) fp->ctf_dynbase;
432
0
  ctf_type_t *t2buf;
433
434
0
  ssize_t increase = 0, size, increment, v2increment, vbytes, v2bytes;
435
0
  const ctf_type_v1_t *tp;
436
0
  ctf_type_t *t2p;
437
438
0
  tbuf = (ctf_type_v1_t *) (fp->ctf_buf + cth->cth_typeoff);
439
0
  tend = (ctf_type_v1_t *) (fp->ctf_buf + cth->cth_stroff);
440
441
  /* Much like init_static_types(), this is a two-pass process.
442
443
     First, figure out the new type-section size needed.  (It is possible,
444
     in theory, for it to be less than the old size, but this is very
445
     unlikely.  It cannot be so small that cth_typeoff ends up of negative
446
     size.  We validate this with an assertion below.)
447
448
     We must cater not only for changes in vlen and types sizes but also
449
     for changes in 'increment', which happen because v2 places some types
450
     into ctf_stype_t where v1 would be forced to use the larger non-stype.  */
451
452
0
  for (tp = tbuf; tp < tend;
453
0
       tp = (ctf_type_v1_t *) ((uintptr_t) tp + increment + vbytes))
454
0
    {
455
0
      unsigned short kind = CTF_V1_INFO_KIND (tp->ctt_info);
456
0
      unsigned long vlen = CTF_V1_INFO_VLEN (tp->ctt_info);
457
458
0
      size = get_ctt_size_v1 (fp, (const ctf_type_t *) tp, NULL, &increment);
459
0
      vbytes = get_vbytes_v1 (fp, kind, size, vlen);
460
461
0
      if (vbytes < 0
462
0
    || (uintptr_t) tend - (uintptr_t) tp < (size_t) increment + vbytes)
463
0
  return ECTF_CORRUPT;
464
465
0
      get_ctt_size_v2_unconverted (fp, (const ctf_type_t *) tp, NULL,
466
0
           &v2increment);
467
0
      v2bytes = get_vbytes_v2 (fp, kind, size, vlen);
468
469
0
      increase += v2increment - increment;  /* May be negative.  */
470
0
      increase += v2bytes - vbytes;
471
0
    }
472
473
  /* Allocate enough room for the new buffer, then copy everything but the type
474
     section into place, and reset the base accordingly.  Leave the version
475
     number unchanged, so that LCTF_INFO_* still works on the
476
     as-yet-untranslated type info.  */
477
478
0
  if ((ctf_base = malloc (fp->ctf_size + increase)) == NULL)
479
0
    return ECTF_ZALLOC;
480
481
  /* Start at ctf_buf, not ctf_base, to squeeze out the original header: we
482
     never use it and it is unconverted.  */
483
484
0
  memcpy (ctf_base, fp->ctf_buf, cth->cth_typeoff);
485
0
  memcpy (ctf_base + cth->cth_stroff + increase,
486
0
    fp->ctf_buf + cth->cth_stroff, cth->cth_strlen);
487
488
0
  memset (ctf_base + cth->cth_typeoff, 0, cth->cth_stroff - cth->cth_typeoff
489
0
    + increase);
490
491
0
  cth->cth_stroff += increase;
492
0
  fp->ctf_size += increase;
493
0
  assert (cth->cth_stroff >= cth->cth_typeoff);
494
0
  fp->ctf_base = ctf_base;
495
0
  fp->ctf_buf = ctf_base;
496
0
  fp->ctf_dynbase = ctf_base;
497
0
  ctf_set_base (fp, cth, ctf_base);
498
499
0
  t2buf = (ctf_type_t *) (fp->ctf_buf + cth->cth_typeoff);
500
501
  /* Iterate through all the types again, upgrading them.
502
503
     Everything that hasn't changed can just be outright memcpy()ed.
504
     Things that have changed need field-by-field consideration.  */
505
506
0
  for (tp = tbuf, t2p = t2buf; tp < tend;
507
0
       tp = (ctf_type_v1_t *) ((uintptr_t) tp + increment + vbytes),
508
0
       t2p = (ctf_type_t *) ((uintptr_t) t2p + v2increment + v2bytes))
509
0
    {
510
0
      unsigned short kind = CTF_V1_INFO_KIND (tp->ctt_info);
511
0
      int isroot = CTF_V1_INFO_ISROOT (tp->ctt_info);
512
0
      unsigned long vlen = CTF_V1_INFO_VLEN (tp->ctt_info);
513
0
      ssize_t v2size;
514
0
      void *vdata, *v2data;
515
516
0
      size = get_ctt_size_v1 (fp, (const ctf_type_t *) tp, NULL, &increment);
517
0
      vbytes = get_vbytes_v1 (fp, kind, size, vlen);
518
519
0
      t2p->ctt_name = tp->ctt_name;
520
0
      t2p->ctt_info = CTF_TYPE_INFO (kind, isroot, vlen);
521
522
0
      switch (kind)
523
0
  {
524
0
  case CTF_K_FUNCTION:
525
0
  case CTF_K_FORWARD:
526
0
  case CTF_K_TYPEDEF:
527
0
  case CTF_K_POINTER:
528
0
  case CTF_K_VOLATILE:
529
0
  case CTF_K_CONST:
530
0
  case CTF_K_RESTRICT:
531
0
    t2p->ctt_type = tp->ctt_type;
532
0
    break;
533
0
  case CTF_K_INTEGER:
534
0
  case CTF_K_FLOAT:
535
0
  case CTF_K_ARRAY:
536
0
  case CTF_K_STRUCT:
537
0
  case CTF_K_UNION:
538
0
  case CTF_K_ENUM:
539
0
  case CTF_K_UNKNOWN:
540
0
    if ((size_t) size <= CTF_MAX_SIZE)
541
0
      t2p->ctt_size = size;
542
0
    else
543
0
      {
544
0
        t2p->ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
545
0
        t2p->ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
546
0
      }
547
0
    break;
548
0
  }
549
550
0
      v2size = get_ctt_size_v2 (fp, t2p, NULL, &v2increment);
551
0
      v2bytes = get_vbytes_v2 (fp, kind, v2size, vlen);
552
553
      /* Catch out-of-sync get_ctt_size_*().  The count goes wrong if
554
   these are not identical (and having them different makes no
555
   sense semantically).  */
556
557
0
      assert (size == v2size);
558
559
      /* Now the varlen info.  */
560
561
0
      vdata = (void *) ((uintptr_t) tp + increment);
562
0
      v2data = (void *) ((uintptr_t) t2p + v2increment);
563
564
0
      switch (kind)
565
0
  {
566
0
  case CTF_K_ARRAY:
567
0
    {
568
0
      const ctf_array_v1_t *ap = (const ctf_array_v1_t *) vdata;
569
0
      ctf_array_t *a2p = (ctf_array_t *) v2data;
570
571
0
      a2p->cta_contents = ap->cta_contents;
572
0
      a2p->cta_index = ap->cta_index;
573
0
      a2p->cta_nelems = ap->cta_nelems;
574
0
      break;
575
0
    }
576
0
  case CTF_K_STRUCT:
577
0
  case CTF_K_UNION:
578
0
    {
579
0
      ctf_member_t tmp;
580
0
      const ctf_member_v1_t *m1 = (const ctf_member_v1_t *) vdata;
581
0
      const ctf_lmember_v1_t *lm1 = (const ctf_lmember_v1_t *) m1;
582
0
      ctf_member_t *m2 = (ctf_member_t *) v2data;
583
0
      ctf_lmember_t *lm2 = (ctf_lmember_t *) m2;
584
0
      unsigned long i;
585
586
      /* We walk all four pointers forward, but only reference the two
587
         that are valid for the given size, to avoid quadruplicating all
588
         the code.  */
589
590
0
      for (i = vlen; i != 0; i--, m1++, lm1++, m2++, lm2++)
591
0
        {
592
0
    size_t offset;
593
0
    if (size < CTF_LSTRUCT_THRESH_V1)
594
0
      {
595
0
        offset = m1->ctm_offset;
596
0
        tmp.ctm_name = m1->ctm_name;
597
0
        tmp.ctm_type = m1->ctm_type;
598
0
      }
599
0
    else
600
0
      {
601
0
        offset = CTF_LMEM_OFFSET (lm1);
602
0
        tmp.ctm_name = lm1->ctlm_name;
603
0
        tmp.ctm_type = lm1->ctlm_type;
604
0
      }
605
0
    if (size < CTF_LSTRUCT_THRESH)
606
0
      {
607
0
        m2->ctm_name = tmp.ctm_name;
608
0
        m2->ctm_type = tmp.ctm_type;
609
0
        m2->ctm_offset = offset;
610
0
      }
611
0
    else
612
0
      {
613
0
        lm2->ctlm_name = tmp.ctm_name;
614
0
        lm2->ctlm_type = tmp.ctm_type;
615
0
        lm2->ctlm_offsethi = CTF_OFFSET_TO_LMEMHI (offset);
616
0
        lm2->ctlm_offsetlo = CTF_OFFSET_TO_LMEMLO (offset);
617
0
      }
618
0
        }
619
0
      break;
620
0
    }
621
0
  case CTF_K_FUNCTION:
622
0
    {
623
0
      unsigned long i;
624
0
      unsigned short *a1 = (unsigned short *) vdata;
625
0
      uint32_t *a2 = (uint32_t *) v2data;
626
627
0
      for (i = vlen; i != 0; i--, a1++, a2++)
628
0
        *a2 = *a1;
629
0
    }
630
  /* FALLTHRU */
631
0
  default:
632
    /* Catch out-of-sync get_vbytes_*().  */
633
0
    assert (vbytes == v2bytes);
634
0
    memcpy (v2data, vdata, vbytes);
635
0
  }
636
0
    }
637
638
  /* Verify that the entire region was converted.  If not, we are either
639
     converting too much, or too little (leading to a buffer overrun either here
640
     or at read time, in init_static_types().) */
641
642
0
  assert ((size_t) t2p - (size_t) fp->ctf_buf == cth->cth_stroff);
643
644
0
  ctf_set_version (fp, cth, CTF_VERSION_1_UPGRADED_3);
645
0
  free (old_ctf_base);
646
647
0
  return 0;
648
0
}
649
650
/* Upgrade from any earlier version.  */
651
static int
652
upgrade_types (ctf_dict_t *fp, ctf_header_t *cth)
653
0
{
654
0
  switch (cth->cth_version)
655
0
    {
656
      /* v1 requires a full pass and reformatting.  */
657
0
    case CTF_VERSION_1:
658
0
      upgrade_types_v1 (fp, cth);
659
      /* FALLTHRU */
660
      /* Already-converted v1 is just like later versions except that its
661
   parent/child boundary is unchanged (and much lower).  */
662
663
0
    case CTF_VERSION_1_UPGRADED_3:
664
0
      fp->ctf_parmax = CTF_MAX_PTYPE_V1;
665
666
      /* v2 is just the same as v3 except for new types and sections:
667
   no upgrading required. */
668
0
    case CTF_VERSION_2: ;
669
      /* FALLTHRU */
670
0
    }
671
0
  return 0;
672
0
}
673
674
static int
675
init_static_types_internal (ctf_dict_t *fp, ctf_header_t *cth,
676
          ctf_dynset_t *all_enums);
677
678
/* Populate statically-defined types (those loaded from a saved buffer).
679
680
   Initialize the type ID translation table with the byte offset of each type,
681
   and initialize the hash tables of each named type.  Upgrade the type table to
682
   the latest supported representation in the process, if needed, and if this
683
   recension of libctf supports upgrading.
684
685
   Returns zero on success and a *positive* ECTF_* or errno value on error.
686
687
   This is a wrapper to simplify memory allocation on error in the _internal
688
   function that does all the actual work.  */
689
690
static int
691
init_static_types (ctf_dict_t *fp, ctf_header_t *cth)
692
0
{
693
0
  ctf_dynset_t *all_enums;
694
0
  int err;
695
696
0
  if ((all_enums = ctf_dynset_create (htab_hash_pointer, htab_eq_pointer,
697
0
              NULL)) == NULL)
698
0
    return ENOMEM;
699
700
0
  err = init_static_types_internal (fp, cth, all_enums);
701
0
  ctf_dynset_destroy (all_enums);
702
0
  return err;
703
0
}
704
705
static int
706
init_static_types_internal (ctf_dict_t *fp, ctf_header_t *cth,
707
          ctf_dynset_t *all_enums)
708
0
{
709
0
  const ctf_type_t *tbuf;
710
0
  const ctf_type_t *tend;
711
712
0
  unsigned long pop[CTF_K_MAX + 1] = { 0 };
713
0
  int pop_enumerators = 0;
714
0
  const ctf_type_t *tp;
715
0
  uint32_t id;
716
0
  uint32_t *xp;
717
0
  unsigned long typemax = 0;
718
0
  ctf_next_t *i = NULL;
719
0
  void *k;
720
721
  /* We determine whether the dict is a child or a parent based on the value of
722
     cth_parname.  */
723
724
0
  int child = cth->cth_parname != 0;
725
0
  int nlstructs = 0, nlunions = 0;
726
0
  int err;
727
728
0
  if (_libctf_unlikely_ (fp->ctf_version == CTF_VERSION_1))
729
0
    {
730
0
      int err;
731
0
      if ((err = upgrade_types (fp, cth)) != 0)
732
0
  return err;       /* Upgrade failed.  */
733
0
    }
734
735
0
  tbuf = (ctf_type_t *) (fp->ctf_buf + cth->cth_typeoff);
736
0
  tend = (ctf_type_t *) (fp->ctf_buf + cth->cth_stroff);
737
738
  /* We make two passes through the entire type section, and one third pass
739
     through part of it.  In this first pass, we count the number of each type
740
     and type-like identifier (like enumerators) and the total number of
741
     types.  */
742
743
0
  for (tp = tbuf; tp < tend; typemax++)
744
0
    {
745
0
      unsigned short kind = LCTF_INFO_KIND (fp, tp->ctt_info);
746
0
      unsigned long vlen = LCTF_INFO_VLEN (fp, tp->ctt_info);
747
0
      ssize_t size, increment, vbytes;
748
749
0
      (void) ctf_get_ctt_size (fp, tp, &size, &increment);
750
0
      vbytes = LCTF_VBYTES (fp, kind, size, vlen);
751
752
0
      if (vbytes < 0
753
0
    || (uintptr_t) tend - (uintptr_t) tp < (size_t) increment + vbytes)
754
0
  return ECTF_CORRUPT;
755
756
      /* For forward declarations, ctt_type is the CTF_K_* kind for the tag,
757
   so bump that population count too.  A corrupt dict may store an
758
   out-of-range kind here, so guard against indexing pop[] out of
759
   bounds.  */
760
0
      if (kind == CTF_K_FORWARD)
761
0
  {
762
0
    if (tp->ctt_type > CTF_K_MAX)
763
0
      return ECTF_CORRUPT;
764
0
    pop[tp->ctt_type]++;
765
0
  }
766
767
0
      tp = (ctf_type_t *) ((uintptr_t) tp + increment + vbytes);
768
0
      pop[kind]++;
769
770
0
      if (kind == CTF_K_ENUM)
771
0
  pop_enumerators += vlen;
772
0
    }
773
774
0
  if (child)
775
0
    {
776
0
      ctf_dprintf ("CTF dict %p is a child\n", (void *) fp);
777
0
      fp->ctf_flags |= LCTF_CHILD;
778
0
    }
779
0
  else
780
0
    ctf_dprintf ("CTF dict %p is a parent\n", (void *) fp);
781
782
  /* Now that we've counted up the number of each type, we can allocate
783
     the hash tables, type translation table, and pointer table.  */
784
785
0
  if ((fp->ctf_structs
786
0
       = ctf_dynhash_create_sized (pop[CTF_K_STRUCT], ctf_hash_string,
787
0
           ctf_hash_eq_string, NULL, NULL)) == NULL)
788
0
    return ENOMEM;
789
790
0
  if ((fp->ctf_unions
791
0
       = ctf_dynhash_create_sized (pop[CTF_K_UNION], ctf_hash_string,
792
0
           ctf_hash_eq_string, NULL, NULL)) == NULL)
793
0
    return ENOMEM;
794
795
0
  if ((fp->ctf_enums
796
0
       = ctf_dynhash_create_sized (pop[CTF_K_ENUM], ctf_hash_string,
797
0
           ctf_hash_eq_string, NULL, NULL)) == NULL)
798
0
    return ENOMEM;
799
800
0
  if ((fp->ctf_names
801
0
       = ctf_dynhash_create_sized (pop[CTF_K_UNKNOWN] +
802
0
           pop[CTF_K_INTEGER] +
803
0
           pop[CTF_K_FLOAT] +
804
0
           pop[CTF_K_FUNCTION] +
805
0
           pop[CTF_K_TYPEDEF] +
806
0
           pop[CTF_K_POINTER] +
807
0
           pop[CTF_K_VOLATILE] +
808
0
           pop[CTF_K_CONST] +
809
0
           pop[CTF_K_RESTRICT] +
810
0
           pop_enumerators,
811
0
           ctf_hash_string,
812
0
           ctf_hash_eq_string, NULL, NULL)) == NULL)
813
0
    return ENOMEM;
814
815
0
  if ((fp->ctf_conflicting_enums
816
0
       = ctf_dynset_create (htab_hash_string, htab_eq_string, NULL)) == NULL)
817
0
    return ENOMEM;
818
819
  /* The ptrtab and txlate can be appropriately sized for precisely this set
820
     of types: the txlate because it is only used to look up static types,
821
     so dynamic types added later will never go through it, and the ptrtab
822
     because later-added types will call grow_ptrtab() automatically, as
823
     needed.  */
824
825
0
  fp->ctf_txlate = malloc (sizeof (uint32_t) * (typemax + 1));
826
0
  fp->ctf_ptrtab_len = typemax + 1;
827
0
  fp->ctf_ptrtab = malloc (sizeof (uint32_t) * fp->ctf_ptrtab_len);
828
0
  fp->ctf_stypes = typemax;
829
830
0
  if (fp->ctf_txlate == NULL || fp->ctf_ptrtab == NULL)
831
0
    return ENOMEM;   /* Memory allocation failed.  */
832
833
0
  xp = fp->ctf_txlate;
834
0
  *xp++ = 0;      /* Type id 0 is used as a sentinel value.  */
835
836
0
  memset (fp->ctf_txlate, 0, sizeof (uint32_t) * (typemax + 1));
837
0
  memset (fp->ctf_ptrtab, 0, sizeof (uint32_t) * (typemax + 1));
838
839
  /* In the second pass through the types, we fill in each entry of the
840
     type and pointer tables and add names to the appropriate hashes.
841
842
     (Not all names are added in this pass, only type names.  See below.)
843
844
     Bump ctf_typemax as we go, but keep it one higher than normal, so that
845
     the type being read in is considered a valid type and it is at least
846
     barely possible to run simple lookups on it.  */
847
848
0
  for (id = 1, fp->ctf_typemax = 1, tp = tbuf; tp < tend; xp++, id++, fp->ctf_typemax++)
849
0
    {
850
0
      unsigned short kind = LCTF_INFO_KIND (fp, tp->ctt_info);
851
0
      unsigned short isroot = LCTF_INFO_ISROOT (fp, tp->ctt_info);
852
0
      unsigned long vlen = LCTF_INFO_VLEN (fp, tp->ctt_info);
853
0
      ssize_t size, increment, vbytes;
854
855
0
      const char *name;
856
857
0
      (void) ctf_get_ctt_size (fp, tp, &size, &increment);
858
0
      name = ctf_strptr (fp, tp->ctt_name);
859
      /* Cannot fail: shielded by call in loop above.  */
860
0
      vbytes = LCTF_VBYTES (fp, kind, size, vlen);
861
862
0
      *xp = (uint32_t) ((uintptr_t) tp - (uintptr_t) fp->ctf_buf);
863
864
0
      switch (kind)
865
0
  {
866
0
  case CTF_K_UNKNOWN:
867
0
  case CTF_K_INTEGER:
868
0
  case CTF_K_FLOAT:
869
0
    {
870
0
      ctf_id_t existing;
871
0
      ctf_encoding_t existing_en;
872
0
      ctf_encoding_t this_en;
873
874
0
      if (!isroot)
875
0
        break;
876
877
      /* Names are reused by bitfields, which are differentiated by
878
         their encodings.  So check for the type already existing, and
879
         iff the new type is a root-visible non-bitfield, replace the
880
         old one.  It's a little hard to figure out whether a type is
881
         a non-bitfield without already knowing that type's native
882
         width, but we can converge on it by replacing an existing
883
         type as long as the new type is zero-offset and has a
884
         bit-width wider than the existing one, since the native type
885
         must necessarily have a bit-width at least as wide as any
886
         bitfield based on it. */
887
888
0
      if (((existing = ctf_dynhash_lookup_type (fp->ctf_names, name)) == 0)
889
0
    || ctf_type_encoding (fp, existing, &existing_en) != 0
890
0
    || (ctf_type_encoding (fp, LCTF_INDEX_TO_TYPE (fp, id, child), &this_en) == 0
891
0
        && this_en.cte_offset == 0
892
0
        && (existing_en.cte_offset != 0
893
0
      || existing_en.cte_bits < this_en.cte_bits)))
894
0
        {
895
0
    err = ctf_dynhash_insert_type (fp, fp->ctf_names,
896
0
                 LCTF_INDEX_TO_TYPE (fp, id, child),
897
0
                 tp->ctt_name);
898
0
    if (err != 0)
899
0
      return err * -1;
900
0
        }
901
0
      break;
902
0
    }
903
904
    /* These kinds have no name, so do not need interning into any
905
       hashtables.  */
906
0
  case CTF_K_ARRAY:
907
0
  case CTF_K_SLICE:
908
0
    break;
909
910
0
  case CTF_K_FUNCTION:
911
0
    if (!isroot)
912
0
      break;
913
914
0
    err = ctf_dynhash_insert_type (fp, fp->ctf_names,
915
0
           LCTF_INDEX_TO_TYPE (fp, id, child),
916
0
           tp->ctt_name);
917
0
    if (err != 0)
918
0
      return err * -1;
919
0
    break;
920
921
0
  case CTF_K_STRUCT:
922
0
    if (size >= CTF_LSTRUCT_THRESH)
923
0
      nlstructs++;
924
925
0
    if (!isroot)
926
0
      break;
927
928
0
    err = ctf_dynhash_insert_type (fp, fp->ctf_structs,
929
0
           LCTF_INDEX_TO_TYPE (fp, id, child),
930
0
           tp->ctt_name);
931
932
0
    if (err != 0)
933
0
      return err * -1;
934
935
0
    break;
936
937
0
  case CTF_K_UNION:
938
0
    if (size >= CTF_LSTRUCT_THRESH)
939
0
      nlunions++;
940
941
0
    if (!isroot)
942
0
      break;
943
944
0
    err = ctf_dynhash_insert_type (fp, fp->ctf_unions,
945
0
           LCTF_INDEX_TO_TYPE (fp, id, child),
946
0
           tp->ctt_name);
947
948
0
    if (err != 0)
949
0
      return err * -1;
950
0
    break;
951
952
0
  case CTF_K_ENUM:
953
0
    {
954
0
      if (!isroot)
955
0
        break;
956
957
0
      err = ctf_dynhash_insert_type (fp, fp->ctf_enums,
958
0
             LCTF_INDEX_TO_TYPE (fp, id, child),
959
0
             tp->ctt_name);
960
961
0
      if (err != 0)
962
0
        return err * -1;
963
964
      /* Remember all enums for later rescanning.  */
965
966
0
      err = ctf_dynset_insert (all_enums, (void *) (ptrdiff_t)
967
0
             LCTF_INDEX_TO_TYPE (fp, id, child));
968
0
      if (err != 0)
969
0
        return err * -1;
970
0
      break;
971
0
    }
972
973
0
  case CTF_K_TYPEDEF:
974
0
    if (!isroot)
975
0
      break;
976
977
0
    err = ctf_dynhash_insert_type (fp, fp->ctf_names,
978
0
           LCTF_INDEX_TO_TYPE (fp, id, child),
979
0
           tp->ctt_name);
980
0
    if (err != 0)
981
0
      return err * -1;
982
0
    break;
983
984
0
  case CTF_K_FORWARD:
985
0
    {
986
0
      ctf_dynhash_t *h = ctf_name_table (fp, tp->ctt_type);
987
988
0
      if (!isroot)
989
0
        break;
990
991
      /* Only insert forward tags into the given hash if the type or tag
992
         name is not already present.  */
993
0
      if (ctf_dynhash_lookup_type (h, name) == 0)
994
0
        {
995
0
    err = ctf_dynhash_insert_type (fp, h, LCTF_INDEX_TO_TYPE (fp, id, child),
996
0
                 tp->ctt_name);
997
0
    if (err != 0)
998
0
      return err * -1;
999
0
        }
1000
0
      break;
1001
0
    }
1002
1003
0
  case CTF_K_POINTER:
1004
    /* If the type referenced by the pointer is in this CTF dict, then
1005
       store the index of the pointer type in fp->ctf_ptrtab[ index of
1006
       referenced type ].  */
1007
1008
0
    if (LCTF_TYPE_ISCHILD (fp, tp->ctt_type) == child
1009
0
        && LCTF_TYPE_TO_INDEX (fp, tp->ctt_type) <= fp->ctf_typemax)
1010
0
      fp->ctf_ptrtab[LCTF_TYPE_TO_INDEX (fp, tp->ctt_type)] = id;
1011
   /*FALLTHRU*/
1012
1013
0
  case CTF_K_VOLATILE:
1014
0
  case CTF_K_CONST:
1015
0
  case CTF_K_RESTRICT:
1016
0
    if (!isroot)
1017
0
      break;
1018
1019
0
    err = ctf_dynhash_insert_type (fp, fp->ctf_names,
1020
0
           LCTF_INDEX_TO_TYPE (fp, id, child),
1021
0
           tp->ctt_name);
1022
0
    if (err != 0)
1023
0
      return err * -1;
1024
0
    break;
1025
0
  default:
1026
0
    ctf_err_warn (fp, 0, ECTF_CORRUPT,
1027
0
      _("init_static_types(): unhandled CTF kind: %x"), kind);
1028
0
    return ECTF_CORRUPT;
1029
0
  }
1030
0
      tp = (ctf_type_t *) ((uintptr_t) tp + increment + vbytes);
1031
0
    }
1032
0
  fp->ctf_typemax--;
1033
0
  assert (fp->ctf_typemax == typemax);
1034
1035
0
  ctf_dprintf ("%lu total types processed\n", fp->ctf_typemax);
1036
1037
  /* In the third pass, we traverse the enums we spotted earlier and track all
1038
     the enumeration constants to aid in future detection of duplicates.
1039
1040
     Doing this in a third pass is necessary to avoid the case where an
1041
     enum appears with a constant FOO, then later a type named FOO appears,
1042
     too late to spot the conflict by checking the enum's constants.  */
1043
1044
0
  while ((err = ctf_dynset_next (all_enums, &i, &k)) == 0)
1045
0
    {
1046
0
      ctf_id_t enum_id = (uintptr_t) k;
1047
0
      ctf_next_t *i_constants = NULL;
1048
0
      const char *cte_name;
1049
1050
0
      while ((cte_name = ctf_enum_next (fp, enum_id, &i_constants, NULL)) != NULL)
1051
0
  {
1052
0
    if (ctf_track_enumerator (fp, enum_id, cte_name) < 0)
1053
0
      {
1054
0
        ctf_next_destroy (i_constants);
1055
0
        ctf_next_destroy (i);
1056
0
        return ctf_errno (fp);
1057
0
      }
1058
0
  }
1059
0
      if (ctf_errno (fp) != ECTF_NEXT_END)
1060
0
  {
1061
0
    ctf_next_destroy (i);
1062
0
    return ctf_errno (fp);
1063
0
  }
1064
0
    }
1065
0
  if (err != ECTF_NEXT_END)
1066
0
    return err;
1067
1068
0
  ctf_dprintf ("%zu enum names hashed\n",
1069
0
         ctf_dynhash_elements (fp->ctf_enums));
1070
0
  ctf_dprintf ("%zu conflicting enumerators identified\n",
1071
0
         ctf_dynset_elements (fp->ctf_conflicting_enums));
1072
0
  ctf_dprintf ("%zu struct names hashed (%d long)\n",
1073
0
         ctf_dynhash_elements (fp->ctf_structs), nlstructs);
1074
0
  ctf_dprintf ("%zu union names hashed (%d long)\n",
1075
0
         ctf_dynhash_elements (fp->ctf_unions), nlunions);
1076
0
  ctf_dprintf ("%zu base type names and identifiers hashed\n",
1077
0
         ctf_dynhash_elements (fp->ctf_names));
1078
1079
0
  return 0;
1080
0
}
1081
1082
/* Endianness-flipping routines.
1083
1084
   We flip everything, mindlessly, even 1-byte entities, so that future
1085
   expansions do not require changes to this code.  */
1086
1087
/* Flip the endianness of the CTF header.  */
1088
1089
void
1090
ctf_flip_header (ctf_header_t *cth)
1091
0
{
1092
0
  swap_thing (cth->cth_preamble.ctp_magic);
1093
0
  swap_thing (cth->cth_preamble.ctp_version);
1094
0
  swap_thing (cth->cth_preamble.ctp_flags);
1095
0
  swap_thing (cth->cth_parlabel);
1096
0
  swap_thing (cth->cth_parname);
1097
0
  swap_thing (cth->cth_cuname);
1098
0
  swap_thing (cth->cth_objtoff);
1099
0
  swap_thing (cth->cth_funcoff);
1100
0
  swap_thing (cth->cth_objtidxoff);
1101
0
  swap_thing (cth->cth_funcidxoff);
1102
0
  swap_thing (cth->cth_varoff);
1103
0
  swap_thing (cth->cth_typeoff);
1104
0
  swap_thing (cth->cth_stroff);
1105
0
  swap_thing (cth->cth_strlen);
1106
0
}
1107
1108
/* Flip the endianness of the label section, an array of ctf_lblent_t.  */
1109
1110
static void
1111
flip_lbls (void *start, size_t len)
1112
0
{
1113
0
  ctf_lblent_t *lbl = start;
1114
0
  ssize_t i;
1115
1116
0
  for (i = len / sizeof (struct ctf_lblent); i > 0; lbl++, i--)
1117
0
    {
1118
0
      swap_thing (lbl->ctl_label);
1119
0
      swap_thing (lbl->ctl_type);
1120
0
    }
1121
0
}
1122
1123
/* Flip the endianness of the data-object or function sections or their indexes,
1124
   all arrays of uint32_t.  */
1125
1126
static void
1127
flip_objts (void *start, size_t len)
1128
0
{
1129
0
  uint32_t *obj = start;
1130
0
  ssize_t i;
1131
1132
0
  for (i = len / sizeof (uint32_t); i > 0; obj++, i--)
1133
0
      swap_thing (*obj);
1134
0
}
1135
1136
/* Flip the endianness of the variable section, an array of ctf_varent_t.  */
1137
1138
static void
1139
flip_vars (void *start, size_t len)
1140
0
{
1141
0
  ctf_varent_t *var = start;
1142
0
  ssize_t i;
1143
1144
0
  for (i = len / sizeof (struct ctf_varent); i > 0; var++, i--)
1145
0
    {
1146
0
      swap_thing (var->ctv_name);
1147
0
      swap_thing (var->ctv_type);
1148
0
    }
1149
0
}
1150
1151
/* Flip the endianness of the type section, a tagged array of ctf_type or
1152
   ctf_stype followed by variable data.  */
1153
1154
static int
1155
flip_types (ctf_dict_t *fp, void *start, size_t len, int to_foreign)
1156
0
{
1157
0
  ctf_type_t *t = start;
1158
1159
0
  while ((uintptr_t) t < ((uintptr_t) start) + len)
1160
0
    {
1161
0
      uint32_t kind;
1162
0
      size_t size;
1163
0
      uint32_t vlen;
1164
0
      size_t vbytes;
1165
1166
0
      if (to_foreign)
1167
0
  {
1168
0
    kind = CTF_V2_INFO_KIND (t->ctt_info);
1169
0
    size = t->ctt_size;
1170
0
    vlen = CTF_V2_INFO_VLEN (t->ctt_info);
1171
0
    vbytes = get_vbytes_v2 (fp, kind, size, vlen);
1172
0
  }
1173
1174
0
      swap_thing (t->ctt_name);
1175
0
      swap_thing (t->ctt_info);
1176
0
      swap_thing (t->ctt_size);
1177
1178
0
      if (!to_foreign)
1179
0
  {
1180
0
    kind = CTF_V2_INFO_KIND (t->ctt_info);
1181
0
    size = t->ctt_size;
1182
0
    vlen = CTF_V2_INFO_VLEN (t->ctt_info);
1183
0
    vbytes = get_vbytes_v2 (fp, kind, size, vlen);
1184
0
  }
1185
1186
0
      if (_libctf_unlikely_ (size == CTF_LSIZE_SENT))
1187
0
  {
1188
0
    if (to_foreign)
1189
0
      size = CTF_TYPE_LSIZE (t);
1190
1191
0
    swap_thing (t->ctt_lsizehi);
1192
0
    swap_thing (t->ctt_lsizelo);
1193
1194
0
    if (!to_foreign)
1195
0
      size = CTF_TYPE_LSIZE (t);
1196
1197
0
    t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_type_t));
1198
0
  }
1199
0
      else
1200
0
  t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_stype_t));
1201
1202
0
      switch (kind)
1203
0
  {
1204
0
  case CTF_K_FORWARD:
1205
0
  case CTF_K_UNKNOWN:
1206
0
  case CTF_K_POINTER:
1207
0
  case CTF_K_TYPEDEF:
1208
0
  case CTF_K_VOLATILE:
1209
0
  case CTF_K_CONST:
1210
0
  case CTF_K_RESTRICT:
1211
    /* These types have no vlen data to swap.  */
1212
0
    assert (vbytes == 0);
1213
0
    break;
1214
1215
0
  case CTF_K_INTEGER:
1216
0
  case CTF_K_FLOAT:
1217
0
    {
1218
      /* These types have a single uint32_t.  */
1219
1220
0
      uint32_t *item = (uint32_t *) t;
1221
1222
0
      swap_thing (*item);
1223
0
      break;
1224
0
    }
1225
1226
0
  case CTF_K_FUNCTION:
1227
0
    {
1228
      /* This type has a bunch of uint32_ts.  */
1229
1230
0
      uint32_t *item = (uint32_t *) t;
1231
0
      ssize_t i;
1232
1233
0
      for (i = vlen; i > 0; item++, i--)
1234
0
        swap_thing (*item);
1235
0
      break;
1236
0
    }
1237
1238
0
  case CTF_K_ARRAY:
1239
0
    {
1240
      /* This has a single ctf_array_t.  */
1241
1242
0
      ctf_array_t *a = (ctf_array_t *) t;
1243
1244
0
      assert (vbytes == sizeof (ctf_array_t));
1245
0
      swap_thing (a->cta_contents);
1246
0
      swap_thing (a->cta_index);
1247
0
      swap_thing (a->cta_nelems);
1248
1249
0
      break;
1250
0
    }
1251
1252
0
  case CTF_K_SLICE:
1253
0
    {
1254
      /* This has a single ctf_slice_t.  */
1255
1256
0
      ctf_slice_t *s = (ctf_slice_t *) t;
1257
1258
0
      assert (vbytes == sizeof (ctf_slice_t));
1259
0
      swap_thing (s->cts_type);
1260
0
      swap_thing (s->cts_offset);
1261
0
      swap_thing (s->cts_bits);
1262
1263
0
      break;
1264
0
    }
1265
1266
0
  case CTF_K_STRUCT:
1267
0
  case CTF_K_UNION:
1268
0
    {
1269
      /* This has an array of ctf_member or ctf_lmember, depending on
1270
         size.  We could consider it to be a simple array of uint32_t,
1271
         but for safety's sake in case these structures ever acquire
1272
         non-uint32_t members, do it member by member.  */
1273
1274
0
      if (_libctf_unlikely_ (size >= CTF_LSTRUCT_THRESH))
1275
0
        {
1276
0
    ctf_lmember_t *lm = (ctf_lmember_t *) t;
1277
0
    ssize_t i;
1278
0
    for (i = vlen; i > 0; i--, lm++)
1279
0
      {
1280
0
        swap_thing (lm->ctlm_name);
1281
0
        swap_thing (lm->ctlm_offsethi);
1282
0
        swap_thing (lm->ctlm_type);
1283
0
        swap_thing (lm->ctlm_offsetlo);
1284
0
      }
1285
0
        }
1286
0
      else
1287
0
        {
1288
0
    ctf_member_t *m = (ctf_member_t *) t;
1289
0
    ssize_t i;
1290
0
    for (i = vlen; i > 0; i--, m++)
1291
0
      {
1292
0
        swap_thing (m->ctm_name);
1293
0
        swap_thing (m->ctm_offset);
1294
0
        swap_thing (m->ctm_type);
1295
0
      }
1296
0
        }
1297
0
      break;
1298
0
    }
1299
1300
0
  case CTF_K_ENUM:
1301
0
    {
1302
      /* This has an array of ctf_enum_t.  */
1303
1304
0
      ctf_enum_t *item = (ctf_enum_t *) t;
1305
0
      ssize_t i;
1306
1307
0
      for (i = vlen; i > 0; item++, i--)
1308
0
        {
1309
0
    swap_thing (item->cte_name);
1310
0
    swap_thing (item->cte_value);
1311
0
        }
1312
0
      break;
1313
0
    }
1314
0
  default:
1315
0
    ctf_err_warn (fp, 0, ECTF_CORRUPT,
1316
0
      _("unhandled CTF kind in endianness conversion: %x"),
1317
0
      kind);
1318
0
    return ECTF_CORRUPT;
1319
0
  }
1320
1321
0
      t = (ctf_type_t *) ((uintptr_t) t + vbytes);
1322
0
    }
1323
1324
0
  return 0;
1325
0
}
1326
1327
/* Flip the endianness of BUF, given the offsets in the (native-endianness) CTH.
1328
   If TO_FOREIGN is set, flip to foreign-endianness; if not, flip away.
1329
1330
   All of this stuff happens before the header is fully initialized, so the
1331
   LCTF_*() macros cannot be used yet.  Since we do not try to endian-convert v1
1332
   data, this is no real loss.  */
1333
1334
int
1335
ctf_flip (ctf_dict_t *fp, ctf_header_t *cth, unsigned char *buf,
1336
    int to_foreign)
1337
0
{
1338
0
  ctf_dprintf("flipping endianness\n");
1339
1340
0
  flip_lbls (buf + cth->cth_lbloff, cth->cth_objtoff - cth->cth_lbloff);
1341
0
  flip_objts (buf + cth->cth_objtoff, cth->cth_funcoff - cth->cth_objtoff);
1342
0
  flip_objts (buf + cth->cth_funcoff, cth->cth_objtidxoff - cth->cth_funcoff);
1343
0
  flip_objts (buf + cth->cth_objtidxoff, cth->cth_funcidxoff - cth->cth_objtidxoff);
1344
0
  flip_objts (buf + cth->cth_funcidxoff, cth->cth_varoff - cth->cth_funcidxoff);
1345
0
  flip_vars (buf + cth->cth_varoff, cth->cth_typeoff - cth->cth_varoff);
1346
0
  return flip_types (fp, buf + cth->cth_typeoff,
1347
0
         cth->cth_stroff - cth->cth_typeoff, to_foreign);
1348
0
}
1349
1350
/* Set up the ctl hashes in a ctf_dict_t.  Called by both writable and
1351
   non-writable dictionary initialization.  */
1352
void ctf_set_ctl_hashes (ctf_dict_t *fp)
1353
0
{
1354
  /* Initialize the ctf_lookup_by_name top-level dictionary.  We keep an
1355
     array of type name prefixes and the corresponding ctf_hash to use.  */
1356
0
  fp->ctf_lookups[0].ctl_prefix = "struct";
1357
0
  fp->ctf_lookups[0].ctl_len = strlen (fp->ctf_lookups[0].ctl_prefix);
1358
0
  fp->ctf_lookups[0].ctl_hash = fp->ctf_structs;
1359
0
  fp->ctf_lookups[1].ctl_prefix = "union";
1360
0
  fp->ctf_lookups[1].ctl_len = strlen (fp->ctf_lookups[1].ctl_prefix);
1361
0
  fp->ctf_lookups[1].ctl_hash = fp->ctf_unions;
1362
0
  fp->ctf_lookups[2].ctl_prefix = "enum";
1363
0
  fp->ctf_lookups[2].ctl_len = strlen (fp->ctf_lookups[2].ctl_prefix);
1364
0
  fp->ctf_lookups[2].ctl_hash = fp->ctf_enums;
1365
0
  fp->ctf_lookups[3].ctl_prefix = _CTF_NULLSTR;
1366
0
  fp->ctf_lookups[3].ctl_len = strlen (fp->ctf_lookups[3].ctl_prefix);
1367
0
  fp->ctf_lookups[3].ctl_hash = fp->ctf_names;
1368
0
  fp->ctf_lookups[4].ctl_prefix = NULL;
1369
0
  fp->ctf_lookups[4].ctl_len = 0;
1370
0
  fp->ctf_lookups[4].ctl_hash = NULL;
1371
0
}
1372
1373
/* Open a CTF file, mocking up a suitable ctf_sect.  */
1374
1375
ctf_dict_t *ctf_simple_open (const char *ctfsect, size_t ctfsect_size,
1376
           const char *symsect, size_t symsect_size,
1377
           size_t symsect_entsize,
1378
           const char *strsect, size_t strsect_size,
1379
           int *errp)
1380
0
{
1381
0
  ctf_sect_t skeleton;
1382
1383
0
  ctf_sect_t ctf_sect, sym_sect, str_sect;
1384
0
  ctf_sect_t *ctfsectp = NULL;
1385
0
  ctf_sect_t *symsectp = NULL;
1386
0
  ctf_sect_t *strsectp = NULL;
1387
1388
0
  skeleton.cts_name = _CTF_SECTION;
1389
0
  skeleton.cts_entsize = 1;
1390
1391
0
  if (ctfsect)
1392
0
    {
1393
0
      memcpy (&ctf_sect, &skeleton, sizeof (struct ctf_sect));
1394
0
      ctf_sect.cts_data = ctfsect;
1395
0
      ctf_sect.cts_size = ctfsect_size;
1396
0
      ctfsectp = &ctf_sect;
1397
0
    }
1398
1399
0
  if (symsect)
1400
0
    {
1401
0
      memcpy (&sym_sect, &skeleton, sizeof (struct ctf_sect));
1402
0
      sym_sect.cts_data = symsect;
1403
0
      sym_sect.cts_size = symsect_size;
1404
0
      sym_sect.cts_entsize = symsect_entsize;
1405
0
      symsectp = &sym_sect;
1406
0
    }
1407
1408
0
  if (strsect)
1409
0
    {
1410
0
      memcpy (&str_sect, &skeleton, sizeof (struct ctf_sect));
1411
0
      str_sect.cts_data = strsect;
1412
0
      str_sect.cts_size = strsect_size;
1413
0
      strsectp = &str_sect;
1414
0
    }
1415
1416
0
  return ctf_bufopen (ctfsectp, symsectp, strsectp, errp);
1417
0
}
1418
1419
/* Decode the specified CTF buffer and optional symbol table, and create a new
1420
   CTF dict representing the symbolic debugging information.  This code can
1421
   be used directly by the debugger, or it can be used as the engine for
1422
   ctf_fdopen() or ctf_open(), below.  */
1423
1424
ctf_dict_t *
1425
ctf_bufopen (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
1426
       const ctf_sect_t *strsect, int *errp)
1427
0
{
1428
0
  const ctf_preamble_t *pp;
1429
0
  size_t hdrsz = sizeof (ctf_header_t);
1430
0
  ctf_header_t *hp;
1431
0
  ctf_dict_t *fp;
1432
0
  int foreign_endian = 0;
1433
0
  int err;
1434
1435
0
  libctf_init_debug();
1436
1437
0
  ctf_set_open_errno (errp, 0);
1438
1439
0
  if ((ctfsect == NULL) || ((symsect != NULL) && (strsect == NULL)))
1440
0
    return (ctf_set_open_errno (errp, EINVAL));
1441
1442
0
  if (symsect != NULL && symsect->cts_entsize != sizeof (Elf32_Sym) &&
1443
0
      symsect->cts_entsize != sizeof (Elf64_Sym))
1444
0
    return (ctf_set_open_errno (errp, ECTF_SYMTAB));
1445
1446
0
  if (symsect != NULL && symsect->cts_data == NULL)
1447
0
    return (ctf_set_open_errno (errp, ECTF_SYMBAD));
1448
1449
0
  if (strsect != NULL && strsect->cts_data == NULL)
1450
0
    return (ctf_set_open_errno (errp, ECTF_STRBAD));
1451
1452
0
  if (ctfsect->cts_data == NULL
1453
0
      || ctfsect->cts_size < sizeof (ctf_preamble_t))
1454
0
    return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1455
1456
0
  pp = (const ctf_preamble_t *) ctfsect->cts_data;
1457
1458
0
  ctf_dprintf ("ctf_bufopen: magic=0x%x version=%u\n",
1459
0
         pp->ctp_magic, pp->ctp_version);
1460
1461
  /* Validate each part of the CTF header.
1462
1463
     First, we validate the preamble (common to all versions).  At that point,
1464
     we know the endianness and specific header version, and can validate the
1465
     version-specific parts including section offsets and alignments.  */
1466
1467
0
  if (_libctf_unlikely_ (pp->ctp_magic != CTF_MAGIC))
1468
0
    {
1469
0
      if (pp->ctp_magic == bswap_16 (CTF_MAGIC))
1470
0
  foreign_endian = 1;
1471
0
      else
1472
0
  return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1473
0
    }
1474
1475
0
  if (_libctf_unlikely_ ((pp->ctp_version < CTF_VERSION_1)
1476
0
       || (pp->ctp_version > CTF_VERSION_3)))
1477
0
    return (ctf_set_open_errno (errp, ECTF_CTFVERS));
1478
1479
0
  if ((symsect != NULL) && (pp->ctp_version < CTF_VERSION_2))
1480
0
    {
1481
      /* The symtab can contain function entries which contain embedded ctf
1482
   info.  We do not support dynamically upgrading such entries (none
1483
   should exist in any case, since dwarf2ctf does not create them).  */
1484
1485
0
      ctf_err_warn (NULL, 0, ECTF_NOTSUP, _("ctf_bufopen: CTF version %d "
1486
0
              "symsect not supported"),
1487
0
        pp->ctp_version);
1488
0
      return (ctf_set_open_errno (errp, ECTF_NOTSUP));
1489
0
    }
1490
1491
0
  if (pp->ctp_version < CTF_VERSION_3)
1492
0
    hdrsz = sizeof (ctf_header_v2_t);
1493
1494
0
  if (_libctf_unlikely_ (pp->ctp_flags > CTF_F_MAX))
1495
0
    {
1496
0
      ctf_err_warn (NULL, 0, ECTF_FLAGS, _("ctf_bufopen: invalid header "
1497
0
             "flags: %x"),
1498
0
        (unsigned int) pp->ctp_flags);
1499
0
      return (ctf_set_open_errno (errp, ECTF_FLAGS));
1500
0
    }
1501
1502
0
  if (ctfsect->cts_size < hdrsz)
1503
0
    return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1504
1505
0
  if ((fp = malloc (sizeof (ctf_dict_t))) == NULL)
1506
0
    return (ctf_set_open_errno (errp, ENOMEM));
1507
1508
0
  memset (fp, 0, sizeof (ctf_dict_t));
1509
1510
0
  if ((fp->ctf_header = malloc (sizeof (struct ctf_header))) == NULL)
1511
0
    {
1512
0
      free (fp);
1513
0
      return (ctf_set_open_errno (errp, ENOMEM));
1514
0
    }
1515
0
  hp = fp->ctf_header;
1516
0
  memcpy (hp, ctfsect->cts_data, hdrsz);
1517
0
  if (pp->ctp_version < CTF_VERSION_3)
1518
0
    upgrade_header (hp);
1519
1520
0
  if (foreign_endian)
1521
0
    ctf_flip_header (hp);
1522
0
  fp->ctf_openflags = hp->cth_flags;
1523
0
  fp->ctf_size = hp->cth_stroff + hp->cth_strlen;
1524
1525
0
  ctf_dprintf ("ctf_bufopen: uncompressed size=%lu\n",
1526
0
         (unsigned long) fp->ctf_size);
1527
1528
0
  if (hp->cth_lbloff > fp->ctf_size || hp->cth_objtoff > fp->ctf_size
1529
0
      || hp->cth_funcoff > fp->ctf_size || hp->cth_objtidxoff > fp->ctf_size
1530
0
      || hp->cth_funcidxoff > fp->ctf_size || hp->cth_typeoff > fp->ctf_size
1531
0
      || hp->cth_stroff > fp->ctf_size)
1532
0
    {
1533
0
      ctf_err_warn (NULL, 0, ECTF_CORRUPT, _("header offset exceeds CTF size"));
1534
0
      return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1535
0
    }
1536
1537
0
  if (hp->cth_lbloff > hp->cth_objtoff
1538
0
      || hp->cth_objtoff > hp->cth_funcoff
1539
0
      || hp->cth_funcoff > hp->cth_typeoff
1540
0
      || hp->cth_funcoff > hp->cth_objtidxoff
1541
0
      || hp->cth_objtidxoff > hp->cth_funcidxoff
1542
0
      || hp->cth_funcidxoff > hp->cth_varoff
1543
0
      || hp->cth_varoff > hp->cth_typeoff || hp->cth_typeoff > hp->cth_stroff)
1544
0
    {
1545
0
      ctf_err_warn (NULL, 0, ECTF_CORRUPT, _("overlapping CTF sections"));
1546
0
      return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1547
0
    }
1548
1549
0
  if ((hp->cth_lbloff & 3) || (hp->cth_objtoff & 2)
1550
0
      || (hp->cth_funcoff & 2) || (hp->cth_objtidxoff & 2)
1551
0
      || (hp->cth_funcidxoff & 2) || (hp->cth_varoff & 3)
1552
0
      || (hp->cth_typeoff & 3))
1553
0
    {
1554
0
      ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1555
0
        _("CTF sections not properly aligned"));
1556
0
      return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1557
0
    }
1558
1559
  /* This invariant will be lifted in v4, but for now it is true.  */
1560
1561
0
  if ((hp->cth_funcidxoff - hp->cth_objtidxoff != 0) &&
1562
0
      (hp->cth_funcidxoff - hp->cth_objtidxoff
1563
0
       != hp->cth_funcoff - hp->cth_objtoff))
1564
0
    {
1565
0
      ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1566
0
        _("Object index section is neither empty nor the "
1567
0
          "same length as the object section: %u versus %u "
1568
0
          "bytes"), hp->cth_funcoff - hp->cth_objtoff,
1569
0
        hp->cth_funcidxoff - hp->cth_objtidxoff);
1570
0
      return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1571
0
    }
1572
1573
0
  if ((hp->cth_varoff - hp->cth_funcidxoff != 0) &&
1574
0
      (hp->cth_varoff - hp->cth_funcidxoff
1575
0
       != hp->cth_objtidxoff - hp->cth_funcoff) &&
1576
0
      (hp->cth_flags & CTF_F_NEWFUNCINFO))
1577
0
    {
1578
0
      ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1579
0
        _("Function index section is neither empty nor the "
1580
0
          "same length as the function section: %u versus %u "
1581
0
          "bytes"), hp->cth_objtidxoff - hp->cth_funcoff,
1582
0
        hp->cth_varoff - hp->cth_funcidxoff);
1583
0
      return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1584
0
    }
1585
1586
  /* Once everything is determined to be valid, attempt to decompress the CTF
1587
     data buffer if it is compressed, or copy it into new storage if it is not
1588
     compressed but needs endian-flipping.  Otherwise we just put the data
1589
     section's buffer pointer into ctf_buf, below.  */
1590
1591
  /* Note: if this is a v1 buffer, it will be reallocated and expanded by
1592
     init_static_types().  */
1593
1594
0
  if (hp->cth_flags & CTF_F_COMPRESS)
1595
0
    {
1596
0
      size_t srclen;
1597
0
      uLongf dstlen;
1598
0
      const void *src;
1599
0
      int rc = Z_OK;
1600
1601
      /* We are allocating this ourselves, so we can drop the ctf header
1602
   copy in favour of ctf->ctf_header.  */
1603
1604
0
      if ((fp->ctf_base = malloc (fp->ctf_size)) == NULL)
1605
0
  {
1606
0
    err = ECTF_ZALLOC;
1607
0
    goto bad;
1608
0
  }
1609
0
      fp->ctf_dynbase = fp->ctf_base;
1610
0
      hp->cth_flags &= ~CTF_F_COMPRESS;
1611
1612
0
      src = (unsigned char *) ctfsect->cts_data + hdrsz;
1613
0
      srclen = ctfsect->cts_size - hdrsz;
1614
0
      dstlen = fp->ctf_size;
1615
0
      fp->ctf_buf = fp->ctf_base;
1616
1617
0
      if ((rc = uncompress (fp->ctf_base, &dstlen, src, srclen)) != Z_OK)
1618
0
  {
1619
0
    ctf_err_warn (NULL, 0, ECTF_DECOMPRESS, _("zlib inflate err: %s"),
1620
0
      zError (rc));
1621
0
    err = ECTF_DECOMPRESS;
1622
0
    goto bad;
1623
0
  }
1624
1625
0
      if ((size_t) dstlen != fp->ctf_size)
1626
0
  {
1627
0
    ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1628
0
      _("zlib inflate short: got %lu of %lu bytes"),
1629
0
      (unsigned long) dstlen, (unsigned long) fp->ctf_size);
1630
0
    err = ECTF_CORRUPT;
1631
0
    goto bad;
1632
0
  }
1633
0
    }
1634
0
  else
1635
0
    {
1636
0
      if (_libctf_unlikely_ (ctfsect->cts_size < hdrsz + fp->ctf_size))
1637
0
  {
1638
0
    ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1639
0
      _("%lu byte long CTF dictionary overruns %lu byte long CTF section"),
1640
0
      (unsigned long) ctfsect->cts_size,
1641
0
      (unsigned long) (hdrsz + fp->ctf_size));
1642
0
    err = ECTF_CORRUPT;
1643
0
    goto bad;
1644
0
  }
1645
1646
0
      if (foreign_endian)
1647
0
  {
1648
0
    if ((fp->ctf_base = malloc (fp->ctf_size)) == NULL)
1649
0
      {
1650
0
        err = ECTF_ZALLOC;
1651
0
        goto bad;
1652
0
      }
1653
0
    fp->ctf_dynbase = fp->ctf_base;
1654
0
    memcpy (fp->ctf_base, ((unsigned char *) ctfsect->cts_data) + hdrsz,
1655
0
      fp->ctf_size);
1656
0
    fp->ctf_buf = fp->ctf_base;
1657
0
  }
1658
0
      else
1659
0
  {
1660
    /* We are just using the section passed in -- but its header may
1661
       be an old version.  Point ctf_buf past the old header, and
1662
       never touch it again.  */
1663
0
    fp->ctf_base = (unsigned char *) ctfsect->cts_data;
1664
0
    fp->ctf_dynbase = NULL;
1665
0
    fp->ctf_buf = fp->ctf_base + hdrsz;
1666
0
  }
1667
0
    }
1668
1669
  /* Once we have uncompressed and validated the CTF data buffer, we can
1670
     proceed with initializing the ctf_dict_t we allocated above.
1671
1672
     Nothing that depends on buf or base should be set directly in this function
1673
     before the init_static_types() call, because it may be reallocated during
1674
     transparent upgrade if this recension of libctf is so configured: see
1675
     ctf_set_base().  */
1676
1677
0
  ctf_set_version (fp, hp, hp->cth_version);
1678
1679
  /* Temporary assignment, just enough to be able to initialize
1680
     the atoms table.  */
1681
1682
0
  fp->ctf_str[CTF_STRTAB_0].cts_strs = (const char *) fp->ctf_buf
1683
0
    + hp->cth_stroff;
1684
0
  fp->ctf_str[CTF_STRTAB_0].cts_len = hp->cth_strlen;
1685
0
  if (ctf_str_create_atoms (fp) < 0)
1686
0
    {
1687
0
      err = ENOMEM;
1688
0
      goto bad;
1689
0
    }
1690
1691
0
  fp->ctf_parmax = CTF_MAX_PTYPE;
1692
0
  memcpy (&fp->ctf_data, ctfsect, sizeof (ctf_sect_t));
1693
1694
0
  if (symsect != NULL)
1695
0
    {
1696
0
      memcpy (&fp->ctf_ext_symtab, symsect, sizeof (ctf_sect_t));
1697
0
      memcpy (&fp->ctf_ext_strtab, strsect, sizeof (ctf_sect_t));
1698
0
    }
1699
1700
0
  if (fp->ctf_data.cts_name != NULL)
1701
0
    if ((fp->ctf_data.cts_name = strdup (fp->ctf_data.cts_name)) == NULL)
1702
0
      {
1703
0
  err = ENOMEM;
1704
0
  goto bad;
1705
0
      }
1706
0
  if (fp->ctf_ext_symtab.cts_name != NULL)
1707
0
    if ((fp->ctf_ext_symtab.cts_name = strdup (fp->ctf_ext_symtab.cts_name)) == NULL)
1708
0
      {
1709
0
  err = ENOMEM;
1710
0
  goto bad;
1711
0
      }
1712
0
  if (fp->ctf_ext_strtab.cts_name != NULL)
1713
0
    if ((fp->ctf_ext_strtab.cts_name = strdup (fp->ctf_ext_strtab.cts_name)) == NULL)
1714
0
      {
1715
0
  err = ENOMEM;
1716
0
  goto bad;
1717
0
      }
1718
1719
0
  if (fp->ctf_data.cts_name == NULL)
1720
0
    fp->ctf_data.cts_name = _CTF_NULLSTR;
1721
0
  if (fp->ctf_ext_symtab.cts_name == NULL)
1722
0
    fp->ctf_ext_symtab.cts_name = _CTF_NULLSTR;
1723
0
  if (fp->ctf_ext_strtab.cts_name == NULL)
1724
0
    fp->ctf_ext_strtab.cts_name = _CTF_NULLSTR;
1725
1726
0
  if (strsect != NULL)
1727
0
    {
1728
0
      fp->ctf_str[CTF_STRTAB_1].cts_strs = strsect->cts_data;
1729
0
      fp->ctf_str[CTF_STRTAB_1].cts_len = strsect->cts_size;
1730
0
    }
1731
1732
  /* Dynamic state, for dynamic addition to this dict after loading.  */
1733
1734
0
  fp->ctf_dthash = ctf_dynhash_create (ctf_hash_integer, ctf_hash_eq_integer,
1735
0
               NULL, NULL);
1736
0
  fp->ctf_dvhash = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
1737
0
               NULL, NULL);
1738
0
  fp->ctf_snapshots = 1;
1739
1740
0
  fp->ctf_objthash = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
1741
0
             free, NULL);
1742
0
  fp->ctf_funchash = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
1743
0
           free, NULL);
1744
1745
0
  if (!fp->ctf_dthash || !fp->ctf_dvhash || !fp->ctf_snapshots ||
1746
0
      !fp->ctf_objthash || !fp->ctf_funchash)
1747
0
    {
1748
0
      err = ENOMEM;
1749
0
      goto bad;
1750
0
    }
1751
1752
0
  if (foreign_endian &&
1753
0
      (err = ctf_flip (fp, hp, fp->ctf_buf, 0)) != 0)
1754
0
    {
1755
      /* We can be certain that ctf_flip() will have endian-flipped everything
1756
   other than the types table when we return.  In particular the header
1757
   is fine, so set it, to allow freeing to use the usual code path.  */
1758
1759
0
      ctf_set_base (fp, hp, fp->ctf_base);
1760
0
      goto bad;
1761
0
    }
1762
1763
0
  ctf_set_base (fp, hp, fp->ctf_base);
1764
1765
0
  if ((err = init_static_types (fp, hp)) != 0)
1766
0
    goto bad;
1767
1768
  /* Allocate and initialize the symtab translation table, pointed to by
1769
     ctf_sxlate, and the corresponding index sections.  This table may be too
1770
     large for the actual size of the object and function info sections: if so,
1771
     ctf_nsyms will be adjusted and the excess will never be used.  It's
1772
     possible to do indexed symbol lookups even without a symbol table, so check
1773
     even in that case.  Initially, we assume the symtab is native-endian: if it
1774
     isn't, the caller will inform us later by calling ctf_symsect_endianness.  */
1775
#ifdef WORDS_BIGENDIAN
1776
  fp->ctf_symsect_little_endian = 0;
1777
#else
1778
0
  fp->ctf_symsect_little_endian = 1;
1779
0
#endif
1780
1781
0
  if (symsect != NULL)
1782
0
    {
1783
0
      fp->ctf_nsyms = symsect->cts_size / symsect->cts_entsize;
1784
0
      fp->ctf_sxlate = malloc (fp->ctf_nsyms * sizeof (uint32_t));
1785
1786
0
      if (fp->ctf_sxlate == NULL)
1787
0
  {
1788
0
    err = ENOMEM;
1789
0
    goto bad;
1790
0
  }
1791
0
    }
1792
1793
0
  if ((err = init_symtab (fp, hp, symsect)) != 0)
1794
0
    goto bad;
1795
1796
0
  ctf_set_ctl_hashes (fp);
1797
1798
0
  if (symsect != NULL)
1799
0
    {
1800
0
      if (symsect->cts_entsize == sizeof (Elf64_Sym))
1801
0
  (void) ctf_setmodel (fp, CTF_MODEL_LP64);
1802
0
      else
1803
0
  (void) ctf_setmodel (fp, CTF_MODEL_ILP32);
1804
0
    }
1805
0
  else
1806
0
    (void) ctf_setmodel (fp, CTF_MODEL_NATIVE);
1807
1808
0
  fp->ctf_refcnt = 1;
1809
0
  return fp;
1810
1811
0
bad:
1812
0
  ctf_set_open_errno (errp, err);
1813
0
  ctf_err_warn_to_open (fp);
1814
  /* Without this, the refcnt is zero on entry and ctf_dict_close() won't
1815
     actually do anything on the grounds that this is a recursive call via
1816
     another dict being closed.  */
1817
0
  fp->ctf_refcnt = 1;
1818
0
  ctf_dict_close (fp);
1819
0
  return NULL;
1820
0
}
1821
1822
/* Bump the refcount on the specified CTF dict, to allow export of ctf_dict_t's
1823
   from iterators that open and close the ctf_dict_t around the loop.  (This
1824
   does not extend their lifetime beyond that of the ctf_archive_t in which they
1825
   are contained.)  */
1826
1827
void
1828
ctf_ref (ctf_dict_t *fp)
1829
0
{
1830
0
  fp->ctf_refcnt++;
1831
0
}
1832
1833
/* Close the specified CTF dict and free associated data structures.  Note that
1834
   ctf_dict_close() is a reference counted operation: if the specified file is
1835
   the parent of other active dict, its reference count will be greater than one
1836
   and it will be freed later when no active children exist.  */
1837
1838
void
1839
ctf_dict_close (ctf_dict_t *fp)
1840
0
{
1841
0
  ctf_dtdef_t *dtd, *ntd;
1842
0
  ctf_dvdef_t *dvd, *nvd;
1843
0
  ctf_in_flight_dynsym_t *did, *nid;
1844
0
  ctf_err_warning_t *err, *nerr;
1845
1846
0
  if (fp == NULL)
1847
0
    return;      /* Allow ctf_dict_close(NULL) to simplify caller code.  */
1848
1849
0
  ctf_dprintf ("ctf_dict_close(%p) refcnt=%u\n", (void *) fp, fp->ctf_refcnt);
1850
1851
0
  if (fp->ctf_refcnt > 1)
1852
0
    {
1853
0
      fp->ctf_refcnt--;
1854
0
      return;
1855
0
    }
1856
1857
  /* It is possible to recurse back in here, notably if dicts in the
1858
     ctf_link_inputs or ctf_link_outputs cite this dict as a parent without
1859
     using ctf_import_unref.  Do nothing in that case.  */
1860
0
  if (fp->ctf_refcnt == 0)
1861
0
    return;
1862
1863
0
  fp->ctf_refcnt--;
1864
0
  free (fp->ctf_dyncuname);
1865
0
  free (fp->ctf_dynparname);
1866
0
  if (fp->ctf_parent && !fp->ctf_parent_unreffed)
1867
0
    ctf_dict_close (fp->ctf_parent);
1868
1869
0
  for (dtd = ctf_list_next (&fp->ctf_dtdefs); dtd != NULL; dtd = ntd)
1870
0
    {
1871
0
      ntd = ctf_list_next (dtd);
1872
0
      ctf_dtd_delete (fp, dtd);
1873
0
    }
1874
0
  ctf_dynhash_destroy (fp->ctf_dthash);
1875
1876
0
  ctf_dynset_destroy (fp->ctf_conflicting_enums);
1877
0
  ctf_dynhash_destroy (fp->ctf_structs);
1878
0
  ctf_dynhash_destroy (fp->ctf_unions);
1879
0
  ctf_dynhash_destroy (fp->ctf_enums);
1880
0
  ctf_dynhash_destroy (fp->ctf_names);
1881
1882
0
  for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
1883
0
    {
1884
0
      nvd = ctf_list_next (dvd);
1885
0
      ctf_dvd_delete (fp, dvd);
1886
0
    }
1887
0
  ctf_dynhash_destroy (fp->ctf_dvhash);
1888
1889
0
  ctf_dynhash_destroy (fp->ctf_symhash_func);
1890
0
  ctf_dynhash_destroy (fp->ctf_symhash_objt);
1891
0
  free (fp->ctf_funcidx_sxlate);
1892
0
  free (fp->ctf_objtidx_sxlate);
1893
0
  ctf_dynhash_destroy (fp->ctf_objthash);
1894
0
  ctf_dynhash_destroy (fp->ctf_funchash);
1895
0
  free (fp->ctf_dynsymidx);
1896
0
  ctf_dynhash_destroy (fp->ctf_dynsyms);
1897
0
  for (did = ctf_list_next (&fp->ctf_in_flight_dynsyms); did != NULL; did = nid)
1898
0
    {
1899
0
      nid = ctf_list_next (did);
1900
0
      ctf_list_delete (&fp->ctf_in_flight_dynsyms, did);
1901
0
      free (did);
1902
0
    }
1903
1904
0
  ctf_str_free_atoms (fp);
1905
0
  free (fp->ctf_tmp_typeslice);
1906
1907
0
  if (fp->ctf_data.cts_name != _CTF_NULLSTR)
1908
0
    free ((char *) fp->ctf_data.cts_name);
1909
1910
0
  if (fp->ctf_ext_symtab.cts_name != _CTF_NULLSTR)
1911
0
    free ((char *) fp->ctf_ext_symtab.cts_name);
1912
1913
0
  if (fp->ctf_ext_strtab.cts_name != _CTF_NULLSTR)
1914
0
    free ((char *) fp->ctf_ext_strtab.cts_name);
1915
0
  else if (fp->ctf_data_mmapped)
1916
0
    ctf_munmap (fp->ctf_data_mmapped, fp->ctf_data_mmapped_len);
1917
1918
0
  free (fp->ctf_dynbase);
1919
1920
0
  ctf_dynhash_destroy (fp->ctf_syn_ext_strtab);
1921
0
  ctf_dynhash_destroy (fp->ctf_link_inputs);
1922
0
  ctf_dynhash_destroy (fp->ctf_link_outputs);
1923
0
  ctf_dynhash_destroy (fp->ctf_link_type_mapping);
1924
0
  ctf_dynhash_destroy (fp->ctf_link_in_cu_mapping);
1925
0
  ctf_dynhash_destroy (fp->ctf_link_out_cu_mapping);
1926
0
  ctf_dynhash_destroy (fp->ctf_add_processing);
1927
0
  ctf_dedup_fini (fp, NULL, 0);
1928
0
  ctf_dynset_destroy (fp->ctf_dedup_atoms_alloc);
1929
1930
0
  for (err = ctf_list_next (&fp->ctf_errs_warnings); err != NULL; err = nerr)
1931
0
    {
1932
0
      nerr = ctf_list_next (err);
1933
0
      ctf_list_delete (&fp->ctf_errs_warnings, err);
1934
0
      free (err->cew_text);
1935
0
      free (err);
1936
0
    }
1937
1938
0
  free (fp->ctf_sxlate);
1939
0
  free (fp->ctf_txlate);
1940
0
  free (fp->ctf_ptrtab);
1941
0
  free (fp->ctf_pptrtab);
1942
1943
0
  free (fp->ctf_header);
1944
0
  free (fp);
1945
0
}
1946
1947
/* Backward compatibility.  */
1948
void
1949
ctf_file_close (ctf_file_t *fp)
1950
0
{
1951
0
  ctf_dict_close (fp);
1952
0
}
1953
1954
/* The converse of ctf_open().  ctf_open() disguises whatever it opens as an
1955
   archive, so closing one is just like closing an archive.  */
1956
void
1957
ctf_close (ctf_archive_t *arc)
1958
0
{
1959
0
  ctf_arc_close (arc);
1960
0
}
1961
1962
/* Get the CTF archive from which this ctf_dict_t is derived.  */
1963
ctf_archive_t *
1964
ctf_get_arc (const ctf_dict_t *fp)
1965
0
{
1966
0
  return fp->ctf_archive;
1967
0
}
1968
1969
/* Return the ctfsect out of the core ctf_impl.  Useful for freeing the
1970
   ctfsect's data * after ctf_dict_close(), which is why we return the actual
1971
   structure, not a pointer to it, since that is likely to become a pointer to
1972
   freed data before the return value is used under the expected use case of
1973
   ctf_getsect()/ ctf_dict_close()/free().  */
1974
ctf_sect_t
1975
ctf_getdatasect (const ctf_dict_t *fp)
1976
0
{
1977
0
  return fp->ctf_data;
1978
0
}
1979
1980
ctf_sect_t
1981
ctf_getsymsect (const ctf_dict_t *fp)
1982
0
{
1983
0
  return fp->ctf_ext_symtab;
1984
0
}
1985
1986
ctf_sect_t
1987
ctf_getstrsect (const ctf_dict_t *fp)
1988
0
{
1989
0
  return fp->ctf_ext_strtab;
1990
0
}
1991
1992
/* Set the endianness of the symbol table attached to FP.  */
1993
void
1994
ctf_symsect_endianness (ctf_dict_t *fp, int little_endian)
1995
0
{
1996
0
  int old_endianness = fp->ctf_symsect_little_endian;
1997
1998
0
  fp->ctf_symsect_little_endian = !!little_endian;
1999
2000
  /* If we already have a symtab translation table, we need to repopulate it if
2001
     our idea of the endianness has changed.  */
2002
2003
0
  if (old_endianness != fp->ctf_symsect_little_endian
2004
0
      && fp->ctf_sxlate != NULL && fp->ctf_ext_symtab.cts_data != NULL)
2005
0
    assert (init_symtab (fp, fp->ctf_header, &fp->ctf_ext_symtab) == 0);
2006
0
}
2007
2008
/* Return the CTF handle for the parent CTF dict, if one exists.  Otherwise
2009
   return NULL to indicate this dict has no imported parent.  */
2010
ctf_dict_t *
2011
ctf_parent_dict (ctf_dict_t *fp)
2012
0
{
2013
0
  return fp->ctf_parent;
2014
0
}
2015
2016
/* Backward compatibility.  */
2017
ctf_dict_t *
2018
ctf_parent_file (ctf_dict_t *fp)
2019
0
{
2020
0
  return ctf_parent_dict (fp);
2021
0
}
2022
2023
/* Return the name of the parent CTF dict, if one exists, or NULL otherwise.  */
2024
const char *
2025
ctf_parent_name (ctf_dict_t *fp)
2026
0
{
2027
0
  return fp->ctf_parname;
2028
0
}
2029
2030
/* Set the parent name.  It is an error to call this routine without calling
2031
   ctf_import() at some point.  */
2032
int
2033
ctf_parent_name_set (ctf_dict_t *fp, const char *name)
2034
0
{
2035
0
  if (fp->ctf_dynparname != NULL)
2036
0
    free (fp->ctf_dynparname);
2037
2038
0
  if ((fp->ctf_dynparname = strdup (name)) == NULL)
2039
0
    return (ctf_set_errno (fp, ENOMEM));
2040
0
  fp->ctf_parname = fp->ctf_dynparname;
2041
0
  return 0;
2042
0
}
2043
2044
/* Return the name of the compilation unit this CTF file applies to.  Usually
2045
   non-NULL only for non-parent dicts.  */
2046
const char *
2047
ctf_cuname (ctf_dict_t *fp)
2048
0
{
2049
0
  return fp->ctf_cuname;
2050
0
}
2051
2052
/* Set the compilation unit name.  */
2053
int
2054
ctf_cuname_set (ctf_dict_t *fp, const char *name)
2055
0
{
2056
0
  if (fp->ctf_dyncuname != NULL)
2057
0
    free (fp->ctf_dyncuname);
2058
2059
0
  if ((fp->ctf_dyncuname = strdup (name)) == NULL)
2060
0
    return (ctf_set_errno (fp, ENOMEM));
2061
0
  fp->ctf_cuname = fp->ctf_dyncuname;
2062
0
  return 0;
2063
0
}
2064
2065
/* Import the types from the specified parent dict by storing a pointer to it in
2066
   ctf_parent and incrementing its reference count.  Only one parent is allowed:
2067
   if a parent already exists, it is replaced by the new parent.  The pptrtab
2068
   is wiped, and will be refreshed by the next ctf_lookup_by_name call.  */
2069
int
2070
ctf_import (ctf_dict_t *fp, ctf_dict_t *pfp)
2071
0
{
2072
0
  if (fp == NULL || fp == pfp || (pfp != NULL && pfp->ctf_refcnt == 0))
2073
0
    return (ctf_set_errno (fp, EINVAL));
2074
2075
0
  if (pfp != NULL && pfp->ctf_dmodel != fp->ctf_dmodel)
2076
0
    return (ctf_set_errno (fp, ECTF_DMODEL));
2077
2078
0
  if (fp->ctf_parent && !fp->ctf_parent_unreffed)
2079
0
    ctf_dict_close (fp->ctf_parent);
2080
0
  fp->ctf_parent = NULL;
2081
2082
0
  free (fp->ctf_pptrtab);
2083
0
  fp->ctf_pptrtab = NULL;
2084
0
  fp->ctf_pptrtab_len = 0;
2085
0
  fp->ctf_pptrtab_typemax = 0;
2086
2087
0
  if (pfp != NULL)
2088
0
    {
2089
0
      int err;
2090
2091
0
      if (fp->ctf_parname == NULL)
2092
0
  if ((err = ctf_parent_name_set (fp, "PARENT")) < 0)
2093
0
    return err;
2094
2095
0
      fp->ctf_flags |= LCTF_CHILD;
2096
0
      pfp->ctf_refcnt++;
2097
0
      fp->ctf_parent_unreffed = 0;
2098
0
    }
2099
2100
0
  fp->ctf_parent = pfp;
2101
0
  return 0;
2102
0
}
2103
2104
/* Like ctf_import, but does not increment the refcount on the imported parent
2105
   or close it at any point: as a result it can go away at any time and the
2106
   caller must do all freeing itself.  Used internally to avoid refcount
2107
   loops.  */
2108
int
2109
ctf_import_unref (ctf_dict_t *fp, ctf_dict_t *pfp)
2110
0
{
2111
0
  if (fp == NULL || fp == pfp || (pfp != NULL && pfp->ctf_refcnt == 0))
2112
0
    return (ctf_set_errno (fp, EINVAL));
2113
2114
0
  if (pfp != NULL && pfp->ctf_dmodel != fp->ctf_dmodel)
2115
0
    return (ctf_set_errno (fp, ECTF_DMODEL));
2116
2117
0
  if (fp->ctf_parent && !fp->ctf_parent_unreffed)
2118
0
    ctf_dict_close (fp->ctf_parent);
2119
0
  fp->ctf_parent = NULL;
2120
2121
0
  free (fp->ctf_pptrtab);
2122
0
  fp->ctf_pptrtab = NULL;
2123
0
  fp->ctf_pptrtab_len = 0;
2124
0
  fp->ctf_pptrtab_typemax = 0;
2125
0
  if (pfp != NULL)
2126
0
    {
2127
0
      int err;
2128
2129
0
      if (fp->ctf_parname == NULL)
2130
0
  if ((err = ctf_parent_name_set (fp, "PARENT")) < 0)
2131
0
    return err;
2132
2133
0
      fp->ctf_flags |= LCTF_CHILD;
2134
0
      fp->ctf_parent_unreffed = 1;
2135
0
    }
2136
2137
0
  fp->ctf_parent = pfp;
2138
0
  return 0;
2139
0
}
2140
2141
/* Set the data model constant for the CTF dict.  */
2142
int
2143
ctf_setmodel (ctf_dict_t *fp, int model)
2144
0
{
2145
0
  const ctf_dmodel_t *dp;
2146
2147
0
  for (dp = _libctf_models; dp->ctd_name != NULL; dp++)
2148
0
    {
2149
0
      if (dp->ctd_code == model)
2150
0
  {
2151
0
    fp->ctf_dmodel = dp;
2152
0
    return 0;
2153
0
  }
2154
0
    }
2155
2156
0
  return (ctf_set_errno (fp, EINVAL));
2157
0
}
2158
2159
/* Return the data model constant for the CTF dict.  */
2160
int
2161
ctf_getmodel (ctf_dict_t *fp)
2162
0
{
2163
0
  return fp->ctf_dmodel->ctd_code;
2164
0
}
2165
2166
/* The caller can hang an arbitrary pointer off each ctf_dict_t using this
2167
   function.  */
2168
void
2169
ctf_setspecific (ctf_dict_t *fp, void *data)
2170
0
{
2171
0
  fp->ctf_specific = data;
2172
0
}
2173
2174
/* Retrieve the arbitrary pointer again.  */
2175
void *
2176
ctf_getspecific (ctf_dict_t *fp)
2177
0
{
2178
0
  return fp->ctf_specific;
2179
0
}