]> Git Repo - binutils.git/blob - libctf/ctf-open.c
libctf: endianness fixes
[binutils.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
1377   if (_libctf_unlikely_ (hp.cth_version < CTF_VERSION_2))
1378     fp->ctf_parmax = CTF_MAX_PTYPE_V1;
1379   else
1380     fp->ctf_parmax = CTF_MAX_PTYPE;
1381
1382   memcpy (&fp->ctf_data, ctfsect, sizeof (ctf_sect_t));
1383
1384   if (symsect != NULL)
1385     {
1386       memcpy (&fp->ctf_symtab, symsect, sizeof (ctf_sect_t));
1387       memcpy (&fp->ctf_strtab, strsect, sizeof (ctf_sect_t));
1388     }
1389
1390   if (fp->ctf_data.cts_name != NULL)
1391     fp->ctf_data.cts_name = ctf_strdup (fp->ctf_data.cts_name);
1392   if (fp->ctf_symtab.cts_name != NULL)
1393     fp->ctf_symtab.cts_name = ctf_strdup (fp->ctf_symtab.cts_name);
1394   if (fp->ctf_strtab.cts_name != NULL)
1395     fp->ctf_strtab.cts_name = ctf_strdup (fp->ctf_strtab.cts_name);
1396
1397   if (fp->ctf_data.cts_name == NULL)
1398     fp->ctf_data.cts_name = _CTF_NULLSTR;
1399   if (fp->ctf_symtab.cts_name == NULL)
1400     fp->ctf_symtab.cts_name = _CTF_NULLSTR;
1401   if (fp->ctf_strtab.cts_name == NULL)
1402     fp->ctf_strtab.cts_name = _CTF_NULLSTR;
1403
1404   if (strsect != NULL)
1405     {
1406       fp->ctf_str[CTF_STRTAB_1].cts_strs = strsect->cts_data;
1407       fp->ctf_str[CTF_STRTAB_1].cts_len = strsect->cts_size;
1408     }
1409
1410   if (foreign_endian &&
1411       (err = flip_ctf (&hp, base)) != 0)
1412     {
1413       /* We can be certain that flip_ctf() will have endian-flipped everything
1414          other than the types table when we return.  In particular the header
1415          is fine, so set it, to allow freeing to use the usual code path.  */
1416
1417       (void) ctf_set_open_errno (errp, err);
1418       ctf_set_base (fp, &hp, base);
1419       goto bad;
1420     }
1421
1422   ctf_set_base (fp, &hp, base);
1423   fp->ctf_size = size + hdrsz;
1424
1425   if ((err = init_types (fp, &hp)) != 0)
1426     {
1427       (void) ctf_set_open_errno (errp, err);
1428       goto bad;
1429     }
1430
1431   /* If we have a symbol table section, allocate and initialize
1432      the symtab translation table, pointed to by ctf_sxlate.  */
1433
1434   if (symsect != NULL)
1435     {
1436       fp->ctf_nsyms = symsect->cts_size / symsect->cts_entsize;
1437       fp->ctf_sxlate = ctf_alloc (fp->ctf_nsyms * sizeof (uint32_t));
1438
1439       if (fp->ctf_sxlate == NULL)
1440         {
1441           (void) ctf_set_open_errno (errp, ENOMEM);
1442           goto bad;
1443         }
1444
1445       if ((err = init_symtab (fp, &hp, symsect, strsect)) != 0)
1446         {
1447           (void) ctf_set_open_errno (errp, err);
1448           goto bad;
1449         }
1450     }
1451
1452   /* Initialize the ctf_lookup_by_name top-level dictionary.  We keep an
1453      array of type name prefixes and the corresponding ctf_hash to use.
1454      NOTE: This code must be kept in sync with the code in ctf_update().  */
1455   fp->ctf_lookups[0].ctl_prefix = "struct";
1456   fp->ctf_lookups[0].ctl_len = strlen (fp->ctf_lookups[0].ctl_prefix);
1457   fp->ctf_lookups[0].ctl_hash = fp->ctf_structs;
1458   fp->ctf_lookups[1].ctl_prefix = "union";
1459   fp->ctf_lookups[1].ctl_len = strlen (fp->ctf_lookups[1].ctl_prefix);
1460   fp->ctf_lookups[1].ctl_hash = fp->ctf_unions;
1461   fp->ctf_lookups[2].ctl_prefix = "enum";
1462   fp->ctf_lookups[2].ctl_len = strlen (fp->ctf_lookups[2].ctl_prefix);
1463   fp->ctf_lookups[2].ctl_hash = fp->ctf_enums;
1464   fp->ctf_lookups[3].ctl_prefix = _CTF_NULLSTR;
1465   fp->ctf_lookups[3].ctl_len = strlen (fp->ctf_lookups[3].ctl_prefix);
1466   fp->ctf_lookups[3].ctl_hash = fp->ctf_names;
1467   fp->ctf_lookups[4].ctl_prefix = NULL;
1468   fp->ctf_lookups[4].ctl_len = 0;
1469   fp->ctf_lookups[4].ctl_hash = NULL;
1470
1471   if (symsect != NULL)
1472     {
1473       if (symsect->cts_entsize == sizeof (Elf64_Sym))
1474         (void) ctf_setmodel (fp, CTF_MODEL_LP64);
1475       else
1476         (void) ctf_setmodel (fp, CTF_MODEL_ILP32);
1477     }
1478   else
1479     (void) ctf_setmodel (fp, CTF_MODEL_NATIVE);
1480
1481   fp->ctf_refcnt = 1;
1482   return fp;
1483
1484 bad:
1485   ctf_file_close (fp);
1486   return NULL;
1487 }
1488
1489 /* Close the specified CTF container and free associated data structures.  Note
1490    that ctf_file_close() is a reference counted operation: if the specified file
1491    is the parent of other active containers, its reference count will be greater
1492    than one and it will be freed later when no active children exist.  */
1493
1494 void
1495 ctf_file_close (ctf_file_t *fp)
1496 {
1497   ctf_dtdef_t *dtd, *ntd;
1498   ctf_dvdef_t *dvd, *nvd;
1499
1500   if (fp == NULL)
1501     return;                /* Allow ctf_file_close(NULL) to simplify caller code.  */
1502
1503   ctf_dprintf ("ctf_file_close(%p) refcnt=%u\n", (void *) fp, fp->ctf_refcnt);
1504
1505   if (fp->ctf_refcnt > 1)
1506     {
1507       fp->ctf_refcnt--;
1508       return;
1509     }
1510
1511   if (fp->ctf_dynparname != NULL)
1512     ctf_free (fp->ctf_dynparname);
1513
1514   if (fp->ctf_parent != NULL)
1515     ctf_file_close (fp->ctf_parent);
1516
1517   for (dtd = ctf_list_next (&fp->ctf_dtdefs); dtd != NULL; dtd = ntd)
1518     {
1519       ntd = ctf_list_next (dtd);
1520       ctf_dtd_delete (fp, dtd);
1521     }
1522   ctf_dynhash_destroy (fp->ctf_dthash);
1523   ctf_dynhash_destroy (fp->ctf_dtbyname);
1524
1525   for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
1526     {
1527       nvd = ctf_list_next (dvd);
1528       ctf_dvd_delete (fp, dvd);
1529     }
1530   ctf_dynhash_destroy (fp->ctf_dvhash);
1531
1532   ctf_free (fp->ctf_tmp_typeslice);
1533
1534   if (fp->ctf_data.cts_name != _CTF_NULLSTR &&
1535       fp->ctf_data.cts_name != NULL)
1536     ctf_free ((char *) fp->ctf_data.cts_name);
1537
1538   if (fp->ctf_symtab.cts_name != _CTF_NULLSTR &&
1539       fp->ctf_symtab.cts_name != NULL)
1540     ctf_free ((char *) fp->ctf_symtab.cts_name);
1541
1542   if (fp->ctf_strtab.cts_name != _CTF_NULLSTR &&
1543       fp->ctf_strtab.cts_name != NULL)
1544     ctf_free ((char *) fp->ctf_strtab.cts_name);
1545
1546   else if (fp->ctf_data_mmapped)
1547     ctf_munmap (fp->ctf_data_mmapped, fp->ctf_data_mmapped_len);
1548
1549   ctf_free_base (fp, NULL);
1550
1551   if (fp->ctf_sxlate != NULL)
1552     ctf_free (fp->ctf_sxlate);
1553
1554   if (fp->ctf_txlate != NULL)
1555     ctf_free (fp->ctf_txlate);
1556
1557   if (fp->ctf_ptrtab != NULL)
1558     ctf_free (fp->ctf_ptrtab);
1559
1560   ctf_hash_destroy (fp->ctf_structs);
1561   ctf_hash_destroy (fp->ctf_unions);
1562   ctf_hash_destroy (fp->ctf_enums);
1563   ctf_hash_destroy (fp->ctf_names);
1564
1565   ctf_free (fp);
1566 }
1567
1568 /* The converse of ctf_open().  ctf_open() disguises whatever it opens as an
1569    archive, so closing one is just like closing an archive.  */
1570 void
1571 ctf_close (ctf_archive_t *arc)
1572 {
1573   ctf_arc_close (arc);
1574 }
1575
1576 /* Get the CTF archive from which this ctf_file_t is derived.  */
1577 ctf_archive_t *
1578 ctf_get_arc (const ctf_file_t *fp)
1579 {
1580   return fp->ctf_archive;
1581 }
1582
1583 /* Return the ctfsect out of the core ctf_impl.  Useful for freeing the
1584    ctfsect's data * after ctf_file_close(), which is why we return the actual
1585    structure, not a pointer to it, since that is likely to become a pointer to
1586    freed data before the return value is used under the expected use case of
1587    ctf_getsect()/ ctf_file_close()/free().  */
1588 extern ctf_sect_t
1589 ctf_getdatasect (const ctf_file_t *fp)
1590 {
1591   return fp->ctf_data;
1592 }
1593
1594 /* Return the CTF handle for the parent CTF container, if one exists.
1595    Otherwise return NULL to indicate this container has no imported parent.  */
1596 ctf_file_t *
1597 ctf_parent_file (ctf_file_t *fp)
1598 {
1599   return fp->ctf_parent;
1600 }
1601
1602 /* Return the name of the parent CTF container, if one exists.  Otherwise
1603    return NULL to indicate this container is a root container.  */
1604 const char *
1605 ctf_parent_name (ctf_file_t *fp)
1606 {
1607   return fp->ctf_parname;
1608 }
1609
1610 /* Set the parent name.  It is an error to call this routine without calling
1611    ctf_import() at some point.  */
1612 void
1613 ctf_parent_name_set (ctf_file_t *fp, const char *name)
1614 {
1615   if (fp->ctf_dynparname != NULL)
1616     ctf_free (fp->ctf_dynparname);
1617
1618   fp->ctf_dynparname = ctf_strdup (name);
1619   fp->ctf_parname = fp->ctf_dynparname;
1620 }
1621
1622 /* Import the types from the specified parent container by storing a pointer
1623    to it in ctf_parent and incrementing its reference count.  Only one parent
1624    is allowed: if a parent already exists, it is replaced by the new parent.  */
1625 int
1626 ctf_import (ctf_file_t *fp, ctf_file_t *pfp)
1627 {
1628   if (fp == NULL || fp == pfp || (pfp != NULL && pfp->ctf_refcnt == 0))
1629     return (ctf_set_errno (fp, EINVAL));
1630
1631   if (pfp != NULL && pfp->ctf_dmodel != fp->ctf_dmodel)
1632     return (ctf_set_errno (fp, ECTF_DMODEL));
1633
1634   if (fp->ctf_parent != NULL)
1635     ctf_file_close (fp->ctf_parent);
1636
1637   if (pfp != NULL)
1638     {
1639       fp->ctf_flags |= LCTF_CHILD;
1640       pfp->ctf_refcnt++;
1641
1642       if (fp->ctf_parname == NULL)
1643         ctf_parent_name_set (fp, "PARENT");
1644     }
1645   fp->ctf_parent = pfp;
1646   return 0;
1647 }
1648
1649 /* Set the data model constant for the CTF container.  */
1650 int
1651 ctf_setmodel (ctf_file_t *fp, int model)
1652 {
1653   const ctf_dmodel_t *dp;
1654
1655   for (dp = _libctf_models; dp->ctd_name != NULL; dp++)
1656     {
1657       if (dp->ctd_code == model)
1658         {
1659           fp->ctf_dmodel = dp;
1660           return 0;
1661         }
1662     }
1663
1664   return (ctf_set_errno (fp, EINVAL));
1665 }
1666
1667 /* Return the data model constant for the CTF container.  */
1668 int
1669 ctf_getmodel (ctf_file_t *fp)
1670 {
1671   return fp->ctf_dmodel->ctd_code;
1672 }
1673
1674 /* The caller can hang an arbitrary pointer off each ctf_file_t using this
1675    function.  */
1676 void
1677 ctf_setspecific (ctf_file_t *fp, void *data)
1678 {
1679   fp->ctf_specific = data;
1680 }
1681
1682 /* Retrieve the arbitrary pointer again.  */
1683 void *
1684 ctf_getspecific (ctf_file_t *fp)
1685 {
1686   return fp->ctf_specific;
1687 }
This page took 0.121124 seconds and 4 git commands to generate.