149d3bc91SRichard Lowe /*
207dc1947SRichard Lowe Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved.
3*4d9fdb46SRobert Mustacchi Portions Copyright 2011-2018 David Anderson. All Rights Reserved.
449d3bc91SRichard Lowe
549d3bc91SRichard Lowe This program is free software; you can redistribute it and/or modify it
6*4d9fdb46SRobert Mustacchi under the terms of version 2.1 of the GNU Lesser General Public License
749d3bc91SRichard Lowe as published by the Free Software Foundation.
849d3bc91SRichard Lowe
949d3bc91SRichard Lowe This program is distributed in the hope that it would be useful, but
1049d3bc91SRichard Lowe WITHOUT ANY WARRANTY; without even the implied warranty of
11*4d9fdb46SRobert Mustacchi MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1249d3bc91SRichard Lowe
1349d3bc91SRichard Lowe Further, this software is distributed without any warranty that it is
14*4d9fdb46SRobert Mustacchi free of the rightful claim of any third person regarding infringement
15*4d9fdb46SRobert Mustacchi or the like. Any license provided herein, whether implied or
1649d3bc91SRichard Lowe otherwise, applies only to this software file. Patent licenses, if
17*4d9fdb46SRobert Mustacchi any, provided herein do not apply to combinations of this program with
18*4d9fdb46SRobert Mustacchi other software, or any other product whatsoever.
1949d3bc91SRichard Lowe
20*4d9fdb46SRobert Mustacchi You should have received a copy of the GNU Lesser General Public
21*4d9fdb46SRobert Mustacchi License along with this program; if not, write the Free Software
2207dc1947SRichard Lowe Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
2349d3bc91SRichard Lowe USA.
2449d3bc91SRichard Lowe
2549d3bc91SRichard Lowe */
2649d3bc91SRichard Lowe
2749d3bc91SRichard Lowe
2849d3bc91SRichard Lowe #include "config.h"
2949d3bc91SRichard Lowe #include <stdio.h>
30*4d9fdb46SRobert Mustacchi #include "dwarf_incl.h"
31*4d9fdb46SRobert Mustacchi #include "dwarf_error.h"
32*4d9fdb46SRobert Mustacchi #include "dwarf_util.h"
33*4d9fdb46SRobert Mustacchi
34*4d9fdb46SRobert Mustacchi /* Note that with 'make check')
35*4d9fdb46SRobert Mustacchi many of the test items
36*4d9fdb46SRobert Mustacchi only make sense if Dwarf_Unsigned (and Dwarf_Signed)
37*4d9fdb46SRobert Mustacchi are 64 bits. The encode/decode logic should
38*4d9fdb46SRobert Mustacchi be fine whether those types are 64 or 32 bits.
39*4d9fdb46SRobert Mustacchi See runtests.sh */
40*4d9fdb46SRobert Mustacchi
41*4d9fdb46SRobert Mustacchi /* 10 bytes of leb, 7 bits each part of the number, gives
42*4d9fdb46SRobert Mustacchi room for a 64bit number.
43*4d9fdb46SRobert Mustacchi While any number of leading zeroes would be legal, so
44*4d9fdb46SRobert Mustacchi no max is really truly required here, why would a
45*4d9fdb46SRobert Mustacchi compiler generate leading zeros? That would
46*4d9fdb46SRobert Mustacchi be strange.
47*4d9fdb46SRobert Mustacchi */
48*4d9fdb46SRobert Mustacchi #define BYTESLEBMAX 10
49*4d9fdb46SRobert Mustacchi #define BITSPERBYTE 8
5049d3bc91SRichard Lowe
5149d3bc91SRichard Lowe
52*4d9fdb46SRobert Mustacchi /* Decode ULEB with checking */
53*4d9fdb46SRobert Mustacchi int
_dwarf_decode_u_leb128_chk(Dwarf_Small * leb128,Dwarf_Unsigned * leb128_length,Dwarf_Unsigned * outval,Dwarf_Byte_Ptr endptr)54*4d9fdb46SRobert Mustacchi _dwarf_decode_u_leb128_chk(Dwarf_Small * leb128,
55*4d9fdb46SRobert Mustacchi Dwarf_Unsigned * leb128_length,
56*4d9fdb46SRobert Mustacchi Dwarf_Unsigned *outval,
57*4d9fdb46SRobert Mustacchi Dwarf_Byte_Ptr endptr)
5849d3bc91SRichard Lowe {
59*4d9fdb46SRobert Mustacchi Dwarf_Unsigned byte = 0;
60*4d9fdb46SRobert Mustacchi Dwarf_Unsigned word_number = 0;
61*4d9fdb46SRobert Mustacchi Dwarf_Unsigned number = 0;
62*4d9fdb46SRobert Mustacchi unsigned shift = 0;
63*4d9fdb46SRobert Mustacchi /* The byte_length value will be a small non-negative integer. */
64*4d9fdb46SRobert Mustacchi unsigned byte_length = 0;
65*4d9fdb46SRobert Mustacchi
66*4d9fdb46SRobert Mustacchi if (leb128 >=endptr) {
67*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
68*4d9fdb46SRobert Mustacchi }
69*4d9fdb46SRobert Mustacchi /* The following unrolls-the-loop for the first two bytes and
70*4d9fdb46SRobert Mustacchi unpacks into 32 bits to make this as fast as possible.
71*4d9fdb46SRobert Mustacchi word_number is assumed big enough that the shift has a defined
72*4d9fdb46SRobert Mustacchi result. */
7349d3bc91SRichard Lowe if ((*leb128 & 0x80) == 0) {
74*4d9fdb46SRobert Mustacchi if (leb128_length) {
7507dc1947SRichard Lowe *leb128_length = 1;
76*4d9fdb46SRobert Mustacchi }
77*4d9fdb46SRobert Mustacchi *outval = *leb128;
78*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
79*4d9fdb46SRobert Mustacchi } else {
80*4d9fdb46SRobert Mustacchi if ((leb128+1) >=endptr) {
81*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
82*4d9fdb46SRobert Mustacchi }
83*4d9fdb46SRobert Mustacchi if ((*(leb128 + 1) & 0x80) == 0) {
84*4d9fdb46SRobert Mustacchi if (leb128_length) {
85*4d9fdb46SRobert Mustacchi *leb128_length = 2;
86*4d9fdb46SRobert Mustacchi }
87*4d9fdb46SRobert Mustacchi word_number = *leb128 & 0x7f;
88*4d9fdb46SRobert Mustacchi word_number |= (*(leb128 + 1) & 0x7f) << 7;
89*4d9fdb46SRobert Mustacchi *outval = word_number;
90*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
91*4d9fdb46SRobert Mustacchi }
92*4d9fdb46SRobert Mustacchi /* Gets messy to hand-inline more byte checking. */
9349d3bc91SRichard Lowe }
9449d3bc91SRichard Lowe
95*4d9fdb46SRobert Mustacchi /* The rest handles long numbers Because the 'number' may be larger
96*4d9fdb46SRobert Mustacchi than the default int/unsigned, we must cast the 'byte' before
97*4d9fdb46SRobert Mustacchi the shift for the shift to have a defined result. */
9849d3bc91SRichard Lowe number = 0;
9949d3bc91SRichard Lowe shift = 0;
10049d3bc91SRichard Lowe byte_length = 1;
101*4d9fdb46SRobert Mustacchi byte = *leb128;
10249d3bc91SRichard Lowe for (;;) {
103*4d9fdb46SRobert Mustacchi if (shift >= (sizeof(number)*BITSPERBYTE)) {
104*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
105*4d9fdb46SRobert Mustacchi }
106*4d9fdb46SRobert Mustacchi number |= (byte & 0x7f) << shift;
10707dc1947SRichard Lowe if ((byte & 0x80) == 0) {
108*4d9fdb46SRobert Mustacchi if (leb128_length) {
10907dc1947SRichard Lowe *leb128_length = byte_length;
110*4d9fdb46SRobert Mustacchi }
111*4d9fdb46SRobert Mustacchi *outval = number;
112*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
11307dc1947SRichard Lowe }
11407dc1947SRichard Lowe shift += 7;
11507dc1947SRichard Lowe byte_length++;
116*4d9fdb46SRobert Mustacchi if (byte_length > BYTESLEBMAX) {
117*4d9fdb46SRobert Mustacchi /* Erroneous input. */
118*4d9fdb46SRobert Mustacchi if( leb128_length) {
119*4d9fdb46SRobert Mustacchi *leb128_length = BYTESLEBMAX;
120*4d9fdb46SRobert Mustacchi }
121*4d9fdb46SRobert Mustacchi break;
122*4d9fdb46SRobert Mustacchi }
12307dc1947SRichard Lowe ++leb128;
124*4d9fdb46SRobert Mustacchi if ((leb128) >=endptr) {
125*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
126*4d9fdb46SRobert Mustacchi }
12707dc1947SRichard Lowe byte = *leb128;
12849d3bc91SRichard Lowe }
129*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
13049d3bc91SRichard Lowe }
13149d3bc91SRichard Lowe
132*4d9fdb46SRobert Mustacchi
13349d3bc91SRichard Lowe #define BITSINBYTE 8
13449d3bc91SRichard Lowe
135*4d9fdb46SRobert Mustacchi int
_dwarf_decode_s_leb128_chk(Dwarf_Small * leb128,Dwarf_Unsigned * leb128_length,Dwarf_Signed * outval,Dwarf_Byte_Ptr endptr)136*4d9fdb46SRobert Mustacchi _dwarf_decode_s_leb128_chk(Dwarf_Small * leb128, Dwarf_Unsigned * leb128_length,
137*4d9fdb46SRobert Mustacchi Dwarf_Signed *outval,Dwarf_Byte_Ptr endptr)
13849d3bc91SRichard Lowe {
139*4d9fdb46SRobert Mustacchi Dwarf_Unsigned byte = 0;
140*4d9fdb46SRobert Mustacchi Dwarf_Signed number = 0;
141*4d9fdb46SRobert Mustacchi Dwarf_Bool sign = 0;
142*4d9fdb46SRobert Mustacchi Dwarf_Unsigned shift = 0;
143*4d9fdb46SRobert Mustacchi /* The byte_length value will be a small non-negative integer. */
144*4d9fdb46SRobert Mustacchi unsigned byte_length = 1;
145*4d9fdb46SRobert Mustacchi
146*4d9fdb46SRobert Mustacchi /* byte_length being the number of bytes of data absorbed so far in
147*4d9fdb46SRobert Mustacchi turning the leb into a Dwarf_Signed. */
148*4d9fdb46SRobert Mustacchi if (!outval) {
149*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
150*4d9fdb46SRobert Mustacchi }
151*4d9fdb46SRobert Mustacchi if (leb128 >= endptr) {
152*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
153*4d9fdb46SRobert Mustacchi }
154*4d9fdb46SRobert Mustacchi byte = *leb128;
15549d3bc91SRichard Lowe for (;;) {
15607dc1947SRichard Lowe sign = byte & 0x40;
157*4d9fdb46SRobert Mustacchi if (shift >= (sizeof(number)*BITSPERBYTE)) {
158*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
159*4d9fdb46SRobert Mustacchi }
160*4d9fdb46SRobert Mustacchi number |= ((Dwarf_Unsigned) ((byte & 0x7f))) << shift;
16107dc1947SRichard Lowe shift += 7;
16207dc1947SRichard Lowe
16307dc1947SRichard Lowe if ((byte & 0x80) == 0) {
16407dc1947SRichard Lowe break;
16507dc1947SRichard Lowe }
16607dc1947SRichard Lowe ++leb128;
167*4d9fdb46SRobert Mustacchi if (leb128 >= endptr) {
168*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
169*4d9fdb46SRobert Mustacchi }
17007dc1947SRichard Lowe byte = *leb128;
17107dc1947SRichard Lowe byte_length++;
172*4d9fdb46SRobert Mustacchi if (byte_length > BYTESLEBMAX) {
173*4d9fdb46SRobert Mustacchi /* Erroneous input. */
174*4d9fdb46SRobert Mustacchi if (leb128_length) {
175*4d9fdb46SRobert Mustacchi *leb128_length = BYTESLEBMAX;
176*4d9fdb46SRobert Mustacchi }
177*4d9fdb46SRobert Mustacchi return DW_DLV_ERROR;
178*4d9fdb46SRobert Mustacchi }
17949d3bc91SRichard Lowe }
18049d3bc91SRichard Lowe
181*4d9fdb46SRobert Mustacchi if (sign) {
182*4d9fdb46SRobert Mustacchi /* The following avoids undefined behavior. */
183*4d9fdb46SRobert Mustacchi unsigned shiftlim = sizeof(Dwarf_Signed) * BITSINBYTE -1;
184*4d9fdb46SRobert Mustacchi if (shift < shiftlim) {
185*4d9fdb46SRobert Mustacchi number |= -(Dwarf_Signed)(((Dwarf_Unsigned)1) << shift);
186*4d9fdb46SRobert Mustacchi } else if (shift == shiftlim) {
187*4d9fdb46SRobert Mustacchi number |= (((Dwarf_Unsigned)1) << shift);
188*4d9fdb46SRobert Mustacchi }
18949d3bc91SRichard Lowe }
19049d3bc91SRichard Lowe
191*4d9fdb46SRobert Mustacchi if (leb128_length) {
19207dc1947SRichard Lowe *leb128_length = byte_length;
193*4d9fdb46SRobert Mustacchi }
194*4d9fdb46SRobert Mustacchi *outval = number;
195*4d9fdb46SRobert Mustacchi return DW_DLV_OK;
19649d3bc91SRichard Lowe }
197