1 /*
2   Copyright (C) 2000-2006 Silicon Graphics, Inc.  All Rights Reserved.
3   Portions Copyright (C) 2007-2019 David Anderson. All Rights Reserved.
4   Portions Copyright 2012 SN Systems Ltd. All rights reserved.
5 
6   This program is free software; you can redistribute it
7   and/or modify it under the terms of version 2.1 of the
8   GNU Lesser General Public License as published by the Free
9   Software Foundation.
10 
11   This program is distributed in the hope that it would be
12   useful, but WITHOUT ANY WARRANTY; without even the implied
13   warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14   PURPOSE.
15 
16   Further, this software is distributed without any warranty
17   that it is free of the rightful claim of any third person
18   regarding infringement or the like.  Any license provided
19   herein, whether implied or otherwise, applies only to this
20   software file.  Patent licenses, if any, provided herein
21   do not apply to combinations of this program with other
22   software, or any other product whatsoever.
23 
24   You should have received a copy of the GNU Lesser General
25   Public License along with this program; if not, write the
26   Free Software Foundation, Inc., 51 Franklin Street - Fifth
27   Floor, Boston MA 02110-1301, USA.
28 
29 */
30 
31 #include "config.h"
32 #include <stdio.h>
33 #include "dwarf_incl.h"
34 #include "dwarf_alloc.h"
35 #include "dwarf_error.h"
36 #include "dwarf_util.h"
37 #include "dwarfstring.h"
38 #include "dwarf_die_deliv.h"
39 
40 #define FALSE 0
41 #define TRUE 1
42 
43 /* These are sanity checks, not 'rules'. */
44 #define MINIMUM_ADDRESS_SIZE 2
45 #define MAXIMUM_ADDRESS_SIZE 8
46 
47 static void assign_correct_unit_type(Dwarf_CU_Context cu_context);
48 static int find_cu_die_base_fields(Dwarf_Debug dbg,
49     Dwarf_CU_Context cucon,
50     Dwarf_Die cudie,
51     Dwarf_Error*    error);
52 
53 static int _dwarf_siblingof_internal(Dwarf_Debug dbg,
54     Dwarf_Die die,
55     Dwarf_CU_Context context,
56     Dwarf_Bool is_info,
57     Dwarf_Die * caller_ret_die, Dwarf_Error * error);
58 
59 /*  see cuandunit.txt for an overview of the
60     DWARF5 split dwarf sections and values
61     and the DWARF4 GNU cc version of a draft
62     version of DWARF5 (quite different from
63     the final DWARF5).
64 */
65 
66 /*  New October 2011.  Enables client code to know if
67     it is a debug_info or debug_types context. */
68 Dwarf_Bool
dwarf_get_die_infotypes_flag(Dwarf_Die die)69 dwarf_get_die_infotypes_flag(Dwarf_Die die)
70 {
71     return die->di_is_info;
72 }
73 
74 #if 0
75 static void
76 dump_bytes(char * msg,Dwarf_Small * start, long len)
77 {
78     Dwarf_Small *end = start + len;
79     Dwarf_Small *cur = start;
80 
81     printf("%s ",msg);
82     for (; cur < end; cur++) {
83         printf("%02x ", *cur);
84     }
85     printf("\n");
86 }
87 #endif
88 
89 /*
90     For a given Dwarf_Debug dbg, this function checks
91     if a CU that includes the given offset has been read
92     or not.  If yes, it returns the Dwarf_CU_Context
93     for the CU.  Otherwise it returns NULL.  Being an
94     internal routine, it is assumed that a valid dbg
95     is passed.
96 
97     **This is a sequential search.  May be too slow.
98 
99     If debug_info and debug_abbrev not loaded, this will
100     wind up returning NULL. So no need to load before calling
101     this.
102 */
103 static Dwarf_CU_Context
_dwarf_find_CU_Context(Dwarf_Debug dbg,Dwarf_Off offset,Dwarf_Bool is_info)104 _dwarf_find_CU_Context(Dwarf_Debug dbg, Dwarf_Off offset,Dwarf_Bool is_info)
105 {
106     Dwarf_CU_Context cu_context = 0;
107     Dwarf_Debug_InfoTypes dis = is_info? &dbg->de_info_reading:
108         &dbg->de_types_reading;
109 
110     if (offset >= dis->de_last_offset)
111         return (NULL);
112 
113     if (dis->de_cu_context != NULL &&
114         dis->de_cu_context->cc_next != NULL &&
115         dis->de_cu_context->cc_next->cc_debug_offset == offset) {
116 
117         return (dis->de_cu_context->cc_next);
118     }
119 
120     if (dis->de_cu_context != NULL &&
121         dis->de_cu_context->cc_debug_offset <= offset) {
122 
123         for (cu_context = dis->de_cu_context;
124             cu_context != NULL;
125             cu_context = cu_context->cc_next) {
126 
127             if (offset >= cu_context->cc_debug_offset &&
128                 offset < cu_context->cc_debug_offset +
129                 cu_context->cc_length + cu_context->cc_length_size
130                 + cu_context->cc_extension_size) {
131 
132                 return (cu_context);
133             }
134         }
135     }
136 
137     for (cu_context = dis->de_cu_context_list;
138         cu_context != NULL;
139         cu_context = cu_context->cc_next) {
140 
141         if (offset >= cu_context->cc_debug_offset &&
142             offset < cu_context->cc_debug_offset +
143             cu_context->cc_length + cu_context->cc_length_size
144             + cu_context->cc_extension_size) {
145 
146             return (cu_context);
147         }
148     }
149 
150     return (NULL);
151 }
152 
153 int
dwarf_get_debugfission_for_die(Dwarf_Die die,struct Dwarf_Debug_Fission_Per_CU_s * fission_out,Dwarf_Error * error)154 dwarf_get_debugfission_for_die(Dwarf_Die die,
155     struct Dwarf_Debug_Fission_Per_CU_s *fission_out,
156     Dwarf_Error *error)
157 {
158     Dwarf_CU_Context context = 0;
159     Dwarf_Debug dbg = 0;
160     struct Dwarf_Debug_Fission_Per_CU_s * percu = 0;
161 
162     CHECK_DIE(die, DW_DLV_ERROR);
163     context = die->di_cu_context;
164     dbg = context->cc_dbg;
165     if (!_dwarf_file_has_debug_fission_index(dbg)) {
166         return DW_DLV_NO_ENTRY;
167     }
168 
169     /*  Logic should work for DW4 and DW5. */
170     if (context->cc_unit_type == DW_UT_type||
171         context->cc_unit_type == DW_UT_split_type ) {
172         if (!_dwarf_file_has_debug_fission_tu_index(dbg)) {
173             return DW_DLV_NO_ENTRY;
174         }
175     } else if (context->cc_unit_type == DW_UT_split_compile) {
176         if (!_dwarf_file_has_debug_fission_cu_index(dbg)) {
177             return DW_DLV_NO_ENTRY;
178         }
179     }
180     percu = &context->cc_dwp_offsets;
181     if (!percu->pcu_type) {
182         return DW_DLV_NO_ENTRY;
183     }
184     *fission_out = *percu;
185     return DW_DLV_OK;
186 }
187 
188 static Dwarf_Bool
is_unknown_UT_value(int ut)189 is_unknown_UT_value(int ut)
190 {
191     switch(ut) {
192     case DW_UT_compile:
193     case DW_UT_type:
194     case DW_UT_partial:
195         return FALSE;
196     case DW_UT_skeleton:
197     case DW_UT_split_compile:
198     case DW_UT_split_type:
199         return FALSE;
200     }
201     return TRUE;
202 }
203 
204 
205 /*  ASSERT: whichone is a DW_SECT* macro value. */
206 Dwarf_Unsigned
_dwarf_get_dwp_extra_offset(struct Dwarf_Debug_Fission_Per_CU_s * dwp,unsigned whichone,Dwarf_Unsigned * size)207 _dwarf_get_dwp_extra_offset(struct Dwarf_Debug_Fission_Per_CU_s* dwp,
208     unsigned whichone, Dwarf_Unsigned * size)
209 {
210     Dwarf_Unsigned sectoff = 0;
211     if (!dwp->pcu_type) {
212         return 0;
213     }
214     sectoff = dwp->pcu_offset[whichone];
215     *size = dwp->pcu_size[whichone];
216     return sectoff;
217 }
218 
219 
220 /*  _dwarf_get_fission_addition_die returns DW_DLV_OK etc.
221 */
222 int
_dwarf_get_fission_addition_die(Dwarf_Die die,int dw_sect_index,Dwarf_Unsigned * offset,Dwarf_Unsigned * size,Dwarf_Error * error)223 _dwarf_get_fission_addition_die(Dwarf_Die die, int dw_sect_index,
224    Dwarf_Unsigned *offset,
225    Dwarf_Unsigned *size,
226    Dwarf_Error *error)
227 {
228     /* We do not yet know the DIE hash, so we cannot use it
229         to identify the offset. */
230     Dwarf_CU_Context context = 0;
231     Dwarf_Unsigned dwpadd = 0;
232     Dwarf_Unsigned dwpsize = 0;
233 
234     CHECK_DIE(die, DW_DLV_ERROR);
235     context = die->di_cu_context;
236     dwpadd =  _dwarf_get_dwp_extra_offset(
237         &context->cc_dwp_offsets,
238         dw_sect_index,&dwpsize);
239     *offset = dwpadd;
240     *size = dwpsize;
241     return DW_DLV_OK;
242 }
243 
244 /*  Not sure if this is the only way to be sure early on in
245     reading a compile unit.  */
246 static int
section_name_ends_with_dwo(const char * name)247 section_name_ends_with_dwo(const char *name)
248 {
249     int lenstr = 0;
250     int dotpos = 0;
251     if (!name) {
252         return FALSE;
253     }
254     lenstr = strlen(name);
255     if (lenstr < 5) {
256         return FALSE;
257     }
258     dotpos = lenstr - 4;
259     if(strcmp(name+dotpos,".dwo")) {
260         return FALSE;
261     }
262     return TRUE;
263 }
264 
265 void
_dwarf_create_address_size_dwarf_error(Dwarf_Debug dbg,Dwarf_Error * error,Dwarf_Unsigned addrsize,int errcode,const char * errname)266 _dwarf_create_address_size_dwarf_error(Dwarf_Debug dbg,
267     Dwarf_Error *error,
268     Dwarf_Unsigned addrsize,
269     int errcode,const char *errname)
270 {
271     dwarfstring m;
272     const char *bites = "bytes";
273     if (addrsize == 1) {
274         bites = "byte";
275     }
276 
277     dwarfstring_constructor(&m);
278     dwarfstring_append(&m,(char *)errname);
279     dwarfstring_append_printf_u(&m,
280         ": Address size of %u ",
281         addrsize);
282     dwarfstring_append_printf_s(&m,
283         "%s is not supported. Corrupt DWARF.",
284         (char *)bites);
285     _dwarf_error_string(dbg,error,errcode,
286         dwarfstring_string(&m));
287     dwarfstring_destructor(&m);
288 }
289 
290 /*  New January 2017 */
291 static int
_dwarf_read_cu_version_and_abbrev_offset(Dwarf_Debug dbg,Dwarf_Small * data,Dwarf_Bool is_info,UNUSEDARG unsigned group_number,unsigned offset_size,Dwarf_CU_Context cu_context,Dwarf_Small * end_data,Dwarf_Unsigned * bytes_read_out,Dwarf_Error * error)292 _dwarf_read_cu_version_and_abbrev_offset(Dwarf_Debug dbg,
293     Dwarf_Small *data,
294     Dwarf_Bool is_info,
295     UNUSEDARG unsigned group_number,
296     unsigned offset_size, /* 4 or 8 */
297     Dwarf_CU_Context cu_context,
298     /* end_data used for sanity checking */
299     Dwarf_Small *    end_data,
300     Dwarf_Unsigned * bytes_read_out,
301     Dwarf_Error *    error)
302 {
303     Dwarf_Small *  data_start = data;
304     Dwarf_Small *  dataptr = data;
305     int            unit_type = 0;
306     Dwarf_Ubyte    addrsize =  0;
307     Dwarf_Unsigned abbrev_offset = 0;
308     Dwarf_Half version = 0;
309 
310     READ_UNALIGNED_CK(dbg, version, Dwarf_Half,
311         dataptr,DWARF_HALF_SIZE,error,end_data);
312     dataptr += DWARF_HALF_SIZE;
313     if (version == DW_CU_VERSION5) {
314         Dwarf_Ubyte unit_typeb = 0;
315 
316         READ_UNALIGNED_CK(dbg, unit_typeb, Dwarf_Ubyte,
317             dataptr, sizeof(unit_typeb),error,end_data);
318         dataptr += sizeof(unit_typeb);
319 
320         unit_type = unit_typeb;
321         /* We do not need is_info flag in DWARF5 */
322         if (is_unknown_UT_value(unit_type)) {
323             /*  DWARF5 object file is corrupt. Invalid value */
324             dwarfstring m;
325             dwarfstring_constructor(&m);
326             dwarfstring_append_printf_u(&m,
327                 "DW_DLE_CU_UT_TYPE_ERROR: we do not know "
328                 " the CU header unit_type 0x%x",unit_type);
329             dwarfstring_append_printf_u(&m," (%u) so cannot"
330                 "process this compilation_unit. A valid type ",
331                 unit_type);
332             dwarfstring_append(&m,"would be DW_UT_compile"
333                 ", for example");
334             _dwarf_error_string(dbg, error,
335                 DW_DLE_CU_UT_TYPE_ERROR,
336                 dwarfstring_string(&m));
337             dwarfstring_destructor(&m);
338             return DW_DLV_ERROR;
339         }
340         READ_UNALIGNED_CK(dbg, addrsize, unsigned char,
341             dataptr, sizeof(addrsize),error,end_data);
342         dataptr += sizeof(char);
343 
344         READ_UNALIGNED_CK(dbg, abbrev_offset, Dwarf_Unsigned,
345             dataptr, offset_size,error,end_data);
346         dataptr += offset_size;
347 
348     } else if (version == DW_CU_VERSION2 ||
349         version == DW_CU_VERSION3 ||
350         version == DW_CU_VERSION4) {
351         /*  DWARF2,3,4  */
352         READ_UNALIGNED_CK(dbg, abbrev_offset, Dwarf_Unsigned,
353             dataptr, offset_size,error,end_data);
354         dataptr += offset_size;
355 
356         READ_UNALIGNED_CK(dbg, addrsize, Dwarf_Ubyte,
357             dataptr, sizeof(addrsize),error,end_data);
358         dataptr += sizeof(addrsize);
359 
360         /*  This is an initial approximation of unit_type.
361             For DW4 we will refine this after we
362             have built the CU header (by reading
363             CU_die)
364         */
365         unit_type = is_info?DW_UT_compile:DW_UT_type;
366     } else {
367         _dwarf_error(dbg, error, DW_DLE_VERSION_STAMP_ERROR);
368         return DW_DLV_ERROR;
369     }
370     cu_context->cc_version_stamp = version;
371     cu_context->cc_unit_type = unit_type;
372     cu_context->cc_address_size = addrsize;
373     cu_context->cc_abbrev_offset = abbrev_offset;
374     if (!addrsize) {
375         _dwarf_error(dbg,error,DW_DLE_ADDRESS_SIZE_ZERO);
376         return DW_DLV_ERROR;
377     }
378     if (addrsize < MINIMUM_ADDRESS_SIZE ||
379         addrsize > MAXIMUM_ADDRESS_SIZE ) {
380         _dwarf_create_address_size_dwarf_error(dbg,error,addrsize,
381             DW_DLE_ADDRESS_SIZE_ERROR,
382             "DW_DLE_ADDRESS_SIZE_ERROR::");
383         return DW_DLV_ERROR;
384     }
385     if (addrsize  > sizeof(Dwarf_Addr)) {
386         _dwarf_create_address_size_dwarf_error(dbg,error,addrsize,
387             DW_DLE_ADDRESS_SIZE_ERROR,
388             "DW_DLE_ADDRESS_SIZE_ERROR: not representable"
389             " in Dwarf_Addr field.");
390         return DW_DLV_ERROR;
391     }
392 
393 
394 
395     /* We are ignoring this. Can get it from DWARF5. */
396     cu_context->cc_segment_selector_size = 0;
397     *bytes_read_out = (dataptr - data_start);
398     return DW_DLV_OK;
399 }
400 
401 /*  .debug_info[.dwo]   .debug_types[.dwo]
402     the latter only DWARF4. */
403 static int
read_info_area_length_and_check(Dwarf_Debug dbg,Dwarf_CU_Context cu_context,Dwarf_Unsigned offset,Dwarf_Byte_Ptr * cu_ptr_io,Dwarf_Unsigned section_size,Dwarf_Byte_Ptr section_end_ptr,Dwarf_Unsigned * max_cu_global_offset_out,Dwarf_Error * error)404 read_info_area_length_and_check(Dwarf_Debug dbg,
405     Dwarf_CU_Context cu_context,
406     Dwarf_Unsigned offset,
407     Dwarf_Byte_Ptr *cu_ptr_io,
408     Dwarf_Unsigned section_size,
409     Dwarf_Byte_Ptr section_end_ptr,
410     Dwarf_Unsigned *max_cu_global_offset_out,
411     Dwarf_Error *error)
412 {
413     Dwarf_Byte_Ptr  cu_ptr = 0;
414     int local_length_size = 0;
415     int local_extension_size = 0;
416     Dwarf_Unsigned max_cu_global_offset = 0;
417     Dwarf_Unsigned length = 0;
418 
419     cu_ptr = *cu_ptr_io;
420     /* READ_AREA_LENGTH updates cu_ptr for consumed bytes */
421     READ_AREA_LENGTH_CK(dbg, length, Dwarf_Unsigned,
422         cu_ptr, local_length_size, local_extension_size,
423         error,section_size,section_end_ptr);
424     if (!length) {
425         return DW_DLV_NO_ENTRY;
426     }
427 
428     cu_context->cc_length_size = local_length_size;
429     cu_context->cc_extension_size = local_extension_size;
430     cu_context->cc_length = length;
431 
432     /*  This is a bare minimum, not the real max offset.
433         A preliminary sanity check. */
434     max_cu_global_offset =  offset + length +
435         local_extension_size + local_length_size;
436     if(length > section_size) {
437         _dwarf_error(dbg, error, DW_DLE_CU_LENGTH_ERROR);
438         return DW_DLV_ERROR;
439     }
440     if(max_cu_global_offset > section_size) {
441         _dwarf_error(dbg, error, DW_DLE_CU_LENGTH_ERROR);
442         return DW_DLV_ERROR;
443     }
444     *cu_ptr_io = cu_ptr;
445     *max_cu_global_offset_out = max_cu_global_offset;
446     return DW_DLV_OK;
447 }
448 
449 
450 /*  In DWARF4  GNU dwp there is a problem.
451     We cannot read the CU die  and it's
452     DW_AT_GNU_dwo_id until we know the
453     section offsets from the index files.
454     Hence we do not know how to search the
455     index files by key. So search by offset.
456 
457     There is no such problem in DWARF5.
458 
459     We have not yet corrected the unit_type so, for DWARF4,
460     we check for simpler unit types.
461 */
462 
463 static int
fill_in_dwp_offsets_if_present(Dwarf_Debug dbg,Dwarf_CU_Context cu_context,Dwarf_Sig8 * signaturedata,Dwarf_Off offset,Dwarf_Error * error)464 fill_in_dwp_offsets_if_present(Dwarf_Debug dbg,
465     Dwarf_CU_Context cu_context,
466     Dwarf_Sig8 * signaturedata,
467     Dwarf_Off    offset,
468     Dwarf_Error *error)
469 {
470     Dwarf_Half unit_type = cu_context->cc_unit_type;
471     const char * typename = 0;
472     Dwarf_Half ver = cu_context->cc_version_stamp;
473 
474     if (unit_type == DW_UT_split_type ||
475         (ver == DW_CU_VERSION4 && unit_type == DW_UT_type)){
476         typename = "tu";
477         if (!_dwarf_file_has_debug_fission_tu_index(dbg) ){
478             /* nothing to do. */
479             return DW_DLV_OK;
480         }
481     } else if (unit_type == DW_UT_split_compile ||
482         (ver == DW_CU_VERSION4 &&
483         unit_type == DW_UT_compile)){
484         typename = "cu";
485         if (!_dwarf_file_has_debug_fission_cu_index(dbg) ){
486             /* nothing to do. */
487             return DW_DLV_OK;
488         }
489     } else {
490         /* nothing to do. */
491         return DW_DLV_OK;
492     }
493 
494     if (cu_context->cc_signature_present) {
495         int resdf = 0;
496 
497         resdf = dwarf_get_debugfission_for_key(dbg,
498             signaturedata,
499             typename,
500             &cu_context->cc_dwp_offsets,
501             error);
502         if (resdf == DW_DLV_ERROR) {
503             return resdf;
504         } else if (resdf == DW_DLV_NO_ENTRY) {
505             _dwarf_error_string(dbg, error,
506                 DW_DLE_MISSING_REQUIRED_CU_OFFSET_HASH,
507                 "DW_DLE_MISSING_REQUIRED_CU_OFFSET_HASH: "
508                 " dwarf_get_debugfission_for_key returned"
509                 " DW_DLV_NO_ENTRY, something is wrong");
510             return DW_DLV_ERROR;
511         }
512     } else {
513         int resdf = 0;
514 
515         resdf = _dwarf_get_debugfission_for_offset(dbg,
516             offset,
517             typename,
518             &cu_context->cc_dwp_offsets,
519             error);
520         if (resdf == DW_DLV_ERROR) {
521             return resdf;
522         } else if (resdf == DW_DLV_NO_ENTRY) {
523             _dwarf_error_string(dbg, error,
524                 DW_DLE_MISSING_REQUIRED_CU_OFFSET_HASH,
525                 "DW_DLE_MISSING_REQUIRED_CU_OFFSET_HASH: "
526                 " dwarf_get_debugfission_for_offset returned"
527                 " DW_DLV_NO_ENTRY, something is wrong");
528             return DW_DLV_ERROR;
529         }
530         cu_context->cc_signature =
531             cu_context->cc_dwp_offsets.pcu_hash;
532         cu_context->cc_signature_present = TRUE;
533     }
534     return DW_DLV_OK;
535 }
536 
537 static Dwarf_Bool
_dwarf_may_have_base_fields(Dwarf_CU_Context cu_context)538 _dwarf_may_have_base_fields(Dwarf_CU_Context cu_context)
539 {
540     if (cu_context->cc_version_stamp < DW_CU_VERSION4) {
541         return FALSE;
542     }
543     return TRUE;
544 }
545 
546 static int
finish_cu_context_via_cudie_inner(Dwarf_Debug dbg,Dwarf_CU_Context cu_context,Dwarf_Error * error)547 finish_cu_context_via_cudie_inner(
548     Dwarf_Debug dbg,
549     Dwarf_CU_Context cu_context,
550     Dwarf_Error *error)
551 {
552     if (_dwarf_may_have_base_fields(cu_context)) {
553         /*  DW4: Look for DW_AT_dwo_id and
554             if there is one pick up the hash
555             DW5: hash in skeleton CU die
556             Also pick up cc_str_offset_base and
557             any other base values. */
558 
559         Dwarf_Die cudie = 0;
560         int resdwo = 0;
561 
562         /*  Must call the internal siblingof so
563             we do not depend on the dbg...de_cu_context
564             used by and for dwarf_cu_header_* calls. */
565         resdwo = _dwarf_siblingof_internal(dbg,NULL,
566             cu_context,
567             cu_context->cc_is_info,
568             &cudie, error);
569         if (resdwo == DW_DLV_OK) {
570             Dwarf_Half cutag = 0;
571             int resdwob = 0;
572             resdwob = find_cu_die_base_fields(dbg,
573                 cu_context,
574                 cudie,
575                 error);
576             if (resdwob == DW_DLV_NO_ENTRY) {
577                 /* The CU die has no children */
578                 dwarf_dealloc(dbg,cudie,DW_DLA_DIE);
579                 cudie = 0;
580                 cu_context->cc_cu_die_has_children = FALSE;
581                 return DW_DLV_OK;
582             } else if (resdwob == DW_DLV_ERROR) {
583                 /*  Not applicable or an error */
584                 dwarf_dealloc(dbg,cudie,DW_DLA_DIE);
585                 cudie = 0;
586                 return resdwob;
587             }
588             resdwob = dwarf_tag(cudie,&cutag,error);
589             if (resdwob == DW_DLV_OK) {
590                 cu_context->cc_cu_die_tag = cutag;
591             }
592             dwarf_dealloc(dbg,cudie,DW_DLA_DIE);
593             return resdwob;
594         } else  if (resdwo == DW_DLV_NO_ENTRY) {
595             /* no cudie. Empty CU. */
596             return DW_DLV_OK;
597         } else {
598             /* no cudie. Error.*/
599             return resdwo;
600         }
601     }
602     return DW_DLV_OK;
603 }
604 
605 static void
local_dealloc_cu_context(Dwarf_Debug dbg,Dwarf_CU_Context context)606 local_dealloc_cu_context(Dwarf_Debug dbg,
607     Dwarf_CU_Context context)
608 {
609     Dwarf_Hash_Table hash_table = 0;
610 
611     if (!context) {
612         return;
613     }
614     hash_table = context->cc_abbrev_hash_table;
615     if (hash_table) {
616         _dwarf_free_abbrev_hash_table_contents(dbg,hash_table);
617         hash_table->tb_entries = 0;
618         dwarf_dealloc(dbg,hash_table, DW_DLA_HASH_TABLE);
619         context->cc_abbrev_hash_table = 0;
620     }
621     dwarf_dealloc(dbg, context, DW_DLA_CU_CONTEXT);
622 }
623 
624 static void
report_local_unit_type_error(Dwarf_Debug dbg,int unit_type,const char * msg,Dwarf_Error * err)625 report_local_unit_type_error(Dwarf_Debug dbg,
626     int unit_type,
627     const char *msg,
628     Dwarf_Error *err)
629 {
630     dwarfstring m;
631 
632     dwarfstring_constructor(&m);
633     dwarfstring_append_printf_s(&m,
634         "DW_DLE_CU_UT_TYPE_VALUE: %s ",(char *)msg);
635     dwarfstring_append_printf_u(&m,
636         "the compilation unit unit_type is 0x%x,"
637         " which is unknown to libdwarf. Corrupt DWARF.",
638         unit_type);
639     _dwarf_error_string(dbg,err,DW_DLE_CU_UT_TYPE_VALUE,
640         dwarfstring_string(&m));
641     dwarfstring_destructor(&m);
642 }
643 
644 /*  This function is used to create a CU Context for
645     a compilation-unit that begins at offset in
646     .debug_info.  The CU Context is attached to the
647     list of CU Contexts for this dbg.  It is assumed
648     that the CU at offset has not been read before,
649     and so do not call this routine before making
650     sure of this with _dwarf_find_CU_Context().
651     Returns NULL on error.  As always, being an
652     internal routine, assumes a good dbg.
653 
654     The offset argument is global offset, the offset
655     in the section, irrespective of CUs.
656     The offset has the DWP Package File offset built in
657     as it comes from the actual section.
658 
659     max_cu_local_offset is a local offset in this CU.
660     So zero of this field is immediately following the length
661     field of the CU header. so max_cu_local_offset is
662     identical to the CU length field.
663     max_cu_global_offset is the offset one-past the end
664     of this entire CU.  */
665 static int
_dwarf_make_CU_Context(Dwarf_Debug dbg,Dwarf_Off offset,Dwarf_Bool is_info,Dwarf_CU_Context * context_out,Dwarf_Error * error)666 _dwarf_make_CU_Context(Dwarf_Debug dbg,
667     Dwarf_Off offset,Dwarf_Bool is_info,
668     Dwarf_CU_Context * context_out,Dwarf_Error * error)
669 {
670     Dwarf_CU_Context cu_context = 0;
671     Dwarf_Unsigned   length = 0;
672     Dwarf_Unsigned   typeoffset = 0;
673     Dwarf_Sig8       signaturedata;
674     Dwarf_Unsigned   types_extra_len = 0;
675     Dwarf_Unsigned   max_cu_local_offset =  0;
676     Dwarf_Unsigned   max_cu_global_offset =  0;
677     Dwarf_Byte_Ptr   cu_ptr = 0;
678     Dwarf_Byte_Ptr   section_end_ptr = 0;
679     int              local_length_size = 0;
680     Dwarf_Unsigned   bytes_read = 0;
681     const char *     secname = is_info?dbg->de_debug_info.dss_name:
682         dbg->de_debug_types.dss_name;
683     Dwarf_Debug_InfoTypes dis = is_info? &dbg->de_info_reading:
684         &dbg->de_types_reading;
685     Dwarf_Unsigned   section_size = is_info? dbg->de_debug_info.dss_size:
686         dbg->de_debug_types.dss_size;
687     int              unit_type = 0;
688     int              version = 0;
689     Dwarf_Small *    dataptr = 0;
690     int              res = 0;
691 
692     memset(&signaturedata,0,sizeof(signaturedata));
693     cu_context =
694         (Dwarf_CU_Context)_dwarf_get_alloc(dbg, DW_DLA_CU_CONTEXT, 1);
695     if (!cu_context) {
696         _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
697         return DW_DLV_ERROR;
698     }
699     cu_context->cc_dbg = dbg;
700     cu_context->cc_is_info = is_info;
701 
702     dataptr = is_info? dbg->de_debug_info.dss_data:
703         dbg->de_debug_types.dss_data;
704     /*  Preliminary sanity checking. */
705     if (!dataptr) {
706         local_dealloc_cu_context(dbg,cu_context);
707         _dwarf_error(dbg, error, DW_DLE_INFO_HEADER_ERROR);
708         return DW_DLV_ERROR;
709     }
710     if (offset >= section_size) {
711         local_dealloc_cu_context(dbg,cu_context);
712         return DW_DLV_ERROR;
713     }
714     if ((offset+4) > section_size) {
715         local_dealloc_cu_context(dbg,cu_context);
716         return DW_DLV_ERROR;
717     }
718     section_end_ptr = dataptr+section_size;
719     cu_ptr = (Dwarf_Byte_Ptr) (dataptr+offset);
720 
721     if (section_name_ends_with_dwo(secname)) {
722         cu_context->cc_is_dwo = TRUE;
723     }
724     res = read_info_area_length_and_check(dbg,
725         cu_context,
726         offset,
727         &cu_ptr,
728         section_size,
729         section_end_ptr,
730         &max_cu_global_offset,
731         error);
732     if (res != DW_DLV_OK) {
733         local_dealloc_cu_context(dbg,cu_context);
734         return res;
735     }
736     local_length_size = cu_context->cc_length_size;
737     length = cu_context->cc_length;
738     max_cu_local_offset =  length;
739     res  = _dwarf_read_cu_version_and_abbrev_offset(dbg,
740         cu_ptr,
741         is_info,
742         dbg->de_groupnumber,
743         local_length_size,
744         cu_context,
745         section_end_ptr,
746         &bytes_read,error);
747     if (res != DW_DLV_OK) {
748         local_dealloc_cu_context(dbg,cu_context);
749         return res;
750     }
751     version = cu_context->cc_version_stamp;
752     cu_ptr += bytes_read;
753     unit_type = cu_context->cc_unit_type;
754     if (cu_ptr > section_end_ptr) {
755         local_dealloc_cu_context(dbg,cu_context);
756         _dwarf_error(dbg, error, DW_DLE_INFO_HEADER_ERROR);
757         return DW_DLV_ERROR;
758     }
759 
760     /*  In a dwp context, the abbrev_offset is
761         still  incomplete.
762         We need to add in the base from the .debug_cu_index
763         or .debug_tu_index . Done below */
764 
765     /*  At this point, for DW4, the unit_type is not fully
766         correct as we don't know if it is a skeleton or
767         a split_compile or split_type */
768     if (version ==  DW_CU_VERSION5 ||
769         version == DW_CU_VERSION4) {
770         /*  DW4/DW5  header fields, depending on UT type.
771             See DW5  section 7.5.1.x, DW4
772             data is a GNU extension of DW4. */
773         switch(unit_type) {
774         case DW_UT_split_type:
775         case DW_UT_type: {
776             types_extra_len = sizeof(Dwarf_Sig8) /* 8 */ +
777                 local_length_size /*type_offset size*/;
778             break;
779         }
780         case DW_UT_skeleton:
781         case DW_UT_split_compile: {
782             types_extra_len = sizeof(Dwarf_Sig8) /* 8 */;
783             break;
784         }
785         case DW_UT_compile: /*  No additional fields */
786         case DW_UT_partial: /*  No additional fields */
787             break;
788         default:
789             /*  Data corruption in libdwarf? */
790             report_local_unit_type_error(dbg, unit_type,
791                 "(DW4 or DW5)",error);
792             local_dealloc_cu_context(dbg,cu_context);
793             return DW_DLV_ERROR;
794         }
795     }
796 
797     /*  Compare the space following the length field
798         to the bytes in the CU header. */
799     if (length <
800         (CU_VERSION_STAMP_SIZE /* is 2 */ +
801         local_length_size /*for debug_abbrev offset */ +
802         CU_ADDRESS_SIZE_SIZE /* is 1 */ +
803         /* and finally size of the rest of the header: */
804         types_extra_len)) {
805 
806         local_dealloc_cu_context(dbg,cu_context);
807         _dwarf_error(dbg, error, DW_DLE_CU_LENGTH_ERROR);
808         return DW_DLV_ERROR;
809     }
810     /*  Now we can read the fields with some confidence,
811         we know the fields of the header are inside
812         the section. */
813 
814     cu_context->cc_unit_type = unit_type;
815     switch(unit_type) {
816     case DW_UT_split_type:
817     case DW_UT_type: {
818         int tres = 0;
819         /*  ASSERT: DW_CU_VERSION4 or DW_CU_VERSION5,
820             determined by logic above.
821             Now read the debug_types extra header fields of
822             the signature (8 bytes) and the typeoffset.
823             This can be in executable, ordinary object
824             (as in Type Unit),
825             there was no dwo in DWARF4
826         */
827         memcpy(&signaturedata,cu_ptr,sizeof(signaturedata));
828         cu_ptr += sizeof(signaturedata);
829 #if 0
830         READ_UNALIGNED_CK(dbg, typeoffset, Dwarf_Unsigned,
831             cu_ptr, local_length_size,error,section_end_ptr);
832 #endif
833         tres = _dwarf_read_unaligned_ck_wrapper(dbg,
834             &typeoffset,cu_ptr,local_length_size,
835             section_end_ptr,error);
836         if (tres != DW_DLV_OK ) {
837             local_dealloc_cu_context(dbg,cu_context);
838             return tres;
839         }
840         cu_context->cc_signature = signaturedata;
841         cu_context->cc_signature_present = TRUE;
842         cu_context->cc_signature_offset = typeoffset;
843         if (typeoffset >= max_cu_local_offset) {
844             local_dealloc_cu_context(dbg,cu_context);
845             _dwarf_error(dbg, error,
846                 DW_DLE_DEBUG_TYPEOFFSET_BAD);
847             return DW_DLV_ERROR;
848         }
849         }
850         break;
851     case DW_UT_skeleton:
852     case DW_UT_split_compile: {
853         /*  These unit types make a pair and
854             paired units have identical signature.*/
855         memcpy(&signaturedata,cu_ptr,sizeof(signaturedata));
856         cu_context->cc_signature = signaturedata;
857         cu_context->cc_signature_present = TRUE;
858 
859         break;
860         }
861     /* The following with no additional fields */
862     case DW_UT_compile:
863     case DW_UT_partial:
864         break;
865     default: {
866         /*  Data corruption in libdwarf? */
867         report_local_unit_type_error(dbg, unit_type,
868             "",error);
869         local_dealloc_cu_context(dbg,cu_context);
870         return DW_DLV_ERROR;
871         }
872     }
873     cu_context->cc_abbrev_hash_table =
874         (Dwarf_Hash_Table) _dwarf_get_alloc(dbg, DW_DLA_HASH_TABLE, 1);
875     if (cu_context->cc_abbrev_hash_table == NULL) {
876         local_dealloc_cu_context(dbg,cu_context);
877         _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
878         return DW_DLV_ERROR;
879     }
880 
881     cu_context->cc_debug_offset = offset;
882 
883     /*  This is recording an overall section value for later
884         sanity checking. */
885     dis->de_last_offset = max_cu_global_offset;
886     *context_out  = cu_context;
887     return DW_DLV_OK;
888 }
889 
890 static int
reloc_incomplete(int res,Dwarf_Error err)891 reloc_incomplete(int res,Dwarf_Error err)
892 {
893     int e = 0;
894 
895     if (res == DW_DLV_OK) {
896         return FALSE;
897     }
898     if (res == DW_DLV_NO_ENTRY) {
899         return FALSE;
900     }
901     e = dwarf_errno(err);
902     if (e == DW_DLE_RELOC_MISMATCH_INDEX        ||
903         e == DW_DLE_RELOC_MISMATCH_RELOC_INDEX  ||
904         e == DW_DLE_RELOC_MISMATCH_STRTAB_INDEX ||
905         e == DW_DLE_RELOC_SECTION_MISMATCH      ||
906         e == DW_DLE_RELOC_SECTION_MISSING_INDEX ||
907         e == DW_DLE_RELOC_SECTION_LENGTH_ODD    ||
908         e == DW_DLE_RELOC_SECTION_PTR_NULL      ||
909         e == DW_DLE_RELOC_SECTION_MALLOC_FAIL   ||
910         e == DW_DLE_SEEK_OFF_END                ||
911         e == DW_DLE_RELOC_INVALID               ||
912         e == DW_DLE_RELOC_SECTION_SYMBOL_INDEX_BAD ) {
913         return TRUE;
914     }
915     return FALSE;
916 }
917 
918 
919 
920 /*  Returns offset of next compilation-unit thru next_cu_offset
921     pointer.
922     It sequentially moves from one
923     cu to the next.  The current cu is recorded
924     internally by libdwarf.
925 
926     The _b form is new for DWARF4 adding new returned fields.  */
927 int
dwarf_next_cu_header(Dwarf_Debug dbg,Dwarf_Unsigned * cu_header_length,Dwarf_Half * version_stamp,Dwarf_Unsigned * abbrev_offset,Dwarf_Half * address_size,Dwarf_Unsigned * next_cu_offset,Dwarf_Error * error)928 dwarf_next_cu_header(Dwarf_Debug dbg,
929     Dwarf_Unsigned * cu_header_length,
930     Dwarf_Half * version_stamp,
931     Dwarf_Unsigned * abbrev_offset,
932     Dwarf_Half * address_size,
933     Dwarf_Unsigned * next_cu_offset,
934     Dwarf_Error * error)
935 {
936     Dwarf_Bool is_info = true;
937     Dwarf_Half header_type = 0;
938     return _dwarf_next_cu_header_internal(dbg,
939         is_info,
940         cu_header_length,
941         version_stamp,
942         abbrev_offset,
943         address_size,
944         0,0,0,0,0,
945         next_cu_offset,
946         &header_type,
947         error);
948 }
949 int
dwarf_next_cu_header_b(Dwarf_Debug dbg,Dwarf_Unsigned * cu_header_length,Dwarf_Half * version_stamp,Dwarf_Unsigned * abbrev_offset,Dwarf_Half * address_size,Dwarf_Half * offset_size,Dwarf_Half * extension_size,Dwarf_Unsigned * next_cu_offset,Dwarf_Error * error)950 dwarf_next_cu_header_b(Dwarf_Debug dbg,
951     Dwarf_Unsigned * cu_header_length,
952     Dwarf_Half * version_stamp,
953     Dwarf_Unsigned * abbrev_offset,
954     Dwarf_Half * address_size,
955     Dwarf_Half * offset_size,
956     Dwarf_Half * extension_size,
957     Dwarf_Unsigned * next_cu_offset,
958     Dwarf_Error * error)
959 {
960     Dwarf_Bool is_info = true;
961     Dwarf_Half header_type = 0;
962     return _dwarf_next_cu_header_internal(dbg,
963         is_info,
964         cu_header_length,
965         version_stamp,
966         abbrev_offset,
967         address_size,
968         offset_size,extension_size,
969         0,0,0,
970         next_cu_offset,
971         &header_type,
972         error);
973 }
974 
975 int
dwarf_next_cu_header_c(Dwarf_Debug dbg,Dwarf_Bool is_info,Dwarf_Unsigned * cu_header_length,Dwarf_Half * version_stamp,Dwarf_Unsigned * abbrev_offset,Dwarf_Half * address_size,Dwarf_Half * offset_size,Dwarf_Half * extension_size,Dwarf_Sig8 * signature,Dwarf_Unsigned * typeoffset,Dwarf_Unsigned * next_cu_offset,Dwarf_Error * error)976 dwarf_next_cu_header_c(Dwarf_Debug dbg,
977     Dwarf_Bool is_info,
978     Dwarf_Unsigned * cu_header_length,
979     Dwarf_Half * version_stamp,
980     Dwarf_Unsigned * abbrev_offset,
981     Dwarf_Half * address_size,
982     Dwarf_Half * offset_size,
983     Dwarf_Half * extension_size,
984     Dwarf_Sig8 * signature,
985     Dwarf_Unsigned * typeoffset,
986     Dwarf_Unsigned * next_cu_offset,
987     Dwarf_Error * error)
988 {
989     Dwarf_Half header_type = 0;
990     int res =_dwarf_next_cu_header_internal(dbg,
991         is_info,
992         cu_header_length,
993         version_stamp,
994         abbrev_offset,
995         address_size,
996         offset_size,
997         extension_size,
998         signature,
999         0,
1000         typeoffset,
1001         next_cu_offset,
1002         &header_type,
1003         error);
1004     return res;
1005 }
1006 int
dwarf_next_cu_header_d(Dwarf_Debug dbg,Dwarf_Bool is_info,Dwarf_Unsigned * cu_header_length,Dwarf_Half * version_stamp,Dwarf_Unsigned * abbrev_offset,Dwarf_Half * address_size,Dwarf_Half * offset_size,Dwarf_Half * extension_size,Dwarf_Sig8 * signature,Dwarf_Unsigned * typeoffset,Dwarf_Unsigned * next_cu_offset,Dwarf_Half * header_cu_type,Dwarf_Error * error)1007 dwarf_next_cu_header_d(Dwarf_Debug dbg,
1008     Dwarf_Bool is_info,
1009     Dwarf_Unsigned * cu_header_length,
1010     Dwarf_Half * version_stamp,
1011     Dwarf_Unsigned * abbrev_offset,
1012     Dwarf_Half * address_size,
1013     Dwarf_Half * offset_size,
1014     Dwarf_Half * extension_size,
1015     Dwarf_Sig8 * signature,
1016     Dwarf_Unsigned * typeoffset,
1017     Dwarf_Unsigned * next_cu_offset,
1018     Dwarf_Half * header_cu_type,
1019     Dwarf_Error * error)
1020 {
1021     /* Faking has_signature to do nothing. */
1022     Dwarf_Bool* has_signature = 0;
1023     int res = 0;
1024 
1025     res = _dwarf_next_cu_header_internal(dbg,
1026         is_info,
1027         cu_header_length,
1028         version_stamp,
1029         abbrev_offset,
1030         address_size,
1031         offset_size,
1032         extension_size,
1033         signature,
1034         has_signature,
1035         typeoffset,
1036         next_cu_offset,
1037         header_cu_type,
1038         error);
1039     return res;
1040 }
1041 
1042 
1043 static void
local_attrlist_dealloc(Dwarf_Debug dbg,Dwarf_Signed atcount,Dwarf_Attribute * alist)1044 local_attrlist_dealloc(Dwarf_Debug dbg,
1045     Dwarf_Signed atcount,
1046     Dwarf_Attribute *alist)
1047 {
1048     Dwarf_Signed i = 0;
1049 
1050     for ( ; i < atcount; ++i) {
1051         dwarf_dealloc(dbg,alist[i],DW_DLA_ATTR);
1052     }
1053     dwarf_dealloc(dbg,alist,DW_DLA_LIST);
1054 }
1055 
1056 
1057 
1058 /*
1059     A DWO/DWP CU has different base fields than
1060     a normal object/executable, but this finds
1061     the base fields for both types.
1062 */
1063 static int
find_cu_die_base_fields(Dwarf_Debug dbg,Dwarf_CU_Context cucon,Dwarf_Die cudie,Dwarf_Error * error)1064 find_cu_die_base_fields(Dwarf_Debug dbg,
1065     Dwarf_CU_Context cucon,
1066     Dwarf_Die cudie,
1067     Dwarf_Error*    error)
1068 {
1069     Dwarf_CU_Context  cu_context = 0;
1070     Dwarf_Attribute * alist = 0;
1071     Dwarf_Signed      atcount = 0;
1072     unsigned          version_stamp = 2;
1073     int               alres = 0;
1074     Dwarf_Signed      i = 0;
1075     Dwarf_Signed low_pc_attrnum = -1;
1076     Dwarf_Signed at_addr_base_attrnum = -1;
1077 
1078     cu_context = cudie->di_cu_context;
1079     version_stamp = cu_context->cc_version_stamp;
1080 
1081     alres = dwarf_attrlist(cudie, &alist,
1082         &atcount,error);
1083     if(alres != DW_DLV_OK) {
1084         /* Something is badly wrong. No attrlist! */
1085         return alres;
1086     }
1087     /*  DW_AT_dwo_id and/or DW_AT_GNU_dwo_id
1088         are only found  in some
1089         experimental DWARF4.
1090         DWARF5 changed CU header contents
1091         to make this attribute unnecessary.
1092         DW_AT_GNU_odr_signature is the same format,
1093         but is in a different namespace so not
1094         appropriate here..
1095     */
1096     for(i = 0;  i < atcount; ++i) {
1097         Dwarf_Half attrnum;
1098         int ares = 0;
1099         Dwarf_Attribute attr = alist[i];
1100         ares = dwarf_whatattr(attr,&attrnum,error);
1101         if (ares == DW_DLV_OK) {
1102             switch(attrnum) {
1103             case DW_AT_dwo_id:
1104             case DW_AT_GNU_dwo_id: {
1105                 Dwarf_Sig8 signature;
1106                 /*  This is for DWARF4 with an early
1107                     non-standard version
1108                     of split dwarf. Not DWARF5. */
1109                 int sres = 0;
1110                 if (version_stamp != DW_CU_VERSION4 ) {
1111                     /* Not supposed to happen. */
1112                     local_attrlist_dealloc(dbg,atcount,alist);
1113                     _dwarf_error(dbg,error,
1114                         DW_DLE_IMPROPER_DWO_ID);
1115                     return DW_DLV_ERROR;
1116                 }
1117                 memset(&signature, 0, sizeof(signature));
1118                 sres = dwarf_formsig8_const(attr,
1119                     &signature,error);
1120                 if(sres == DW_DLV_OK) {
1121                     if (!cucon->cc_signature_present) {
1122                         cucon->cc_signature = signature;
1123                         cucon->cc_signature_present = TRUE;
1124                     } else {
1125                         /*  Something wrong. Two styles ?
1126                             Do what? verify the same sig?
1127                             FIXME */
1128                     }
1129                 } else {
1130                     /* Something is badly wrong. */
1131                     local_attrlist_dealloc(dbg,atcount,alist);
1132                     return sres;
1133                 }
1134                 break;
1135             }
1136             /*  If, in .debug_rnglists for a CU the
1137                 applicable range has no base address
1138                 this attribute provides a base address.
1139                 If this is indexed doing this now would
1140                 lead to an infinite recursion.
1141                 So wait till all the other fields seen.
1142             */
1143             case DW_AT_low_pc: {
1144                 low_pc_attrnum = i;
1145                 break;
1146             }
1147 
1148             /*  The offset is of the first offset in
1149                 .debug_str_offsets that is the string table
1150                 for this CU. */
1151             case DW_AT_str_offsets_base:{
1152                 int udres = 0;
1153                 udres = dwarf_global_formref(attr,
1154                     &cucon->cc_str_offsets_base,
1155                     error);
1156                 if(udres == DW_DLV_OK) {
1157                     cucon->cc_str_offsets_base_present = TRUE;
1158                 } else {
1159                     local_attrlist_dealloc(dbg,atcount,alist);
1160                     /* Something is badly wrong. */
1161                     return udres;
1162                 }
1163                 break;
1164             }
1165             /*  offset in .debug_loclists  of the offsets table
1166                 applicable to this CU. */
1167             case DW_AT_loclists_base: {
1168                 int udres = 0;
1169                 udres = dwarf_global_formref(attr,
1170                     &cucon->cc_loclists_base,
1171                     error);
1172                 if(udres == DW_DLV_OK) {
1173                     cucon->cc_loclists_base_present = TRUE;
1174                 } else {
1175                     local_attrlist_dealloc(dbg,atcount,alist);
1176                     /* Something is badly wrong. */
1177                     return udres;
1178                 }
1179                 break;
1180                 }
1181             /*  Base offset  in .debug_addr of the addr table
1182                 for this CU. DWARF5 (and possibly GNU DWARF4) */
1183             case DW_AT_addr_base:
1184             case DW_AT_GNU_addr_base: {
1185                 int udres = 0;
1186                 at_addr_base_attrnum = i;
1187                 udres = dwarf_global_formref(attr,
1188                     &cucon->cc_addr_base,
1189                     error);
1190                 if(udres == DW_DLV_OK) {
1191                     cucon->cc_addr_base_present = TRUE;
1192                 } else {
1193                     local_attrlist_dealloc(dbg,atcount,alist);
1194                     /* Something is badly wrong. */
1195                     return udres;
1196                 }
1197                 break;
1198             }
1199             case DW_AT_GNU_ranges_base:
1200             /*  The DW4 ranges base was never used in GNU
1201                 but did get emitted in skeletons.
1202                 http://llvm.1065342.n5.nabble.com/
1203                 DebugInfo-DW-AT-GNU-ranges-base-in-
1204                 non-fission-td64194.html
1205                 We therefore ignore it.  */
1206                 break;
1207             /*  offset in .debug_rnglists  of the offsets table
1208                 applicable to this CU. */
1209             case  DW_AT_rnglists_base: {
1210                 int udres = 0;
1211                 udres = dwarf_global_formref(attr,
1212                     &cucon->cc_rnglists_base,
1213                     error);
1214                 if(udres == DW_DLV_OK) {
1215                     cucon->cc_rnglists_base_present = TRUE;
1216                 } else {
1217                     local_attrlist_dealloc(dbg,atcount,alist);
1218                     /* Something is badly wrong. */
1219                     return udres;
1220                 }
1221                 break;
1222                 }
1223             /*  A signature, found in a DWARF5 skeleton
1224                 compilation unit. */
1225             case DW_AT_GNU_dwo_name:
1226             case DW_AT_dwo_name: {
1227                 int dnres = 0;
1228 
1229                 dnres = dwarf_formstring(attr,
1230                     &cucon->cc_dwo_name,error);
1231                 if (dnres != DW_DLV_OK) {
1232                     local_attrlist_dealloc(dbg,atcount,alist);
1233                     return dnres;
1234                 }
1235                 cucon->cc_dwo_name_present = TRUE;
1236                 break;
1237                 }
1238             default: /* do nothing, not an attribute
1239                 we need to deal with here. */
1240                 break;
1241             }
1242         }
1243     }
1244     if (low_pc_attrnum >= 0 ){
1245         int lres = 0;
1246         Dwarf_Attribute attr = alist[low_pc_attrnum];
1247         Dwarf_Half form = 0;
1248 
1249         /* If the form is indexed, we better have
1250             seen DW_AT_addr_base.! */
1251         lres = dwarf_whatform(attr,&form,error);
1252         if (lres != DW_DLV_OK) {
1253             local_attrlist_dealloc(dbg,atcount,alist);
1254             return lres;
1255         }
1256         if (dwarf_addr_form_is_indexed(form)) {
1257             if (at_addr_base_attrnum < 0) {
1258                 dwarfstring m;
1259 
1260                 dwarfstring_constructor(&m);
1261                 dwarfstring_append(&m,
1262                     "DW_DLE_ATTR_NO_CU_CONTEXT: "
1263                     "The DW_AT_low_pc  CU_DIE uses "
1264                     "an indexed attribute yet "
1265                     "DW_AT_addr_base is not in the CU DIE.");
1266                 _dwarf_error_string(dbg,error,
1267                     DW_DLE_ATTR_NO_CU_CONTEXT,
1268                     dwarfstring_string(&m));
1269                 dwarfstring_destructor(&m);
1270                 local_attrlist_dealloc(dbg,atcount,alist);
1271                 return DW_DLV_ERROR;
1272             }
1273         }
1274         lres = dwarf_formaddr(attr,
1275             &cucon->cc_low_pc,error);
1276         if(lres == DW_DLV_OK) {
1277             cucon->cc_low_pc_present = TRUE;
1278         } else {
1279             /* Something is badly wrong. */
1280             local_attrlist_dealloc(dbg,atcount,alist);
1281             return lres;
1282         }
1283     }
1284     local_attrlist_dealloc(dbg,atcount,alist);
1285     alist = 0;
1286     atcount = 0;
1287     {
1288         int chres = 0;
1289         Dwarf_Half flag = 0;
1290 
1291         /*  always winds up with cc_cu_die_has_children
1292             set intentionally...to something. */
1293         cucon->cc_cu_die_has_children = TRUE;
1294         chres = dwarf_die_abbrev_children_flag(cudie,&flag);
1295         /*  If chres is not DW_DLV_OK the assumption
1296             of children remains true. */
1297         if (chres == DW_DLV_OK) {
1298             cucon->cc_cu_die_has_children = flag;
1299         }
1300     }
1301     return DW_DLV_OK;
1302 }
1303 
1304 /*  Called only for DWARF4 */
1305 static void
assign_correct_unit_type(Dwarf_CU_Context cu_context)1306 assign_correct_unit_type(Dwarf_CU_Context cu_context)
1307 {
1308     Dwarf_Half tag = cu_context->cc_cu_die_tag;
1309     if(!cu_context->cc_cu_die_has_children) {
1310         if(cu_context->cc_signature_present) {
1311             if (tag == DW_TAG_compile_unit ||
1312                 tag == DW_TAG_type_unit ) {
1313                 cu_context->cc_unit_type = DW_UT_skeleton;
1314             }
1315         }
1316     } else {
1317         if(cu_context->cc_signature_present) {
1318             if (tag == DW_TAG_compile_unit) {
1319                 cu_context->cc_unit_type = DW_UT_split_compile;
1320             } else if (tag == DW_TAG_type_unit) {
1321                 cu_context->cc_unit_type = DW_UT_split_type;
1322             }
1323         }
1324     }
1325 }
1326 
1327 static int
finish_up_cu_context_from_cudie(Dwarf_Debug dbg,Dwarf_Unsigned offset,Dwarf_CU_Context cu_context,Dwarf_Error * error)1328 finish_up_cu_context_from_cudie(Dwarf_Debug dbg,
1329     Dwarf_Unsigned offset,
1330     Dwarf_CU_Context cu_context,
1331     Dwarf_Error *error)
1332 {
1333     int version = cu_context->cc_version_stamp;
1334     Dwarf_Sig8 signaturedata;
1335     int res = 0;
1336 
1337 
1338     memset(&signaturedata,0,sizeof(signaturedata));
1339     signaturedata = cu_context->cc_signature;
1340 
1341     /*  Loads and initializes the dwarf .debug_cu_index
1342         and .debug_tu_index split dwarf package
1343         file sections */
1344     res = fill_in_dwp_offsets_if_present(dbg,
1345         cu_context,
1346         &signaturedata,
1347         offset,
1348         error);
1349     if (res == DW_DLV_ERROR) {
1350         return res;
1351     }
1352     if (res != DW_DLV_OK) {
1353         return res;
1354     }
1355 
1356     if (cu_context->cc_dwp_offsets.pcu_type) {
1357         Dwarf_Unsigned absize = 0;
1358         Dwarf_Unsigned aboff = 0;
1359 
1360         aboff = _dwarf_get_dwp_extra_offset(
1361             &cu_context->cc_dwp_offsets,
1362             DW_SECT_ABBREV, &absize);
1363         cu_context->cc_abbrev_offset +=  aboff;
1364     }
1365 
1366     if (cu_context->cc_abbrev_offset >=
1367         dbg->de_debug_abbrev.dss_size) {
1368         _dwarf_error(dbg, error, DW_DLE_ABBREV_OFFSET_ERROR);
1369         return DW_DLV_ERROR;
1370     }
1371     /*  Now we can read the CU die and determine
1372         the correct DW_UT_ type for DWARF4 and some
1373         offset base fields for DW4-fission and DW5 */
1374     if (version == DW_CU_VERSION4 || version == DW_CU_VERSION5) {
1375         res = finish_cu_context_via_cudie_inner(dbg,
1376             cu_context,
1377             error);
1378         if(res == DW_DLV_ERROR) {
1379             return res;
1380         }
1381         if(res != DW_DLV_OK) {
1382             return res;
1383         }
1384         if (version == DW_CU_VERSION4) {
1385             assign_correct_unit_type(cu_context);
1386         }
1387     }
1388     return DW_DLV_OK;
1389 }
1390 /*
1391     CU_Contexts do not overlap.
1392     cu_context we see here is not in the list we
1393     are updating. See _dwarf_find_CU_Context()
1394 
1395     Invariant: cc_debug_offset in strictly
1396         ascending order in the list.
1397 */
1398 static void
insert_into_cu_context_list(Dwarf_Debug_InfoTypes dis,Dwarf_CU_Context icu_context)1399 insert_into_cu_context_list(Dwarf_Debug_InfoTypes dis,
1400     Dwarf_CU_Context icu_context)
1401 {
1402     Dwarf_Unsigned ioffset = icu_context->cc_debug_offset;
1403     Dwarf_Unsigned eoffset = 0;
1404     Dwarf_Unsigned hoffset = 0;
1405     Dwarf_Unsigned coffset = 0;
1406     Dwarf_CU_Context next = 0;
1407     Dwarf_CU_Context past = 0;
1408     Dwarf_CU_Context cur = 0;
1409 
1410     /*  Add the context into the section context list.
1411         This is the one and only place where it is
1412         saved for re-use and eventual dealloc. */
1413     if (!dis->de_cu_context_list) {
1414         /*  First cu encountered. */
1415         dis->de_cu_context_list = icu_context;
1416         dis->de_cu_context_list_end = icu_context;
1417         return;
1418     }
1419     eoffset = dis->de_cu_context_list_end->cc_debug_offset;
1420     if (eoffset < ioffset) {
1421         /* Normal case, add at end. */
1422         dis->de_cu_context_list_end->cc_next = icu_context;
1423         dis->de_cu_context_list_end = icu_context;
1424         return;
1425     }
1426     hoffset = dis->de_cu_context_list->cc_debug_offset;
1427     if (hoffset > ioffset) {
1428         /* insert as new head. Unusual. */
1429         next =  dis->de_cu_context_list;
1430         dis->de_cu_context_list = icu_context;
1431         dis->de_cu_context_list->cc_next = next;
1432         /*  No need to touch de_cu_context_list_end */
1433         return;
1434     }
1435     cur = dis->de_cu_context_list;
1436     past = 0;
1437     /*  Insert in middle somewhere. Neither at
1438         start nor end.
1439         ASSERT: cur non-null
1440         ASSERT: past non-null */
1441     past = cur;
1442     cur = cur->cc_next;
1443     for ( ; cur ; cur = next) {
1444         next = cur->cc_next;
1445         coffset = cur->cc_debug_offset;
1446         if (coffset  >  ioffset) {
1447             /*  Insert before cur, using past.
1448                 ASSERT: past non-null  */
1449             past->cc_next = icu_context;
1450             icu_context->cc_next = cur;
1451             return;
1452         }
1453         past = cur;
1454     }
1455     /*  Impossible, for end, coffset (ie, eoffset) > ioffset  */
1456     /* NOTREACHED */
1457     return;
1458 }
1459 
1460 int
_dwarf_next_cu_header_internal(Dwarf_Debug dbg,Dwarf_Bool is_info,Dwarf_Unsigned * cu_header_length,Dwarf_Half * version_stamp,Dwarf_Unsigned * abbrev_offset,Dwarf_Half * address_size,Dwarf_Half * offset_size,Dwarf_Half * extension_size,Dwarf_Sig8 * signature_out,Dwarf_Bool * has_signature,Dwarf_Unsigned * typeoffset,Dwarf_Unsigned * next_cu_offset,Dwarf_Half * header_type,Dwarf_Error * error)1461 _dwarf_next_cu_header_internal(Dwarf_Debug dbg,
1462     Dwarf_Bool is_info,
1463     Dwarf_Unsigned * cu_header_length,
1464     Dwarf_Half * version_stamp,
1465     Dwarf_Unsigned * abbrev_offset,
1466     Dwarf_Half * address_size,
1467     Dwarf_Half * offset_size,
1468     Dwarf_Half * extension_size,
1469     Dwarf_Sig8 * signature_out,
1470     Dwarf_Bool * has_signature,
1471     Dwarf_Unsigned *typeoffset,
1472     Dwarf_Unsigned * next_cu_offset,
1473 
1474     /*  header_type: DW_UT_compile, DW_UT_partial,
1475         DW_UT_type, returned through the pointer.
1476         A new item in DWARF5, synthesized for earlier DWARF
1477         CUs (& TUs). */
1478     Dwarf_Half * header_type,
1479     Dwarf_Error * error)
1480 {
1481     /* Offset for current and new CU. */
1482     Dwarf_Unsigned new_offset = 0;
1483 
1484     /* CU Context for current CU. */
1485     Dwarf_CU_Context cu_context = 0;
1486     Dwarf_Debug_InfoTypes dis = 0;
1487     Dwarf_Unsigned section_size =  0;
1488     int res = 0;
1489 
1490     /* ***** BEGIN CODE ***** */
1491 
1492     if (dbg == NULL) {
1493         _dwarf_error(NULL, error, DW_DLE_DBG_NULL);
1494         return (DW_DLV_ERROR);
1495     }
1496     dis = is_info? &dbg->de_info_reading: &dbg->de_types_reading;
1497     /*  Get offset into .debug_info of next CU.
1498         If dbg has no context,
1499         this has to be the first one.  */
1500     if (!dis->de_cu_context) {
1501         Dwarf_Small *dataptr = is_info? dbg->de_debug_info.dss_data:
1502             dbg->de_debug_types.dss_data;
1503         new_offset = 0;
1504         if (!dataptr) {
1505             Dwarf_Error err2= 0;
1506             int resd = is_info?_dwarf_load_debug_info(dbg, &err2):
1507                 _dwarf_load_debug_types(dbg,&err2);
1508 
1509             if (resd != DW_DLV_OK) {
1510                 if (reloc_incomplete(resd,err2)) {
1511                     /*  We will assume all is ok, though it is not.
1512                         Relocation errors need not be fatal. */
1513                     char msg_buf[300];
1514                     char *dwerrmsg = 0;
1515                     char *msgprefix =
1516                         "Relocations did not complete successfully, "
1517                         "but we are " " ignoring error: ";
1518                     size_t totallen = 0;
1519                     size_t prefixlen = 0;
1520 
1521                     dwerrmsg = dwarf_errmsg(err2);
1522                     prefixlen = strlen(msgprefix);
1523                     totallen = prefixlen + strlen(dwerrmsg);
1524                     if( totallen >= sizeof(msg_buf)) {
1525                         /*  Impossible unless something corrupted.
1526                             Provide a shorter dwerrmsg*/
1527                         strcpy(msg_buf,"Error:corrupted dwarf message table!");
1528                     } else {
1529                         strcpy(msg_buf,msgprefix);
1530                         strcpy(msg_buf+prefixlen,dwerrmsg);
1531                     }
1532                     dwarf_insert_harmless_error(dbg,msg_buf);
1533                     /*  Fall thru to use the newly loaded section.
1534                         even though it might not be adequately
1535                         relocated. */
1536                     if (resd == DW_DLV_ERROR) {
1537                         dwarf_dealloc(dbg,err2,DW_DLA_ERROR);
1538                         err2 = 0;
1539                     }
1540                 } else {
1541                     if (error) {
1542                         *error = err2;
1543                         err2 = 0;
1544                     }
1545                     /*  There is nothing here, or
1546                         what is here is damaged. */
1547                     return resd;
1548                 }
1549 
1550             }
1551         }
1552         /*  We are leaving new_offset zero. We are at the
1553             start of a section. */
1554     } else {
1555         /* We already have is_info  cu_context. */
1556 
1557         new_offset = dis->de_cu_context->cc_debug_offset +
1558             dis->de_cu_context->cc_length +
1559             dis->de_cu_context->cc_length_size +
1560             dis->de_cu_context->cc_extension_size;
1561     }
1562 
1563     /*  Check that there is room in .debug_info beyond
1564         the new offset for at least a new cu header.
1565         If not, return -1 (DW_DLV_NO_ENTRY) to indicate end
1566         of debug_info section, and reset
1567         de_cu_debug_info_offset to
1568         enable looping back through the cu's. */
1569     section_size = is_info? dbg->de_debug_info.dss_size:
1570         dbg->de_debug_types.dss_size;
1571     if ((new_offset + _dwarf_length_of_cu_header_simple(dbg,is_info)) >=
1572         section_size) {
1573         dis->de_cu_context = NULL;
1574         return DW_DLV_NO_ENTRY;
1575     }
1576 
1577     /* Check if this CU has been read before. */
1578     cu_context = _dwarf_find_CU_Context(dbg, new_offset,is_info);
1579 
1580     /* If not, make CU Context for it. */
1581     if (!cu_context) {
1582         res = _dwarf_make_CU_Context(dbg, new_offset,is_info,
1583             &cu_context,error);
1584         if (res == DW_DLV_ERROR) {
1585             return res;
1586         }
1587         if (res == DW_DLV_NO_ENTRY) {
1588             return res;
1589         }
1590         res = finish_up_cu_context_from_cudie(dbg,new_offset,
1591             cu_context,error);
1592         if (res == DW_DLV_ERROR) {
1593             local_dealloc_cu_context(dbg,cu_context);
1594             return res;
1595         }
1596         if (res == DW_DLV_NO_ENTRY) {
1597             local_dealloc_cu_context(dbg,cu_context);
1598             return res;
1599         }
1600 
1601         dis->de_cu_context = cu_context;
1602         insert_into_cu_context_list(dis,cu_context);
1603     } else {
1604         dis->de_cu_context = cu_context;
1605     }
1606 
1607     if (cu_header_length) {
1608         *cu_header_length = cu_context->cc_length;
1609     }
1610 
1611     if (version_stamp) {
1612         *version_stamp = cu_context->cc_version_stamp;
1613     }
1614     if (abbrev_offset) {
1615         *abbrev_offset = cu_context->cc_abbrev_offset;
1616     }
1617     if (address_size) {
1618         *address_size = cu_context->cc_address_size;
1619     }
1620     if (offset_size) {
1621         *offset_size = cu_context->cc_length_size;
1622     }
1623     if (extension_size) {
1624         *extension_size = cu_context->cc_extension_size;
1625     }
1626     if (header_type) {
1627         *header_type = cu_context->cc_unit_type;
1628     }
1629     if (typeoffset) {
1630         *typeoffset = cu_context->cc_signature_offset;
1631     }
1632     if (signature_out) {
1633         *signature_out = cu_context->cc_signature;
1634     }
1635     if (has_signature) {
1636         *has_signature = cu_context->cc_signature_present;
1637     }
1638     /*  Determine the offset of the next CU. */
1639     new_offset = new_offset + cu_context->cc_length +
1640         cu_context->cc_length_size + cu_context->cc_extension_size;
1641     /*  Allowing null argument starting 22 April 2019. */
1642     if (next_cu_offset) {
1643         *next_cu_offset = new_offset;
1644     }
1645     return DW_DLV_OK;
1646 }
1647 
1648 /*  This involves data in a split dwarf or package file.
1649 
1650     Given hash signature, return the CU_die of the applicable CU.
1651     The hash is assumed to be from 'somewhere'.
1652     For DWARF 4:
1653         From a skeleton DIE DW_AT_GNU_dwo_id  ("cu" case) or
1654         From a DW_FORM_ref_sig8 ("tu" case).
1655     For DWARF5:
1656         From  dwo_id in a skeleton CU header (DW_UT_skeleton).
1657         From a DW_FORM_ref_sig8 ("tu" case).
1658 
1659 
1660     If "tu" request,  the CU_die
1661     of of the type unit.
1662     Works on either a dwp package file or a dwo object.
1663 
1664     If "cu" request,  the CU_die
1665     of the compilation unit.
1666     Works on either a dwp package file or a dwo object.
1667 
1668     If the hash passed is not present, returns DW_DLV_NO_ENTRY
1669     (but read the next two paragraphs for more detail).
1670 
1671     If a dwp package file with the hash signature
1672     is present in the applicable index but no matching
1673     compilation unit can be found, it returns DW_DLV_ERROR.
1674 
1675     If a .dwo object there is no index and we look at the
1676     compilation units (possibly all of them). If not present
1677     then we return DW_DLV_NO_ENTRY.
1678 
1679     The returned_die is a CU DIE if the sig_type is "cu".
1680     The returned_die is a type DIE if the sig_type is "tu".
1681     Perhaps both should return CU die.
1682 
1683     New 27 April, 2015
1684 */
1685 int
dwarf_die_from_hash_signature(Dwarf_Debug dbg,Dwarf_Sig8 * hash_sig,const char * sig_type,Dwarf_Die * returned_die,Dwarf_Error * error)1686 dwarf_die_from_hash_signature(Dwarf_Debug dbg,
1687     Dwarf_Sig8 *     hash_sig,
1688     const char *     sig_type  /* "tu" or "cu"*/,
1689     Dwarf_Die  *     returned_die,
1690     Dwarf_Error*     error)
1691 {
1692     Dwarf_Bool is_type_unit = FALSE;
1693     int sres = 0;
1694 
1695     sres = _dwarf_load_debug_info(dbg,error);
1696     if (sres == DW_DLV_ERROR) {
1697         return sres;
1698     }
1699     sres = _dwarf_load_debug_types(dbg,error);
1700     if (sres == DW_DLV_ERROR) {
1701         return sres;
1702     }
1703 
1704     if (!strcmp(sig_type,"tu")) {
1705         is_type_unit = TRUE;
1706     } else if (!strcmp(sig_type,"cu")) {
1707         is_type_unit = FALSE;
1708     } else {
1709         _dwarf_error(dbg,error,DW_DLE_SIG_TYPE_WRONG_STRING);
1710         return DW_DLV_ERROR;
1711     }
1712 
1713     if (_dwarf_file_has_debug_fission_index(dbg)) {
1714         /* This is a dwp package file. */
1715         int fisres = 0;
1716         Dwarf_Bool is_info2 = 0;
1717         Dwarf_Off cu_header_off = 0;
1718         Dwarf_Off cu_size = 0;
1719         Dwarf_Off cu_die_off = 0;
1720         Dwarf_Off typeoffset = 0;
1721         Dwarf_Die cudie = 0;
1722         Dwarf_Die typedie = 0;
1723         Dwarf_CU_Context context = 0;
1724         Dwarf_Debug_Fission_Per_CU fiss;
1725 
1726         memset(&fiss,0,sizeof(fiss));
1727         fisres = dwarf_get_debugfission_for_key(dbg,hash_sig,
1728             sig_type,&fiss,error);
1729         if (fisres != DW_DLV_OK) {
1730             return fisres;
1731         }
1732         /* Found it */
1733         if(is_type_unit) {
1734             /*  DW4 has debug_types, so look in .debug_types
1735                 Else look in .debug_info.  */
1736             is_info2 = dbg->de_debug_types.dss_size?FALSE:TRUE;
1737         } else {
1738             is_info2 = TRUE;
1739         }
1740 
1741         cu_header_off = _dwarf_get_dwp_extra_offset(&fiss,
1742             is_info2?DW_SECT_INFO:DW_SECT_TYPES,
1743             &cu_size);
1744 
1745         fisres = dwarf_get_cu_die_offset_given_cu_header_offset_b(
1746             dbg,cu_header_off,
1747             is_info2,
1748             &cu_die_off,error);
1749         if (fisres != DW_DLV_OK) {
1750             return fisres;
1751         }
1752         fisres = dwarf_offdie_b(dbg,cu_die_off,is_info2,
1753             &cudie,error);
1754         if (fisres != DW_DLV_OK) {
1755             return fisres;
1756         }
1757         if (!is_type_unit) {
1758             *returned_die = cudie;
1759             return DW_DLV_OK;
1760         }
1761         context = cudie->di_cu_context;
1762         typeoffset = context->cc_signature_offset;
1763         typeoffset += cu_header_off;
1764         fisres = dwarf_offdie_b(dbg,typeoffset,is_info2,
1765             &typedie,error);
1766         if (fisres != DW_DLV_OK) {
1767             dwarf_dealloc(dbg,cudie,DW_DLA_DIE);
1768             return fisres;
1769         }
1770         *returned_die = typedie;
1771         dwarf_dealloc(dbg,cudie,DW_DLA_DIE);
1772         return DW_DLV_OK;
1773     }
1774     /*  Look thru all the CUs, there is no DWP tu/cu index.
1775         There will be COMDAT sections for  the type TUs
1776             (DW_UT_type).
1777         A single non-comdat for the DW_UT_compile. */
1778     /*  FIXME: DW_DLE_DEBUG_FISSION_INCOMPLETE  */
1779     _dwarf_error(dbg,error,DW_DLE_DEBUG_FISSION_INCOMPLETE);
1780     return DW_DLV_ERROR;
1781 }
1782 
1783 static int
dwarf_ptr_CU_offset(Dwarf_CU_Context cu_context,Dwarf_Byte_Ptr di_ptr,Dwarf_Bool is_info,Dwarf_Off * cu_off)1784 dwarf_ptr_CU_offset(Dwarf_CU_Context cu_context,
1785     Dwarf_Byte_Ptr di_ptr,
1786     Dwarf_Bool is_info,
1787     Dwarf_Off * cu_off)
1788 {
1789     Dwarf_Debug dbg = cu_context->cc_dbg;
1790     Dwarf_Small *dataptr = is_info? dbg->de_debug_info.dss_data:
1791         dbg->de_debug_types.dss_data;
1792     *cu_off = (di_ptr - dataptr);
1793     return DW_DLV_OK;
1794 }
1795 #if 0 /* FOR DEBUGGING */
1796 /* Just for debug purposes */
1797 void print_sib_offset(Dwarf_Die sibling)
1798 {
1799     Dwarf_Off sib_off;
1800     Dwarf_Error error;
1801     dwarf_dieoffset(sibling,&sib_off,&error);
1802     fprintf(stderr," SIB OFF = 0x%" DW_PR_XZEROS DW_PR_DUx,sib_off);
1803 }
1804 void print_ptr_offset(Dwarf_CU_Context cu_context,Dwarf_Byte_Ptr di_ptr)
1805 {
1806     Dwarf_Off ptr_off;
1807     dwarf_ptr_CU_offset(cu_context,di_ptr,&ptr_off);
1808     fprintf(stderr," PTR OFF = 0x%" DW_PR_XZEROS DW_PR_DUx,ptr_off);
1809 }
1810 #endif
1811 
1812 
1813 /*  Validate the sibling DIE. This only makes sense to call
1814     if the sibling's DIEs have been travsersed and
1815     dwarf_child() called on each,
1816     so that the last DIE dwarf_child saw was the last.
1817     Essentially ensuring that (after such traversal) that we
1818     are in the same place a sibling attribute would identify.
1819     In case we return DW_DLV_ERROR, the global offset of the last
1820     DIE traversed by dwarf_child is returned through *offset
1821 
1822     It is essentially guaranteed that  dbg->de_last_die
1823     is a stale DIE pointer of a deallocated DIE when we get here.
1824     It must not be used as a DIE pointer here,
1825     just as a sort of anonymous pointer that we just check against
1826     NULL.
1827 
1828     There is a (subtle?) dependence on the fact that when we call this
1829     the last dwarf_child() call would have been for this sibling.
1830     Meaning that this works in a depth-first traversal even though there
1831     is no stack of 'de_last_die' values.
1832 
1833     The check for dbg->de_last_die just ensures sanity.
1834 
1835     If one is switching between normal debug_frame and eh_frame
1836     (traversing them in tandem, let us say) in a single
1837     Dwarf_Debug this validator makes no sense.
1838     It works if one processes a .debug_frame (entirely) and
1839     then an eh_frame (or vice versa) though.
1840     Use caution.
1841 */
1842 int
dwarf_validate_die_sibling(Dwarf_Die sibling,Dwarf_Off * offset)1843 dwarf_validate_die_sibling(Dwarf_Die sibling,Dwarf_Off *offset)
1844 {
1845     Dwarf_Debug dbg = 0;
1846     Dwarf_Error *error = 0;
1847     Dwarf_Debug_InfoTypes dis = 0;
1848     CHECK_DIE(sibling, DW_DLV_ERROR);
1849     dbg = sibling->di_cu_context->cc_dbg;
1850 
1851     dis = sibling->di_is_info? &dbg->de_info_reading: &dbg->de_types_reading;
1852 
1853     *offset = 0;
1854     if (dis->de_last_die && dis->de_last_di_ptr) {
1855         if (sibling->di_debug_ptr == dis->de_last_di_ptr) {
1856             return (DW_DLV_OK);
1857         }
1858     }
1859     /* Calculate global offset used for error reporting */
1860     dwarf_ptr_CU_offset(sibling->di_cu_context,
1861         dis->de_last_di_ptr,sibling->di_is_info,offset);
1862     return (DW_DLV_ERROR);
1863 }
1864 
1865 /*  This function does two slightly different things
1866     depending on the input flag want_AT_sibling.  If
1867     this flag is true, it checks if the input die has
1868     a DW_AT_sibling attribute.  If it does it returns
1869     a pointer to the start of the sibling die in the
1870     .debug_info section.  Otherwise it behaves the
1871     same as the want_AT_sibling false case.
1872 
1873     If the want_AT_sibling flag is false, it returns
1874     a pointer to the immediately adjacent die in the
1875     .debug_info section.
1876 
1877     Die_info_end points to the end of the .debug_info
1878     portion for the cu the die belongs to.  It is used
1879     to check that the search for the next die does not
1880     cross the end of the current cu.  Cu_info_start points
1881     to the start of the .debug_info portion for the
1882     current cu, and is used to add to the offset for
1883     DW_AT_sibling attributes.  Finally, has_die_child
1884     is a pointer to a Dwarf_Bool that is set true if
1885     the present die has children, false otherwise.
1886     However, in case want_AT_child is true and the die
1887     has a DW_AT_sibling attribute *has_die_child is set
1888     false to indicate that the children are being skipped.
1889 
1890     die_info_end  points to the last byte+1 of the cu.  */
1891 static int
_dwarf_next_die_info_ptr(Dwarf_Byte_Ptr die_info_ptr,Dwarf_CU_Context cu_context,Dwarf_Byte_Ptr die_info_end,Dwarf_Byte_Ptr cu_info_start,Dwarf_Bool want_AT_sibling,Dwarf_Bool * has_die_child,Dwarf_Byte_Ptr * next_die_ptr_out,Dwarf_Error * error)1892 _dwarf_next_die_info_ptr(Dwarf_Byte_Ptr die_info_ptr,
1893     Dwarf_CU_Context cu_context,
1894     Dwarf_Byte_Ptr die_info_end,
1895     Dwarf_Byte_Ptr cu_info_start,
1896     Dwarf_Bool want_AT_sibling,
1897     Dwarf_Bool * has_die_child,
1898     Dwarf_Byte_Ptr *next_die_ptr_out,
1899     Dwarf_Error *error)
1900 {
1901     Dwarf_Byte_Ptr info_ptr = 0;
1902     Dwarf_Byte_Ptr abbrev_ptr = 0;
1903     Dwarf_Unsigned abbrev_code = 0;
1904     Dwarf_Abbrev_List abbrev_list = 0;
1905     Dwarf_Half attr = 0;
1906     Dwarf_Half attr_form = 0;
1907     Dwarf_Unsigned offset = 0;
1908     Dwarf_Unsigned utmp = 0;
1909     Dwarf_Debug dbg = 0;
1910     Dwarf_Byte_Ptr abbrev_end = 0;
1911     int lres = 0;
1912 
1913     info_ptr = die_info_ptr;
1914     DECODE_LEB128_UWORD_CK(info_ptr, utmp,dbg,error,die_info_end);
1915     abbrev_code = (Dwarf_Unsigned) utmp;
1916     if (abbrev_code == 0) {
1917         /*  Should never happen. Tested before we got here. */
1918         _dwarf_error(dbg, error, DW_DLE_NEXT_DIE_PTR_NULL);
1919         return DW_DLV_ERROR;
1920     }
1921 
1922 
1923     lres = _dwarf_get_abbrev_for_code(cu_context, abbrev_code,
1924         &abbrev_list,error);
1925     if (lres == DW_DLV_ERROR) {
1926         return lres;
1927     }
1928     if (lres == DW_DLV_NO_ENTRY) {
1929         _dwarf_error(dbg, error, DW_DLE_NEXT_DIE_NO_ABBREV_LIST);
1930         return DW_DLV_ERROR;
1931     }
1932     dbg = cu_context->cc_dbg;
1933 
1934     *has_die_child = abbrev_list->abl_has_child;
1935 
1936     abbrev_ptr = abbrev_list->abl_abbrev_ptr;
1937     abbrev_end = _dwarf_calculate_abbrev_section_end_ptr(cu_context);
1938 
1939     do {
1940         Dwarf_Unsigned utmp2;
1941 
1942         DECODE_LEB128_UWORD_CK(abbrev_ptr, utmp2,dbg,error,
1943             abbrev_end);
1944         if (utmp2 > DW_AT_hi_user) {
1945             _dwarf_error(dbg, error, DW_DLE_ATTR_CORRUPT);
1946             return DW_DLV_ERROR;
1947         }
1948         attr = (Dwarf_Half) utmp2;
1949         DECODE_LEB128_UWORD_CK(abbrev_ptr, utmp2,dbg,error,
1950             abbrev_end);
1951         if (!_dwarf_valid_form_we_know(utmp2,attr)) {
1952             _dwarf_error(dbg, error, DW_DLE_UNKNOWN_FORM);
1953             return DW_DLV_ERROR;
1954         }
1955         attr_form = (Dwarf_Half) utmp2;
1956         if (attr_form == DW_FORM_indirect) {
1957             Dwarf_Unsigned utmp6;
1958 
1959             /* DECODE_LEB128_UWORD updates info_ptr */
1960             DECODE_LEB128_UWORD_CK(info_ptr, utmp6,dbg,error,
1961                 die_info_end);
1962             attr_form = (Dwarf_Half) utmp6;
1963         }
1964         if (attr_form == DW_FORM_implicit_const) {
1965             UNUSEDARG Dwarf_Signed cval = 0;
1966 
1967             DECODE_LEB128_SWORD_CK(abbrev_ptr, cval,dbg,error,
1968                 abbrev_end);
1969         }
1970 
1971         if (want_AT_sibling && attr == DW_AT_sibling) {
1972             switch (attr_form) {
1973             case DW_FORM_ref1:
1974                 READ_UNALIGNED_CK(dbg, offset, Dwarf_Unsigned,
1975                     info_ptr, sizeof(Dwarf_Small),
1976                     error,die_info_end);
1977                 break;
1978             case DW_FORM_ref2:
1979                 /* READ_UNALIGNED does not update info_ptr */
1980                 READ_UNALIGNED_CK(dbg, offset, Dwarf_Unsigned,
1981                     info_ptr,DWARF_HALF_SIZE,
1982                     error,die_info_end);
1983                 break;
1984             case DW_FORM_ref4:
1985                 READ_UNALIGNED_CK(dbg, offset, Dwarf_Unsigned,
1986                     info_ptr, DWARF_32BIT_SIZE,
1987                     error,die_info_end);
1988                 break;
1989             case DW_FORM_ref8:
1990                 READ_UNALIGNED_CK(dbg, offset, Dwarf_Unsigned,
1991                     info_ptr, DWARF_64BIT_SIZE,
1992                     error,die_info_end);
1993                 break;
1994             case DW_FORM_ref_udata:
1995                 DECODE_LEB128_UWORD_CK(info_ptr, offset,
1996                     dbg,error,die_info_end);
1997                 break;
1998             case DW_FORM_ref_addr:
1999                 /*  Very unusual.  The FORM is intended to refer to
2000                     a different CU, but a different CU cannot
2001                     be a sibling, can it?
2002                     We could ignore this and treat as if no
2003                     DW_AT_sibling
2004                     present.   Or derive the offset from it and if
2005                     it is in the same CU use it directly.
2006                     The offset here is *supposed* to be a
2007                     global offset,
2008                     so adding cu_info_start is wrong  to any offset
2009                     we find here unless cu_info_start
2010                     is zero! Lets pretend there is no DW_AT_sibling
2011                     attribute.  */
2012                 goto no_sibling_attr;
2013             default:
2014                 _dwarf_error(dbg, error, DW_DLE_NEXT_DIE_WRONG_FORM);
2015                 return DW_DLV_ERROR;
2016             }
2017 
2018             /*  Reset *has_die_child to indicate children skipped.  */
2019             *has_die_child = false;
2020 
2021             /*  A value beyond die_info_end indicates an error. Exactly
2022                 at die_info_end means 1-past-cu-end and simply means we
2023                 are at the end, do not return error. Higher level
2024                 will detect that we are at the end. */
2025             {   /*  Care required here. Offset can be garbage. */
2026                 ptrdiff_t plen = die_info_end - cu_info_start;
2027                 ptrdiff_t signdoffset = (ptrdiff_t)offset;
2028                 if (signdoffset > plen || signdoffset < 0) {
2029                     /* Error case, bad DWARF. */
2030                     _dwarf_error(dbg, error,DW_DLE_SIBLING_OFFSET_WRONG);
2031                     return DW_DLV_ERROR;
2032                 }
2033             }
2034             /* At or before end-of-cu */
2035             *next_die_ptr_out = cu_info_start + offset;
2036             return DW_DLV_OK;
2037         }
2038 
2039         no_sibling_attr:
2040         if (attr_form != 0 && attr_form != DW_FORM_implicit_const) {
2041             int res = 0;
2042             Dwarf_Unsigned sizeofval = 0;
2043             ptrdiff_t  sizeb = 0;
2044 
2045             res = _dwarf_get_size_of_val(cu_context->cc_dbg,
2046                 attr_form,
2047                 cu_context->cc_version_stamp,
2048                 cu_context->cc_address_size,
2049                 info_ptr,
2050                 cu_context->cc_length_size,
2051                 &sizeofval,
2052                 die_info_end,
2053                 error);
2054             if(res != DW_DLV_OK) {
2055                 return res;
2056             }
2057             /*  It is ok for info_ptr == die_info_end, as we will test
2058                 later before using a too-large info_ptr */
2059             sizeb = (ptrdiff_t)sizeofval;
2060             if (sizeb > (die_info_end - info_ptr) ||
2061                 sizeb < 0) {
2062                 _dwarf_error(dbg, error, DW_DLE_NEXT_DIE_PAST_END);
2063                 return DW_DLV_ERROR;
2064             }
2065             info_ptr += sizeofval;
2066             if (info_ptr > die_info_end) {
2067                 /*  More than one-past-end indicates a bug somewhere,
2068                     likely bad dwarf generation. */
2069                 _dwarf_error(dbg, error, DW_DLE_NEXT_DIE_PAST_END);
2070                 return DW_DLV_ERROR;
2071             }
2072         }
2073     } while (attr != 0 || attr_form != 0);
2074     *next_die_ptr_out = info_ptr;
2075     return DW_DLV_OK;
2076 }
2077 
2078 /*  Multiple TAGs are in fact compile units.
2079     Allow them all.
2080     Return non-zero if a CU tag.
2081     Else return 0.
2082 */
2083 static int
is_cu_tag(int t)2084 is_cu_tag(int t)
2085 {
2086     if (t == DW_TAG_compile_unit  ||
2087         t == DW_TAG_partial_unit  ||
2088         t == DW_TAG_skeleton_unit ||
2089         t == DW_TAG_type_unit) {
2090         return 1;
2091     }
2092     return 0;
2093 }
2094 
2095 /*  Given a Dwarf_Debug dbg, and a Dwarf_Die die, it returns
2096     a Dwarf_Die for the sibling of die.  In case die is NULL,
2097     it returns (thru ptr) a Dwarf_Die for the first die in the current
2098     cu in dbg.  Returns DW_DLV_ERROR on error.
2099 
2100     It is assumed that every sibling chain including those with
2101     only one element is terminated with a NULL die, except a
2102     chain with only a NULL die.
2103 
2104     The algorithm moves from one die to the adjacent one.  It
2105     returns when the depth of children it sees equals the number
2106     of sibling chain terminations.  A single count, child_depth
2107     is used to track the depth of children and sibling terminations
2108     encountered.  Child_depth is incremented when a die has the
2109     Has-Child flag set unless the child happens to be a NULL die.
2110     Child_depth is decremented when a die has Has-Child false,
2111     and the adjacent die is NULL.  Algorithm returns when
2112     child_depth is 0.
2113 
2114     **NOTE: Do not modify input die, since it is used at the end.  */
2115 int
dwarf_siblingof(Dwarf_Debug dbg,Dwarf_Die die,Dwarf_Die * caller_ret_die,Dwarf_Error * error)2116 dwarf_siblingof(Dwarf_Debug dbg,
2117     Dwarf_Die die,
2118     Dwarf_Die * caller_ret_die, Dwarf_Error * error)
2119 {
2120     int res = 0;
2121     Dwarf_Bool is_info = TRUE;
2122     Dwarf_Debug_InfoTypes dis = 0;
2123 
2124     dis = &dbg->de_info_reading;
2125     res = _dwarf_siblingof_internal(dbg,die,
2126         die?die->di_cu_context:dis->de_cu_context,
2127         is_info,caller_ret_die,error);
2128     return res;
2129 }
2130 /*  This is the new form, October 2011.  On calling with 'die' NULL,
2131     we cannot tell if this is debug_info or debug_types, so
2132     we must be informed!. */
2133 int
dwarf_siblingof_b(Dwarf_Debug dbg,Dwarf_Die die,Dwarf_Bool is_info,Dwarf_Die * caller_ret_die,Dwarf_Error * error)2134 dwarf_siblingof_b(Dwarf_Debug dbg,
2135     Dwarf_Die die,
2136     Dwarf_Bool is_info,
2137     Dwarf_Die * caller_ret_die, Dwarf_Error * error)
2138 {
2139     int res;
2140     Dwarf_Debug_InfoTypes dis = 0;
2141 
2142     dis = is_info? &dbg->de_info_reading:
2143         &dbg->de_types_reading;
2144 
2145     res = _dwarf_siblingof_internal(dbg,die,
2146         die?die->di_cu_context:dis->de_cu_context,
2147         is_info,caller_ret_die,error);
2148     return res;
2149 }
2150 
2151 static int
_dwarf_siblingof_internal(Dwarf_Debug dbg,Dwarf_Die die,Dwarf_CU_Context context,Dwarf_Bool is_info,Dwarf_Die * caller_ret_die,Dwarf_Error * error)2152 _dwarf_siblingof_internal(Dwarf_Debug dbg,
2153     Dwarf_Die die,
2154     Dwarf_CU_Context context,
2155     Dwarf_Bool is_info,
2156     Dwarf_Die * caller_ret_die, Dwarf_Error * error)
2157 {
2158     Dwarf_Die ret_die = 0;
2159     Dwarf_Byte_Ptr die_info_ptr = 0;
2160     Dwarf_Byte_Ptr cu_info_start = 0;
2161 
2162     /* die_info_end points 1-past end of die (once set) */
2163     Dwarf_Byte_Ptr die_info_end = 0;
2164     Dwarf_Unsigned abbrev_code = 0;
2165     Dwarf_Unsigned utmp = 0;
2166     int lres = 0;
2167     int dieres = 0;
2168     /* Since die may be NULL, we rely on the input argument. */
2169     Dwarf_Small *dataptr =  0;
2170 
2171     if (dbg == NULL) {
2172         _dwarf_error(NULL, error, DW_DLE_DBG_NULL);
2173         return (DW_DLV_ERROR);
2174     }
2175     dataptr = is_info? dbg->de_debug_info.dss_data:
2176         dbg->de_debug_types.dss_data;
2177     if (die == NULL) {
2178         /*  Find root die of cu */
2179         /*  die_info_end is untouched here, need not be set in this
2180             branch. */
2181         Dwarf_Off off2 = 0;
2182         Dwarf_Unsigned headerlen = 0;
2183         int cres = 0;
2184 
2185         /*  If we've not loaded debug_info
2186             context will be NULL. */
2187         if (!context) {
2188             local_dealloc_cu_context(dbg,context);
2189             return (DW_DLV_ERROR);
2190         }
2191         off2 = context->cc_debug_offset;
2192         cu_info_start = dataptr + off2;
2193         cres = _dwarf_length_of_cu_header(dbg, off2,is_info,
2194             &headerlen,error);
2195         if (cres != DW_DLV_OK) {
2196             return cres;
2197         }
2198         die_info_ptr = cu_info_start + headerlen;
2199         die_info_end = _dwarf_calculate_info_section_end_ptr(context);
2200 
2201         /*  Recording the CU die pointer so we can later access
2202             for special FORMs relating to .debug_str_offsets
2203             and .debug_addr  */
2204         context->cc_cu_die_offset_present = TRUE;
2205         context->cc_cu_die_global_sec_offset = off2 + headerlen;
2206     } else {
2207         /* Find sibling die. */
2208         Dwarf_Bool has_child = false;
2209         Dwarf_Signed child_depth = 0;
2210 
2211         /*  We cannot have a legal die unless debug_info
2212             was loaded, so
2213             no need to load debug_info here. */
2214         CHECK_DIE(die, DW_DLV_ERROR);
2215 
2216         die_info_ptr = die->di_debug_ptr;
2217         if (*die_info_ptr == 0) {
2218             return (DW_DLV_NO_ENTRY);
2219         }
2220         context = die->di_cu_context;
2221         cu_info_start = dataptr+ context->cc_debug_offset;
2222         die_info_end = _dwarf_calculate_info_section_end_ptr(context);
2223 
2224         if ((*die_info_ptr) == 0) {
2225             return (DW_DLV_NO_ENTRY);
2226         }
2227         child_depth = 0;
2228         do {
2229             int res2 = 0;
2230             Dwarf_Byte_Ptr die_info_ptr2 = 0;
2231 
2232             res2 = _dwarf_next_die_info_ptr(die_info_ptr,
2233                 context, die_info_end,
2234                 cu_info_start, true, &has_child,
2235                 &die_info_ptr2,
2236                 error);
2237             if(res2 != DW_DLV_OK) {
2238                 return res2;
2239             }
2240             if (die_info_ptr2 < die_info_ptr) {
2241                 /*  There is something very wrong, our die value
2242                     decreased.  Bad DWARF. */
2243                 _dwarf_error(dbg, error, DW_DLE_NEXT_DIE_LOW_ERROR);
2244                 return (DW_DLV_ERROR);
2245             }
2246             if (die_info_ptr2 > die_info_end) {
2247                 _dwarf_error(dbg, error, DW_DLE_NEXT_DIE_PAST_END);
2248                 return (DW_DLV_ERROR);
2249             }
2250             die_info_ptr = die_info_ptr2;
2251 
2252             /*  die_info_end is one past end. Do not read it!
2253                 A test for '!= die_info_end'  would work as well,
2254                 but perhaps < reads more like the meaning. */
2255             if (die_info_ptr < die_info_end) {
2256                 if ((*die_info_ptr) == 0 && has_child) {
2257                     die_info_ptr++;
2258                     has_child = false;
2259                 }
2260             }
2261 
2262             /*  die_info_ptr can be one-past-end.  */
2263             if ((die_info_ptr == die_info_end) ||
2264                 ((*die_info_ptr) == 0)) {
2265                 /* We are at the end of a sibling list.
2266                     get back to the next containing
2267                     sibling list (looking for a libling
2268                     list with more on it).
2269                     */
2270                 for (;;) {
2271                     if (child_depth == 0) {
2272                         /*  Meaning there is no outer list,
2273                             so stop. */
2274                         break;
2275                     }
2276                     if (die_info_ptr == die_info_end) {
2277                         /*  September 2016: do not deref
2278                             if we are past end.
2279                             If we are at end at this point
2280                             it means the sibling list
2281                             inside this CU is not properly
2282                             terminated.
2283                             August 2019:
2284                             We used to declare an error,
2285                             DW_DLE_SIBLING_LIST_IMPROPER but
2286                             now we just silently
2287                             declare this is the end of the list.
2288                             Each level of a sibling nest should
2289                             have a single NUL byte, but here
2290                             things are wrong, the DWARF
2291                             is corrupt.  */
2292                         return DW_DLV_NO_ENTRY;
2293                     }
2294                     if (*die_info_ptr) {
2295                         /* We have a real sibling. */
2296                         break;
2297                     }
2298                     /*  Move out one DIE level.
2299                         Move past NUL byte marking end of
2300                         this sibling list. */
2301                     child_depth--;
2302                     die_info_ptr++;
2303                 }
2304             } else {
2305                 child_depth = has_child ? child_depth + 1 : child_depth;
2306             }
2307         } while (child_depth != 0);
2308     }
2309 
2310     /*  die_info_ptr > die_info_end is really a bug (possibly in dwarf
2311         generation)(but we are past end, no more DIEs here), whereas
2312         die_info_ptr == die_info_end means 'one past end, no more DIEs
2313         here'. */
2314     if (die_info_ptr >= die_info_end) {
2315         return (DW_DLV_NO_ENTRY);
2316     }
2317     if ((*die_info_ptr) == 0) {
2318         return (DW_DLV_NO_ENTRY);
2319     }
2320 
2321     ret_die = (Dwarf_Die) _dwarf_get_alloc(dbg, DW_DLA_DIE, 1);
2322     if (ret_die == NULL) {
2323         _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
2324         return (DW_DLV_ERROR);
2325     }
2326 
2327     ret_die->di_is_info = is_info;
2328     ret_die->di_debug_ptr = die_info_ptr;
2329     ret_die->di_cu_context =
2330         die == NULL ? context : die->di_cu_context;
2331 
2332 #if 0
2333     DECODE_LEB128_UWORD_CK(die_info_ptr, utmp,dbg,error,die_info_end);
2334 #endif
2335     dieres = _dwarf_leb128_uword_wrapper(dbg,
2336         &die_info_ptr,die_info_end,&utmp,error);
2337     if (dieres == DW_DLV_ERROR) {
2338         dwarf_dealloc(dbg, ret_die, DW_DLA_DIE);
2339         return dieres;
2340     }
2341     if (die_info_ptr > die_info_end) {
2342         /*  We managed to go past the end of the CU!.
2343             Something is badly wrong. */
2344         dwarf_dealloc(dbg, ret_die, DW_DLA_DIE);
2345         _dwarf_error(dbg, error, DW_DLE_ABBREV_DECODE_ERROR);
2346         return (DW_DLV_ERROR);
2347     }
2348     abbrev_code = (Dwarf_Unsigned) utmp;
2349     if (abbrev_code == 0) {
2350         /* Zero means a null DIE */
2351         dwarf_dealloc(dbg, ret_die, DW_DLA_DIE);
2352         return (DW_DLV_NO_ENTRY);
2353     }
2354     ret_die->di_abbrev_code = abbrev_code;
2355     lres = _dwarf_get_abbrev_for_code(ret_die->di_cu_context,
2356         abbrev_code,
2357         &ret_die->di_abbrev_list,error);
2358     if (lres == DW_DLV_ERROR) {
2359         dwarf_dealloc(dbg, ret_die, DW_DLA_DIE);
2360         return lres;
2361     }
2362     if (lres == DW_DLV_NO_ENTRY) {
2363         dwarfstring m;
2364         dwarf_dealloc(dbg, ret_die, DW_DLA_DIE);
2365         dwarfstring_constructor(&m);
2366         dwarfstring_append_printf_u(&m,
2367             "There is no abbrev present for code 0x%x .",
2368             abbrev_code);
2369         _dwarf_error_string(dbg, error,
2370             DW_DLE_DIE_ABBREV_LIST_NULL,dwarfstring_string(&m));
2371         dwarfstring_destructor(&m);
2372         return DW_DLV_ERROR;
2373     }
2374     if (die == NULL && !is_cu_tag(ret_die->di_abbrev_list->abl_tag)) {
2375         dwarf_dealloc(dbg, ret_die, DW_DLA_DIE);
2376         _dwarf_error(dbg, error, DW_DLE_FIRST_DIE_NOT_CU);
2377         return DW_DLV_ERROR;
2378     }
2379 
2380     *caller_ret_die = ret_die;
2381     return (DW_DLV_OK);
2382 }
2383 
2384 
2385 int
dwarf_child(Dwarf_Die die,Dwarf_Die * caller_ret_die,Dwarf_Error * error)2386 dwarf_child(Dwarf_Die die,
2387     Dwarf_Die * caller_ret_die,
2388     Dwarf_Error * error)
2389 {
2390     Dwarf_Byte_Ptr die_info_ptr = 0;
2391     Dwarf_Byte_Ptr die_info_ptr2 = 0;
2392 
2393     /* die_info_end points one-past-end of die area. */
2394     Dwarf_Byte_Ptr die_info_end = 0;
2395     Dwarf_Die ret_die = 0;
2396     Dwarf_Bool has_die_child = 0;
2397     Dwarf_Debug dbg;
2398     Dwarf_Unsigned abbrev_code = 0;
2399     Dwarf_Unsigned utmp = 0;
2400     Dwarf_Debug_InfoTypes dis = 0;
2401     int res = 0;
2402     Dwarf_CU_Context context = 0;
2403     int lres = 0;
2404 
2405     CHECK_DIE(die, DW_DLV_ERROR);
2406     dbg = die->di_cu_context->cc_dbg;
2407     dis = die->di_is_info? &dbg->de_info_reading:
2408         &dbg->de_types_reading;
2409     die_info_ptr = die->di_debug_ptr;
2410 
2411     /*  We are saving a DIE pointer here, but the pointer
2412         will not be presumed live later, when it is tested. */
2413     dis->de_last_die = die;
2414     dis->de_last_di_ptr = die_info_ptr;
2415 
2416     /* NULL die has no child. */
2417     if ((*die_info_ptr) == 0) {
2418         return DW_DLV_NO_ENTRY;
2419     }
2420     context = die->di_cu_context;
2421     die_info_end = _dwarf_calculate_info_section_end_ptr(context);
2422 
2423     res = _dwarf_next_die_info_ptr(die_info_ptr,
2424         die->di_cu_context,
2425         die_info_end,
2426         NULL, false,
2427         &has_die_child,
2428         &die_info_ptr2,
2429         error);
2430     if(res != DW_DLV_OK) {
2431         return res;
2432     }
2433     if (die_info_ptr == die_info_end) {
2434         return DW_DLV_NO_ENTRY;
2435     }
2436     die_info_ptr = die_info_ptr2;
2437 
2438     dis->de_last_di_ptr = die_info_ptr;
2439 
2440     if (!has_die_child) {
2441         /* Look for end of sibling chain. */
2442         while (dis->de_last_di_ptr < die_info_end) {
2443             if (*dis->de_last_di_ptr) {
2444                 break;
2445             }
2446             ++dis->de_last_di_ptr;
2447         }
2448         return DW_DLV_NO_ENTRY;
2449     }
2450 
2451     ret_die = (Dwarf_Die) _dwarf_get_alloc(dbg, DW_DLA_DIE, 1);
2452     if (ret_die == NULL) {
2453         _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
2454         return DW_DLV_ERROR;
2455     }
2456     ret_die->di_debug_ptr = die_info_ptr;
2457     ret_die->di_cu_context = die->di_cu_context;
2458     ret_die->di_is_info = die->di_is_info;
2459 
2460     DECODE_LEB128_UWORD_CK(die_info_ptr, utmp,
2461         dbg,error,die_info_end);
2462     abbrev_code = (Dwarf_Unsigned) utmp;
2463 
2464     dis->de_last_di_ptr = die_info_ptr;
2465 
2466     if (abbrev_code == 0) {
2467         /* Look for end of sibling chain */
2468         while (dis->de_last_di_ptr < die_info_end) {
2469             if (*dis->de_last_di_ptr) {
2470                 break;
2471             }
2472             ++dis->de_last_di_ptr;
2473         }
2474 
2475         /*  We have arrived at a null DIE,
2476             at the end of a CU or the end
2477             of a list of siblings. */
2478         *caller_ret_die = 0;
2479         dwarf_dealloc(dbg, ret_die, DW_DLA_DIE);
2480         ret_die = 0;
2481         return DW_DLV_NO_ENTRY;
2482     }
2483     ret_die->di_abbrev_code = abbrev_code;
2484     lres = _dwarf_get_abbrev_for_code(die->di_cu_context, abbrev_code,
2485         &ret_die->di_abbrev_list,error);
2486     if (lres == DW_DLV_ERROR) {
2487         dwarf_dealloc(dbg, ret_die, DW_DLA_DIE);
2488         ret_die = 0;
2489         return lres;
2490     }
2491     if (lres == DW_DLV_NO_ENTRY) {
2492         dwarf_dealloc(dbg, ret_die, DW_DLA_DIE);
2493         ret_die = 0;
2494         _dwarf_error(dbg, error, DW_DLE_ABBREV_MISSING);
2495         return DW_DLV_ERROR;
2496     }
2497     *caller_ret_die = ret_die;
2498     return (DW_DLV_OK);
2499 }
2500 
2501 /*  Given a (global, not cu_relative) die offset, this returns
2502     a pointer to a DIE thru *new_die.
2503     It is up to the caller to do a
2504     dwarf_dealloc(dbg,*new_die,DW_DLE_DIE);
2505     The old form only works with debug_info.
2506     The new _b form works with debug_info or debug_types.
2507     */
2508 int
dwarf_offdie(Dwarf_Debug dbg,Dwarf_Off offset,Dwarf_Die * new_die,Dwarf_Error * error)2509 dwarf_offdie(Dwarf_Debug dbg,
2510     Dwarf_Off offset, Dwarf_Die * new_die, Dwarf_Error * error)
2511 {
2512     Dwarf_Bool is_info = true;
2513     return dwarf_offdie_b(dbg,offset,is_info,new_die,error);
2514 }
2515 
2516 int
dwarf_offdie_b(Dwarf_Debug dbg,Dwarf_Off offset,Dwarf_Bool is_info,Dwarf_Die * new_die,Dwarf_Error * error)2517 dwarf_offdie_b(Dwarf_Debug dbg,
2518     Dwarf_Off offset, Dwarf_Bool is_info,
2519     Dwarf_Die * new_die, Dwarf_Error * error)
2520 {
2521     Dwarf_CU_Context cu_context = 0;
2522     Dwarf_Off new_cu_offset = 0;
2523     Dwarf_Die die = 0;
2524     Dwarf_Byte_Ptr info_ptr = 0;
2525     Dwarf_Unsigned abbrev_code = 0;
2526     Dwarf_Unsigned utmp = 0;
2527     int lres = 0;
2528     Dwarf_Debug_InfoTypes dis = 0;
2529     Dwarf_Byte_Ptr die_info_end = 0;
2530 
2531     if (dbg == NULL) {
2532         _dwarf_error(NULL, error, DW_DLE_DBG_NULL);
2533         return (DW_DLV_ERROR);
2534     }
2535     dis = is_info? &dbg->de_info_reading:
2536         &dbg->de_types_reading;
2537 
2538     cu_context = _dwarf_find_CU_Context(dbg, offset,is_info);
2539     if (cu_context == NULL) {
2540         Dwarf_Unsigned section_size = is_info?
2541             dbg->de_debug_info.dss_size:
2542             dbg->de_debug_types.dss_size;
2543         int res = is_info?_dwarf_load_debug_info(dbg, error):
2544             _dwarf_load_debug_types(dbg,error);
2545 
2546         if (res != DW_DLV_OK) {
2547             return res;
2548         }
2549 
2550         if (dis->de_cu_context_list_end != NULL) {
2551             Dwarf_CU_Context lcu_context =
2552                 dis->de_cu_context_list_end;
2553             new_cu_offset =
2554                 lcu_context->cc_debug_offset +
2555                 lcu_context->cc_length +
2556                 lcu_context->cc_length_size +
2557                 lcu_context->cc_extension_size;
2558         }
2559 
2560         do {
2561             if ((new_cu_offset +
2562                 _dwarf_length_of_cu_header_simple(dbg,is_info)) >=
2563                 section_size) {
2564                 _dwarf_error(dbg, error, DW_DLE_OFFSET_BAD);
2565                 return (DW_DLV_ERROR);
2566             }
2567             res = _dwarf_make_CU_Context(dbg, new_cu_offset,is_info,
2568                 &cu_context,error);
2569             if (res != DW_DLV_OK) {
2570                 local_dealloc_cu_context(dbg,cu_context);
2571                 return res;
2572             }
2573 
2574             res = finish_up_cu_context_from_cudie(dbg,new_cu_offset,
2575                 cu_context,error);
2576             if (res == DW_DLV_ERROR) {
2577                 local_dealloc_cu_context(dbg,cu_context);
2578                 return res;
2579             }
2580             if (res == DW_DLV_NO_ENTRY) {
2581                 local_dealloc_cu_context(dbg,cu_context);
2582                 return res;
2583             }
2584             /*  Add the new cu_context to a list of contexts */
2585             insert_into_cu_context_list(dis,cu_context);
2586             new_cu_offset = new_cu_offset + cu_context->cc_length +
2587                 cu_context->cc_length_size +
2588                 cu_context->cc_extension_size;
2589         } while (offset >= new_cu_offset);
2590     }
2591 
2592     die_info_end = _dwarf_calculate_info_section_end_ptr(cu_context);
2593     die = (Dwarf_Die) _dwarf_get_alloc(dbg, DW_DLA_DIE, 1);
2594     if (!die) {
2595         _dwarf_error(dbg, error, DW_DLE_ALLOC_FAIL);
2596         return (DW_DLV_ERROR);
2597     }
2598     die->di_cu_context = cu_context;
2599     die->di_is_info = is_info;
2600 
2601     {
2602         Dwarf_Small *dataptr = is_info? dbg->de_debug_info.dss_data:
2603             dbg->de_debug_types.dss_data;
2604         info_ptr = dataptr + offset;
2605     }
2606     die->di_debug_ptr = info_ptr;
2607 #if 0
2608     DECODE_LEB128_UWORD_CK(info_ptr, utmp,dbg,error,die_info_end);
2609 #endif
2610     lres = _dwarf_leb128_uword_wrapper(dbg,&info_ptr,die_info_end,
2611         &utmp,error);
2612     if (lres != DW_DLV_OK) {
2613         dwarf_dealloc(dbg, die, DW_DLA_DIE);
2614         return lres;
2615     }
2616     abbrev_code = utmp;
2617     if (abbrev_code == 0) {
2618         /* we are at a null DIE (or there is a bug). */
2619         *new_die = 0;
2620         dwarf_dealloc(dbg, die, DW_DLA_DIE);
2621         return DW_DLV_NO_ENTRY;
2622     }
2623     die->di_abbrev_code = abbrev_code;
2624     lres = _dwarf_get_abbrev_for_code(cu_context, abbrev_code,
2625         &die->di_abbrev_list,error);
2626     if (lres == DW_DLV_ERROR) {
2627         dwarf_dealloc(dbg, die, DW_DLA_DIE);
2628         return lres;
2629     }
2630     if (lres == DW_DLV_NO_ENTRY) {
2631         dwarfstring m;
2632 
2633         dwarf_dealloc(dbg,die, DW_DLA_DIE);
2634         dwarfstring_constructor(&m);
2635         dwarfstring_append_printf_u(&m,
2636             "There is no abbrev present for code 0x%x .",
2637             abbrev_code);
2638         _dwarf_error_string(dbg, error,
2639             DW_DLE_DIE_ABBREV_LIST_NULL,dwarfstring_string(&m));
2640         dwarfstring_destructor(&m);
2641         return DW_DLV_ERROR;
2642     }
2643     *new_die = die;
2644     return DW_DLV_OK;
2645 }
2646 
2647 /*  New March 2016.
2648     Lets one cross check the abbreviations section and
2649     the DIE information presented  by dwarfdump -i -G -v. */
2650 int
dwarf_die_abbrev_global_offset(Dwarf_Die die,Dwarf_Off * abbrev_goffset,Dwarf_Unsigned * abbrev_count,Dwarf_Error * error)2651 dwarf_die_abbrev_global_offset(Dwarf_Die die,
2652     Dwarf_Off       * abbrev_goffset,
2653     Dwarf_Unsigned  * abbrev_count,
2654     Dwarf_Error*      error)
2655 {
2656     Dwarf_Abbrev_List dal = 0;
2657     Dwarf_Debug dbg = 0;
2658 
2659     CHECK_DIE(die, DW_DLV_ERROR);
2660     dbg = die->di_cu_context->cc_dbg;
2661     dal = die->di_abbrev_list;
2662     if(!dal) {
2663         _dwarf_error(dbg,error,DW_DLE_DWARF_ABBREV_NULL);
2664         return DW_DLV_ERROR;
2665     }
2666     *abbrev_goffset = dal->abl_goffset;
2667     *abbrev_count = dal->abl_count;
2668     return DW_DLV_OK;
2669 }
2670 
2671 
2672 /*  New August 2018.
2673     Because some real compressed sections
2674     have .zdebug instead
2675     of .debug as the leading characters.
2676     actual_sec_name_out points to a static
2677     string so so not free it. */
2678 int
dwarf_get_real_section_name(Dwarf_Debug dbg,const char * std_section_name,const char ** actual_sec_name_out,Dwarf_Small * marked_zcompressed,Dwarf_Small * marked_zlib_compressed,Dwarf_Small * marked_shf_compressed,Dwarf_Unsigned * compressed_length,Dwarf_Unsigned * uncompressed_length,Dwarf_Error * error)2679 dwarf_get_real_section_name(Dwarf_Debug dbg,
2680     const char  *std_section_name,
2681     const char **actual_sec_name_out,
2682     Dwarf_Small *marked_zcompressed, /* zdebug */
2683     Dwarf_Small *marked_zlib_compressed, /* ZLIB string */
2684     Dwarf_Small *marked_shf_compressed, /* SHF_COMPRESSED */
2685     Dwarf_Unsigned *compressed_length,
2686     Dwarf_Unsigned *uncompressed_length,
2687     Dwarf_Error *error)
2688 {
2689     unsigned i = 0;
2690     char tbuf[50];
2691     unsigned std_sec_name_len = strlen(std_section_name);
2692 
2693     tbuf[0] = 0;
2694     /*  std_section_name never has the .dwo on the end,
2695         so allow for that and allow one (arbitrarily) more. */
2696     if ((std_sec_name_len + 5) < sizeof(tbuf)) {
2697         strcpy(tbuf,std_section_name);
2698         strcpy(tbuf+std_sec_name_len,".dwo");
2699     }
2700     if (dbg == NULL) {
2701         _dwarf_error(NULL, error, DW_DLE_DBG_NULL);
2702         return (DW_DLV_ERROR);
2703     }
2704     for (i=0; i < dbg->de_debug_sections_total_entries; i++) {
2705         struct Dwarf_dbg_sect_s *sdata = &dbg->de_debug_sections[i];
2706         struct Dwarf_Section_s *section = sdata->ds_secdata;
2707         const char *std = section->dss_standard_name;
2708 
2709         if (!strcmp(std,std_section_name) ||
2710             !strcmp(std,tbuf)) {
2711             const char *used = section->dss_name;
2712             *actual_sec_name_out = used;
2713             if (sdata->ds_have_zdebug) {
2714                 *marked_zcompressed = TRUE;
2715             }
2716             if (section->dss_ZLIB_compressed) {
2717                 *marked_zlib_compressed = TRUE;
2718                 if (uncompressed_length) {
2719                     *uncompressed_length =
2720                         section->dss_uncompressed_length;
2721                 }
2722                 if (compressed_length) {
2723                     *compressed_length =
2724                         section->dss_compressed_length;
2725                 }
2726             }
2727             if (section->dss_shf_compressed) {
2728                 *marked_shf_compressed = TRUE;
2729                 if (uncompressed_length) {
2730                     *uncompressed_length =
2731                         section->dss_uncompressed_length;
2732                 }
2733                 if (compressed_length) {
2734                     *compressed_length =
2735                         section->dss_compressed_length;
2736                 }
2737             }
2738             return DW_DLV_OK;
2739         }
2740     }
2741     return DW_DLV_NO_ENTRY;
2742 }
2743 /*  This is useful when printing DIE data.
2744     The string pointer returned must not be freed.
2745     With non-elf objects it is possible the
2746     string returned might be empty or NULL,
2747     so callers should be prepared for that kind
2748     of return. */
2749 int
dwarf_get_die_section_name(Dwarf_Debug dbg,Dwarf_Bool is_info,const char ** sec_name,Dwarf_Error * error)2750 dwarf_get_die_section_name(Dwarf_Debug dbg,
2751     Dwarf_Bool    is_info,
2752     const char ** sec_name,
2753     Dwarf_Error * error)
2754 {
2755     struct Dwarf_Section_s *sec = 0;
2756 
2757     if (dbg == NULL) {
2758         _dwarf_error(NULL, error, DW_DLE_DBG_NULL);
2759         return (DW_DLV_ERROR);
2760     }
2761     if (is_info) {
2762         sec = &dbg->de_debug_info;
2763     } else {
2764         sec = &dbg->de_debug_types;
2765     }
2766     if (sec->dss_size == 0) {
2767         /* We don't have such a  section at all. */
2768         return DW_DLV_NO_ENTRY;
2769     }
2770     *sec_name = sec->dss_name;
2771     return DW_DLV_OK;
2772 }
2773 
2774 /* This one assumes is_info not known to caller but a DIE is known. */
2775 int
dwarf_get_die_section_name_b(Dwarf_Die die,const char ** sec_name,Dwarf_Error * error)2776 dwarf_get_die_section_name_b(Dwarf_Die die,
2777     const char ** sec_name,
2778     Dwarf_Error * error)
2779 {
2780     Dwarf_CU_Context context = 0;
2781     Dwarf_Bool is_info = 0;
2782     Dwarf_Debug dbg = 0;
2783 
2784     CHECK_DIE(die, DW_DLV_ERROR);
2785     context = die->di_cu_context;
2786     dbg = context->cc_dbg;
2787     is_info = context->cc_is_info;
2788     return dwarf_get_die_section_name(dbg,is_info,sec_name,error);
2789 }
2790