Browse code

Do endian conversion in Word6 macro code.

git-svn-id: file:///var/lib/svn/clamav-devel/trunk/clamav-devel@538 77e5149b-7576-45b1-b177-96237e5ba77b

Trog authored on 2004/05/05 21:32:33
Showing 2 changed files
... ...
@@ -1,3 +1,7 @@
1
+Wed May  5 13:33:12 BST 2004 (trog)
2
+-----------------------------------
3
+  * libclamav/vba_extract.c: Do endian conversion in Word6 macro code.
4
+
1 5
 Wed May  5 11:32:22 BST 2004 (trog)
2 6
 -----------------------------------
3 7
   * libclamav/vba_extract.c: Add another Office2003 VBA signature.
... ...
@@ -803,6 +803,13 @@ static int wm_read_macro_entry(int fd, macro_entry_t *macro_entry)
803 803
 		cli_dbgmsg("read macro_entry failed\n");
804 804
 		return FALSE;
805 805
 	}
806
+	
807
+	macro_entry->intname_i = vba_endian_convert_16(macro_entry->intname_i, FALSE);
808
+	macro_entry->extname_i = vba_endian_convert_16(macro_entry->extname_i, FALSE);
809
+	macro_entry->xname_i = vba_endian_convert_16(macro_entry->xname_i, FALSE);
810
+	macro_entry->len = vba_endian_convert_32(macro_entry->len, FALSE);
811
+	macro_entry->state = vba_endian_convert_32(macro_entry->state, FALSE);
812
+	macro_entry->offset = vba_endian_convert_32(macro_entry->offset, FALSE);
806 813
 	return TRUE;
807 814
 }
808 815
 
... ...
@@ -819,7 +826,7 @@ static macro_info_t *wm_read_macro_info(int fd)
819 819
 		cli_dbgmsg("read macro_info failed\n");
820 820
 		return NULL;
821 821
 	}
822
-	
822
+	macro_info->count = vba_endian_convert_16(macro_info->count, FALSE);
823 823
 	cli_dbgmsg("macro count: %d\n", macro_info->count);
824 824
 	macro_info->macro_entry = (macro_entry_t *)
825 825
 			cli_malloc(sizeof(macro_entry_t) * macro_info->count);
... ...
@@ -905,6 +912,7 @@ static menu_info_t *wm_read_menu_info(int fd)
905 905
 		free(menu_info);
906 906
 		return NULL;
907 907
 	}
908
+	menu_info->count = vba_endian_convert_16(menu_info->count, FALSE);
908 909
 	cli_dbgmsg("menu_info count: %d\n", menu_info->count);
909 910
 	
910 911
 	menu_info->menu_entry =
... ...
@@ -934,6 +942,11 @@ static menu_info_t *wm_read_menu_info(int fd)
934 934
 		if (cli_readn(fd, &menu_entry->pos, 2) != 2) {
935 935
 			goto abort;
936 936
 		}
937
+		menu_entry->context = vba_endian_convert_16(menu_entry->context, FALSE);
938
+		menu_entry->menu = vba_endian_convert_16(menu_entry->menu, FALSE);
939
+		menu_entry->extname_i = vba_endian_convert_16(menu_entry->extname_i, FALSE);
940
+		menu_entry->intname_i = vba_endian_convert_16(menu_entry->intname_i, FALSE);
941
+		menu_entry->pos = vba_endian_convert_16(menu_entry->pos, FALSE);
937 942
 		cli_dbgmsg("menu entry: %d.%d\n", menu_entry->menu, menu_entry->pos);
938 943
 	}
939 944
 	return menu_info;
... ...
@@ -977,6 +990,7 @@ static macro_extnames_t *wm_read_macro_extnames(int fd)
977 977
 		free(macro_extnames);
978 978
 		return NULL;
979 979
 	}
980
+	size = vba_endian_convert_16(size, FALSE);
980 981
 	if (size == -1) { /* Unicode flag */
981 982
 		is_unicode=1;
982 983
 		if (cli_readn(fd, &size, 2) != 2) {
... ...
@@ -984,6 +998,7 @@ static macro_extnames_t *wm_read_macro_extnames(int fd)
984 984
 			free(macro_extnames);
985 985
 			return NULL;
986 986
 		}
987
+		size = vba_endian_convert_16(size, FALSE);
987 988
 	}
988 989
 	cli_dbgmsg("ext names size: 0x%x\n", size);
989 990
 
... ...
@@ -1008,45 +1023,56 @@ static macro_extnames_t *wm_read_macro_extnames(int fd)
1008 1008
 		}
1009 1009
 		macro_extname = &macro_extnames->macro_extname[macro_extnames->count-1];
