Coverage Report

Created: 2026-07-12 09:22

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.  */
758
0
      if (kind == CTF_K_FORWARD)
759
0
  pop[tp->ctt_type]++;
760
761
0
      tp = (ctf_type_t *) ((uintptr_t) tp + increment + vbytes);
762
0
      pop[kind]++;
763
764
0
      if (kind == CTF_K_ENUM)
765
0
  pop_enumerators += vlen;
766
0
    }
767
768
0
  if (child)
769
0
    {
770
0
      ctf_dprintf ("CTF dict %p is a child\n", (void *) fp);
771
0
      fp->ctf_flags |= LCTF_CHILD;
772
0
    }
773
0
  else
774
0
    ctf_dprintf ("CTF dict %p is a parent\n", (void *) fp);
775
776
  /* Now that we've counted up the number of each type, we can allocate
777
     the hash tables, type translation table, and pointer table.  */
778
779
0
  if ((fp->ctf_structs
780
0
       = ctf_dynhash_create_sized (pop[CTF_K_STRUCT], ctf_hash_string,
781
0
           ctf_hash_eq_string, NULL, NULL)) == NULL)
782
0
    return ENOMEM;
783
784
0
  if ((fp->ctf_unions
785
0
       = ctf_dynhash_create_sized (pop[CTF_K_UNION], ctf_hash_string,
786
0
           ctf_hash_eq_string, NULL, NULL)) == NULL)
787
0
    return ENOMEM;
788
789
0
  if ((fp->ctf_enums
790
0
       = ctf_dynhash_create_sized (pop[CTF_K_ENUM], ctf_hash_string,
791
0
           ctf_hash_eq_string, NULL, NULL)) == NULL)
792
0
    return ENOMEM;
793
794
0
  if ((fp->ctf_names
795
0
       = ctf_dynhash_create_sized (pop[CTF_K_UNKNOWN] +
796
0
           pop[CTF_K_INTEGER] +
797
0
           pop[CTF_K_FLOAT] +
798
0
           pop[CTF_K_FUNCTION] +
799
0
           pop[CTF_K_TYPEDEF] +
800
0
           pop[CTF_K_POINTER] +
801
0
           pop[CTF_K_VOLATILE] +
802
0
           pop[CTF_K_CONST] +
803
0
           pop[CTF_K_RESTRICT] +
804
0
           pop_enumerators,
805
0
           ctf_hash_string,
806
0
           ctf_hash_eq_string, NULL, NULL)) == NULL)
807
0
    return ENOMEM;
808
809
0
  if ((fp->ctf_conflicting_enums
810
0
       = ctf_dynset_create (htab_hash_string, htab_eq_string, NULL)) == NULL)
811
0
    return ENOMEM;
812
813
  /* The ptrtab and txlate can be appropriately sized for precisely this set
814
     of types: the txlate because it is only used to look up static types,
815
     so dynamic types added later will never go through it, and the ptrtab
816
     because later-added types will call grow_ptrtab() automatically, as
817
     needed.  */
818
819
0
  fp->ctf_txlate = malloc (sizeof (uint32_t) * (typemax + 1));
820
0
  fp->ctf_ptrtab_len = typemax + 1;
821
0
  fp->ctf_ptrtab = malloc (sizeof (uint32_t) * fp->ctf_ptrtab_len);
822
0
  fp->ctf_stypes = typemax;
823
824
0
  if (fp->ctf_txlate == NULL || fp->ctf_ptrtab == NULL)
825
0
    return ENOMEM;   /* Memory allocation failed.  */
826
827
0
  xp = fp->ctf_txlate;
828
0
  *xp++ = 0;      /* Type id 0 is used as a sentinel value.  */
829
830
0
  memset (fp->ctf_txlate, 0, sizeof (uint32_t) * (typemax + 1));
831
0
  memset (fp->ctf_ptrtab, 0, sizeof (uint32_t) * (typemax + 1));
832
833
  /* In the second pass through the types, we fill in each entry of the
834
     type and pointer tables and add names to the appropriate hashes.
835
836
     (Not all names are added in this pass, only type names.  See below.)
837
838
     Bump ctf_typemax as we go, but keep it one higher than normal, so that
839
     the type being read in is considered a valid type and it is at least
840
     barely possible to run simple lookups on it.  */
841
842
0
  for (id = 1, fp->ctf_typemax = 1, tp = tbuf; tp < tend; xp++, id++, fp->ctf_typemax++)
843
0
    {
844
0
      unsigned short kind = LCTF_INFO_KIND (fp, tp->ctt_info);
845
0
      unsigned short isroot = LCTF_INFO_ISROOT (fp, tp->ctt_info);
846
0
      unsigned long vlen = LCTF_INFO_VLEN (fp, tp->ctt_info);
847
0
      ssize_t size, increment, vbytes;
848
849
0
      const char *name;
850
851
0
      (void) ctf_get_ctt_size (fp, tp, &size, &increment);
852
0
      name = ctf_strptr (fp, tp->ctt_name);
853
      /* Cannot fail: shielded by call in loop above.  */
854
0
      vbytes = LCTF_VBYTES (fp, kind, size, vlen);
855
856
0
      *xp = (uint32_t) ((uintptr_t) tp - (uintptr_t) fp->ctf_buf);
857
858
0
      switch (kind)
859
0
  {
860
0
  case CTF_K_UNKNOWN:
861
0
  case CTF_K_INTEGER:
862
0
  case CTF_K_FLOAT:
863
0
    {
864
0
      ctf_id_t existing;
865
0
      ctf_encoding_t existing_en;
866
0
      ctf_encoding_t this_en;
867
868
0
      if (!isroot)
869
0
        break;
870
871
      /* Names are reused by bitfields, which are differentiated by
872
         their encodings.  So check for the type already existing, and
873
         iff the new type is a root-visible non-bitfield, replace the
874
         old one.  It's a little hard to figure out whether a type is
875
         a non-bitfield without already knowing that type's native
876
         width, but we can converge on it by replacing an existing
877
         type as long as the new type is zero-offset and has a
878
         bit-width wider than the existing one, since the native type
879
         must necessarily have a bit-width at least as wide as any
880
         bitfield based on it. */
881
882
0
      if (((existing = ctf_dynhash_lookup_type (fp->ctf_names, name)) == 0)
883
0
    || ctf_type_encoding (fp, existing, &existing_en) != 0
884
0
    || (ctf_type_encoding (fp, LCTF_INDEX_TO_TYPE (fp, id, child), &this_en) == 0
885
0
        && this_en.cte_offset == 0
886
0
        && (existing_en.cte_offset != 0
887
0
      || existing_en.cte_bits < this_en.cte_bits)))
888
0
        {
889
0
    err = ctf_dynhash_insert_type (fp, fp->ctf_names,
890
0
                 LCTF_INDEX_TO_TYPE (fp, id, child),
891
0
                 tp->ctt_name);
892
0
    if (err != 0)
893
0
      return err * -1;
894
0
        }
895
0
      break;
896
0
    }
897
898
    /* These kinds have no name, so do not need interning into any
899
       hashtables.  */
900
0
  case CTF_K_ARRAY:
901
0
  case CTF_K_SLICE:
902
0
    break;
903
904
0
  case CTF_K_FUNCTION:
905
0
    if (!isroot)
906
0
      break;
907
908
0
    err = ctf_dynhash_insert_type (fp, fp->ctf_names,
909
0
           LCTF_INDEX_TO_TYPE (fp, id, child),
910
0
           tp->ctt_name);
911
0
    if (err != 0)
912
0
      return err * -1;
913
0
    break;
914
915
0
  case CTF_K_STRUCT:
916
0
    if (size >= CTF_LSTRUCT_THRESH)
917
0
      nlstructs++;
918
919
0
    if (!isroot)
920
0
      break;
921
922
0
    err = ctf_dynhash_insert_type (fp, fp->ctf_structs,
923
0
           LCTF_INDEX_TO_TYPE (fp, id, child),
924
0
           tp->ctt_name);
925
926
0
    if (err != 0)
927
0
      return err * -1;
928
929
0
    break;
930
931
0
  case CTF_K_UNION:
932
0
    if (size >= CTF_LSTRUCT_THRESH)
933
0
      nlunions++;
934
935
0
    if (!isroot)
936
0
      break;
937
938
0
    err = ctf_dynhash_insert_type (fp, fp->ctf_unions,
939
0
           LCTF_INDEX_TO_TYPE (fp, id, child),
940
0
           tp->ctt_name);
941
942
0
    if (err != 0)
943
0
      return err * -1;
944
0
    break;
945
946
0
  case CTF_K_ENUM:
947
0
    {
948
0
      if (!isroot)
949
0
        break;
950
951
0
      err = ctf_dynhash_insert_type (fp, fp->ctf_enums,
952
0
             LCTF_INDEX_TO_TYPE (fp, id, child),
953
0
             tp->ctt_name);
954
955
0
      if (err != 0)
956
0
        return err * -1;
957
958
      /* Remember all enums for later rescanning.  */
959
960
0
      err = ctf_dynset_insert (all_enums, (void *) (ptrdiff_t)
961
0
             LCTF_INDEX_TO_TYPE (fp, id, child));
962
0
      if (err != 0)
963
0
        return err * -1;
964
0
      break;
965
0
    }
966
967
0
  case CTF_K_TYPEDEF:
968
0
    if (!isroot)
969
0
      break;
970
971
0
    err = ctf_dynhash_insert_type (fp, fp->ctf_names,
972
0
           LCTF_INDEX_TO_TYPE (fp, id, child),
973
0
           tp->ctt_name);
974
0
    if (err != 0)
975
0
      return err * -1;
976
0
    break;
977
978
0
  case CTF_K_FORWARD:
979
0
    {
980
0
      ctf_dynhash_t *h = ctf_name_table (fp, tp->ctt_type);
981
982
0
      if (!isroot)
983
0
        break;
984
985
      /* Only insert forward tags into the given hash if the type or tag
986
         name is not already present.  */
987
0
      if (ctf_dynhash_lookup_type (h, name) == 0)
988
0
        {
989
0
    err = ctf_dynhash_insert_type (fp, h, LCTF_INDEX_TO_TYPE (fp, id, child),
990
0
                 tp->ctt_name);
991
0
    if (err != 0)
992
0
      return err * -1;
993
0
        }
994
0
      break;
995
0
    }
996
997
0
  case CTF_K_POINTER:
998
    /* If the type referenced by the pointer is in this CTF dict, then
999
       store the index of the pointer type in fp->ctf_ptrtab[ index of
1000
       referenced type ].  */
1001
1002
0
    if (LCTF_TYPE_ISCHILD (fp, tp->ctt_type) == child
1003
0
        && LCTF_TYPE_TO_INDEX (fp, tp->ctt_type) <= fp->ctf_typemax)
1004
0
      fp->ctf_ptrtab[LCTF_TYPE_TO_INDEX (fp, tp->ctt_type)] = id;
1005
   /*FALLTHRU*/
1006
1007
0
  case CTF_K_VOLATILE:
1008
0
  case CTF_K_CONST:
1009
0
  case CTF_K_RESTRICT:
1010
0
    if (!isroot)
1011
0
      break;
1012
1013
0
    err = ctf_dynhash_insert_type (fp, fp->ctf_names,
1014
0
           LCTF_INDEX_TO_TYPE (fp, id, child),
1015
0
           tp->ctt_name);
1016
0
    if (err != 0)
1017
0
      return err * -1;
1018
0
    break;
1019
0
  default:
1020
0
    ctf_err_warn (fp, 0, ECTF_CORRUPT,
1021
0
      _("init_static_types(): unhandled CTF kind: %x"), kind);
1022
0
    return ECTF_CORRUPT;
1023
0
  }
1024
0
      tp = (ctf_type_t *) ((uintptr_t) tp + increment + vbytes);
1025
0
    }
