-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdextypes.c
99 lines (91 loc) · 2.41 KB
/
dextypes.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <stdio.h>
#include <stdlib.h>
#include "dextypes.h"
#include "utils.h"
/*
*The codes in this file are all taken from dalvik's libdex/Leb128.h
*/
int readUnsignedLeb128(FILE *file, u4 *offset)
{
u1 uleb;
int result;
if(fseek(file, *offset, SEEK_SET)){
fprintf(stderr, "readUnsignedLeb128 - fseek %u failure.\n", *offset);
exit(EXIT_FAILURE);
}
if(get_data(&uleb, *offset, 1, 1, file) == NULL){
fprintf(stderr, "readUnsignedLeb128 - get_data uleb failure.\n");
exit(EXIT_FAILURE);
}
++(*offset);
result = uleb;
if (result > 0x7f) {
if(get_data(&uleb, *offset, 1, 1, file) == NULL){
fprintf(stderr, "readUnsignedLeb128 - get_data uleb failure.\n");
exit(EXIT_FAILURE);
}
++(*offset);
result = (result & 0x7f) | ((uleb & 0x7f) << 7);
if (uleb > 0x7f) {
if(get_data(&uleb, *offset, 1, 1, file) == NULL){
fprintf(stderr, "readUnsignedLeb128 - get_data uleb failure.\n");
exit(EXIT_FAILURE);
}
++(*offset);
result |= (uleb & 0x7f) << 14;
if (uleb > 0x7f) {
if(get_data(&uleb, *offset, 1, 1, file) == NULL){
fprintf(stderr, "readUnsignedLeb128 - get_data uleb failure.\n");
exit(EXIT_FAILURE);
}
++(*offset);
result |= (uleb & 0x7f) << 21;
if (uleb > 0x7f) {
/*
* Note: We don't check to see if cur is out of
* range here, meaning we tolerate garbage in the
* high four-order bits.
*/
if(get_data(&uleb, *offset, 1, 1, file) == NULL){
fprintf(stderr, "readUnsignedLeb128 - get_data uleb failure.\n");
exit(EXIT_FAILURE);
}
++(*offset);
result |= uleb << 28;
}
}
}
}
return result;
}
int readSignedLeb128(const u1 **pStream)
{
const u1 *ptr = *pStream;
int result = *(ptr++);
if(result <= 0x7f){
result = (result << 25) >> 25;
}else{
int cur = *(ptr++);
result = (result & 0x7f) | ((cur & 0x7f) << 7);
if(cur <= 0x7f){
result = (result << 18) >> 18;
}else{
cur = *(ptr++);
result |= (cur & 0x7f) << 14;
if(cur <= 0x7f){
result = (result << 11) >> 11;
}else{
cur = *(ptr++);
result |= (cur & 0x7f) << 21;
if(cur <= 0x7f){
result = (result << 4) >> 4;
}else{
cur = *(ptr++);
result |= cur << 28;
}
}
}
}
*pStream = ptr;
return result;
}