Line data Source code
1 : /* Get specific attribute of abbreviation.
2 : Copyright (C) 2003, 2004, 2005, 2014 Red Hat, Inc.
3 : This file is part of elfutils.
4 : Written by Ulrich Drepper <drepper@redhat.com>, 2003.
5 :
6 : This file is free software; you can redistribute it and/or modify
7 : it under the terms of either
8 :
9 : * the GNU Lesser General Public License as published by the Free
10 : Software Foundation; either version 3 of the License, or (at
11 : your option) any later version
12 :
13 : or
14 :
15 : * the GNU General Public License as published by the Free
16 : Software Foundation; either version 2 of the License, or (at
17 : your option) any later version
18 :
19 : or both in parallel, as here.
20 :
21 : elfutils is distributed in the hope that it will be useful, but
22 : WITHOUT ANY WARRANTY; without even the implied warranty of
23 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
24 : General Public License for more details.
25 :
26 : You should have received copies of the GNU General Public License and
27 : the GNU Lesser General Public License along with this program. If
28 : not, see <http://www.gnu.org/licenses/>. */
29 :
30 : #ifdef HAVE_CONFIG_H
31 : # include <config.h>
32 : #endif
33 :
34 : #include <assert.h>
35 : #include <dwarf.h>
36 : #include "libdwP.h"
37 :
38 :
39 : int
40 308999 : dwarf_getabbrevattr (Dwarf_Abbrev *abbrev, size_t idx, unsigned int *namep,
41 : unsigned int *formp, Dwarf_Off *offsetp)
42 : {
43 308999 : if (abbrev == NULL)
44 : return -1;
45 :
46 308999 : size_t cnt = 0;
47 308999 : const unsigned char *attrp = abbrev->attrp;
48 : const unsigned char *start_attrp;
49 : unsigned int name;
50 : unsigned int form;
51 :
52 : do
53 : {
54 1047057 : start_attrp = attrp;
55 :
56 : /* Attribute code and form are encoded as ULEB128 values.i
57 : XXX We have no way to bounds check. */
58 1047057 : get_uleb128 (name, attrp, attrp + len_leb128 (name));
59 1047057 : get_uleb128 (form, attrp, attrp + len_leb128 (form));
60 :
61 : /* If both values are zero the index is out of range. */
62 1047057 : if (name == 0 && form == 0)
63 : return -1;
64 : }
65 982838 : while (cnt++ < idx);
66 :
67 : /* Store the result if requested. */
68 244780 : if (namep != NULL)
69 244780 : *namep = name;
70 244780 : if (formp != NULL)
71 244780 : *formp = form;
72 244780 : if (offsetp != NULL)
73 244780 : *offsetp = (start_attrp - abbrev->attrp) + abbrev->offset;
74 :
75 : return 0;
76 : }
|