1026
0
  fp->ctf_typemax--;
1027
0
  assert (fp->ctf_typemax == typemax);
1028
1029
0
  ctf_dprintf ("%lu total types processed\n", fp->ctf_typemax);
1030
1031
  /* In the third pass, we traverse the enums we spotted earlier and track all
1032
     the enumeration constants to aid in future detection of duplicates.
1033
1034
     Doing this in a third pass is necessary to avoid the case where an
1035
     enum appears with a constant FOO, then later a type named FOO appears,
1036
     too late to spot the conflict by checking the enum's constants.  */
1037
1038
0
  while ((err = ctf_dynset_next (all_enums, &i, &k)) == 0)
1039
0
    {
1040
0
      ctf_id_t enum_id = (uintptr_t) k;
1041
0
      ctf_next_t *i_constants = NULL;
1042
0
      const char *cte_name;
1043
1044
0
      while ((cte_name = ctf_enum_next (fp, enum_id, &i_constants, NULL)) != NULL)
1045
0
  {
1046
0
    if (ctf_track_enumerator (fp, enum_id, cte_name) < 0)
1047
0
      {
1048
0
        ctf_next_destroy (i_constants);
1049
0
        ctf_next_destroy (i);
1050
0
        return ctf_errno (fp);
1051
0
      }
1052
0
  }
1053
0
      if (ctf_errno (fp) != ECTF_NEXT_END)
1054
0
  {
1055
0
    ctf_next_destroy (i);
1056
0
    return ctf_errno (fp);
1057
0
  }
1058
0
    }
1059
0
  if (err != ECTF_NEXT_END)
1060
0
    return err;
1061
1062
0
  ctf_dprintf ("%zu enum names hashed\n",
1063
0
         ctf_dynhash_elements (fp->ctf_enums));
1064
0
  ctf_dprintf ("%zu conflicting enumerators identified\n",
1065
0
         ctf_dynset_elements (fp->ctf_conflicting_enums));
1066
0
  ctf_dprintf ("%zu struct names hashed (%d long)\n",
1067
0
         ctf_dynhash_elements (fp->ctf_structs), nlstructs);
1068
0
  ctf_dprintf ("%zu union names hashed (%d long)\n",
1069
0
         ctf_dynhash_elements (fp->ctf_unions), nlunions);
1070
0
  ctf_dprintf ("%zu base type names and identifiers hashed\n",
1071
0
         ctf_dynhash_elements (fp->ctf_names));
1072
1073
0
  return 0;
1074
0
}
1075
1076
/* Endianness-flipping routines.
1077
1078
   We flip everything, mindlessly, even 1-byte entities, so that future
1079
   expansions do not require changes to this code.  */
1080
1081
/* Flip the endianness of the CTF header.  */
1082
1083
void
1084
ctf_flip_header (ctf_header_t *cth)
1085
0
{
1086
0
  swap_thing (cth->cth_preamble.ctp_magic);
1087
0
  swap_thing (cth->cth_preamble.ctp_version);
1088
0
  swap_thing (cth->cth_preamble.ctp_flags);
1089
0
  swap_thing (cth->cth_parlabel);
1090
0
  swap_thing (cth->cth_parname);
1091
0
  swap_thing (cth->cth_cuname);
1092
0
  swap_thing (cth->cth_objtoff);
1093
0
  swap_thing (cth->cth_funcoff);
1094
0
  swap_thing (cth->cth_objtidxoff);
1095
0
  swap_thing (cth->cth_funcidxoff);
1096
0
  swap_thing (cth->cth_varoff);
1097
0
  swap_thing (cth->cth_typeoff);
1098
0
  swap_thing (cth->cth_stroff);
1099
0
  swap_thing (cth->cth_strlen);
1100
0
}
1101
1102
/* Flip the endianness of the label section, an array of ctf_lblent_t.  */
1103
1104
static void
1105
flip_lbls (void *start, size_t len)
1106
0
{
1107
0
  ctf_lblent_t *lbl = start;
1108
0
  ssize_t i;
1109
1110
0
  for (i = len / sizeof (struct ctf_lblent); i > 0; lbl++, i--)
1111
0
    {
1112
0
      swap_thing (lbl->ctl_label);
1113
0
      swap_thing (lbl->ctl_type);
1114
0
    }
1115
0
}
1116
1117
/* Flip the endianness of the data-object or function sections or their indexes,
1118
   all arrays of uint32_t.  */
