Browse code

more bugfixes

git-svn: trunk@2228

Tomasz Kojm authored on 2006/09/03 03:18:16
Showing 6 changed files
... ...
@@ -1,3 +1,7 @@
1
+Sat Sep  2 20:16:26 CEST 2006 (tk)
2
+----------------------------------
3
+  * libclamav/unrar: more bugfixes
4
+
1 5
 Thu Aug 31 21:43:09 CEST 2006 (tk)
2 6
 ----------------------------------
3 7
   * libclamav/unrar: improve error handling
... ...
@@ -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);