Browse code

Thu Jan 29 10:29:02 GMT 2004 (trog) ----------------------------------- * libclamav: VBA decode - add big-endian support

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
Showing 2 changed files
... ...
@@ -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) {