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... | ... |
@@ -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 = ¯o_extnames->macro_extname[macro_extnames->count-1]; |
1010 | 1010 |
if (is_unicode) { |
1011 |
- if (cli_readn(fd, ¯o_extname->length, 2) != 2) { |
|
1011 |
+ if (cli_readn(fd, ¯o_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, ¯o_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, ¯o_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, ¯o_intname->length, 1) != 1) { |
1111 | 1112 |
cli_dbgmsg("read macro_intnames failed\n"); |
1112 | 1113 |
macro_intnames->count = i; |