git-svn-id: file:///var/lib/svn/clamav-devel/trunk/clamav-devel@218 77e5149b-7576-45b1-b177-96237e5ba77b
Trog authored on 2004/01/29 19:28:33... | ... |
@@ -1,3 +1,7 @@ |
1 |
+Thu Jan 29 10:29:02 GMT 2004 (trog) |
|
2 |
+----------------------------------- |
|
3 |
+ * libclamav: VBA decode - add big-endian support |
|
4 |
+ |
|
1 | 5 |
Wed Jan 28 15:57:44 GMT 2004 (njh) |
2 | 6 |
---------------------------------- |
3 | 7 |
* clamav-milter: Fixed compilation error with --enable-debug |
... | ... |
@@ -42,6 +42,25 @@ typedef struct vba_version_tag { |
42 | 42 |
} vba_version_t; |
43 | 43 |
|
44 | 44 |
|
45 |
+#ifdef WORDS_LITTLEENDIAN |
|
46 |
+#define vba_endian_convert_16(v) (v) |
|
47 |
+#else |
|
48 |
+static uint16_t vba_endian_convert_16(uint16_t v) |
|
49 |
+{ |
|
50 |
+ return ((v >> 8) + (v << 8)); |
|
51 |
+} |
|
52 |
+#endif |
|
53 |
+ |
|
54 |
+#ifdef WORDS_LITTLEENDIAN |
|
55 |
+#define vba_endian_convert_32(v) (v) |
|
56 |
+#else |
|
57 |
+static uint32_t vba_endian_convert_32(uint32_t v) |
|
58 |
+{ |
|
59 |
+ return ((v >> 24) | ((v & 0x00FF0000) >> 8) | |
|
60 |
+ ((v & 0x0000FF00) << 8) | (v << 24)); |
|
61 |
+} |
|
62 |
+#endif |
|
63 |
+ |
|
45 | 64 |
typedef struct byte_array_tag { |
46 | 65 |
unsigned int length; |
47 | 66 |
unsigned char *data; |
... | ... |
@@ -161,7 +180,7 @@ static void vba56_test_middle(int fd) |
161 | 161 |
return; |
162 | 162 |
} |
163 | 163 |
|
164 |
- if (strncmp(test_middle, middle_str, 20) != 0) { |
|
164 |
+ if (memcmp(test_middle, middle_str, 20) != 0) { |
|
165 | 165 |
lseek(fd, -20, SEEK_CUR); |
166 | 166 |
} |
167 | 167 |
return; |
... | ... |
@@ -181,7 +200,7 @@ static void vba56_test_end(int fd) |
181 | 181 |
return; |
182 | 182 |
} |
183 | 183 |
|
184 |
- if (strncmp(test_end, end_str, 20) != 0) { |
|
184 |
+ if (memcmp(test_end, end_str, 20) != 0) { |
|
185 | 185 |
lseek(fd, -20, SEEK_CUR); |
186 | 186 |
} |
187 | 187 |
return; |
... | ... |
@@ -230,7 +249,7 @@ vba_project_t *vba56_dir_read(const char *dir) |
230 | 230 |
if (vba_readn(fd, &magic, 2) != 2) { |
231 | 231 |
return NULL; |
232 | 232 |
} |
233 |
- if (strncmp(magic, vba56_signature, 2) != 0) { |
|
233 |
+ if (memcmp(magic, vba56_signature, 2) != 0) { |
|
234 | 234 |
return NULL; |
235 | 235 |
} |
236 | 236 |
|
... | ... |
@@ -238,7 +257,7 @@ vba_project_t *vba56_dir_read(const char *dir) |
238 | 238 |
return NULL; |
239 | 239 |
} |
240 | 240 |
for (i=0 ; i < NUM_VBA_VERSIONS ; i++) { |
241 |
- if (strncmp(version, vba_version[i].signature, 4) == 0) { |
|
241 |
+ if (memcmp(version, vba_version[i].signature, 4) == 0) { |
|
242 | 242 |
break; |
243 | 243 |
} |
244 | 244 |
} |
... | ... |
@@ -292,6 +311,14 @@ vba_project_t *vba56_dir_read(const char *dir) |
292 | 292 |
return NULL; |
293 | 293 |
} |
294 | 294 |
|
295 |
+ LidA = vba_endian_convert_32(LidA); |
|
296 |
+ LidB = vba_endian_convert_32(LidB); |
|
297 |
+ CharSet = vba_endian_convert_16(CharSet); |
|
298 |
+ LenA = vba_endian_convert_16(LenA); |
|
299 |
+ LenB = vba_endian_convert_16(LenB); |
|
300 |
+ LenC = vba_endian_convert_16(LenC); |
|
301 |
+ LenD = vba_endian_convert_16(LenD); |
|
302 |
+ |
|
295 | 303 |
cli_dbgmsg(" LidA: %d\n LidB: %d\n CharSet: %d\n", LidA, LidB, CharSet); |
296 | 304 |
cli_dbgmsg(" LenA: %d\n UnknownB: %d\n UnknownC: %d\n", LenA, UnknownB, UnknownC); |
297 | 305 |
cli_dbgmsg(" LenB: %d\n LenC: %d\n LenD: %d\n", LenB, LenC, LenD); |
... | ... |
@@ -321,6 +348,7 @@ vba_project_t *vba56_dir_read(const char *dir) |
321 | 321 |
if (vba_readn(fd, &length, 2) != 2) { |
322 | 322 |
return NULL; |
323 | 323 |
} |
324 |
+ length = vba_endian_convert_16(length); |
|
324 | 325 |
if (length < 6) { |
325 | 326 |
lseek(fd, -2, SEEK_CUR); |
326 | 327 |
break; |
... | ... |
@@ -382,6 +410,7 @@ vba_project_t *vba56_dir_read(const char *dir) |
382 | 382 |
if (vba_readn(fd, &record_count, 2) != 2) { |
383 | 383 |
return NULL; |
384 | 384 |
} |
385 |
+ record_count = vba_endian_convert_16(record_count); |
|
385 | 386 |
cli_dbgmsg("\nVBA Record count: %d\n", record_count); |
386 | 387 |
/*if (record_count <= 0) { |
387 | 388 |
return TRUE; |
... | ... |
@@ -399,7 +428,7 @@ vba_project_t *vba56_dir_read(const char *dir) |
399 | 399 |
free(buff); |
400 | 400 |
return NULL; |
401 | 401 |
} |
402 |
- if (!strncmp(buff, fixed_octet, 8)) { |
|
402 |
+ if (!memcmp(buff, fixed_octet, 8)) { |
|
403 | 403 |
free(buff); |
404 | 404 |
return NULL; |
405 | 405 |
} |
... | ... |
@@ -419,12 +448,14 @@ vba_project_t *vba56_dir_read(const char *dir) |
419 | 419 |
|
420 | 420 |
/* no idea what this stuff is */ |
421 | 421 |
if (ooff != 0xFFFF) { |
422 |
+ ooff = vba_endian_convert_16(ooff); |
|
422 | 423 |
lseek(fd, ooff, SEEK_CUR); |
423 | 424 |
} |
424 | 425 |
if (vba_readn(fd, &ooff, 2) != 2) { |
425 | 426 |
return NULL; |
426 | 427 |
} |
427 | 428 |
if (ooff != 0xFFFF) { |
429 |
+ ooff = vba_endian_convert_16(ooff); |
|
428 | 430 |
lseek(fd, ooff, SEEK_CUR); |
429 | 431 |
} |
430 | 432 |
lseek(fd, 100, SEEK_CUR); |
... | ... |
@@ -432,6 +463,7 @@ vba_project_t *vba56_dir_read(const char *dir) |
432 | 432 |
if (vba_readn(fd, &record_count, 2) != 2) { |
433 | 433 |
return NULL; |
434 | 434 |
} |
435 |
+ record_count = vba_endian_convert_16(record_count); |
|
435 | 436 |
cli_dbgmsg("\nVBA Record count: %d\n", record_count); |
436 | 437 |
|
437 | 438 |
vba_project = (vba_project_t *) cli_malloc(sizeof(struct vba_project_tag)); |
... | ... |
@@ -444,6 +476,7 @@ vba_project_t *vba56_dir_read(const char *dir) |
444 | 444 |
if (vba_readn(fd, &length, 2) != 2) { |
445 | 445 |
return NULL; |
446 | 446 |
} |
447 |
+ length = vba_endian_convert_16(length); |
|
447 | 448 |
buff = (unsigned char *) cli_malloc(length); |
448 | 449 |
if (!buff) { |
449 | 450 |
cli_dbgmsg("cli_malloc failed\n"); |
... | ... |
@@ -461,17 +494,20 @@ vba_project_t *vba56_dir_read(const char *dir) |
461 | 461 |
if (vba_readn(fd, &length, 2) != 2) { |
462 | 462 |
return NULL; |
463 | 463 |
} |
464 |
+ length = vba_endian_convert_16(length); |
|
464 | 465 |
lseek(fd, length, SEEK_CUR); |
465 | 466 |
|
466 | 467 |
/* unknown stuff */ |
467 | 468 |
if (vba_readn(fd, &ooff, 2) != 2) { |
468 | 469 |
return NULL; |
469 | 470 |
} |
471 |
+ ooff = vba_endian_convert_16(ooff); |
|
470 | 472 |
if (ooff == 0xFFFF) { |
471 | 473 |
lseek(fd, 2, SEEK_CUR); |
472 | 474 |
if (vba_readn(fd, &ooff, 2) != 2) { |
473 | 475 |
return NULL; |
474 | 476 |
} |
477 |
+ ooff = vba_endian_convert_16(ooff); |
|
475 | 478 |
lseek(fd, ooff, SEEK_CUR); |
476 | 479 |
} else { |
477 | 480 |
lseek(fd, 2 + ooff, SEEK_CUR); |
... | ... |
@@ -488,6 +524,7 @@ vba_project_t *vba56_dir_read(const char *dir) |
488 | 488 |
if (vba_readn(fd, &offset, 4) != 4) { |
489 | 489 |
return NULL; |
490 | 490 |
} |
491 |
+ offset = vba_endian_convert_32(offset); |
|
491 | 492 |
vba_project->offset[i] = offset; |
492 | 493 |
cli_dbgmsg("offset:%d\n", offset); |
493 | 494 |
lseek(fd, 2, SEEK_CUR); |
... | ... |
@@ -539,6 +576,7 @@ unsigned char *vba_decompress(int fd, uint32_t offset) |
539 | 539 |
if (vba_readn(fd, &token, 2) != 2) { |
540 | 540 |
return FALSE; |
541 | 541 |
} |
542 |
+ token = vba_endian_convert_16(token); |
|
542 | 543 |
win_pos = pos % VBA_COMPRESSION_WINDOW; |
543 | 544 |
if (win_pos <= 0x80) { |
544 | 545 |
if (win_pos <= 0x20) { |