Changeset 2584 for zzuf/trunk


Ignore:
Timestamp:
Jul 24, 2008, 1:40:13 AM (12 years ago)
Author:
Sam Hocevar
Message:
  • Hack around to get HP-UX tools to work. It still fails the most nasty zzcat test, though. But a more massive redesign is probably necessary.
Location:
zzuf/trunk/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • zzuf/trunk/src/fd.c

    r2336 r2584  
    6060static struct files
    6161{
    62     int managed, locked, active;
    63     int64_t pos;
     62    int managed, locked, active, already_fuzzed;
     63    int64_t pos, already_pos;
    6464    /* Public stuff */
    6565    struct fuzz fuzz;
     
    386386}
    387387
     388void _zz_setfuzzed(int fd, int count)
     389{
     390    if(fd < 0 || fd >= maxfd || fds[fd] == -1)
     391        return;
     392
     393    /* FIXME: what if we just slightly advanced? */
     394    if(files[fds[fd]].pos == files[fds[fd]].already_pos
     395        && count <= files[fds[fd]].already_fuzzed)
     396        return;
     397
     398    files[fds[fd]].already_pos = files[fds[fd]].pos;
     399    files[fds[fd]].already_fuzzed = count;
     400}
     401
     402int _zz_getfuzzed(int fd)
     403{
     404    if(fd < 0 || fd >= maxfd || fds[fd] == -1)
     405        return 0;
     406
     407    if(files[fds[fd]].pos < files[fds[fd]].already_pos)
     408        return 0;
     409
     410    if(files[fds[fd]].pos >= files[fds[fd]].already_pos
     411                               + files[fds[fd]].already_fuzzed)
     412        return 0;
     413
     414    return files[fds[fd]].already_fuzzed + files[fds[fd]].already_pos
     415                                         - files[fds[fd]].pos;
     416}
     417
    388418struct fuzz *_zz_getfuzz(int fd)
    389419{
  • zzuf/trunk/src/fd.h

    r1858 r2584  
    3838extern void _zz_setpos(int, int64_t);
    3939extern void _zz_addpos(int, int64_t);
     40extern void _zz_setfuzzed(int, int);
     41extern int _zz_getfuzzed(int);
     42
    4043extern struct fuzz *_zz_getfuzz(int);
    4144
  • zzuf/trunk/src/lib-stream.c

    r2572 r2584  
    359359}
    360360
     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
    361375#if defined REFILL_ONLY_STDIO /* Don't fuzz or seek if we have __srefill() */
    362376#   define FREAD_FUZZ() \
     
    383397        { \
    384398            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            } \
    387405            _zz_setpos(fd, newpos); \
    388406            if(newpos >= pos + 4) \
     
    405423    { \
    406424        int64_t pos; \
    407         int fd; \
     425        int fd, already_fuzzed = 0; \
    408426        LOADSYM(fn); \
    409427        fd = fileno(stream); \
     
    414432        ret = ORIG(fn)(ptr, size, nmemb, stream); \
    415433        _zz_unlock(fd); \
     434        FREAD_PREFUZZ(); \
    416435        FREAD_FUZZ(); \
    417436    } while(0)
     
    430449#endif
    431450
     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
    432457#if defined REFILL_ONLY_STDIO /* Don't fuzz or seek if we have __srefill() */
    433458#   define FGETC_FUZZ
     
    437462        { \
    438463            uint8_t ch = ret; \
    439             _zz_fuzz(fd, &ch, 1); \
     464            if(already_fuzzed <= 0) \
     465               _zz_fuzz(fd, &ch, 1); \
    440466            _zz_addpos(fd, 1); \
    441467            ret = ch; \
     
    445471#define FGETC(fn, s, arg) \
    446472    do { \
    447         int fd; \
     473        int fd, already_fuzzed = 0; \
    448474        LOADSYM(fn); \
    449475        fd = fileno(s); \
     
    453479        ret = ORIG(fn)(arg); \
    454480        _zz_unlock(fd); \
     481        FGETC_PREFUZZ \
    455482        FGETC_FUZZ \
    456483        if(ret == EOF) \
     
    759786    do \
    760787    { \
     788        int64_t pos; \
    761789        off_t newpos; \
    762790        int fd; \
     
    765793        if(!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd)) \
    766794            return ORIG(fn)(fp); \
     795        pos = _zz_getpos(fd); \
    767796        _zz_lock(fd); \
    768797        ret = ORIG(fn)(fp); \
     
    771800        if(ret != EOF) \
    772801        { \
     802            int already_fuzzed = 0; \
    773803            if(fn_advances) \
    774804            { \
     805                uint8_t ch = (uint8_t)(unsigned int)ret; \
    775806                if(newpos != -1) \
    776807                    _zz_setpos(fd, newpos - fp->FILE_CNT - 1); \
    777                 uint8_t ch = (uint8_t)(unsigned int)ret; \
     808                already_fuzzed = _zz_getfuzzed(fd); \
    778809                _zz_fuzz(fd, &ch, 1); \
    779                 ret = ch; \
     810                ret = fp->FILE_PTR[-1] = ch; \
     811                _zz_setfuzzed(fd, fp->FILE_CNT + 1); \
    780812                _zz_addpos(fd, 1); \
    781813            } \
    782814            else \
    783815            { \
     816                _zz_setfuzzed(fd, fp->FILE_CNT); \
    784817                if(newpos != -1) \
    785818                    _zz_setpos(fd, newpos - fp->FILE_CNT); \
    786819            } \
    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); \
    789826        } \
    790         if(!_zz_islocked(fd)) \
    791             debug("%s([%i]) = %i", __func__, fd, ret); \
     827        _zz_setpos(fd, pos); /* FIXME: do we always need to do this? */ \
     828        debug("%s([%i]) = %i", __func__, fd, ret); \
    792829    } \
    793830    while(0)
Note: See TracChangeset for help on using the changeset viewer.