1119
1120
static void
1121
flip_objts (void *start, size_t len)
1122
0
{
1123
0
  uint32_t *obj = start;
1124
0
  ssize_t i;
1125
1126
0
  for (i = len / sizeof (uint32_t); i > 0; obj++, i--)
1127
0
      swap_thing (*obj);
1128
0
}
1129
1130
/* Flip the endianness of the variable section, an array of ctf_varent_t.  */
1131
1132
static void
1133
flip_vars (void *start, size_t len)
1134
0
{
1135
0
  ctf_varent_t *var = start;
1136
0
  ssize_t i;
1137
1138
0
  for (i = len / sizeof (struct ctf_varent); i > 0; var++, i--)
1139
0
    {
1140
0
      swap_thing (var->ctv_name);
1141
0
      swap_thing (var->ctv_type);
1142
0
    }
1143
0
}
1144
1145
/* Flip the endianness of the type section, a tagged array of ctf_type or
1146
   ctf_stype followed by variable data.  */
1147
1148
static int
1149
flip_types (ctf_dict_t *fp, void *start, size_t len, int to_foreign)
1150
0
{
1151
0
  ctf_type_t *t = start;
1152
1153
0
  while ((uintptr_t) t < ((uintptr_t) start) + len)
1154
0
    {
1155
0
      uint32_t kind;
1156
0
      size_t size;
1157
0
      uint32_t vlen;
1158
0
      size_t vbytes;
1159
1160
0
      if (to_foreign)
1161
0
  {
1162
0
    kind = CTF_V2_INFO_KIND (t->ctt_info);
1163
0
    size = t->ctt_size;
1164
0
    vlen = CTF_V2_INFO_VLEN (t->ctt_info);
1165
0
    vbytes = get_vbytes_v2 (fp, kind, size, vlen);
1166
0
  }
1167
1168
0
      swap_thing (t->ctt_name);
1169
0
      swap_thing (t->ctt_info);
1170
0
      swap_thing (t->ctt_size);
1171
1172
0
      if (!to_foreign)
1173
0
  {
1174
0
    kind = CTF_V2_INFO_KIND (t->ctt_info);
1175
0
    size = t->ctt_size;
1176
0
    vlen = CTF_V2_INFO_VLEN (t->ctt_info);
1177
0
    vbytes = get_vbytes_v2 (fp, kind, size, vlen);
1178
0
  }
1179
1180
0
      if (_libctf_unlikely_ (size == CTF_LSIZE_SENT))
1181
0
  {
1182
0
    if (to_foreign)
1183
0
      size = CTF_TYPE_LSIZE (t);
1184
1185
0
    swap_thing (t->ctt_lsizehi);
1186
0
    swap_thing (t->ctt_lsizelo);
1187
1188
0
    if (!to_foreign)
1189
0
      size = CTF_TYPE_LSIZE (t);
1190
1191
0
    t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_type_t));
1192
0
  }
1193
0
      else
1194
0
  t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_stype_t));
1195
1196
0
      switch (kind)
1197
0
  {
1198
0
  case CTF_K_FORWARD:
1199
0
  case CTF_K_UNKNOWN:
1200
0
  case CTF_K_POINTER:
1201
0
  case CTF_K_TYPEDEF:
1202
0
  case CTF_K_VOLATILE:
1203
0
  case CTF_K_CONST:
1204
0
  case CTF_K_RESTRICT:
1205
    /* These types have no vlen data to swap.  */
1206
0
    assert (vbytes == 0);
1207
0
    break;
1208
1209
0
  case CTF_K_INTEGER:
1210
0
  case CTF_K_FLOAT:
1211
0
    {
1212
      /* These types have a single uint32_t.  */
1213
1214
0
      uint32_t *item = (uint32_t *) t;
1215
1216
0
      swap_thing (*item);
1217
0
      break;
1218
0
    }
1219
1220
0
  case CTF_K_FUNCTION:
1221
0
    {
1222
      /* This type has a bunch of uint32_ts.  */
1223
1224
0
      uint32_t *item = (uint32_t *) t;
1225
0
      ssize_t i;
1226
1227
0
      for (i = vlen; i > 0; item++, i--)
1228
0
        swap_thing (*item);
1229
0
      break;
1230
0
    }
1231
1232
0
  case CTF_K_ARRAY:
1233
0
    {
1234
      /* This has a single ctf_array_t.  */
1235
1236
0
      ctf_array_t *a = (ctf_array_t *) t;
1237
1238
0
      assert (vbytes == sizeof (ctf_array_t));
1239
0
      swap_thing (a->cta_contents);
1240
0
      swap_thing (a->cta_index);
1241
0
      swap_thing (a->cta_nelems);
1242
1243
0
      break;
1244
0
    }
1245
1246
0
  case CTF_K_SLICE:
1247
0
    {
1248
      /* This has a single ctf_slice_t.  */
1249
1250
0
      ctf_slice_t *s = (ctf_slice_t *) t;
1251
1252
0
      assert (vbytes == sizeof (ctf_slice_t));
1253
0
      swap_thing (s->cts_type);
1254
0
      swap_thing (s->cts_offset);
1255
0
      swap_thing (s->cts_bits);
1256
1257
0
      break;
1258
0
    }
1259
1260
0
  case CTF_K_STRUCT:
1261
0
  case CTF_K_UNION:
1262
0
    {
1263
      /* This has an array of ctf_member or ctf_lmember, depending on
1264
         size.  We could consider it to be a simple array of uint32_t,
1265
         but for safety's sake in case these structures ever acquire
1266
         non-uint32_t members, do it member by member.  */
1267
1268
0
      if (_libctf_unlikely_ (size >= CTF_LSTRUCT_THRESH))
1269
0
        {
1270
0
    ctf_lmember_t *lm = (ctf_lmember_t *) t;
1271
0
    ssize_t i;
1272
0
    for (i = vlen; i > 0; i--, lm++)
1273
0
      {
1274
0
        swap_thing (lm->ctlm_name);
1275
0
        swap_thing (lm->ctlm_offsethi);
1276
0
        swap_thing (lm->ctlm_type);
1277
0
        swap_thing (lm->ctlm_offsetlo);
1278
0
      }
1279
0
        }
1280
0
      else
1281
0
        {
1282
0
    ctf_member_t *m = (ctf_member_t *) t;
1283
0
    ssize_t i;
1284
0
    for (i = vlen; i > 0; i--, m++)
1285
0
      {
1286
0
        swap_thing (m->ctm_name);
1287
0
        swap_thing (m->ctm_offset);
1288
0
        swap_thing (m->ctm_type);
1289
0
      }
1290
0
        }
1291
0
      break;
1292
0
    }
1293
1294
0
  case CTF_K_ENUM:
1295
0
    {
1296
      /* This has an array of ctf_enum_t.  */
1297
1298
0
      ctf_enum_t *item = (ctf_enum_t *) t;
1299
0
      ssize_t i;
1300
1301
0
      for (i = vlen; i > 0; item++, i--)
1302
0
        {
1303
0
    swap_thing (item->cte_name);
1304
0
    swap_thing (item->cte_value);
1305
0
        }
1306
0
      break;
1307
0
    }
1308
0
  default:
1309
0
    ctf_err_warn (fp, 0, ECTF_CORRUPT,
1310
0
      _("unhandled CTF kind in endianness conversion: %x"),
1311
0
      kind);
1312
0
    return ECTF_CORRUPT;
1313
0
  }
1314
1315
0
      t = (ctf_type_t *) ((uintptr_t) t + vbytes);
1316
0
    }
1317
1318
0
  return 0;
1319
0
}
1320
1321
/* Flip the endianness of BUF, given the offsets in the (native-endianness) CTH.
1322
   If TO_FOREIGN is set, flip to foreign-endianness; if not, flip away.
1323
1324
   All of this stuff happens before the header is fully initialized, so the
1325
   LCTF_*() macros cannot be used yet.  Since we do not try to endian-convert v1
1326
   data, this is no real loss.  */
1327
1328
int
1329
ctf_flip (ctf_dict_t *fp, ctf_header_t *cth, unsigned char *buf,
1330
    int to_foreign)
