Changeset 2584 for zzuf/trunk/src/lib-stream.c
- Timestamp:
- Jul 24, 2008, 1:40:13 AM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
zzuf/trunk/src/lib-stream.c
r2572 r2584 359 359 } 360 360 361 #if defined HAVE___FILBUF || defined HAVE___SRGET 362 # define FREAD_PREFUZZ() \ 363 do \ 364 { \ 365 int64_t tmp = _zz_getpos(fd); \ 366 _zz_setpos(fd, pos); \ 367 already_fuzzed = _zz_getfuzzed(fd); \ 368 _zz_setpos(fd, tmp); \ 369 } \ 370 while(0) 371 #else 372 # define FREAD_PREFUZZ() do {} while(0) 373 #endif 374 361 375 #if defined REFILL_ONLY_STDIO /* Don't fuzz or seek if we have __srefill() */ 362 376 # define FREAD_FUZZ() \ … … 383 397 { \ 384 398 char *b = ptr; \ 385 _zz_setpos(fd, pos); \ 386 _zz_fuzz(fd, ptr, newpos - pos); \ 399 /* Skip bytes that were already fuzzed by __filbuf or __srget */ \ 400 if(newpos > pos + already_fuzzed) \ 401 { \ 402 _zz_setpos(fd, pos + already_fuzzed); \ 403 _zz_fuzz(fd, ptr, newpos - pos - already_fuzzed); \ 404 } \ 387 405 _zz_setpos(fd, newpos); \ 388 406 if(newpos >= pos + 4) \ … … 405 423 { \ 406 424 int64_t pos; \ 407 int fd ; \425 int fd, already_fuzzed = 0; \ 408 426 LOADSYM(fn); \ 409 427 fd = fileno(stream); \ … … 414 432 ret = ORIG(fn)(ptr, size, nmemb, stream); \ 415 433 _zz_unlock(fd); \ 434 FREAD_PREFUZZ(); \ 416 435 FREAD_FUZZ(); \ 417 436 } while(0) … … 430 449 #endif 431 450 451 #if defined HAVE___FILBUF || defined HAVE___SRGET 452 # define FGETC_PREFUZZ already_fuzzed = _zz_getfuzzed(fd); 453 #else 454 # define FGETC_PREFUZZ 455 #endif 456 432 457 #if defined REFILL_ONLY_STDIO /* Don't fuzz or seek if we have __srefill() */ 433 458 # define FGETC_FUZZ … … 437 462 { \ 438 463 uint8_t ch = ret; \ 439 _zz_fuzz(fd, &ch, 1); \ 464 if(already_fuzzed <= 0) \ 465 _zz_fuzz(fd, &ch, 1); \ 440 466 _zz_addpos(fd, 1); \ 441 467 ret = ch; \ … … 445 471 #define FGETC(fn, s, arg) \ 446 472 do { \ 447 int fd ; \473 int fd, already_fuzzed = 0; \ 448 474 LOADSYM(fn); \ 449 475 fd = fileno(s); \ … … 453 479 ret = ORIG(fn)(arg); \ 454 480 _zz_unlock(fd); \ 481 FGETC_PREFUZZ \ 455 482 FGETC_FUZZ \ 456 483 if(ret == EOF) \ … … 759 786 do \ 760 787 { \ 788 int64_t pos; \ 761 789 off_t newpos; \ 762 790 int fd; \ … … 765 793 if(!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd)) \ 766 794 return ORIG(fn)(fp); \ 795 pos = _zz_getpos(fd); \ 767 796 _zz_lock(fd); \ 768 797 ret = ORIG(fn)(fp); \ … … 771 800 if(ret != EOF) \ 772 801 { \ 802 int already_fuzzed = 0; \ 773 803 if(fn_advances) \ 774 804 { \ 805 uint8_t ch = (uint8_t)(unsigned int)ret; \ 775 806 if(newpos != -1) \ 776 807 _zz_setpos(fd, newpos - fp->FILE_CNT - 1); \ 777 uint8_t ch = (uint8_t)(unsigned int)ret; \808 already_fuzzed = _zz_getfuzzed(fd); \ 778 809 _zz_fuzz(fd, &ch, 1); \ 779 ret = ch; \ 810 ret = fp->FILE_PTR[-1] = ch; \ 811 _zz_setfuzzed(fd, fp->FILE_CNT + 1); \ 780 812 _zz_addpos(fd, 1); \ 781 813 } \ 782 814 else \ 783 815 { \ 816 _zz_setfuzzed(fd, fp->FILE_CNT); \ 784 817 if(newpos != -1) \ 785 818 _zz_setpos(fd, newpos - fp->FILE_CNT); \ 786 819 } \ 787 _zz_fuzz(fd, fp->FILE_PTR, fp->FILE_CNT); \ 788 _zz_addpos(fd, fp->FILE_CNT); \ 820 if(fp->FILE_CNT > already_fuzzed) \ 821 { \ 822 _zz_addpos(fd, already_fuzzed); \ 823 _zz_fuzz(fd, fp->FILE_PTR, fp->FILE_CNT - already_fuzzed); \ 824 } \ 825 _zz_addpos(fd, fp->FILE_CNT - already_fuzzed); \ 789 826 } \ 790 if(!_zz_islocked(fd))\791 827 _zz_setpos(fd, pos); /* FIXME: do we always need to do this? */ \ 828 debug("%s([%i]) = %i", __func__, fd, ret); \ 792 829 } \ 793 830 while(0)
Note: See TracChangeset
for help on using the changeset viewer.