1010 1010
 		if (is_unicode) {
1011
-			if (cli_readn(fd, &macro_extname->length, 2) != 2) {
1011
+			if (cli_readn(fd, &macro_extname->length, 1) != 1) {
1012 1012
 				cli_dbgmsg("read macro_extnames failed\n");
1013 1013
 				return NULL;
1014 1014
 			}
1015
-			name_tmp = (char *) cli_malloc(macro_extname->length*2);
1016
-			if (name_tmp == NULL) {
1015
+			lseek(fd, 1, SEEK_CUR);
1016
+			if (macro_extname->length > 0) {
1017
+			    name_tmp = (char *) cli_malloc(macro_extname->length*2);
1018
+			    if (name_tmp == NULL) {
1017 1019
 				goto abort;
1018
-			}
1019
-			if (cli_readn(fd, name_tmp, macro_extname->length*2) != 
1020
+			    }
1021
+			    if (cli_readn(fd, name_tmp, macro_extname->length*2) != 
1020 1022
 						macro_extname->length*2) {
1021 1023
 				cli_dbgmsg("read macro_extnames failed\n");
1022 1024
 				free(name_tmp);
1023 1025
 				goto abort;
1026
+			    }
1027
+			    macro_extname->extname =
1028
+				get_unicode_name(name_tmp, macro_extname->length*2, FALSE);
1029
+			    free(name_tmp);
1030
+			} else {
1031
+			    macro_extname->extname = strdup("[no name]");
1032
+			    macro_extname->length = 10;
1024 1033
 			}
1025
-			macro_extname->extname =
1026
-			get_unicode_name(name_tmp, macro_extname->length*2, FALSE);
1027
-			free(name_tmp);
1028 1034
 		} else {
1029
-			if (cli_readn(fd, &length_tmp, 1) != 1) {
1035
+			if (cli_readn(fd, &macro_extname->length, 1) != 1) {
1030 1036
 				cli_dbgmsg("read macro_extnames failed\n");
1031 1037
 				goto abort;
1032 1038
 			}
1033
-			macro_extname->length = (uint16_t) length_tmp;
1034
-			macro_extname->extname = (char *) cli_malloc(macro_extname->length+1);
1035
-			if (!macro_extname->extname) {
1039
+			if (macro_extname->length > 0) {
1040
+			    macro_extname->extname = (char *) cli_malloc(macro_extname->length+1);
1041
+			    if (!macro_extname->extname) {
1036 1042
 				macro_extnames->count--;
1037 1043
 				goto abort;
1038
-			}
1039
-			if (cli_readn(fd, macro_extname->extname, macro_extname->length) != 
1044
+			    }
1045
+			    if (cli_readn(fd, macro_extname->extname, macro_extname->length) != 
1040 1046
 						macro_extname->length) {
1041 1047
 				cli_dbgmsg("read macro_extnames failed\n");
1042 1048
 				goto abort;
1049
+			    }
1050
+			    macro_extname->extname[macro_extname->length] = '\0';
1051
+			} else {
1052
+			    macro_extname->extname = strdup("[no name]");
1053
+			    macro_extname->length = 10;
1043 1054
 			}
1044
-			macro_extname->extname[macro_extname->length] = '\0';
1045 1055
 		}
1046 1056
 		if (cli_readn(fd, &macro_extname->numref, 2) != 2) {
1047 1057
 			cli_dbgmsg("read macro_extnames failed\n");
1048 1058
 			return NULL;
1049
-		}		
1059
+		}	
1060
+		macro_extname->numref = vba_endian_convert_16(macro_extname->numref, FALSE);
1050 1061
 		cli_dbgmsg("ext name: %s\n", macro_extname->extname);
1051 1062
 	}
1052 1063
 	return macro_extnames;
... ...
@@ -1092,6 +1118,7 @@ static macro_intnames_t *wm_read_macro_intnames(int fd)
1092 1092
 		cli_dbgmsg("read macro_intnames failed\n");
1093 1093
 		return NULL;
1094 1094
 	}
1095
+	macro_intnames->count = vba_endian_convert_16(macro_intnames->count, FALSE);
1095 1096
 	cli_dbgmsg("int names count: %d\n", macro_intnames->count);
1096 1097
 	
1097 1098
 	macro_intnames->macro_intname =
... ...
@@ -1106,7 +1133,8 @@ static macro_intnames_t *wm_read_macro_intnames(int fd)
1106 1106
 			cli_dbgmsg("read macro_intnames failed\n");
1107 1107
 			macro_intnames->count = i;
1108 1108
 			goto abort;
1109
-		}		
1109
+		}
1110
+		macro_intname->id = vba_endian_convert_16(macro_intname->id, FALSE);
1110 1111
 		if (cli_readn(fd, &macro_intname->length, 1) != 1) {
1111 1112
 			cli_dbgmsg("read macro_intnames failed\n");
1112 1113
 			macro_intnames->count = i;