1331
0
{
1332
0
  ctf_dprintf("flipping endianness\n");
1333
1334
0
  flip_lbls (buf + cth->cth_lbloff, cth->cth_objtoff - cth->cth_lbloff);
1335
0
  flip_objts (buf + cth->cth_objtoff, cth->cth_funcoff - cth->cth_objtoff);
1336
0
  flip_objts (buf + cth->cth_funcoff, cth->cth_objtidxoff - cth->cth_funcoff);
1337
0
  flip_objts (buf + cth->cth_objtidxoff, cth->cth_funcidxoff - cth->cth_objtidxoff);
1338
0
  flip_objts (buf + cth->cth_funcidxoff, cth->cth_varoff - cth->cth_funcidxoff);
1339
0
  flip_vars (buf + cth->cth_varoff, cth->cth_typeoff - cth->cth_varoff);
1340
0
  return flip_types (fp, buf + cth->cth_typeoff,
1341
0
         cth->cth_stroff - cth->cth_typeoff, to_foreign);
1342
0
}
1343
1344
/* Set up the ctl hashes in a ctf_dict_t.  Called by both writable and
1345
   non-writable dictionary initialization.  */
1346
void ctf_set_ctl_hashes (ctf_dict_t *fp)
1347
0
{
1348
  /* Initialize the ctf_lookup_by_name top-level dictionary.  We keep an
1349
     array of type name prefixes and the corresponding ctf_hash to use.  */
1350
0
  fp->ctf_lookups[0].ctl_prefix = "struct";
1351
0
  fp->ctf_lookups[0].ctl_len = strlen (fp->ctf_lookups[0].ctl_prefix);
1352
0
  fp->ctf_lookups[0].ctl_hash = fp->ctf_structs;
1353
0
  fp->ctf_lookups[1].ctl_prefix = "union";
1354
0
  fp->ctf_lookups[1].ctl_len = strlen (fp->ctf_lookups[1].ctl_prefix);
1355
0
  fp->ctf_lookups[1].ctl_hash = fp->ctf_unions;
1356
0
  fp->ctf_lookups[2].ctl_prefix = "enum";
1357
0
  fp->ctf_lookups[2].ctl_len = strlen (fp->ctf_lookups[2].ctl_prefix);
1358
0
  fp->ctf_lookups[2].ctl_hash = fp->ctf_enums;
1359
0
  fp->ctf_lookups[3].ctl_prefix = _CTF_NULLSTR;
1360
0
  fp->ctf_lookups[3].ctl_len = strlen (fp->ctf_lookups[3].ctl_prefix);
1361
0
  fp->ctf_lookups[3].ctl_hash = fp->ctf_names;
1362
0
  fp->ctf_lookups[4].ctl_prefix = NULL;
1363
0
  fp->ctf_lookups[4].ctl_len = 0;
1364
0
  fp->ctf_lookups[4].ctl_hash = NULL;
1365
0
}
1366
1367
/* Open a CTF file, mocking up a suitable ctf_sect.  */
1368
1369
ctf_dict_t *ctf_simple_open (const char *ctfsect, size_t ctfsect_size,
1370
           const char *symsect, size_t symsect_size,
1371
           size_t symsect_entsize,
1372
           const char *strsect, size_t strsect_size,
1373
           int *errp)
1374
0
{
1375
0
  ctf_sect_t skeleton;
1376
1377
0
  ctf_sect_t ctf_sect, sym_sect, str_sect;
1378
0
  ctf_sect_t *ctfsectp = NULL;
1379
0
  ctf_sect_t *symsectp = NULL;
1380
0
  ctf_sect_t *strsectp = NULL;
1381
1382
0
  skeleton.cts_name = _CTF_SECTION;
1383
0
  skeleton.cts_entsize = 1;
1384
1385
0
  if (ctfsect)
1386
0
    {
1387
0
      memcpy (&ctf_sect, &skeleton, sizeof (struct ctf_sect));
1388
0
      ctf_sect.cts_data = ctfsect;
1389
0
      ctf_sect.cts_size = ctfsect_size;
1390
0
      ctfsectp = &ctf_sect;
1391
0
    }
1392
1393
0
  if (symsect)
1394
0
    {
1395
0
      memcpy (&sym_sect, &skeleton, sizeof (struct ctf_sect));
1396
0
      sym_sect.cts_data = symsect;
1397
0
      sym_sect.cts_size = symsect_size;
1398
0
      sym_sect.cts_entsize = symsect_entsize;
1399
0
      symsectp = &sym_sect;
1400
0
    }
1401
1402
0
  if (strsect)
1403
0
    {
1404
0
      memcpy (&str_sect, &skeleton, sizeof (struct ctf_sect));
1405
0
      str_sect.cts_data = strsect;
1406
0
      str_sect.cts_size = strsect_size;
1407
0
      strsectp = &str_sect;
1408
0
    }
1409
1410
0
  return ctf_bufopen (ctfsectp, symsectp, strsectp, errp);
1411
0
}
1412
1413
/* Decode the specified CTF buffer and optional symbol table, and create a new
1414
   CTF dict representing the symbolic debugging information.  This code can
1415
   be used directly by the debugger, or it can be used as the engine for
1416
   ctf_fdopen() or ctf_open(), below.  */
1417
1418
ctf_dict_t *
1419
ctf_bufopen (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
1420
       const ctf_sect_t *strsect, int *errp)
