]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - libctf/ctf-open.c
bus error with fuzzed archive element
[thirdparty/binutils-gdb.git] / libctf / ctf-open.c
1 /* Opening CTF files.
2 Copyright (C) 2019 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 <assert.h>
26 #include "swap.h"
27 #include <bfd.h>
28 #include <zlib.h>
29
30 #include "elf-bfd.h"
31
32 static const ctf_dmodel_t _libctf_models[] = {
33 {"ILP32", CTF_MODEL_ILP32, 4, 1, 2, 4, 4},
34 {"LP64", CTF_MODEL_LP64, 8, 1, 2, 4, 8},
35 {NULL, 0, 0, 0, 0, 0, 0}
36 };
37
38 const char _CTF_SECTION[] = ".ctf";
39 const char _CTF_NULLSTR[] = "";
40
41 /* Version-sensitive accessors. */
42
43 static uint32_t
44 get_kind_v1 (uint32_t info)
45 {
46 return (CTF_V1_INFO_KIND (info));
47 }
48
49 static uint32_t
50 get_root_v1 (uint32_t info)
51 {
52 return (CTF_V1_INFO_ISROOT (info));
53 }
54
55 static uint32_t
56 get_vlen_v1 (uint32_t info)
57 {
58 return (CTF_V1_INFO_VLEN (info));
59 }
60
61 static uint32_t
62 get_kind_v2 (uint32_t info)
63 {
64 return (CTF_V2_INFO_KIND (info));
65 }
66
67 static uint32_t
68 get_root_v2 (uint32_t info)
69 {
70 return (CTF_V2_INFO_ISROOT (info));
71 }
72
73 static uint32_t
74 get_vlen_v2 (uint32_t info)
75 {
76 return (CTF_V2_INFO_VLEN (info));
77 }
78
79 static inline ssize_t
80 get_ctt_size_common (const ctf_file_t *fp _libctf_unused_,
81 const ctf_type_t *tp _libctf_unused_,
82 ssize_t *sizep, ssize_t *incrementp, size_t lsize,
83 size_t csize, size_t ctf_type_size,
84 size_t ctf_stype_size, size_t ctf_lsize_sent)
85 {
86 ssize_t size, increment;
87
88 if (csize == ctf_lsize_sent)
89 {
90 size = lsize;
91 increment = ctf_type_size;
92 }
93 else
94 {
95 size = csize;
96 increment = ctf_stype_size;
97 }
98
99 if (sizep)
100 *sizep = size;
101 if (incrementp)
102 *incrementp = increment;
103
104 return size;
105 }
106
107 static ssize_t
108 get_ctt_size_v1 (const ctf_file_t *fp, const ctf_type_t *tp,
109 ssize_t *sizep, ssize_t *incrementp)
110 {
111 ctf_type_v1_t *t1p = (ctf_type_v1_t *) tp;
112
113 return (get_ctt_size_common (fp, tp, sizep, incrementp,
114 CTF_TYPE_LSIZE (t1p), t1p->ctt_size,
115 sizeof (ctf_type_v1_t), sizeof (ctf_stype_v1_t),
116 CTF_LSIZE_SENT_V1));
117 }
118
119 /* Return the size that a v1 will be once it is converted to v2. */
120
121 static ssize_t
122 get_ctt_size_v2_unconverted (const ctf_file_t *fp, const ctf_type_t *tp,
123 ssize_t *sizep, ssize_t *incrementp)
124 {
125 ctf_type_v1_t *t1p = (ctf_type_v1_t *) tp;
126
127 return (get_ctt_size_common (fp, tp, sizep, incrementp,
128 CTF_TYPE_LSIZE (t1p), t1p->ctt_size,
129 sizeof (ctf_type_t), sizeof (ctf_stype_t),
130 CTF_LSIZE_SENT));
131 }
132
133 static ssize_t
134 get_ctt_size_v2 (const ctf_file_t *fp, const ctf_type_t *tp,
135 ssize_t *sizep, ssize_t *incrementp)
136 {
137 return (get_ctt_size_common (fp, tp, sizep, incrementp,
138 CTF_TYPE_LSIZE (tp), tp->ctt_size,
139 sizeof (ctf_type_t), sizeof (ctf_stype_t),
140 CTF_LSIZE_SENT));
141 }
142
143 static ssize_t
144 get_vbytes_common (unsigned short kind, ssize_t size _libctf_unused_,
145 size_t vlen)
146 {
147 switch (kind)
148 {
149 case CTF_K_INTEGER:
150 case CTF_K_FLOAT:
151 return (sizeof (uint32_t));
152 case CTF_K_SLICE:
153 return (sizeof (ctf_slice_t));
154 case CTF_K_ENUM:
155 return (sizeof (ctf_enum_t) * vlen);
156 case CTF_K_FORWARD:
157 case CTF_K_UNKNOWN:
158 case CTF_K_POINTER:
159 case CTF_K_TYPEDEF:
160 case CTF_K_VOLATILE:
161 case CTF_K_CONST:
162 case CTF_K_RESTRICT:
163 return 0;
164 default:
165 ctf_dprintf ("detected invalid CTF kind -- %x\n", kind);
166 return ECTF_CORRUPT;
167 }
168 }
169
170 static ssize_t
171 get_vbytes_v1 (unsigned short kind, ssize_t size, size_t vlen)
172 {
173 switch (kind)
174 {
175 case CTF_K_ARRAY:
176 return (sizeof (ctf_array_v1_t));
177 case CTF_K_FUNCTION:
178 return (sizeof (unsigned short) * (vlen + (vlen & 1)));
179 case CTF_K_STRUCT:
180 case CTF_K_UNION:
181 if (size < CTF_LSTRUCT_THRESH_V1)
182 return (sizeof (ctf_member_v1_t) * vlen);
183 else
184 return (sizeof (ctf_lmember_v1_t) * vlen);
185 }
186
187 return (get_vbytes_common (kind, size, vlen));
188 }
189
190 static ssize_t
191 get_vbytes_v2 (unsigned short kind, ssize_t size, size_t vlen)
192 {
193 switch (kind)
194 {
195 case CTF_K_ARRAY:
196 return (sizeof (ctf_array_t));
197 case CTF_K_FUNCTION:
198 return (sizeof (uint32_t) * (vlen + (vlen & 1)));
199 case CTF_K_STRUCT:
200 case CTF_K_UNION:
201 if (size < CTF_LSTRUCT_THRESH)
202 return (sizeof (ctf_member_t) * vlen);
203 else
204 return (sizeof (ctf_lmember_t) * vlen);
205 }
206
207 return (get_vbytes_common (kind, size, vlen));
208 }
209
210 static const ctf_fileops_t ctf_fileops[] = {
211 {NULL, NULL, NULL, NULL, NULL},
212 /* CTF_VERSION_1 */
213 {get_kind_v1, get_root_v1, get_vlen_v1, get_ctt_size_v1, get_vbytes_v1},
214 /* CTF_VERSION_1_UPGRADED_3 */
215 {get_kind_v2, get_root_v2, get_vlen_v2, get_ctt_size_v2, get_vbytes_v2},
216 /* CTF_VERSION_2 */
217 {get_kind_v2, get_root_v2, get_vlen_v2, get_ctt_size_v2, get_vbytes_v2},
218 /* CTF_VERSION_3, identical to 2: only new type kinds */
219 {get_kind_v2, get_root_v2, get_vlen_v2, get_ctt_size_v2, get_vbytes_v2},
220 };
221
222 /* Initialize the symtab translation table by filling each entry with the
223 offset of the CTF type or function data corresponding to each STT_FUNC or
224 STT_OBJECT entry in the symbol table. */
225
226 static int
227 init_symtab (ctf_file_t *fp, const ctf_header_t *hp,
228 const ctf_sect_t *sp, const ctf_sect_t *strp)
229 {
230 const unsigned char *symp = sp->cts_data;
231 uint32_t *xp = fp->ctf_sxlate;
232 uint32_t *xend = xp + fp->ctf_nsyms;
233
234 uint32_t objtoff = hp->cth_objtoff;
235 uint32_t funcoff = hp->cth_funcoff;
236
237 uint32_t info, vlen;
238 Elf64_Sym sym, *gsp;
239 const char *name;
240
241 /* The CTF data object and function type sections are ordered to match
242 the relative order of the respective symbol types in the symtab.
243 If no type information is available for a symbol table entry, a
244 pad is inserted in the CTF section. As a further optimization,
245 anonymous or undefined symbols are omitted from the CTF data. */
246
247 for (; xp < xend; xp++, symp += sp->cts_entsize)
248 {
249 if (sp->cts_entsize == sizeof (Elf32_Sym))
250 gsp = ctf_sym_to_elf64 ((Elf32_Sym *) (uintptr_t) symp, &sym);
251 else
252 gsp = (Elf64_Sym *) (uintptr_t) symp;
253
254 if (gsp->st_name < strp->cts_size)
255 name = (const char *) strp->cts_data + gsp->st_name;
256 else
257 name = _CTF_NULLSTR;
258
259 if (gsp->st_name == 0 || gsp->st_shndx == SHN_UNDEF
260 || strcmp (name, "_START_") == 0 || strcmp (name, "_END_") == 0)
261 {
262 *xp = -1u;
263 continue;
264 }
265
266 switch (ELF64_ST_TYPE (gsp->st_info))
267 {
268 case STT_OBJECT:
269 if (objtoff >= hp->cth_funcoff
270 || (gsp->st_shndx == SHN_EXTABS && gsp->st_value == 0))
271 {
272 *xp = -1u;
273 break;
274 }
275
276 *xp = objtoff;
277 objtoff += sizeof (uint32_t);
278 break;
279
280 case STT_FUNC:
281 if (funcoff >= hp->cth_typeoff)
282 {
283 *xp = -1u;
284 break;
285 }
286
287 *xp = funcoff;
288
289 info = *(uint32_t *) ((uintptr_t) fp->ctf_buf + funcoff);
290 vlen = LCTF_INFO_VLEN (fp, info);
291
292 /* If we encounter a zero pad at the end, just skip it. Otherwise
293 skip over the function and its return type (+2) and the argument
294 list (vlen).
295 */
296 if (LCTF_INFO_KIND (fp, info) == CTF_K_UNKNOWN && vlen == 0)
297 funcoff += sizeof (uint32_t); /* Skip pad. */
298 else
299 funcoff += sizeof (uint32_t) * (vlen + 2);
300 break;
301
302 default:
303 *xp = -1u;
304 break;
305 }
306 }
307
308 ctf_dprintf ("loaded %lu symtab entries\n", fp->ctf_nsyms);
309 return 0;
310 }
311
312 /* Set the CTF base pointer and derive the buf pointer from it, initializing
313 everything in the ctf_file that depends on the base or buf pointers. */
314
315 static void
316 ctf_set_base (ctf_file_t *fp, const ctf_header_t *hp, void *base)
317 {
318 fp->ctf_base = base;
319 fp->ctf_buf = fp->ctf_base + sizeof (ctf_header_t);
320 fp->ctf_vars = (ctf_varent_t *) ((const char *) fp->ctf_buf +
321 hp->cth_varoff);
322 fp->ctf_nvars = (hp->cth_typeoff - hp->cth_varoff) / sizeof (ctf_varent_t);
323
324 fp->ctf_str[CTF_STRTAB_0].cts_strs = (const char *) fp->ctf_buf
325 + hp->cth_stroff;
326 fp->ctf_str[CTF_STRTAB_0].cts_len = hp->cth_strlen;
327
328 /* If we have a parent container name and label, store the relocated
329 string pointers in the CTF container for easy access later. */
330
331 /* Note: before conversion, these will be set to values that will be
332 immediately invalidated by the conversion process, but the conversion
333 process will call ctf_set_base() again to fix things up. */
334
335 if (hp->cth_parlabel != 0)
336 fp->ctf_parlabel = ctf_strptr (fp, hp->cth_parlabel);
337 if (hp->cth_parname != 0)
338 fp->ctf_parname = ctf_strptr (fp, hp->cth_parname);
339
340 ctf_dprintf ("ctf_set_base: parent name %s (label %s)\n",
341 fp->ctf_parname ? fp->ctf_parname : "<NULL>",
342 fp->ctf_parlabel ? fp->ctf_parlabel : "<NULL>");
343 }
344
345 /* Free a ctf_base pointer: the pointer passed, or (if NULL) fp->ctf_base. */
346 static void
347 ctf_free_base (ctf_file_t *fp, unsigned char *ctf_base)
348 {
349 unsigned char *base;
350
351 if (ctf_base)
352 base = ctf_base;
353 else
354 base = (unsigned char *) fp->ctf_base;
355
356 if (base != fp->ctf_data.cts_data && base != NULL)
357 ctf_free (base);
358 }
359
360 /* Set the version of the CTF file. */
361
362 /* When this is reset, LCTF_* changes behaviour, but there is no guarantee that
363 the variable data list associated with each type has been upgraded: the
364 caller must ensure this has been done in advance. */
365
366 static void
367 ctf_set_version (ctf_file_t * fp, ctf_header_t * cth, int ctf_version)
368 {
369 fp->ctf_version = ctf_version;
370 cth->cth_version = ctf_version;
371 fp->ctf_fileops = &ctf_fileops[ctf_version];
372 }
373
374 /* Upgrade the type table to CTF_VERSION_3 (really CTF_VERSION_1_UPGRADED_3).
375
376 The upgrade is not done in-place: the ctf_base is moved. ctf_strptr() must
377 not be called before reallocation is complete.
378
379 Type kinds not checked here due to nonexistence in older formats:
380 CTF_K_SLICE. */
381 static int
382 upgrade_types (ctf_file_t *fp, ctf_header_t *cth)
383 {
384 const ctf_type_v1_t *tbuf;
385 const ctf_type_v1_t *tend;
386 unsigned char *ctf_base, *old_ctf_base = (unsigned char *) fp->ctf_base;
387 ctf_type_t *t2buf;
388
389 ssize_t increase = 0, size, increment, v2increment, vbytes, v2bytes;
390 const ctf_type_v1_t *tp;
391 ctf_type_t *t2p;
392 ctf_header_t *new_cth;
393
394 tbuf = (ctf_type_v1_t *) (fp->ctf_buf + cth->cth_typeoff);
395 tend = (ctf_type_v1_t *) (fp->ctf_buf + cth->cth_stroff);
396
397 /* Much like init_types(), this is a two-pass process.
398
399 First, figure out the new type-section size needed. (It is possible,
400 in theory, for it to be less than the old size, but this is very
401 unlikely. It cannot be so small that cth_typeoff ends up of negative
402 size. We validate this with an assertion below.)
403
404 We must cater not only for changes in vlen and types sizes but also
405 for changes in 'increment', which happen because v2 places some types
406 into ctf_stype_t where v1 would be forced to use the larger non-stype. */
407
408 for (tp = tbuf; tp < tend;
409 tp = (ctf_type_v1_t *) ((uintptr_t) tp + increment + vbytes))
410 {
411 unsigned short kind = CTF_V1_INFO_KIND (tp->ctt_info);
412 unsigned long vlen = CTF_V1_INFO_VLEN (tp->ctt_info);
413
414 size = get_ctt_size_v1 (fp, (const ctf_type_t *) tp, NULL, &increment);
415 vbytes = get_vbytes_v1 (kind, size, vlen);
416
417 get_ctt_size_v2_unconverted (fp, (const ctf_type_t *) tp, NULL,
418 &v2increment);
419 v2bytes = get_vbytes_v2 (kind, size, vlen);
420
421 if ((vbytes < 0) || (size < 0))
422 return ECTF_CORRUPT;
423
424 increase += v2increment - increment; /* May be negative. */
425 increase += v2bytes - vbytes;
426 }
427
428 /* Allocate enough room for the new buffer, then copy everything but the
429 type section into place, and reset the base accordingly. Leave the
430 version number unchanged, so that LCTF_INFO_* still works on the
431 as-yet-untranslated type info. */
432
433 if ((ctf_base = ctf_alloc (fp->ctf_size + increase)) == NULL)
434 return ECTF_ZALLOC;
435
436 memcpy (ctf_base, fp->ctf_base, sizeof (ctf_header_t) + cth->cth_typeoff);
437 memcpy (ctf_base + sizeof (ctf_header_t) + cth->cth_stroff + increase,
438 fp->ctf_base + sizeof (ctf_header_t) + cth->cth_stroff,
439 cth->cth_strlen);
440
441 memset (ctf_base + sizeof (ctf_header_t) + cth->cth_typeoff, 0,
442 cth->cth_stroff - cth->cth_typeoff + increase);
443
444 /* The cth here is an automatic variable in ctf_bufopen(), and transient
445 (a copy maintained because at that stage the header read out of the
446 ctf file may be read-only). We make all modifications in the
447 canonical copy at ctf_base (by now, writable), then copy it back into
448 cth at the end. */
449
450 new_cth = (ctf_header_t *) ctf_base;
451 new_cth->cth_stroff += increase;
452 fp->ctf_size += increase;
453 assert (new_cth->cth_stroff >= new_cth->cth_typeoff);
454 ctf_set_base (fp, new_cth, ctf_base);
455
456 t2buf = (ctf_type_t *) (fp->ctf_buf + new_cth->cth_typeoff);
457
458 /* Iterate through all the types again, upgrading them.
459
460 Everything that hasn't changed can just be outright memcpy()ed.
461 Things that have changed need field-by-field consideration. */
462
463 for (tp = tbuf, t2p = t2buf; tp < tend;
464 tp = (ctf_type_v1_t *) ((uintptr_t) tp + increment + vbytes),
465 t2p = (ctf_type_t *) ((uintptr_t) t2p + v2increment + v2bytes))
466 {
467 unsigned short kind = CTF_V1_INFO_KIND (tp->ctt_info);
468 int isroot = CTF_V1_INFO_ISROOT (tp->ctt_info);
469 unsigned long vlen = CTF_V1_INFO_VLEN (tp->ctt_info);
470 ssize_t v2size;
471 void *vdata, *v2data;
472
473 size = get_ctt_size_v1 (fp, (const ctf_type_t *) tp, NULL, &increment);
474 vbytes = get_vbytes_v1 (kind, size, vlen);
475
476 t2p->ctt_name = tp->ctt_name;
477 t2p->ctt_info = CTF_TYPE_INFO (kind, isroot, vlen);
478
479 switch (kind)
480 {
481 case CTF_K_FUNCTION:
482 case CTF_K_FORWARD:
483 case CTF_K_TYPEDEF:
484 case CTF_K_POINTER:
485 case CTF_K_VOLATILE:
486 case CTF_K_CONST:
487 case CTF_K_RESTRICT:
488 t2p->ctt_type = tp->ctt_type;
489 break;
490 case CTF_K_INTEGER:
491 case CTF_K_FLOAT:
492 case CTF_K_ARRAY:
493 case CTF_K_STRUCT:
494 case CTF_K_UNION:
495 case CTF_K_ENUM:
496 case CTF_K_UNKNOWN:
497 if ((size_t) size <= CTF_MAX_SIZE)
498 t2p->ctt_size = size;
499 else
500 {
501 t2p->ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
502 t2p->ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
503 }
504 break;
505 }
506
507 v2size = get_ctt_size_v2 (fp, t2p, NULL, &v2increment);
508 v2bytes = get_vbytes_v2 (kind, v2size, vlen);
509
510 /* Catch out-of-sync get_ctt_size_*(). The count goes wrong if
511 these are not identical (and having them different makes no
512 sense semantically). */
513
514 assert (size == v2size);
515
516 /* Now the varlen info. */
517
518 vdata = (void *) ((uintptr_t) tp + increment);
519 v2data = (void *) ((uintptr_t) t2p + v2increment);
520
521 switch (kind)
522 {
523 case CTF_K_ARRAY:
524 {
525 const ctf_array_v1_t *ap = (const ctf_array_v1_t *) vdata;
526 ctf_array_t *a2p = (ctf_array_t *) v2data;
527
528 a2p->cta_contents = ap->cta_contents;
529 a2p->cta_index = ap->cta_index;
530 a2p->cta_nelems = ap->cta_nelems;
531 break;
532 }
533 case CTF_K_STRUCT:
534 case CTF_K_UNION:
535 {
536 ctf_member_t tmp;
537 const ctf_member_v1_t *m1 = (const ctf_member_v1_t *) vdata;
538 const ctf_lmember_v1_t *lm1 = (const ctf_lmember_v1_t *) m1;
539 ctf_member_t *m2 = (ctf_member_t *) v2data;
540 ctf_lmember_t *lm2 = (ctf_lmember_t *) m2;
541 unsigned long i;
542
543 /* We walk all four pointers forward, but only reference the two
544 that are valid for the given size, to avoid quadruplicating all
545 the code. */
546
547 for (i = vlen; i != 0; i--, m1++, lm1++, m2++, lm2++)
548 {
549 size_t offset;
550 if (size < CTF_LSTRUCT_THRESH_V1)
551 {
552 offset = m1->ctm_offset;
553 tmp.ctm_name = m1->ctm_name;
554 tmp.ctm_type = m1->ctm_type;
555 }
556 else
557 {
558 offset = CTF_LMEM_OFFSET (lm1);
559 tmp.ctm_name = lm1->ctlm_name;
560 tmp.ctm_type = lm1->ctlm_type;
561 }
562 if (size < CTF_LSTRUCT_THRESH)
563 {
564 m2->ctm_name = tmp.ctm_name;
565 m2->ctm_type = tmp.ctm_type;
566 m2->ctm_offset = offset;
567 }
568 else
569 {
570 lm2->ctlm_name = tmp.ctm_name;
571 lm2->ctlm_type = tmp.ctm_type;
572 lm2->ctlm_offsethi = CTF_OFFSET_TO_LMEMHI (offset);
573 lm2->ctlm_offsetlo = CTF_OFFSET_TO_LMEMLO (offset);
574 }
575 }
576 break;
577 }
578 case CTF_K_FUNCTION:
579 {
580 unsigned long i;
581 unsigned short *a1 = (unsigned short *) vdata;
582 uint32_t *a2 = (uint32_t *) v2data;
583
584 for (i = vlen; i != 0; i--, a1++, a2++)
585 *a2 = *a1;
586 }
587 /* FALLTHRU */
588 default:
589 /* Catch out-of-sync get_vbytes_*(). */
590 assert (vbytes == v2bytes);
591 memcpy (v2data, vdata, vbytes);
592 }
593 }
594
595 /* Verify that the entire region was converted. If not, we are either
596 converting too much, or too little (leading to a buffer overrun either here
597 or at read time, in init_types().) */
598
599 assert ((size_t) t2p - (size_t) fp->ctf_buf == new_cth->cth_stroff);
600
601 ctf_set_version (fp, (ctf_header_t *) ctf_base, CTF_VERSION_1_UPGRADED_3);
602 ctf_free_base (fp, old_ctf_base);
603 memcpy (cth, new_cth, sizeof (ctf_header_t));
604
605 return 0;
606 }
607
608 /* Initialize the type ID translation table with the byte offset of each type,
609 and initialize the hash tables of each named type. Upgrade the type table to
610 the latest supported representation in the process, if needed, and if this
611 recension of libctf supports upgrading. */
612
613 static int
614 init_types (ctf_file_t *fp, ctf_header_t *cth)
615 {
616 const ctf_type_t *tbuf;
617 const ctf_type_t *tend;
618
619 unsigned long pop[CTF_K_MAX + 1] = { 0 };
620 const ctf_type_t *tp;
621 ctf_hash_t *hp;
622 uint32_t id, dst;
623 uint32_t *xp;
624
625 /* We determine whether the container is a child or a parent based on
626 the value of cth_parname. */
627
628 int child = cth->cth_parname != 0;
629 int nlstructs = 0, nlunions = 0;
630 int err;
631
632 if (_libctf_unlikely_ (fp->ctf_version == CTF_VERSION_1))
633 {
634 int err;
635 if ((err = upgrade_types (fp, cth)) != 0)
636 return err; /* Upgrade failed. */
637 }
638
639 tbuf = (ctf_type_t *) (fp->ctf_buf + cth->cth_typeoff);
640 tend = (ctf_type_t *) (fp->ctf_buf + cth->cth_stroff);
641
642 /* We make two passes through the entire type section. In this first
643 pass, we count the number of each type and the total number of types. */
644
645 for (tp = tbuf; tp < tend; fp->ctf_typemax++)
646 {
647 unsigned short kind = LCTF_INFO_KIND (fp, tp->ctt_info);
648 unsigned long vlen = LCTF_INFO_VLEN (fp, tp->ctt_info);
649 ssize_t size, increment, vbytes;
650
651 (void) ctf_get_ctt_size (fp, tp, &size, &increment);
652 vbytes = LCTF_VBYTES (fp, kind, size, vlen);
653
654 if (vbytes < 0)
655 return ECTF_CORRUPT;
656
657 if (kind == CTF_K_FORWARD)
658 {
659 /* For forward declarations, ctt_type is the CTF_K_* kind for the tag,
660 so bump that population count too. If ctt_type is unknown, treat
661 the tag as a struct. */
662
663 if (tp->ctt_type == CTF_K_UNKNOWN || tp->ctt_type >= CTF_K_MAX)
664 pop[CTF_K_STRUCT]++;
665 else
666 pop[tp->ctt_type]++;
667 }
668 tp = (ctf_type_t *) ((uintptr_t) tp + increment + vbytes);
669 pop[kind]++;
670 }
671
672 if (child)
673 {
674 ctf_dprintf ("CTF container %p is a child\n", (void *) fp);
675 fp->ctf_flags |= LCTF_CHILD;
676 }
677 else
678 ctf_dprintf ("CTF container %p is a parent\n", (void *) fp);
679
680 /* Now that we've counted up the number of each type, we can allocate
681 the hash tables, type translation table, and pointer table. */
682
683 if ((fp->ctf_structs = ctf_hash_create (pop[CTF_K_STRUCT], ctf_hash_string,
684 ctf_hash_eq_string)) == NULL)
685 return ENOMEM;
686
687 if ((fp->ctf_unions = ctf_hash_create (pop[CTF_K_UNION], ctf_hash_string,
688 ctf_hash_eq_string)) == NULL)
689 return ENOMEM;
690
691 if ((fp->ctf_enums = ctf_hash_create (pop[CTF_K_ENUM], ctf_hash_string,
692 ctf_hash_eq_string)) == NULL)
693 return ENOMEM;
694
695 if ((fp->ctf_names = ctf_hash_create (pop[CTF_K_INTEGER] +
696 pop[CTF_K_FLOAT] +
697 pop[CTF_K_FUNCTION] +
698 pop[CTF_K_TYPEDEF] +
699 pop[CTF_K_POINTER] +
700 pop[CTF_K_VOLATILE] +
701 pop[CTF_K_CONST] +
702 pop[CTF_K_RESTRICT],
703 ctf_hash_string,
704 ctf_hash_eq_string)) == NULL)
705 return ENOMEM;
706
707 fp->ctf_txlate = ctf_alloc (sizeof (uint32_t) * (fp->ctf_typemax + 1));
708 fp->ctf_ptrtab = ctf_alloc (sizeof (uint32_t) * (fp->ctf_typemax + 1));
709
710 if (fp->ctf_txlate == NULL || fp->ctf_ptrtab == NULL)
711 return ENOMEM; /* Memory allocation failed. */
712
713 xp = fp->ctf_txlate;
714 *xp++ = 0; /* Type id 0 is used as a sentinel value. */
715
716 memset (fp->ctf_txlate, 0, sizeof (uint32_t) * (fp->ctf_typemax + 1));
717 memset (fp->ctf_ptrtab, 0, sizeof (uint32_t) * (fp->ctf_typemax + 1));
718
719 /* In the second pass through the types, we fill in each entry of the
720 type and pointer tables and add names to the appropriate hashes. */
721
722 for (id = 1, tp = tbuf; tp < tend; xp++, id++)
723 {
724 unsigned short kind = LCTF_INFO_KIND (fp, tp->ctt_info);
725 unsigned short flag = LCTF_INFO_ISROOT (fp, tp->ctt_info);
726 unsigned long vlen = LCTF_INFO_VLEN (fp, tp->ctt_info);
727 ssize_t size, increment, vbytes;
728
729 const char *name;
730
731 (void) ctf_get_ctt_size (fp, tp, &size, &increment);
732 name = ctf_strptr (fp, tp->ctt_name);
733 vbytes = LCTF_VBYTES (fp, kind, size, vlen);
734
735 switch (kind)
736 {
737 case CTF_K_INTEGER:
738 case CTF_K_FLOAT:
739 /* Names are reused by bit-fields, which are differentiated by their
740 encodings, and so typically we'd record only the first instance of
741 a given intrinsic. However, we replace an existing type with a
742 root-visible version so that we can be sure to find it when
743 checking for conflicting definitions in ctf_add_type(). */
744
745 if (((ctf_hash_lookup_type (fp->ctf_names, fp, name)) == 0)
746 || (flag & CTF_ADD_ROOT))
747 {
748 err = ctf_hash_define_type (fp->ctf_names, fp,
749 LCTF_INDEX_TO_TYPE (fp, id, child),
750 tp->ctt_name);
751 if (err != 0 && err != ECTF_STRTAB)
752 return err;
753 }
754 break;
755
756 /* These kinds have no name, so do not need interning into any
757 hashtables. */
758 case CTF_K_ARRAY:
759 case CTF_K_SLICE:
760 break;
761
762 case CTF_K_FUNCTION:
763 err = ctf_hash_insert_type (fp->ctf_names, fp,
764 LCTF_INDEX_TO_TYPE (fp, id, child),
765 tp->ctt_name);
766 if (err != 0 && err != ECTF_STRTAB)
767 return err;
768 break;
769
770 case CTF_K_STRUCT:
771 err = ctf_hash_define_type (fp->ctf_structs, fp,
772 LCTF_INDEX_TO_TYPE (fp, id, child),
773 tp->ctt_name);
774
775 if (err != 0 && err != ECTF_STRTAB)
776 return err;
777
778 if (size >= CTF_LSTRUCT_THRESH)
779 nlstructs++;
780 break;
781
782 case CTF_K_UNION:
783 err = ctf_hash_define_type (fp->ctf_unions, fp,
784 LCTF_INDEX_TO_TYPE (fp, id, child),
785 tp->ctt_name);
786
787 if (err != 0 && err != ECTF_STRTAB)
788 return err;
789
790 if (size >= CTF_LSTRUCT_THRESH)
791 nlunions++;
792 break;
793
794 case CTF_K_ENUM:
795 err = ctf_hash_define_type (fp->ctf_enums, fp,
796 LCTF_INDEX_TO_TYPE (fp, id, child),
797 tp->ctt_name);
798
799 if (err != 0 && err != ECTF_STRTAB)
800 return err;
801 break;
802
803 case CTF_K_TYPEDEF:
804 err = ctf_hash_insert_type (fp->ctf_names, fp,
805 LCTF_INDEX_TO_TYPE (fp, id, child),
806 tp->ctt_name);
807 if (err != 0 && err != ECTF_STRTAB)
808 return err;
809 break;
810
811 case CTF_K_FORWARD:
812 /* Only insert forward tags into the given hash if the type or tag
813 name is not already present. */
814 switch (tp->ctt_type)
815 {
816 case CTF_K_STRUCT:
817 hp = fp->ctf_structs;
818 break;
819 case CTF_K_UNION:
820 hp = fp->ctf_unions;
821 break;
822 case CTF_K_ENUM:
823 hp = fp->ctf_enums;
824 break;
825 default:
826 hp = fp->ctf_structs;
827 }
828
829 if (ctf_hash_lookup_type (hp, fp, name) == 0)
830 {
831 err = ctf_hash_insert_type (hp, fp,
832 LCTF_INDEX_TO_TYPE (fp, id, child),
833 tp->ctt_name);
834 if (err != 0 && err != ECTF_STRTAB)
835 return err;
836 }
837 break;
838
839 case CTF_K_POINTER:
840 /* If the type referenced by the pointer is in this CTF container,
841 then store the index of the pointer type in
842 fp->ctf_ptrtab[ index of referenced type ]. */
843
844 if (LCTF_TYPE_ISCHILD (fp, tp->ctt_type) == child
845 && LCTF_TYPE_TO_INDEX (fp, tp->ctt_type) <= fp->ctf_typemax)
846 fp->ctf_ptrtab[LCTF_TYPE_TO_INDEX (fp, tp->ctt_type)] = id;
847 /*FALLTHRU*/
848
849 case CTF_K_VOLATILE:
850 case CTF_K_CONST:
851 case CTF_K_RESTRICT:
852 err = ctf_hash_insert_type (fp->ctf_names, fp,
853 LCTF_INDEX_TO_TYPE (fp, id, child),
854 tp->ctt_name);
855 if (err != 0 && err != ECTF_STRTAB)
856 return err;
857 break;
858 default:
859 ctf_dprintf ("unhandled CTF kind in endianness conversion -- %x\n",
860 kind);
861 return ECTF_CORRUPT;
862 }
863
864 *xp = (uint32_t) ((uintptr_t) tp - (uintptr_t) fp->ctf_buf);
865 tp = (ctf_type_t *) ((uintptr_t) tp + increment + vbytes);
866 }
867
868 ctf_dprintf ("%lu total types processed\n", fp->ctf_typemax);
869 ctf_dprintf ("%u enum names hashed\n", ctf_hash_size (fp->ctf_enums));
870 ctf_dprintf ("%u struct names hashed (%d long)\n",
871 ctf_hash_size (fp->ctf_structs), nlstructs);
872 ctf_dprintf ("%u union names hashed (%d long)\n",
873 ctf_hash_size (fp->ctf_unions), nlunions);
874 ctf_dprintf ("%u base type names hashed\n", ctf_hash_size (fp->ctf_names));
875
876 /* Make an additional pass through the pointer table to find pointers that
877 point to anonymous typedef nodes. If we find one, modify the pointer table
878 so that the pointer is also known to point to the node that is referenced
879 by the anonymous typedef node. */
880
881 for (id = 1; id <= fp->ctf_typemax; id++)
882 {
883 if ((dst = fp->ctf_ptrtab[id]) != 0)
884 {
885 tp = LCTF_INDEX_TO_TYPEPTR (fp, id);
886
887 if (LCTF_INFO_KIND (fp, tp->ctt_info) == CTF_K_TYPEDEF &&
888 strcmp (ctf_strptr (fp, tp->ctt_name), "") == 0 &&
889 LCTF_TYPE_ISCHILD (fp, tp->ctt_type) == child &&
890 LCTF_TYPE_TO_INDEX (fp, tp->ctt_type) <= fp->ctf_typemax)
891 fp->ctf_ptrtab[LCTF_TYPE_TO_INDEX (fp, tp->ctt_type)] = dst;
892 }
893 }
894
895 return 0;
896 }
897
898 /* Endianness-flipping routines.
899
900 We flip everything, mindlessly, even 1-byte entities, so that future
901 expansions do not require changes to this code. */
902
903 /* < C11? define away static assertions. */
904
905 #if !defined (__STDC_VERSION__) || __STDC_VERSION__ < 201112L
906 #define _Static_assert(cond, err)
907 #endif
908
909 /* Swap the endianness of something. */
910
911 #define swap_thing(x) \
912 do { \
913 _Static_assert (sizeof (x) == 1 || (sizeof (x) % 2 == 0 \
914 && sizeof (x) <= 8), \
915 "Invalid size, update endianness code"); \
916 switch (sizeof (x)) { \
917 case 2: x = bswap_16 (x); break; \
918 case 4: x = bswap_32 (x); break; \
919 case 8: x = bswap_64 (x); break; \
920 case 1: /* Nothing needs doing */ \
921 break; \
922 } \
923 } while (0);
924
925 /* Flip the endianness of the CTF header. */
926
927 static void
928 flip_header (ctf_header_t *cth)
929 {
930 swap_thing (cth->cth_preamble.ctp_magic);
931 swap_thing (cth->cth_preamble.ctp_version);
932 swap_thing (cth->cth_preamble.ctp_flags);
933 swap_thing (cth->cth_parlabel);
934 swap_thing (cth->cth_parname);
935 swap_thing (cth->cth_objtoff);
936 swap_thing (cth->cth_funcoff);
937 swap_thing (cth->cth_varoff);
938 swap_thing (cth->cth_typeoff);
939 swap_thing (cth->cth_stroff);
940 swap_thing (cth->cth_strlen);
941 }
942
943 /* Flip the endianness of the label section, an array of ctf_lblent_t. */
944
945 static void
946 flip_lbls (void *start, size_t len)
947 {
948 ctf_lblent_t *lbl = start;
949
950 for (ssize_t i = len / sizeof (struct ctf_lblent); i > 0; lbl++, i--)
951 {
952 swap_thing (lbl->ctl_label);
953 swap_thing (lbl->ctl_type);
954 }
955 }
956
957 /* Flip the endianness of the data-object or function sections, an array of
958 uint32_t. (The function section has more internal structure, but that
959 structure is an array of uint32_t, so can be treated as one big array for
960 byte-swapping.) */
961
962 static void
963 flip_objts (void *start, size_t len)
964 {
965 uint32_t *obj = start;
966
967 for (ssize_t i = len / sizeof (uint32_t); i > 0; obj++, i--)
968 swap_thing (*obj);
969 }
970
971 /* Flip the endianness of the variable section, an array of ctf_varent_t. */
972
973 static void
974 flip_vars (void *start, size_t len)
975 {
976 ctf_varent_t *var = start;
977
978 for (ssize_t i = len / sizeof (struct ctf_varent); i > 0; var++, i--)
979 {
980 swap_thing (var->ctv_name);
981 swap_thing (var->ctv_type);
982 }
983 }
984
985 /* Flip the endianness of the type section, a tagged array of ctf_type or
986 ctf_stype followed by variable data. */
987
988 static int
989 flip_types (void *start, size_t len)
990 {
991 ctf_type_t *t = start;
992
993 while ((uintptr_t) t < ((uintptr_t) start) + len)
994 {
995 swap_thing (t->ctt_name);
996 swap_thing (t->ctt_info);
997 swap_thing (t->ctt_size);
998
999 uint32_t kind = CTF_V2_INFO_KIND (t->ctt_info);
1000 size_t size = t->ctt_size;
1001 uint32_t vlen = CTF_V2_INFO_VLEN (t->ctt_info);
1002 size_t vbytes = get_vbytes_v2 (kind, size, vlen);
1003
1004 if (_libctf_unlikely_ (size == CTF_LSIZE_SENT))
1005 {
1006 swap_thing (t->ctt_lsizehi);
1007 swap_thing (t->ctt_lsizelo);
1008 size = CTF_TYPE_LSIZE (t);
1009 t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_type_t));
1010 }
1011 else
1012 t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_stype_t));
1013
1014 switch (kind)
1015 {
1016 case CTF_K_FORWARD:
1017 case CTF_K_UNKNOWN:
1018 case CTF_K_POINTER:
1019 case CTF_K_TYPEDEF:
1020 case CTF_K_VOLATILE:
1021 case CTF_K_CONST:
1022 case CTF_K_RESTRICT:
1023 /* These types have no vlen data to swap. */
1024 assert (vbytes == 0);
1025 break;
1026
1027 case CTF_K_INTEGER:
1028 case CTF_K_FLOAT:
1029 {
1030 /* These types have a single uint32_t. */
1031
1032 uint32_t *item = (uint32_t *) t;
1033
1034 swap_thing (*item);
1035 break;
1036 }
1037
1038 case CTF_K_FUNCTION:
1039 {
1040 /* This type has a bunch of uint32_ts. */
1041
1042 uint32_t *item = (uint32_t *) t;
1043
1044 for (ssize_t i = vlen; i > 0; item++, i--)
1045 swap_thing (*item);
1046 break;
1047 }
1048
1049 case CTF_K_ARRAY:
1050 {
1051 /* This has a single ctf_array_t. */
1052
1053 ctf_array_t *a = (ctf_array_t *) t;
1054
1055 assert (vbytes == sizeof (ctf_array_t));
1056 swap_thing (a->cta_contents);
1057 swap_thing (a->cta_index);
1058 swap_thing (a->cta_nelems);
1059
1060 break;
1061 }
1062
1063 case CTF_K_SLICE:
1064 {
1065 /* This has a single ctf_slice_t. */
1066
1067 ctf_slice_t *s = (ctf_slice_t *) t;
1068
1069 assert (vbytes == sizeof (ctf_slice_t));
1070 swap_thing (s->cts_type);
1071 swap_thing (s->cts_offset);
1072 swap_thing (s->cts_bits);
1073
1074 break;
1075 }
1076
1077 case CTF_K_STRUCT:
1078 case CTF_K_UNION:
1079 {
1080 /* This has an array of ctf_member or ctf_lmember, depending on
1081 size. We could consider it to be a simple array of uint32_t,
1082 but for safety's sake in case these structures ever acquire
1083 non-uint32_t members, do it member by member. */
1084
1085 if (_libctf_unlikely_ (size >= CTF_LSTRUCT_THRESH))
1086 {
1087 ctf_lmember_t *lm = (ctf_lmember_t *) t;
1088 for (ssize_t i = vlen; i > 0; i--, lm++)
1089 {
1090 swap_thing (lm->ctlm_name);
1091 swap_thing (lm->ctlm_offsethi);
1092 swap_thing (lm->ctlm_type);
1093 swap_thing (lm->ctlm_offsetlo);
1094 }
1095 }
1096 else
1097 {
1098 ctf_member_t *m = (ctf_member_t *) t;
1099 for (ssize_t i = vlen; i > 0; i--, m++)
1100 {
1101 swap_thing (m->ctm_name);
1102 swap_thing (m->ctm_offset);
1103 swap_thing (m->ctm_type);
1104 }
1105 }
1106 break;
1107 }
1108
1109 case CTF_K_ENUM:
1110 {
1111 /* This has an array of ctf_enum_t. */
1112
1113 ctf_enum_t *item = (ctf_enum_t *) t;
1114
1115 for (ssize_t i = vlen; i > 0; item++, i--)
1116 {
1117 swap_thing (item->cte_name);
1118 swap_thing (item->cte_value);
1119 }
1120 break;
1121 }
1122 default:
1123 ctf_dprintf ("unhandled CTF kind in endianness conversion -- %x\n",
1124 kind);
1125 return ECTF_CORRUPT;
1126 }
1127
1128 t = (ctf_type_t *) ((uintptr_t) t + vbytes);
1129 }
1130
1131 return 0;
1132 }
1133
1134 /* Flip the endianness of BASE, given the offsets in the (already endian-
1135 converted) CTH.
1136
1137 All of this stuff happens before the header is fully initialized, so the
1138 LCTF_*() macros cannot be used yet. Since we do not try to endian-convert v1
1139 data, this is no real loss. */
1140
1141 static int
1142 flip_ctf (ctf_header_t *cth, unsigned char *base)
1143 {
1144 base += sizeof (ctf_header_t);
1145
1146 flip_lbls (base + cth->cth_lbloff, cth->cth_objtoff - cth->cth_lbloff);
1147 flip_objts (base + cth->cth_objtoff, cth->cth_funcoff - cth->cth_objtoff);
1148 flip_objts (base + cth->cth_funcoff, cth->cth_varoff - cth->cth_funcoff);
1149 flip_vars (base + cth->cth_varoff, cth->cth_typeoff - cth->cth_varoff);
1150 return flip_types (base + cth->cth_typeoff, cth->cth_stroff - cth->cth_typeoff);
1151 }
1152
1153 /* Open a CTF file, mocking up a suitable ctf_sect. */
1154 ctf_file_t *ctf_simple_open (const char *ctfsect, size_t ctfsect_size,
1155 const char *symsect, size_t symsect_size,
1156 size_t symsect_entsize,
1157 const char *strsect, size_t strsect_size,
1158 int *errp)
1159 {
1160 ctf_sect_t skeleton;
1161
1162 ctf_sect_t ctf_sect, sym_sect, str_sect;
1163 ctf_sect_t *ctfsectp = NULL;
1164 ctf_sect_t *symsectp = NULL;
1165 ctf_sect_t *strsectp = NULL;
1166
1167 skeleton.cts_name = _CTF_SECTION;
1168 skeleton.cts_entsize = 1;
1169
1170 if (ctfsect)
1171 {
1172 memcpy (&ctf_sect, &skeleton, sizeof (struct ctf_sect));
1173 ctf_sect.cts_data = ctfsect;
1174 ctf_sect.cts_size = ctfsect_size;
1175 ctfsectp = &ctf_sect;
1176 }
1177
1178 if (symsect)
1179 {
1180 memcpy (&sym_sect, &skeleton, sizeof (struct ctf_sect));
1181 sym_sect.cts_data = symsect;
1182 sym_sect.cts_size = symsect_size;
1183 sym_sect.cts_entsize = symsect_entsize;
1184 symsectp = &sym_sect;
1185 }
1186
1187 if (strsect)
1188 {
1189 memcpy (&str_sect, &skeleton, sizeof (struct ctf_sect));
1190 str_sect.cts_data = strsect;
1191 str_sect.cts_size = strsect_size;
1192 strsectp = &str_sect;
1193 }
1194
1195 return ctf_bufopen (ctfsectp, symsectp, strsectp, errp);
1196 }
1197
1198 /* Decode the specified CTF buffer and optional symbol table, and create a new
1199 CTF container representing the symbolic debugging information. This code can
1200 be used directly by the debugger, or it can be used as the engine for
1201 ctf_fdopen() or ctf_open(), below. */
1202
1203 ctf_file_t *
1204 ctf_bufopen (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
1205 const ctf_sect_t *strsect, int *errp)
1206 {
1207 const ctf_preamble_t *pp;
1208 ctf_header_t hp;
1209 ctf_file_t *fp;
1210 void *base;
1211 size_t size, hdrsz;
1212 int foreign_endian = 0;
1213 int err;
1214
1215 libctf_init_debug();
1216
1217 if (ctfsect == NULL || ((symsect == NULL) != (strsect == NULL)))
1218 return (ctf_set_open_errno (errp, EINVAL));
1219
1220 if (symsect != NULL && symsect->cts_entsize != sizeof (Elf32_Sym) &&
1221 symsect->cts_entsize != sizeof (Elf64_Sym))
1222 return (ctf_set_open_errno (errp, ECTF_SYMTAB));
1223
1224 if (symsect != NULL && symsect->cts_data == NULL)
1225 return (ctf_set_open_errno (errp, ECTF_SYMBAD));
1226
1227 if (strsect != NULL && strsect->cts_data == NULL)
1228 return (ctf_set_open_errno (errp, ECTF_STRBAD));
1229
1230 if (ctfsect->cts_size < sizeof (ctf_preamble_t))
1231 return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1232
1233 pp = (const ctf_preamble_t *) ctfsect->cts_data;
1234
1235 ctf_dprintf ("ctf_bufopen: magic=0x%x version=%u\n",
1236 pp->ctp_magic, pp->ctp_version);
1237
1238 /* Validate each part of the CTF header.
1239
1240 First, we validate the preamble (common to all versions). At that point,
1241 we know the endianness and specific header version, and can validate the
1242 version-specific parts including section offsets and alignments.
1243
1244 We specifically do not support foreign-endian old versions. */
1245
1246 if (_libctf_unlikely_ (pp->ctp_magic != CTF_MAGIC))
1247 {
1248 if (pp->ctp_magic == bswap_16 (CTF_MAGIC))
1249 {
1250 if (pp->ctp_version != CTF_VERSION_3)
1251 return (ctf_set_open_errno (errp, ECTF_CTFVERS));
1252 foreign_endian = 1;
1253 }
1254 else
1255 return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1256 }
1257
1258 if (_libctf_unlikely_ ((pp->ctp_version < CTF_VERSION_1)
1259 || (pp->ctp_version > CTF_VERSION_3)))
1260 return (ctf_set_open_errno (errp, ECTF_CTFVERS));
1261
1262 if ((symsect != NULL) && (pp->ctp_version < CTF_VERSION_2))
1263 {
1264 /* The symtab can contain function entries which contain embedded ctf
1265 info. We do not support dynamically upgrading such entries (none
1266 should exist in any case, since dwarf2ctf does not create them). */
1267
1268 ctf_dprintf ("ctf_bufopen: CTF version %d symsect not "
1269 "supported\n", pp->ctp_version);
1270 return (ctf_set_open_errno (errp, ECTF_NOTSUP));
1271 }
1272
1273 if (ctfsect->cts_size < sizeof (ctf_header_t))
1274 return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1275
1276 memcpy (&hp, ctfsect->cts_data, sizeof (hp));
1277
1278 if (foreign_endian)
1279 flip_header (&hp);
1280
1281 ctf_dprintf ("header offsets: %x/%x/%x/%x/%x/%x/%x\n",
1282 hp.cth_lbloff, hp.cth_objtoff, hp.cth_funcoff, hp.cth_varoff,
1283 hp.cth_typeoff, hp.cth_stroff, hp.cth_strlen);
1284 hdrsz = sizeof (ctf_header_t);
1285
1286 size = hp.cth_stroff + hp.cth_strlen;
1287
1288 ctf_dprintf ("ctf_bufopen: uncompressed size=%lu\n", (unsigned long) size);
1289
1290 if (hp.cth_lbloff > size || hp.cth_objtoff > size
1291 || hp.cth_funcoff > size || hp.cth_typeoff > size || hp.cth_stroff > size)
1292 return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1293
1294 if (hp.cth_lbloff > hp.cth_objtoff
1295 || hp.cth_objtoff > hp.cth_funcoff
1296 || hp.cth_funcoff > hp.cth_typeoff
1297 || hp.cth_funcoff > hp.cth_varoff
1298 || hp.cth_varoff > hp.cth_typeoff || hp.cth_typeoff > hp.cth_stroff)
1299 return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1300
1301 if ((hp.cth_lbloff & 3) || (hp.cth_objtoff & 1)
1302 || (hp.cth_funcoff & 1) || (hp.cth_varoff & 3) || (hp.cth_typeoff & 3))
1303 return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1304
1305 /* Once everything is determined to be valid, attempt to decompress the CTF
1306 data buffer if it is compressed, or copy it into new storage if it is not
1307 compressed but needs endian-flipping. Otherwise we just put the data
1308 section's buffer pointer into ctf_buf, below. */
1309
1310 /* Note: if this is a v1 buffer, it will be reallocated and expanded by
1311 init_types(). */
1312
1313 if (hp.cth_flags & CTF_F_COMPRESS)
1314 {
1315 size_t srclen;
1316 uLongf dstlen;
1317 const void *src;
1318 int rc = Z_OK;
1319 void *buf;
1320
1321 if ((base = ctf_alloc (size + hdrsz)) == NULL)
1322 return (ctf_set_open_errno (errp, ECTF_ZALLOC));
1323
1324 memcpy (base, ctfsect->cts_data, hdrsz);
1325 ((ctf_preamble_t *) base)->ctp_flags &= ~CTF_F_COMPRESS;
1326 buf = (unsigned char *) base + hdrsz;
1327
1328 src = (unsigned char *) ctfsect->cts_data + hdrsz;
1329 srclen = ctfsect->cts_size - hdrsz;
1330 dstlen = size;
1331
1332 if ((rc = uncompress (buf, &dstlen, src, srclen)) != Z_OK)
1333 {
1334 ctf_dprintf ("zlib inflate err: %s\n", zError (rc));
1335 free (base);
1336 return (ctf_set_open_errno (errp, ECTF_DECOMPRESS));
1337 }
1338
1339 if ((size_t) dstlen != size)
1340 {
1341 ctf_dprintf ("zlib inflate short -- got %lu of %lu "
1342 "bytes\n", (unsigned long) dstlen, (unsigned long) size);
1343 free (base);
1344 return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1345 }
1346
1347 }
1348 else if (foreign_endian)
1349 {
1350 if ((base = ctf_alloc (size + hdrsz)) == NULL)
1351 return (ctf_set_open_errno (errp, ECTF_ZALLOC));
1352 memcpy (base, ctfsect->cts_data, size + hdrsz);
1353 }
1354 else
1355 base = (void *) ctfsect->cts_data;
1356
1357 /* Flip the endianness of the copy of the header in the section, to avoid
1358 ending up with a partially-endian-flipped file. */
1359
1360 if (foreign_endian)
1361 flip_header ((ctf_header_t *) base);
1362
1363 /* Once we have uncompressed and validated the CTF data buffer, we can
1364 proceed with allocating a ctf_file_t and initializing it.
1365
1366 Nothing that depends on buf or base should be set directly in this function
1367 before the init_types() call, because it may be reallocated during
1368 transparent upgrade if this recension of libctf is so configured: see
1369 ctf_set_base() and ctf_realloc_base(). */
1370
1371 if ((fp = ctf_alloc (sizeof (ctf_file_t))) == NULL)
1372 return (ctf_set_open_errno (errp, ENOMEM));
1373
1374 memset (fp, 0, sizeof (ctf_file_t));
1375 ctf_set_version (fp, &hp, hp.cth_version);
1376 ctf_str_create_atoms (fp);
1377
1378 if (_libctf_unlikely_ (hp.cth_version < CTF_VERSION_2))
1379 fp->ctf_parmax = CTF_MAX_PTYPE_V1;
1380 else
1381 fp->ctf_parmax = CTF_MAX_PTYPE;
1382
1383 memcpy (&fp->ctf_data, ctfsect, sizeof (ctf_sect_t));
1384
1385 if (symsect != NULL)
1386 {
1387 memcpy (&fp->ctf_symtab, symsect, sizeof (ctf_sect_t));
1388 memcpy (&fp->ctf_strtab, strsect, sizeof (ctf_sect_t));
1389 }
1390
1391 if (fp->ctf_data.cts_name != NULL)
1392 fp->ctf_data.cts_name = ctf_strdup (fp->ctf_data.cts_name);
1393 if (fp->ctf_symtab.cts_name != NULL)
1394 fp->ctf_symtab.cts_name = ctf_strdup (fp->ctf_symtab.cts_name);
1395 if (fp->ctf_strtab.cts_name != NULL)
1396 fp->ctf_strtab.cts_name = ctf_strdup (fp->ctf_strtab.cts_name);
1397
1398 if (fp->ctf_data.cts_name == NULL)
1399 fp->ctf_data.cts_name = _CTF_NULLSTR;
1400 if (fp->ctf_symtab.cts_name == NULL)
1401 fp->ctf_symtab.cts_name = _CTF_NULLSTR;
1402 if (fp->ctf_strtab.cts_name == NULL)
1403 fp->ctf_strtab.cts_name = _CTF_NULLSTR;
1404
1405 if (strsect != NULL)
1406 {
1407 fp->ctf_str[CTF_STRTAB_1].cts_strs = strsect->cts_data;
1408 fp->ctf_str[CTF_STRTAB_1].cts_len = strsect->cts_size;
1409 }
1410
1411 if (foreign_endian &&
1412 (err = flip_ctf (&hp, base)) != 0)
1413 {
1414 /* We can be certain that flip_ctf() will have endian-flipped everything
1415 other than the types table when we return. In particular the header
1416 is fine, so set it, to allow freeing to use the usual code path. */
1417
1418 (void) ctf_set_open_errno (errp, err);
1419 ctf_set_base (fp, &hp, base);
1420 goto bad;
1421 }
1422
1423 ctf_set_base (fp, &hp, base);
1424 fp->ctf_size = size + hdrsz;
1425
1426 if ((err = init_types (fp, &hp)) != 0)
1427 {
1428 (void) ctf_set_open_errno (errp, err);
1429 goto bad;
1430 }
1431
1432 /* If we have a symbol table section, allocate and initialize
1433 the symtab translation table, pointed to by ctf_sxlate. */
1434
1435 if (symsect != NULL)
1436 {
1437 fp->ctf_nsyms = symsect->cts_size / symsect->cts_entsize;
1438 fp->ctf_sxlate = ctf_alloc (fp->ctf_nsyms * sizeof (uint32_t));
1439
1440 if (fp->ctf_sxlate == NULL)
1441 {
1442 (void) ctf_set_open_errno (errp, ENOMEM);
1443 goto bad;
1444 }
1445
1446 if ((err = init_symtab (fp, &hp, symsect, strsect)) != 0)
1447 {
1448 (void) ctf_set_open_errno (errp, err);
1449 goto bad;
1450 }
1451 }
1452
1453 /* Initialize the ctf_lookup_by_name top-level dictionary. We keep an
1454 array of type name prefixes and the corresponding ctf_hash to use.
1455 NOTE: This code must be kept in sync with the code in ctf_update(). */
1456 fp->ctf_lookups[0].ctl_prefix = "struct";
1457 fp->ctf_lookups[0].ctl_len = strlen (fp->ctf_lookups[0].ctl_prefix);
1458 fp->ctf_lookups[0].ctl_hash = fp->ctf_structs;
1459 fp->ctf_lookups[1].ctl_prefix = "union";
1460 fp->ctf_lookups[1].ctl_len = strlen (fp->ctf_lookups[1].ctl_prefix);
1461 fp->ctf_lookups[1].ctl_hash = fp->ctf_unions;
1462 fp->ctf_lookups[2].ctl_prefix = "enum";
1463 fp->ctf_lookups[2].ctl_len = strlen (fp->ctf_lookups[2].ctl_prefix);
1464 fp->ctf_lookups[2].ctl_hash = fp->ctf_enums;
1465 fp->ctf_lookups[3].ctl_prefix = _CTF_NULLSTR;
1466 fp->ctf_lookups[3].ctl_len = strlen (fp->ctf_lookups[3].ctl_prefix);
1467 fp->ctf_lookups[3].ctl_hash = fp->ctf_names;
1468 fp->ctf_lookups[4].ctl_prefix = NULL;
1469 fp->ctf_lookups[4].ctl_len = 0;
1470 fp->ctf_lookups[4].ctl_hash = NULL;
1471
1472 if (symsect != NULL)
1473 {
1474 if (symsect->cts_entsize == sizeof (Elf64_Sym))
1475 (void) ctf_setmodel (fp, CTF_MODEL_LP64);
1476 else
1477 (void) ctf_setmodel (fp, CTF_MODEL_ILP32);
1478 }
1479 else
1480 (void) ctf_setmodel (fp, CTF_MODEL_NATIVE);
1481
1482 fp->ctf_refcnt = 1;
1483 return fp;
1484
1485 bad:
1486 ctf_file_close (fp);
1487 return NULL;
1488 }
1489
1490 /* Close the specified CTF container and free associated data structures. Note
1491 that ctf_file_close() is a reference counted operation: if the specified file
1492 is the parent of other active containers, its reference count will be greater
1493 than one and it will be freed later when no active children exist. */
1494
1495 void
1496 ctf_file_close (ctf_file_t *fp)
1497 {
1498 ctf_dtdef_t *dtd, *ntd;
1499 ctf_dvdef_t *dvd, *nvd;
1500
1501 if (fp == NULL)
1502 return; /* Allow ctf_file_close(NULL) to simplify caller code. */
1503
1504 ctf_dprintf ("ctf_file_close(%p) refcnt=%u\n", (void *) fp, fp->ctf_refcnt);
1505
1506 if (fp->ctf_refcnt > 1)
1507 {
1508 fp->ctf_refcnt--;
1509 return;
1510 }
1511
1512 if (fp->ctf_dynparname != NULL)
1513 ctf_free (fp->ctf_dynparname);
1514
1515 if (fp->ctf_parent != NULL)
1516 ctf_file_close (fp->ctf_parent);
1517
1518 for (dtd = ctf_list_next (&fp->ctf_dtdefs); dtd != NULL; dtd = ntd)
1519 {
1520 ntd = ctf_list_next (dtd);
1521 ctf_dtd_delete (fp, dtd);
1522 }
1523 ctf_dynhash_destroy (fp->ctf_dthash);
1524 ctf_dynhash_destroy (fp->ctf_dtbyname);
1525
1526 for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
1527 {
1528 nvd = ctf_list_next (dvd);
1529 ctf_dvd_delete (fp, dvd);
1530 }
1531 ctf_dynhash_destroy (fp->ctf_dvhash);
1532 ctf_str_free_atoms (fp);
1533
1534 ctf_free (fp->ctf_tmp_typeslice);
1535
1536 if (fp->ctf_data.cts_name != _CTF_NULLSTR &&
1537 fp->ctf_data.cts_name != NULL)
1538 ctf_free ((char *) fp->ctf_data.cts_name);
1539
1540 if (fp->ctf_symtab.cts_name != _CTF_NULLSTR &&
1541 fp->ctf_symtab.cts_name != NULL)
1542 ctf_free ((char *) fp->ctf_symtab.cts_name);
1543
1544 if (fp->ctf_strtab.cts_name != _CTF_NULLSTR &&
1545 fp->ctf_strtab.cts_name != NULL)
1546 ctf_free ((char *) fp->ctf_strtab.cts_name);
1547
1548 else if (fp->ctf_data_mmapped)
1549 ctf_munmap (fp->ctf_data_mmapped, fp->ctf_data_mmapped_len);
1550
1551 ctf_free_base (fp, NULL);
1552
1553 if (fp->ctf_sxlate != NULL)
1554 ctf_free (fp->ctf_sxlate);
1555
1556 if (fp->ctf_txlate != NULL)
1557 ctf_free (fp->ctf_txlate);
1558
1559 if (fp->ctf_ptrtab != NULL)
1560 ctf_free (fp->ctf_ptrtab);
1561
1562 ctf_hash_destroy (fp->ctf_structs);
1563 ctf_hash_destroy (fp->ctf_unions);
1564 ctf_hash_destroy (fp->ctf_enums);
1565 ctf_hash_destroy (fp->ctf_names);
1566
1567 ctf_free (fp);
1568 }
1569
1570 /* The converse of ctf_open(). ctf_open() disguises whatever it opens as an
1571 archive, so closing one is just like closing an archive. */
1572 void
1573 ctf_close (ctf_archive_t *arc)
1574 {
1575 ctf_arc_close (arc);
1576 }
1577
1578 /* Get the CTF archive from which this ctf_file_t is derived. */
1579 ctf_archive_t *
1580 ctf_get_arc (const ctf_file_t *fp)
1581 {
1582 return fp->ctf_archive;
1583 }
1584
1585 /* Return the ctfsect out of the core ctf_impl. Useful for freeing the
1586 ctfsect's data * after ctf_file_close(), which is why we return the actual
1587 structure, not a pointer to it, since that is likely to become a pointer to
1588 freed data before the return value is used under the expected use case of
1589 ctf_getsect()/ ctf_file_close()/free(). */
1590 extern ctf_sect_t
1591 ctf_getdatasect (const ctf_file_t *fp)
1592 {
1593 return fp->ctf_data;
1594 }
1595
1596 /* Return the CTF handle for the parent CTF container, if one exists.
1597 Otherwise return NULL to indicate this container has no imported parent. */
1598 ctf_file_t *
1599 ctf_parent_file (ctf_file_t *fp)
1600 {
1601 return fp->ctf_parent;
1602 }
1603
1604 /* Return the name of the parent CTF container, if one exists. Otherwise
1605 return NULL to indicate this container is a root container. */
1606 const char *
1607 ctf_parent_name (ctf_file_t *fp)
1608 {
1609 return fp->ctf_parname;
1610 }
1611
1612 /* Set the parent name. It is an error to call this routine without calling
1613 ctf_import() at some point. */
1614 void
1615 ctf_parent_name_set (ctf_file_t *fp, const char *name)
1616 {
1617 if (fp->ctf_dynparname != NULL)
1618 ctf_free (fp->ctf_dynparname);
1619
1620 fp->ctf_dynparname = ctf_strdup (name);
1621 fp->ctf_parname = fp->ctf_dynparname;
1622 }
1623
1624 /* Import the types from the specified parent container by storing a pointer
1625 to it in ctf_parent and incrementing its reference count. Only one parent
1626 is allowed: if a parent already exists, it is replaced by the new parent. */
1627 int
1628 ctf_import (ctf_file_t *fp, ctf_file_t *pfp)
1629 {
1630 if (fp == NULL || fp == pfp || (pfp != NULL && pfp->ctf_refcnt == 0))
1631 return (ctf_set_errno (fp, EINVAL));
1632
1633 if (pfp != NULL && pfp->ctf_dmodel != fp->ctf_dmodel)
1634 return (ctf_set_errno (fp, ECTF_DMODEL));
1635
1636 if (fp->ctf_parent != NULL)
1637 ctf_file_close (fp->ctf_parent);
1638
1639 if (pfp != NULL)
1640 {
1641 fp->ctf_flags |= LCTF_CHILD;
1642 pfp->ctf_refcnt++;
1643
1644 if (fp->ctf_parname == NULL)
1645 ctf_parent_name_set (fp, "PARENT");
1646 }
1647 fp->ctf_parent = pfp;
1648 return 0;
1649 }
1650
1651 /* Set the data model constant for the CTF container. */
1652 int
1653 ctf_setmodel (ctf_file_t *fp, int model)
1654 {
1655 const ctf_dmodel_t *dp;
1656
1657 for (dp = _libctf_models; dp->ctd_name != NULL; dp++)
1658 {
1659 if (dp->ctd_code == model)
1660 {
1661 fp->ctf_dmodel = dp;
1662 return 0;
1663 }
1664 }
1665
1666 return (ctf_set_errno (fp, EINVAL));
1667 }
1668
1669 /* Return the data model constant for the CTF container. */
1670 int
1671 ctf_getmodel (ctf_file_t *fp)
1672 {
1673 return fp->ctf_dmodel->ctd_code;
1674 }
1675
1676 /* The caller can hang an arbitrary pointer off each ctf_file_t using this
1677 function. */
1678 void
1679 ctf_setspecific (ctf_file_t *fp, void *data)
1680 {
1681 fp->ctf_specific = data;
1682 }
1683
1684 /* Retrieve the arbitrary pointer again. */
1685 void *
1686 ctf_getspecific (ctf_file_t *fp)
1687 {
1688 return fp->ctf_specific;
1689 }