git-svn: trunk@2228
Tomasz Kojm authored on 2006/09/03 03:18:16... | ... |
@@ -818,8 +818,12 @@ static int add_vm_code(unpack_data_t *unpack_data, unsigned int first_byte, |
818 | 818 |
return FALSE; |
819 | 819 |
} |
820 | 820 |
unpack_data->old_filter_lengths_size++; |
821 |
- unpack_data->old_filter_lengths = (int *) realloc(unpack_data->old_filter_lengths, |
|
821 |
+ unpack_data->old_filter_lengths = (int *) cli_realloc(unpack_data->old_filter_lengths, |
|
822 | 822 |
sizeof(int) * unpack_data->old_filter_lengths_size); |
823 |
+ if(!unpack_data->old_filter_lengths) { |
|
824 |
+ cli_dbgmsg("unrar: add_vm_code: cli_realloc failed for unpack_data->old_filter_lengths\n"); |
|
825 |
+ return FALSE; |
|
826 |
+ } |
|
823 | 827 |
unpack_data->old_filter_lengths[unpack_data->old_filter_lengths_size-1] = 0; |
824 | 828 |
filter->exec_count = 0; |
825 | 829 |
} else { |
... | ... |
@@ -888,12 +892,19 @@ static int add_vm_code(unpack_data_t *unpack_data, unsigned int first_byte, |
888 | 888 |
return FALSE; |
889 | 889 |
} |
890 | 890 |
vm_code = (unsigned char *) cli_malloc(vm_codesize); |
891 |
+ if(!vm_code) { |
|
892 |
+ cli_dbgmsg("unrar: add_vm_code: cli_malloc failed for vm_code\n"); |
|
893 |
+ return FALSE; |
|
894 |
+ } |
|
891 | 895 |
for (i=0 ; i < vm_codesize ; i++) { |
892 | 896 |
vm_code[i] = rarvm_getbits(&rarvm_input) >> 8; |
893 | 897 |
rarvm_addbits(&rarvm_input, 8); |
894 | 898 |
} |
895 |
- rarvm_prepare(&unpack_data->rarvm_data, &rarvm_input, &vm_code[0], |
|
896 |
- vm_codesize, &filter->prg); |
|
899 |
+ if(!rarvm_prepare(&unpack_data->rarvm_data, &rarvm_input, &vm_code[0], vm_codesize, &filter->prg)) { |
|
900 |
+ cli_dbgmsg("unrar: add_vm_code: rarvm_prepare failed\n"); |
|
901 |
+ free(vm_code); |
|
902 |
+ return FALSE; |
|
903 |
+ } |
|
897 | 904 |
free(vm_code); |
898 | 905 |
} |
899 | 906 |
stack_filter->prg.alt_cmd = &filter->prg.cmd.array[0]; |
... | ... |
@@ -902,12 +913,20 @@ static int add_vm_code(unpack_data_t *unpack_data, unsigned int first_byte, |
902 | 902 |
static_size = filter->prg.static_size; |
903 | 903 |
if (static_size > 0 && static_size < VM_GLOBALMEMSIZE) { |
904 | 904 |
stack_filter->prg.static_data = cli_malloc(static_size); |
905 |
+ if(!stack_filter->prg.static_data) { |
|
906 |
+ cli_dbgmsg("unrar: add_vm_code: cli_malloc failed for stack_filter->prg.static_data\n"); |
|
907 |
+ return FALSE; |
|
908 |
+ } |
|
905 | 909 |
memcpy(stack_filter->prg.static_data, filter->prg.static_data, static_size); |
906 | 910 |
} |
907 | 911 |
|
908 | 912 |
if (stack_filter->prg.global_size < VM_FIXEDGLOBALSIZE) { |
909 | 913 |
free(stack_filter->prg.global_data); |
910 | 914 |
stack_filter->prg.global_data = cli_malloc(VM_FIXEDGLOBALSIZE); |
915 |
+ if(!stack_filter->prg.global_data) { |
|
916 |
+ cli_dbgmsg("unrar: add_vm_code: cli_malloc failed for stack_filter->prg.global_data\n"); |
|
917 |
+ return FALSE; |
|
918 |
+ } |
|
911 | 919 |
memset(stack_filter->prg.global_data, 0, VM_FIXEDGLOBALSIZE); |
912 | 920 |
stack_filter->prg.global_size = VM_FIXEDGLOBALSIZE; |
913 | 921 |
} |
... | ... |
@@ -932,8 +951,12 @@ static int add_vm_code(unpack_data_t *unpack_data, unsigned int first_byte, |
932 | 932 |
cur_size = stack_filter->prg.global_size; |
933 | 933 |
if (cur_size < data_size+VM_FIXEDGLOBALSIZE) { |
934 | 934 |
stack_filter->prg.global_size += data_size+VM_FIXEDGLOBALSIZE-cur_size; |
935 |
- stack_filter->prg.global_data = realloc(stack_filter->prg.global_data, |
|
935 |
+ stack_filter->prg.global_data = cli_realloc(stack_filter->prg.global_data, |
|
936 | 936 |
stack_filter->prg.global_size); |
937 |
+ if(!stack_filter->prg.global_data) { |
|
938 |
+ cli_dbgmsg("unrar: add_vm_code: cli_realloc failed for stack_filter->prg.global_data\n"); |
|
939 |
+ return FALSE; |
|
940 |
+ } |
|
937 | 941 |
} |
938 | 942 |
global_data = &stack_filter->prg.global_data[VM_FIXEDGLOBALSIZE]; |
939 | 943 |
for (i=0 ; i< data_size ; i++) { |
... | ... |
@@ -1321,6 +1344,10 @@ rar_metadata_t *cli_unrar(int fd, const char *dirname, const struct cl_limits *l |
1321 | 1321 |
return FALSE; |
1322 | 1322 |
} |
1323 | 1323 |
unpack_data = cli_malloc(sizeof(unpack_data_t)); |
1324 |
+ if(!unpack_data) { |
|
1325 |
+ cli_dbgmsg("unrar: cli_unrar: cli_malloc failed for unpack_data\n"); |
|
1326 |
+ return FALSE; |
|
1327 |
+ } |
|
1324 | 1328 |
unpack_data->rarvm_data.mem = NULL; |
1325 | 1329 |
unpack_data->old_filter_lengths = NULL; |
1326 | 1330 |
unpack_data->PrgStack.array = unpack_data->Filters.array = NULL; |
... | ... |
@@ -48,7 +48,7 @@ void rar_cmd_array_reset(rar_cmd_array_t *cmd_a) |
48 | 48 |
int rar_cmd_array_add(rar_cmd_array_t *cmd_a, int num) |
49 | 49 |
{ |
50 | 50 |
cmd_a->num_items += num; |
51 |
- cmd_a->array = (struct rarvm_prepared_command *) realloc(cmd_a->array, |
|
51 |
+ cmd_a->array = (struct rarvm_prepared_command *) cli_realloc(cmd_a->array, |
|
52 | 52 |
cmd_a->num_items * sizeof(struct rarvm_prepared_command)); |
53 | 53 |
if (cmd_a->array == NULL) { |
54 | 54 |
return FALSE; |
... | ... |
@@ -52,7 +52,7 @@ void rar_filter_array_reset(rar_filter_array_t *filter_a) |
52 | 52 |
int rar_filter_array_add(rar_filter_array_t *filter_a, int num) |
53 | 53 |
{ |
54 | 54 |
filter_a->num_items += num; |
55 |
- filter_a->array = (struct UnpackFilter **) realloc(filter_a->array, |
|
55 |
+ filter_a->array = (struct UnpackFilter **) cli_realloc(filter_a->array, |
|
56 | 56 |
filter_a->num_items * sizeof(struct UnpackFilter **)); |
57 | 57 |
if (filter_a->array == NULL) { |
58 | 58 |
filter_a->num_items=0; |
... | ... |
@@ -882,7 +882,7 @@ static int rarvm_execute_code(rarvm_data_t *rarvm_data, |
882 | 882 |
} |
883 | 883 |
} |
884 | 884 |
|
885 |
-void rarvm_execute(rarvm_data_t *rarvm_data, struct rarvm_prepared_program *prg) |
|
885 |
+int rarvm_execute(rarvm_data_t *rarvm_data, struct rarvm_prepared_program *prg) |
|
886 | 886 |
{ |
887 | 887 |
unsigned int global_size, static_size, new_pos, new_size, data_size; |
888 | 888 |
struct rarvm_prepared_command *prepared_code; |
... | ... |
@@ -923,10 +923,16 @@ void rarvm_execute(rarvm_data_t *rarvm_data, struct rarvm_prepared_program *prg) |
923 | 923 |
(unsigned int *)&rarvm_data->mem[VM_GLOBALMEMADDR+0x30]),VM_GLOBALMEMSIZE); |
924 | 924 |
if (data_size != 0) { |
925 | 925 |
prg->global_size += data_size+VM_FIXEDGLOBALSIZE; |
926 |
- prg->global_data = realloc(prg->global_data, prg->global_size); |
|
926 |
+ prg->global_data = cli_realloc(prg->global_data, prg->global_size); |
|
927 |
+ if(!prg->global_data) { |
|
928 |
+ cli_dbgmsg("unrar: rarvm_execute: cli_realloc failed for prg->global_data\n"); |
|
929 |
+ return FALSE; |
|
930 |
+ } |
|
927 | 931 |
memcpy(prg->global_data, &rarvm_data->mem[VM_GLOBALMEMADDR], |
928 | 932 |
data_size+VM_FIXEDGLOBALSIZE); |
929 | 933 |
} |
934 |
+ |
|
935 |
+ return TRUE; |
|
930 | 936 |
} |
931 | 937 |
|
932 | 938 |
void rarvm_decode_arg(rarvm_data_t *rarvm_data, rarvm_input_t *rarvm_input, |
... | ... |
@@ -1025,7 +1031,7 @@ void rarvm_optimize(struct rarvm_prepared_program *prg) |
1025 | 1025 |
} |
1026 | 1026 |
} |
1027 | 1027 |
|
1028 |
-void rarvm_prepare(rarvm_data_t *rarvm_data, rarvm_input_t *rarvm_input, unsigned char *code, |
|
1028 |
+int rarvm_prepare(rarvm_data_t *rarvm_data, rarvm_input_t *rarvm_input, unsigned char *code, |
|
1029 | 1029 |
int code_size, struct rarvm_prepared_program *prg) |
1030 | 1030 |
{ |
1031 | 1031 |
unsigned char xor_sum; |
... | ... |
@@ -1067,9 +1073,17 @@ void rarvm_prepare(rarvm_data_t *rarvm_data, rarvm_input_t *rarvm_input, unsigne |
1067 | 1067 |
int data_size = rarvm_read_data(rarvm_input)+1; |
1068 | 1068 |
rar_dbgmsg("data_size=%d\n", data_size); |
1069 | 1069 |
prg->static_data = cli_malloc(data_size); |
1070 |
+ if(!prg->static_data) { |
|
1071 |
+ cli_dbgmsg("unrar: rarvm_prepare: cli_malloc failed for prg->static_data\n"); |
|
1072 |
+ return FALSE; |
|
1073 |
+ } |
|
1070 | 1074 |
for (i=0 ; rarvm_input->in_addr < code_size && i < data_size ; i++) { |
1071 | 1075 |
prg->static_size++; |
1072 |
- prg->static_data = realloc(prg->static_data, prg->static_size); |
|
1076 |
+ prg->static_data = cli_realloc(prg->static_data, prg->static_size); |
|
1077 |
+ if(!prg->static_data) { |
|
1078 |
+ cli_dbgmsg("unrar: rarvm_prepare: cli_realloc failed for prg->static_data\n"); |
|
1079 |
+ return FALSE; |
|
1080 |
+ } |
|
1073 | 1081 |
prg->static_data[i] = rarvm_getbits(rarvm_input) >> 8; |
1074 | 1082 |
rarvm_addbits(rarvm_input, 8); |
1075 | 1083 |
} |
... | ... |
@@ -1151,4 +1165,6 @@ void rarvm_prepare(rarvm_data_t *rarvm_data, rarvm_input_t *rarvm_input, unsigne |
1151 | 1151 |
if (code_size!=0) { |
1152 | 1152 |
rarvm_optimize(prg); |
1153 | 1153 |
} |
1154 |
+ |
|
1155 |
+ return TRUE; |
|
1154 | 1156 |
} |
... | ... |
@@ -111,10 +111,10 @@ unsigned int rarvm_getbits(rarvm_input_t *rarvm_input); |
111 | 111 |
void rarvm_addbits(rarvm_input_t *rarvm_input, int bits); |
112 | 112 |
int rarvm_init(rarvm_data_t *rarvm_data); |
113 | 113 |
void rarvm_free(rarvm_data_t *rarvm_data); |
114 |
-void rarvm_prepare(rarvm_data_t *rarvm_data, rarvm_input_t *rarvm_input, unsigned char *code, |
|
114 |
+int rarvm_prepare(rarvm_data_t *rarvm_data, rarvm_input_t *rarvm_input, unsigned char *code, |
|
115 | 115 |
int code_size, struct rarvm_prepared_program *prg); |
116 | 116 |
void rarvm_set_memory(rarvm_data_t *rarvm_data, unsigned int pos, uint8_t *data, unsigned int data_size); |
117 |
-void rarvm_execute(rarvm_data_t *rarvm_data, struct rarvm_prepared_program *prg); |
|
117 |
+int rarvm_execute(rarvm_data_t *rarvm_data, struct rarvm_prepared_program *prg); |
|
118 | 118 |
void rarvm_set_value(int byte_mode, unsigned int *addr, unsigned int value); |
119 | 119 |
unsigned int rarvm_read_data(rarvm_input_t *rarvm_input); |
120 | 120 |
uint32_t rar_crc(uint32_t start_crc, void *addr, uint32_t size); |