1421
0
{
1422
0
  const ctf_preamble_t *pp;
1423
0
  size_t hdrsz = sizeof (ctf_header_t);
1424
0
  ctf_header_t *hp;
1425
0
  ctf_dict_t *fp;
1426
0
  int foreign_endian = 0;
1427
0
  int err;
1428
1429
0
  libctf_init_debug();
1430
1431
0
  ctf_set_open_errno (errp, 0);
1432
1433
0
  if ((ctfsect == NULL) || ((symsect != NULL) && (strsect == NULL)))
1434
0
    return (ctf_set_open_errno (errp, EINVAL));
1435
1436
0
  if (symsect != NULL && symsect->cts_entsize != sizeof (Elf32_Sym) &&
1437
0
      symsect->cts_entsize != sizeof (Elf64_Sym))
1438
0
    return (ctf_set_open_errno (errp, ECTF_SYMTAB));
1439
1440
0
  if (symsect != NULL && symsect->cts_data == NULL)
1441
0
    return (ctf_set_open_errno (errp, ECTF_SYMBAD));
1442
1443
0
  if (strsect != NULL && strsect->cts_data == NULL)
1444
0
    return (ctf_set_open_errno (errp, ECTF_STRBAD));
1445
1446
0
  if (ctfsect->cts_data == NULL
1447
0
      || ctfsect->cts_size < sizeof (ctf_preamble_t))
1448
0
    return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1449
1450
0
  pp = (const ctf_preamble_t *) ctfsect->cts_data;
1451
1452
0
  ctf_dprintf ("ctf_bufopen: magic=0x%x version=%u\n",
1453
0
         pp->ctp_magic, pp->ctp_version);
1454
1455
  /* Validate each part of the CTF header.
1456
1457
     First, we validate the preamble (common to all versions).  At that point,
1458
     we know the endianness and specific header version, and can validate the
1459
     version-specific parts including section offsets and alignments.  */
1460
1461
0
  if (_libctf_unlikely_ (pp->ctp_magic != CTF_MAGIC))
1462
0
    {
1463
0
      if (pp->ctp_magic == bswap_16 (CTF_MAGIC))
1464
0
  foreign_endian = 1;
1465
0
      else
1466
0
  return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1467
0
    }
1468
1469
0
  if (_libctf_unlikely_ ((pp->ctp_version < CTF_VERSION_1)
1470
0
       || (pp->ctp_version > CTF_VERSION_3)))
1471
0
    return (ctf_set_open_errno (errp, ECTF_CTFVERS));
1472
1473
0
  if ((symsect != NULL) && (pp->ctp_version < CTF_VERSION_2))
1474
0
    {
1475
      /* The symtab can contain function entries which contain embedded ctf
1476
   info.  We do not support dynamically upgrading such entries (none
1477
   should exist in any case, since dwarf2ctf does not create them).  */
1478
1479
0
      ctf_err_warn (NULL, 0, ECTF_NOTSUP, _("ctf_bufopen: CTF version %d "
1480
0
              "symsect not supported"),
1481
0
        pp->ctp_version);
1482
0
      return (ctf_set_open_errno (errp, ECTF_NOTSUP));
1483
0
    }
1484
1485
0
  if (pp->ctp_version < CTF_VERSION_3)
1486
0
    hdrsz = sizeof (ctf_header_v2_t);
1487
1488
0
  if (_libctf_unlikely_ (pp->ctp_flags > CTF_F_MAX))
1489
0
    {
1490
0
      ctf_err_warn (NULL, 0, ECTF_FLAGS, _("ctf_bufopen: invalid header "
1491
0
             "flags: %x"),
1492
0
        (unsigned int) pp->ctp_flags);
1493
0
      return (ctf_set_open_errno (errp, ECTF_FLAGS));
1494
0
    }
1495
1496
0
  if (ctfsect->cts_size < hdrsz)
1497
0
    return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1498
1499
0
  if ((fp = malloc (sizeof (ctf_dict_t))) == NULL)
1500
0
    return (ctf_set_open_errno (errp, ENOMEM));
1501
1502
0
  memset (fp, 0, sizeof (ctf_dict_t));
1503
1504
0
  if ((fp->ctf_header = malloc (sizeof (struct ctf_header))) == NULL)
1505
0
    {
1506
0
      free (fp);
1507
0
      return (ctf_set_open_errno (errp, ENOMEM));
1508
0
    }
1509
0
  hp = fp->ctf_header;
1510
0
  memcpy (hp, ctfsect->cts_data, hdrsz);
1511
0
  if (pp->ctp_version < CTF_VERSION_3)
1512
0
    upgrade_header (hp);
1513
1514
0
  if (foreign_endian)
1515
0
    ctf_flip_header (hp);
1516
0
  fp->ctf_openflags = hp->cth_flags;
1517
0
  fp->ctf_size = hp->cth_stroff + hp->cth_strlen;
1518
1519
0
  ctf_dprintf ("ctf_bufopen: uncompressed size=%lu\n",
1520
0
         (unsigned long) fp->ctf_size);
1521
1522
0
  if (hp->cth_lbloff > fp->ctf_size || hp->cth_objtoff > fp->ctf_size
1523
0
      || hp->cth_funcoff > fp->ctf_size || hp->cth_objtidxoff > fp->ctf_size
1524
0
      || hp->cth_funcidxoff > fp->ctf_size || hp->cth_typeoff > fp->ctf_size
1525
0
      || hp->cth_stroff > fp->ctf_size)
1526
0
    {
1527
0
      ctf_err_warn (NULL, 0, ECTF_CORRUPT, _("header offset exceeds CTF size"));
1528
0
      return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1529
0
    }
1530
1531
0
  if (hp->cth_lbloff > hp->cth_objtoff
1532
0
      || hp->cth_objtoff > hp->cth_funcoff
1533
0
      || hp->cth_funcoff > hp->cth_typeoff
1534
0
      || hp->cth_funcoff > hp->cth_objtidxoff
1535
0
      || hp->cth_objtidxoff > hp->cth_funcidxoff
1536
0
      || hp->cth_funcidxoff > hp->cth_varoff
1537
0
      || hp->cth_varoff > hp->cth_typeoff || hp->cth_typeoff > hp->cth_stroff)
1538
0
    {
1539
0
      ctf_err_warn (NULL, 0, ECTF_CORRUPT, _("overlapping CTF sections"));
1540
0
      return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1541
0
    }
1542
1543
0
  if ((hp->cth_lbloff & 3) || (hp->cth_objtoff & 2)
1544
0
      || (hp->cth_funcoff & 2) || (hp->cth_objtidxoff & 2)
1545
0
      || (hp->cth_funcidxoff & 2) || (hp->cth_varoff & 3)
1546
0
      || (hp->cth_typeoff & 3))
1547
0
    {
1548
0
      ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1549
0
        _("CTF sections not properly aligned"));
1550
0
      return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1551
0
    }
1552
1553
  /* This invariant will be lifted in v4, but for now it is true.  */
1554
1555
0
  if ((hp->cth_funcidxoff - hp->cth_objtidxoff != 0) &&
1556
0
      (hp->cth_funcidxoff - hp->cth_objtidxoff
1557
0
       != hp->cth_funcoff - hp->cth_objtoff))
1558
0
    {
1559
0
      ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1560
0
        _("Object index section is neither empty nor the "
1561
0
          "same length as the object section: %u versus %u "
1562
0
          "bytes"), hp->cth_funcoff - hp->cth_objtoff,
1563
0
        hp->cth_funcidxoff - hp->cth_objtidxoff);
1564
0
      return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1565
0
    }
1566
1567
0
  if ((hp->cth_varoff - hp->cth_funcidxoff != 0) &&
1568
0
      (hp->cth_varoff - hp->cth_funcidxoff
1569
0
       != hp->cth_objtidxoff - hp->cth_funcoff) &&
1570
0
      (hp->cth_flags & CTF_F_NEWFUNCINFO))
1571
0
    {
1572
0
      ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1573
0
        _("Function index section is neither empty nor the "
1574
0
          "same length as the function section: %u versus %u "
1575
0
          "bytes"), hp->cth_objtidxoff - hp->cth_funcoff,
1576
0
        hp->cth_varoff - hp->cth_funcidxoff);
1577
0
      return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1578
0
    }
1579
1580
  /* Once everything is determined to be valid, attempt to decompress the CTF
1581
     data buffer if it is compressed, or copy it into new storage if it is not
1582
     compressed but needs endian-flipping.  Otherwise we just put the data
1583
     section's buffer pointer into ctf_buf, below.  */
1584
1585
  /* Note: if this is a v1 buffer, it will be reallocated and expanded by
1586
     init_static_types().  */
1587
1588
0
  if (hp->cth_flags & CTF_F_COMPRESS)
1589
0
    {
1590
0
      size_t srclen;
1591
0
      uLongf dstlen;
1592
0
      const void *src;
1593
0
      int rc = Z_OK;
1594
1595
      /* We are allocating this ourselves, so we can drop the ctf header
1596
   copy in favour of ctf->ctf_header.  */
1597
1598
0
      if ((fp->ctf_base = malloc (fp->ctf_size)) == NULL)
1599
0
  {
1600
0
    err = ECTF_ZALLOC;
1601
0
    goto bad;
1602
0
  }
1603
0
      fp->ctf_dynbase = fp->ctf_base;
1604
0
      hp->cth_flags &= ~CTF_F_COMPRESS;
1605
1606
0
      src = (unsigned char *) ctfsect->cts_data + hdrsz;
1607
0
      srclen = ctfsect->cts_size - hdrsz;
1608
0
      dstlen = fp->ctf_size;
1609
0
      fp->ctf_buf = fp->ctf_base;
1610
1611
0
      if ((rc = uncompress (fp->ctf_base, &dstlen, src, srclen)) != Z_OK)
1612
0
  {
1613
0
    ctf_err_warn (NULL, 0, ECTF_DECOMPRESS, _("zlib inflate err: %s"),
1614
0
      zError (rc));
1615
0
    err = ECTF_DECOMPRESS;
1616
0
    goto bad;
1617
0
  }
1618
1619
0
      if ((size_t) dstlen != fp->ctf_size)
1620
0
  {
1621
0
    ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1622
0
      _("zlib inflate short: got %lu of %lu bytes"),
1623
0
      (unsigned long) dstlen, (unsigned long) fp->ctf_size);
1624
0
    err = ECTF_CORRUPT;
1625
0
    goto bad;
1626
0
  }
1627
0
    }
1628
0
  else
1629
0
    {
1630
0
      if (_libctf_unlikely_ (ctfsect->cts_size < hdrsz + fp->ctf_size))
1631
0
  {
1632
0
    ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1633
0
      _("%lu byte long CTF dictionary overruns %lu byte long CTF section"),
1634
0
      (unsigned long) ctfsect->cts_size,
1635
0
      (unsigned long) (hdrsz + fp->ctf_size));
1636
0
    err = ECTF_CORRUPT;
1637
0
    goto bad;
1638
0
  }
1639
1640
0
      if (foreign_endian)
