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