1641
0
  {
1642
0
    if ((fp->ctf_base = malloc (fp->ctf_size)) == NULL)
1643
0
      {
1644
0
        err = ECTF_ZALLOC;
1645
0
        goto bad;
1646
0
      }
1647
0
    fp->ctf_dynbase = fp->ctf_base;
1648
0
    memcpy (fp->ctf_base, ((unsigned char *) ctfsect->cts_data) + hdrsz,
1649
0
      fp->ctf_size);
1650
0
    fp->ctf_buf = fp->ctf_base;
1651
0
  }
1652
0
      else
1653
0
  {
1654
    /* We are just using the section passed in -- but its header may
1655
       be an old version.  Point ctf_buf past the old header, and
1656
       never touch it again.  */
1657
0
    fp->ctf_base = (unsigned char *) ctfsect->cts_data;
1658
0
    fp->ctf_dynbase = NULL;
1659
0
    fp->ctf_buf = fp->ctf_base + hdrsz;
1660
0
  }
1661
0
    }
1662
1663
  /* Once we have uncompressed and validated the CTF data buffer, we can
1664
     proceed with initializing the ctf_dict_t we allocated above.
1665
1666
     Nothing that depends on buf or base should be set directly in this function
1667
     before the init_static_types() call, because it may be reallocated during
1668
     transparent upgrade if this recension of libctf is so configured: see
1669
     ctf_set_base().  */
1670
1671
0
  ctf_set_version (fp, hp, hp->cth_version);
1672
1673
  /* Temporary assignment, just enough to be able to initialize
1674
     the atoms table.  */
1675
1676
0
  fp->ctf_str[CTF_STRTAB_0].cts_strs = (const char *) fp->ctf_buf
1677
0
    + hp->cth_stroff;
1678
0
  fp->ctf_str[CTF_STRTAB_0].cts_len = hp->cth_strlen;
1679
0
  if (ctf_str_create_atoms (fp) < 0)
1680
0
    {
1681
0
      err = ENOMEM;
1682
0
      goto bad;
1683
0
    }
1684
1685
0
  fp->ctf_parmax = CTF_MAX_PTYPE;
1686
0
  memcpy (&fp->ctf_data, ctfsect, sizeof (ctf_sect_t));
1687
1688
0
  if (symsect != NULL)
1689
0
    {
1690
0
      memcpy (&fp->ctf_ext_symtab, symsect, sizeof (ctf_sect_t));
1691
0
      memcpy (&fp->ctf_ext_strtab, strsect, sizeof (ctf_sect_t));
1692
0
    }
1693
1694
0
  if (fp->ctf_data.cts_name != NULL)
1695
0
    if ((fp->ctf_data.cts_name = strdup (fp->ctf_data.cts_name)) == NULL)
1696
0
      {
1697
0
  err = ENOMEM;
1698
0
  goto bad;
1699
0
      }
1700
0
  if (fp->ctf_ext_symtab.cts_name != NULL)
1701
0
    if ((fp->ctf_ext_symtab.cts_name = strdup (fp->ctf_ext_symtab.cts_name)) == NULL)
1702
0
      {
1703
0
  err = ENOMEM;
1704
0
  goto bad;
1705
0
      }
1706
0
  if (fp->ctf_ext_strtab.cts_name != NULL)
1707
0
    if ((fp->ctf_ext_strtab.cts_name = strdup (fp->ctf_ext_strtab.cts_name)) == NULL)
1708
0
      {
1709
0
  err = ENOMEM;
1710
0
  goto bad;
1711
0
      }
1712
1713
0
  if (fp->ctf_data.cts_name == NULL)
1714
0
    fp->ctf_data.cts_name = _CTF_NULLSTR;
1715
0
  if (fp->ctf_ext_symtab.cts_name == NULL)
1716
0
    fp->ctf_ext_symtab.cts_name = _CTF_NULLSTR;
1717
0
  if (fp->ctf_ext_strtab.cts_name == NULL)
1718
0
    fp->ctf_ext_strtab.cts_name = _CTF_NULLSTR;
1719
1720
0
  if (strsect != NULL)
1721
0
    {
1722
0
      fp->ctf_str[CTF_STRTAB_1].cts_strs = strsect->cts_data;
1723
0
      fp->ctf_str[CTF_STRTAB_1].cts_len = strsect->cts_size;
1724
0
    }
1725
1726
  /* Dynamic state, for dynamic addition to this dict after loading.  */
1727
1728
0
  fp->ctf_dthash = ctf_dynhash_create (ctf_hash_integer, ctf_hash_eq_integer,
1729
0
               NULL, NULL);
1730
0
  fp->ctf_dvhash = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
1731
0
               NULL, NULL);
1732
0
  fp->ctf_snapshots = 1;
1733
1734
0
  fp->ctf_objthash = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
1735
0
             free, NULL);
1736
0
  fp->ctf_funchash = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
1737
0
           free, NULL);
1738
1739
0
  if (!fp->ctf_dthash || !fp->ctf_dvhash || !fp->ctf_snapshots ||
1740
0
      !fp->ctf_objthash || !fp->ctf_funchash)
1741
0
    {
1742
0
      err = ENOMEM;
1743
0
      goto bad;
1744
0
    }
1745
1746
0
  if (foreign_endian &&
1747
0
      (err = ctf_flip (fp, hp, fp->ctf_buf, 0)) != 0)
1748
0
    {
1749
      /* We can be certain that ctf_flip() will have endian-flipped everything
1750
   other than the types table when we return.  In particular the header
1751
   is fine, so set it, to allow freeing to use the usual code path.  */
1752
1753
0
      ctf_set_base (fp, hp, fp->ctf_base);
1754
0
      goto bad;
1755
0
    }
1756
1757
0
  ctf_set_base (fp, hp, fp->ctf_base);
1758
1759
0
  if ((err = init_static_types (fp, hp)) != 0)
1760
0
    goto bad;
1761
1762
  /* Allocate and initialize the symtab translation table, pointed to by
1763
     ctf_sxlate, and the corresponding index sections.  This table may be too
1764
     large for the actual size of the object and function info sections: if so,
1765
     ctf_nsyms will be adjusted and the excess will never be used.  It's
1766
     possible to do indexed symbol lookups even without a symbol table, so check
1767
     even in that case.  Initially, we assume the symtab is native-endian: if it
1768
     isn't, the caller will inform us later by calling ctf_symsect_endianness.  */
1769
#ifdef WORDS_BIGENDIAN
1770
  fp->ctf_symsect_little_endian = 0;
1771
#else
1772
0
  fp->ctf_symsect_little_endian = 1;
1773
0
#endif
1774
1775
0
  if (symsect != NULL)
1776
0
    {
1777
0
      fp->ctf_nsyms = symsect->cts_size / symsect->cts_entsize;
1778
0
      fp->ctf_sxlate = malloc (fp->ctf_nsyms * sizeof (uint32_t));
1779
1780
0
      if (fp->ctf_sxlate == NULL)
1781
0
  {
1782
0
    err = ENOMEM;
1783
0
    goto bad;
1784
0
  }
1785
0
    }
1786
1787
0
  if ((err = init_symtab (fp, hp, symsect)) != 0)
1788
0
    goto bad;
1789
1790
0
  ctf_set_ctl_hashes (fp);
1791
1792
0
  if (symsect != NULL)
1793
0
    {
1794
0
      if (symsect->cts_entsize == sizeof (Elf64_Sym))
1795
0
  (void) ctf_setmodel (fp, CTF_MODEL_LP64);
1796
0
      else
1797
0
  (void) ctf_setmodel (fp, CTF_MODEL_ILP32);
1798
0
    }
1799
0
  else
1800
0
    (void) ctf_setmodel (fp, CTF_MODEL_NATIVE);
1801
1802
0
  fp->ctf_refcnt = 1;
1803
0
  return fp;
1804
1805
0
bad:
1806
0
  ctf_set_open_errno (errp, err);
1807
0
  ctf_err_warn_to_open (fp);
1808
  /* Without this, the refcnt is zero on entry and ctf_dict_close() won't
1809
     actually do anything on the grounds that this is a recursive call via
1810
     another dict being closed.  */
1811
0
  fp->ctf_refcnt = 1;
1812
0
  ctf_dict_close (fp);
1813
0
  return NULL;
1814
0
}
1815
1816
/* Bump the refcount on the specified CTF dict, to allow export of ctf_dict_t's
1817
   from iterators that open and close the ctf_dict_t around the loop.  (This
1818
   does not extend their lifetime beyond that of the ctf_archive_t in which they
1819
   are contained.)  */
1820
1821
void
1822
ctf_ref (ctf_dict_t *fp)
1823
0
{
1824
0
  fp->ctf_refcnt++;
1825
0
}
1826
1827
/* Close the specified CTF dict and free associated data structures.  Note that
1828
   ctf_dict_close() is a reference counted operation: if the specified file is
1829
   the parent of other active dict, its reference count will be greater than one
1830
   and it will be freed later when no active children exist.  */
1831
1832
void
1833
ctf_dict_close (ctf_dict_t *fp)
1834
0
{
1835
0
  ctf_dtdef_t *dtd, *ntd;
1836
0
  ctf_dvdef_t *dvd, *nvd;
1837
0
  ctf_in_flight_dynsym_t *did, *nid;
1838
0
  ctf_err_warning_t *err, *nerr;
1839
1840
0
  if (fp == NULL)
1841
0
    return;      /* Allow ctf_dict_close(NULL) to simplify caller code.  */
1842
1843
0
  ctf_dprintf ("ctf_dict_close(%p) refcnt=%u\n", (void *) fp, fp->ctf_refcnt);
1844
1845
0
  if (fp->ctf_refcnt > 1)
1846
0
    {
1847
0
      fp->ctf_refcnt--;
1848
0
      return;
1849
0
    }
1850
1851
  /* It is possible to recurse back in here, notably if dicts in the
1852
     ctf_link_inputs or ctf_link_outputs cite this dict as a parent without
1853
     using ctf_import_unref.  Do nothing in that case.  */
1854
0
  if (fp->ctf_refcnt == 0)
1855
0
    return;
1856
1857
0
  fp->ctf_refcnt--;
1858
0
  free (fp->ctf_dyncuname);
1859
0
  free (fp->ctf_dynparname);
1860
0
  if (fp->ctf_parent && !fp->ctf_parent_unreffed)
1861
0
    ctf_dict_close (fp->ctf_parent);
1862
1863
0
  for (dtd = ctf_list_next (&fp->ctf_dtdefs); dtd != NULL; dtd = ntd)
1864
0
    {
1865
0
      ntd = ctf_list_next (dtd);
1866
0
      ctf_dtd_delete (fp, dtd);
1867
0
    }
1868
0
  ctf_dynhash_destroy (fp->ctf_dthash);
1869
1870
0
  ctf_dynset_destroy (fp->ctf_conflicting_enums);
1871
0
  ctf_dynhash_destroy (fp->ctf_structs);
1872
0
  ctf_dynhash_destroy (fp->ctf_unions);
1873
0
  ctf_dynhash_destroy (fp->ctf_enums);
1874
0
  ctf_dynhash_destroy (fp->ctf_names);
1875
1876
0
  for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
1877
0
    {
1878
0
      nvd = ctf_list_next (dvd);
1879
0
      ctf_dvd_delete (fp, dvd);
1880
0
    }
1881
0
  ctf_dynhash_destroy (fp->ctf_dvhash);
1882
1883
0
  ctf_dynhash_destroy (fp->ctf_symhash_func);
1884
0
  ctf_dynhash_destroy (fp->ctf_symhash_objt);
1885
0
  free (fp->ctf_funcidx_sxlate);
1886
0
  free (fp->ctf_objtidx_sxlate);
1887
0
  ctf_dynhash_destroy (fp->ctf_objthash);
1888
0
  ctf_dynhash_destroy (fp->ctf_funchash);
1889
0
  free (fp->ctf_dynsymidx);
1890
0
  ctf_dynhash_destroy (fp->ctf_dynsyms);
1891
0
  for (did = ctf_list_next (&fp->ctf_in_flight_dynsyms); did != NULL; did = nid)
1892
0
    {
1893
0
      nid = ctf_list_next (did);
1894
0
      ctf_list_delete (&fp->ctf_in_flight_dynsyms, did);
1895
0
      free (did);
1896
0
    }
1897
1898
0
  ctf_str_free_atoms (fp);
1899
0
  free (fp->ctf_tmp_typeslice);
1900
1901
0
  if (fp->ctf_data.cts_name != _CTF_NULLSTR)
1902
0
    free ((char *) fp->ctf_data.cts_name);
1903
1904
0
  if (fp->ctf_ext_symtab.cts_name != _CTF_NULLSTR)
1905
0
    free ((char *) fp->ctf_ext_symtab.cts_name);
1906
1907
0
  if (fp->ctf_ext_strtab.cts_name != _CTF_NULLSTR)
1908
0
    free ((char *) fp->ctf_ext_strtab.cts_name);
1909
0
  else if (fp->ctf_data_mmapped)
1910
0
    ctf_munmap (fp->ctf_data_mmapped, fp->ctf_data_mmapped_len);
1911
1912
0
  free (fp->ctf_dynbase);
1913
1914
0
  ctf_dynhash_destroy (fp->ctf_syn_ext_strtab);
1915
0
  ctf_dynhash_destroy (fp->ctf_link_inputs);
1916
0
  ctf_dynhash_destroy (fp->ctf_link_outputs);
1917
0
  ctf_dynhash_destroy (fp->ctf_link_type_mapping);
1918
0
  ctf_dynhash_destroy (fp->ctf_link_in_cu_mapping);
1919
0
  ctf_dynhash_destroy (fp->ctf_link_out_cu_mapping);
1920
0
  ctf_dynhash_destroy (fp->ctf_add_processing);
1921
0
  ctf_dedup_fini (fp, NULL, 0);
1922
0
  ctf_dynset_destroy (fp->ctf_dedup_atoms_alloc);
1923
1924
0
  for (err = ctf_list_next (&fp->ctf_errs_warnings); err != NULL; err = nerr)
1925
0
    {
1926
0
      nerr = ctf_list_next (err);
1927
0
      ctf_list_delete (&fp->ctf_errs_warnings, err);
1928
0
      free (err->cew_text);
1929
0
      free (err);
1930
0
    }
1931
1932
0
  free (fp->ctf_sxlate);
1933
0
  free (fp->ctf_txlate);
1934
0
  free (fp->ctf_ptrtab);
1935
0
  free (fp->ctf_pptrtab);
1936
1937
0
  free (fp->ctf_header);
1938
0
  free (fp);
1939
0
}
1940
1941
/* Backward compatibility.  */
1942
void
1943
ctf_file_close (ctf_file_t *fp)
1944
0
{
1945
0
  ctf_dict_close (fp);
1946
0
}
1947
1948
/* The converse of ctf_open().  ctf_open() disguises whatever it opens as an
1949
   archive, so closing one is just like closing an archive.  */
1950
void
1951
ctf_close (ctf_archive_t *arc)
1952
0
{
1953
0
  ctf_arc_close (arc);
1954
0
}
1955
1956
/* Get the CTF archive from which this ctf_dict_t is derived.  */
1957
ctf_archive_t *
1958
ctf_get_arc (const ctf_dict_t *fp)
1959
0
{
1960
0
  return fp->ctf_archive;
1961
0
}
1962
1963
/* Return the ctfsect out of the core ctf_impl.  Useful for freeing the
1964
   ctfsect's data * after ctf_dict_close(), which is why we return the actual
1965
   structure, not a pointer to it, since that is likely to become a pointer to
1966
   freed data before the return value is used under the expected use case of
1967
   ctf_getsect()/ ctf_dict_close()/free().  */
1968
ctf_sect_t
1969
ctf_getdatasect (const ctf_dict_t *fp)
1970
0
{
1971
0
  return fp->ctf_data;
1972
0
}
1973
1974
ctf_sect_t
1975
ctf_getsymsect (const ctf_dict_t *fp)
1976
0
{
1977
0
  return fp->ctf_ext_symtab;
1978
0
}
1979
1980
ctf_sect_t
1981
ctf_getstrsect (const ctf_dict_t *fp)
1982
0
{
1983
0
  return fp->ctf_ext_strtab;
1984
0
}
1985
1986
/* Set the endianness of the symbol table attached to FP.  */
1987
void
1988
ctf_symsect_endianness (ctf_dict_t *fp, int little_endian)
1989
0
{
1990
0
  int old_endianness = fp->ctf_symsect_little_endian;
1991
1992
0
  fp->ctf_symsect_little_endian = !!little_endian;
1993
1994
  /* If we already have a symtab translation table, we need to repopulate it if
1995
     our idea of the endianness has changed.  */
1996
1997
0
  if (old_endianness != fp->ctf_symsect_little_endian
1998
0
      && fp->ctf_sxlate != NULL && fp->ctf_ext_symtab.cts_data != NULL)
1999
0
    assert (init_symtab (fp, fp->ctf_header, &fp->ctf_ext_symtab) == 0);
2000
0
}
2001
2002
/* Return the CTF handle for the parent CTF dict, if one exists.  Otherwise
2003
   return NULL to indicate this dict has no imported parent.  */
2004
ctf_dict_t *
2005
ctf_parent_dict (ctf_dict_t *fp)
2006
0
{
2007
0
  return fp->ctf_parent;
2008
0
}
2009
2010
/* Backward compatibility.  */
2011
ctf_dict_t *
2012
ctf_parent_file (ctf_dict_t *fp)
2013
0
{
2014
0
  return ctf_parent_dict (fp);
2015
0
}
2016
2017
/* Return the name of the parent CTF dict, if one exists, or NULL otherwise.  */
2018
const char *
2019
ctf_parent_name (ctf_dict_t *fp)
2020
0
{
2021
0
  return fp->ctf_parname;
2022
0
}
2023
2024
/* Set the parent name.  It is an error to call this routine without calling
2025
   ctf_import() at some point.  */
2026
int
2027
ctf_parent_name_set (ctf_dict_t *fp, const char *name)
2028
0
{
2029
0
  if (fp->ctf_dynparname != NULL)
2030
0
    free (fp->ctf_dynparname);
2031
2032
0
  if ((fp->ctf_dynparname = strdup (name)) == NULL)
2033
0
    return (ctf_set_errno (fp, ENOMEM));
2034
0
  fp->ctf_parname = fp->ctf_dynparname;
2035
0
  return 0;
2036
0
}
2037
2038
/* Return the name of the compilation unit this CTF file applies to.  Usually
2039
   non-NULL only for non-parent dicts.  */
2040
const char *
2041
ctf_cuname (ctf_dict_t *fp)
2042
0
{
2043
0
  return fp->ctf_cuname;
2044
0
}
2045
2046
/* Set the compilation unit name.  */
2047
int
2048
ctf_cuname_set (ctf_dict_t *fp, const char *name)
2049
0
{
2050
0
  if (fp->ctf_dyncuname != NULL)
2051
0
    free (fp->ctf_dyncuname);
2052
2053
0
  if ((fp->ctf_dyncuname = strdup (name)) == NULL)
2054
0
    return (ctf_set_errno (fp, ENOMEM));
2055
0
  fp->ctf_cuname = fp->ctf_dyncuname;
2056
0
  return 0;
2057
0
}
2058
2059
/* Import the types from the specified parent dict by storing a pointer to it in
2060
   ctf_parent and incrementing its reference count.  Only one parent is allowed:
2061
   if a parent already exists, it is replaced by the new parent.  The pptrtab
2062
   is wiped, and will be refreshed by the next ctf_lookup_by_name call.  */
2063
int
2064
ctf_import (ctf_dict_t *fp, ctf_dict_t *pfp)
2065
0
{
2066
0
  if (fp == NULL || fp == pfp || (pfp != NULL && pfp->ctf_refcnt == 0))
2067
0
    return (ctf_set_errno (fp, EINVAL));
2068
2069
0
  if (pfp != NULL && pfp->ctf_dmodel != fp->ctf_dmodel)
2070
0
    return (ctf_set_errno (fp, ECTF_DMODEL));
2071
2072
0
  if (fp->ctf_parent && !fp->ctf_parent_unreffed)
2073
0
    ctf_dict_close (fp->ctf_parent);
2074
0
  fp->ctf_parent = NULL;
2075
2076
0
  free (fp->ctf_pptrtab);
2077
0
  fp->ctf_pptrtab = NULL;
2078
0
  fp->ctf_pptrtab_len = 0;
2079
0
  fp->ctf_pptrtab_typemax = 0;
2080
2081
0
  if (pfp != NULL)
2082
0
    {
2083
0
      int err;
2084
2085
0
      if (fp->ctf_parname == NULL)
2086
0
  if ((err = ctf_parent_name_set (fp, "PARENT")) < 0)
2087
0
    return err;
2088
2089
0
      fp->ctf_flags |= LCTF_CHILD;
2090
0
      pfp->ctf_refcnt++;
2091
0
      fp->ctf_parent_unreffed = 0;
2092
0
    }
2093
2094
0
  fp->ctf_parent = pfp;
2095
0
  return 0;
2096
0
}
2097
2098
/* Like ctf_import, but does not increment the refcount on the imported parent
2099
   or close it at any point: as a result it can go away at any time and the
2100
   caller must do all freeing itself.  Used internally to avoid refcount
2101
   loops.  */
2102
int
2103
ctf_import_unref (ctf_dict_t *fp, ctf_dict_t *pfp)
2104
0
{
2105
0
  if (fp == NULL || fp == pfp || (pfp != NULL && pfp->ctf_refcnt == 0))
2106
0
    return (ctf_set_errno (fp, EINVAL));
2107
2108
0
  if (pfp != NULL && pfp->ctf_dmodel != fp->ctf_dmodel)
2109
0
    return (ctf_set_errno (fp, ECTF_DMODEL));
2110
2111
0
  if (fp->ctf_parent && !fp->ctf_parent_unreffed)
2112
0
    ctf_dict_close (fp->ctf_parent);
2113
0
  fp->ctf_parent = NULL;
2114
2115
0
  free (fp->ctf_pptrtab);
2116
0
  fp->ctf_pptrtab = NULL;
2117
0
  fp->ctf_pptrtab_len = 0;
2118
0
  fp->ctf_pptrtab_typemax = 0;
2119
0
  if (pfp != NULL)
2120
0
    {
2121
0
      int err;
2122
2123
0
      if (fp->ctf_parname == NULL)
2124
0
  if ((err = ctf_parent_name_set (fp, "PARENT")) < 0)
2125
0
    return err;
2126
2127
0
      fp->ctf_flags |= LCTF_CHILD;
2128
0
      fp->ctf_parent_unreffed = 1;
2129
0
    }
2130
2131
0
  fp->ctf_parent = pfp;
2132
0
  return 0;
2133
0
}
2134
2135
/* Set the data model constant for the CTF dict.  */
2136
int
2137
ctf_setmodel (ctf_dict_t *fp, int model)
2138
0
{
2139
0
  const ctf_dmodel_t *dp;
2140
2141
0
  for (dp = _libctf_models; dp->ctd_name != NULL; dp++)
2142
0
    {
2143
0
      if (dp->ctd_code == model)
2144
0
  {
2145
0
    fp->ctf_dmodel = dp;
2146
0
    return 0;
2147
0
  }
2148
0
    }
2149
2150
0
  return (ctf_set_errno (fp, EINVAL));
2151
0
}
2152
2153
/* Return the data model constant for the CTF dict.  */
2154
int
2155
ctf_getmodel (ctf_dict_t *fp)
2156
0
{
2157
0
  return fp->ctf_dmodel->ctd_code;
2158
0
}
2159
2160
/* The caller can hang an arbitrary pointer off each ctf_dict_t using this
2161
   function.  */
2162
void
2163
ctf_setspecific (ctf_dict_t *fp, void *data)
2164
0
{
2165
0
  fp->ctf_specific = data;
2166
0
}
2167
2168
/* Retrieve the arbitrary pointer again.  */
2169
void *
2170
ctf_getspecific (ctf_dict_t *fp)
2171
0
{
2172
0
  return fp->ctf_specific;
2173
0
}