Changeset 4011 for zzuf


Ignore:
Timestamp:
Nov 23, 2009, 1:27:05 AM (10 years ago)
Author:
Sam Hocevar
Message:

Reimplement uflow() under Linux. Unlocked IO now works on Linux, except
in combination with getdelim()/getline().

Location:
zzuf/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • zzuf/trunk/configure.ac

    r4006 r4011  
    7979
    8080AC_MSG_CHECKING(for FILE* internal members)
     81ac_cv_have_glibc_fp="no"
    8182ac_v_fp_cnt="unknown"
    8283ac_v_fp_ptr="unknown"
    8384AC_TRY_COMPILE([#include <stdio.h>],
    84  [FILE *fp; fp->__cnt++; fp->__ptr++],
    85  [ac_v_fp_cnt=__cnt; ac_v_fp_ptr=__ptr],
     85 [FILE *fp; fp->_IO_read_ptr++; fp->_IO_read_end++],
     86 [ac_cv_have_glibc_fp=yes; ac_v_fp_cnt=_IO_read_end; ac_v_fp_ptr=_IO_read_ptr],
    8687 [AC_TRY_COMPILE([#include <stdio.h>],
    87    [FILE *fp; fp->_cnt++; fp->_ptr++],
    88    [ac_v_fp_cnt=_cnt; ac_v_fp_ptr=_ptr],
     88   [FILE *fp; fp->__cnt++; fp->__ptr++],
     89   [ac_v_fp_cnt=__cnt; ac_v_fp_ptr=__ptr],
    8990   [AC_TRY_COMPILE([#include <stdio.h>],
    90      [FILE *fp; fp->_c++; fp->_p++],
    91      [ac_v_fp_cnt=_c; ac_v_fp_ptr=_p],
     91     [FILE *fp; fp->_cnt++; fp->_ptr++],
     92     [ac_v_fp_cnt=_cnt; ac_v_fp_ptr=_ptr],
    9293     [AC_TRY_COMPILE([#include <stdio.h>],
    93        [FILE *fp; fp->_r++; fp->_p++],
    94        [ac_v_fp_cnt=_r; ac_v_fp_ptr=_p])])])])
    95 AC_MSG_RESULT($ac_v_fp_cnt/$ac_v_fp_ptr)
    96 AC_DEFINE_UNQUOTED(FILE_CNT, $ac_v_fp_cnt, [Define to the FILE::cnt member name])
    97 AC_DEFINE_UNQUOTED(FILE_PTR, $ac_v_fp_ptr, [Define to the FILE::ptr member name])
     94       [FILE *fp; fp->_c++; fp->_p++],
     95       [ac_v_fp_cnt=_c; ac_v_fp_ptr=_p],
     96       [AC_TRY_COMPILE([#include <stdio.h>],
     97         [FILE *fp; fp->_r++; fp->_p++],
     98         [ac_v_fp_cnt=_r; ac_v_fp_ptr=_p])])])])])
     99AC_MSG_RESULT($ac_v_fp_ptr/$ac_v_fp_cnt)
     100if test "$ac_cv_have_glibc_fp" != "no"; then
     101  AC_DEFINE(HAVE_GLIBC_FP, 1, [Define to 1 if FILE has glibc-style members])
     102fi
     103AC_DEFINE_UNQUOTED(FILE_PTR, $ac_v_fp_ptr, [Define to the FILE::ptr member])
     104AC_DEFINE_UNQUOTED(FILE_CNT, $ac_v_fp_cnt, [Define to the FILE::cnt member])
    98105
    99106dnl  On HP-UX, fpos64_t == int64_t, but on Linux it's a compound object.
  • zzuf/trunk/msvc/config.h

    r4006 r4011  
    5050#define HAVE_GETPAGESIZE 1
    5151#define HAVE_GETTIMEOFDAY 1
     52/* #undef HAVE_GLIBC_FP */
    5253#define HAVE_INTTYPES_H 1
    5354#define HAVE_IO_H 1
  • zzuf/trunk/src/lib-stream.c

    r3981 r4011  
    11/*
    22 *  zzuf - general purpose fuzzer
    3  *  Copyright (c) 2006 Sam Hocevar <sam@zoy.org>
     3 *  Copyright (c) 2006-2009 Sam Hocevar <sam@hocevar.net>
    44 *                All Rights Reserved
    55 *
     
    6060#endif
    6161
     62#if defined HAVE___UFLOW
     63int NEW(__uflow)(FILE *fp);
     64#endif
     65
    6266/* Library functions that we divert */
    6367static FILE *  (*ORIG(fopen))    (const char *path, const char *mode);
     
    135139                                    FILE *stream);
    136140#endif
     141#if defined HAVE___UFLOW
     142static int     (*ORIG(__uflow))    (FILE *fp);
     143#endif
    137144
    138145/* Additional BSDisms */
     
    152159#endif
    153160
     161/* Helper functions for refill-like functions */
     162#if defined HAVE___FILBUF || defined HAVE___SRGET || defined HAVE___UFLOW
     163static inline uint8_t *get_stream_ptr(FILE *stream)
     164{
     165    return (uint8_t *)stream->FILE_PTR;
     166}
     167
     168static inline int get_stream_cnt(FILE *stream)
     169{
     170#   if defined HAVE_GLIBC_FP
     171    return (int)((uint8_t *)stream->FILE_CNT - (uint8_t *)stream->FILE_PTR);
     172#   else
     173    return stream->FILE_CNT;
     174#   endif
     175}
     176#endif
     177
    154178/* Our function wrappers */
    155179#if defined REFILL_ONLY_STDIO /* Fuzz fp if we have __srefill() */
    156180#   define FOPEN_FUZZ() \
    157     _zz_fuzz(fd, ret->FILE_PTR, ret->FILE_CNT)
     181    _zz_fuzz(fd, get_stream_ptr(ret), get_stream_cnt(ret))
    158182#else
    159183#   define FOPEN_FUZZ()
    160184#endif
     185
     186#define BEGIN_STREAM(fp) \
     187    debug2("oldstream([%i], %p, %i)", fileno(fp), \
     188           get_stream_ptr(fp), get_stream_cnt(fp));
     189
     190#define END_STREAM(fp) \
     191    debug2("newstream([%i], %p, %i)", fileno(fp), \
     192           get_stream_ptr(fp), get_stream_cnt(fp));
    161193
    162194#define FOPEN(fn) \
     
    174206            _zz_register(fd); \
    175207            debug("%s(\"%s\", \"%s\") = [%i]", __func__, path, mode, fd); \
     208            END_STREAM(ret); \
    176209            FOPEN_FUZZ(); \
    177210        } \
     
    270303        if(!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd)) \
    271304            return ORIG(fn)(stream, offset, whence); \
     305        BEGIN_STREAM(stream); \
    272306        _zz_lock(fd); \
    273307        ret = ORIG(fn)(stream, offset, whence); \
     
    276310              fd, (long long int)offset, whence, ret); \
    277311        FSEEK_FUZZ(fn2) \
     312        END_STREAM(stream); \
    278313    } while(0)
    279314
     
    312347        if(!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd)) \
    313348            return ORIG(fn)(stream, pos); \
     349        BEGIN_STREAM(stream); \
    314350        _zz_lock(fd); \
    315351        ret = ORIG(fn)(stream, pos); \
     
    318354              fd, (long long int)FPOS_CAST(*pos), ret); \
    319355        _zz_setpos(fd, (int64_t)FPOS_CAST(*pos)); \
     356        END_STREAM(stream); \
    320357    } \
    321358    while(0)
     
    359396}
    360397
    361 #if defined HAVE___FILBUF || defined HAVE___SRGET
     398#if defined HAVE___FILBUF || defined HAVE___SRGET || defined HAVE___UFLOW
    362399#   define FREAD_PREFUZZ() \
    363400    do \
     
    428465        if(!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd)) \
    429466            return ORIG(fn)(ptr, size, nmemb, stream); \
     467        BEGIN_STREAM(stream); \
    430468        pos = ftell(stream); \
    431469        _zz_lock(fd); \
     
    434472        FREAD_PREFUZZ(); \
    435473        FREAD_FUZZ(); \
     474        END_STREAM(stream); \
    436475    } while(0)
    437476
     
    449488#endif
    450489
    451 #if defined HAVE___FILBUF || defined HAVE___SRGET
     490#if defined HAVE___FILBUF || defined HAVE___SRGET || defined HAVE___UFLOW
    452491#   define FGETC_PREFUZZ already_fuzzed = _zz_getfuzzed(fd);
    453492#else
     
    476515        if(!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd)) \
    477516            return ORIG(fn)(arg); \
     517        BEGIN_STREAM(s); \
    478518        _zz_lock(fd); \
    479519        ret = ORIG(fn)(arg); \
     
    485525        else \
    486526            debug("%s([%i]) = '%c'", __func__, fd, ret); \
     527        END_STREAM(s); \
    487528    } while(0)
    488529
     
    584625        if(!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd)) \
    585626            return ORIG(fn)(s, size, stream); \
     627        BEGIN_STREAM(s); \
    586628        FGETS_FUZZ(fn, fn2) \
    587629        debug("%s(%p, %i, [%i]) = %p", __func__, s, size, fd, ret); \
     630        END_STREAM(s); \
    588631    } while(0)
    589632
     
    609652        return ORIG(ungetc)(c, stream);
    610653
     654    BEGIN_STREAM(stream);
    611655    _zz_lock(fd);
    612656    ret = ORIG(ungetc)(c, stream);
     
    629673    else
    630674        debug("%s(0x%02x, [%i]) = '%c'", __func__, c, fd, ret);
    631 
     675    END_STREAM(stream);
    632676    return ret;
    633677}
     
    642686        return ORIG(fclose)(fp);
    643687
     688    BEGIN_STREAM(fp);
    644689    _zz_lock(fd);
    645690    ret = ORIG(fclose)(fp);
     
    661706        fd = fileno(stream); \
    662707        if(!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd)) \
    663             return ORIG(getdelim)(lineptr, n, delim, stream); \
     708        { \
     709            ret = ORIG(getdelim)(lineptr, n, delim, stream); \
     710            break; \
     711        } \
     712        BEGIN_STREAM(stream); \
    664713        line = *lineptr; \
    665714        size = line ? *n : 0; \
     
    704753            debug("%s(%p, %p, [%i]) = %li", __func__, \
    705754                  lineptr, n, fd, (long int)ret); \
    706         return ret; \
     755        END_STREAM(stream); \
     756        break; \
    707757    } while(0)
    708758
     
    745795        return ORIG(fgetln)(stream, len);
    746796
     797    BEGIN_STREAM(stream);
    747798#if defined REFILL_ONLY_STDIO /* Don't fuzz or seek if we have __srefill() */
    748799    _zz_lock(fd);
     
    779830
    780831    debug("%s([%i], &%li) = %p", __func__, fd, (long int)*len, ret);
     832    END_STREAM(stream);
    781833    return ret;
    782834}
     835#endif
     836
     837#if defined HAVE___FILBUF || defined HAVE___SRGET
     838#   define REFILL_RETURNS_INT 1
     839#elif defined HAVE___UFLOW
     840#   define REFILL_RETURNS_INT 0
    783841#endif
    784842
     
    793851        if(!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd)) \
    794852            return ORIG(fn)(fp); \
     853        BEGIN_STREAM(fp); \
    795854        pos = _zz_getpos(fd); \
    796855        _zz_lock(fd); \
     
    805864                uint8_t ch = (uint8_t)(unsigned int)ret; \
    806865                if(newpos != -1) \
    807                     _zz_setpos(fd, newpos - fp->FILE_CNT - 1); \
     866                    _zz_setpos(fd, newpos - get_stream_cnt(fp) - 1); \
    808867                already_fuzzed = _zz_getfuzzed(fd); \
    809868                _zz_fuzz(fd, &ch, 1); \
    810                 ret = fp->FILE_PTR[-1] = ch; \
    811                 _zz_setfuzzed(fd, fp->FILE_CNT + 1); \
     869                ret = get_stream_ptr(fp)[-1] = ch; \
     870                _zz_setfuzzed(fd, get_stream_cnt(fp) + 1); \
    812871                _zz_addpos(fd, 1); \
    813872            } \
    814873            else \
    815874            { \
    816                 _zz_setfuzzed(fd, fp->FILE_CNT); \
     875                _zz_setfuzzed(fd, get_stream_cnt(fp)); \
    817876                if(newpos != -1) \
    818                     _zz_setpos(fd, newpos - fp->FILE_CNT); \
     877                    _zz_setpos(fd, newpos - get_stream_cnt(fp)); \
    819878            } \
    820             if(fp->FILE_CNT > already_fuzzed) \
     879            if(get_stream_cnt(fp) > already_fuzzed) \
    821880            { \
    822881                _zz_addpos(fd, already_fuzzed); \
    823                 _zz_fuzz(fd, fp->FILE_PTR, fp->FILE_CNT - already_fuzzed); \
     882                _zz_fuzz(fd, get_stream_ptr(fp), \
     883                             get_stream_cnt(fp) - already_fuzzed); \
    824884            } \
    825             _zz_addpos(fd, fp->FILE_CNT - already_fuzzed); \
     885            _zz_addpos(fd, get_stream_cnt(fp) - already_fuzzed); \
    826886        } \
    827887        _zz_setpos(fd, pos); /* FIXME: do we always need to do this? */ \
    828         debug("%s([%i]) = %i", __func__, fd, ret); \
     888        if (REFILL_RETURNS_INT) \
     889            debug("%s([%i]) = %i", __func__, fd, ret); \
     890        else if (ret == EOF) \
     891            debug("%s([%i]) = EOF", __func__, fd, ret); \
     892        else \
     893            debug("%s([%i]) = '%c'", __func__, fd, ret); \
     894        END_STREAM(fp); \
    829895    } \
    830896    while(0)
     
    851917#endif
    852918
     919#if defined HAVE___UFLOW
     920int NEW(__uflow)(FILE *fp)
     921{
     922    int ret; REFILL(__uflow, 1); return ret;
     923}
     924#endif
     925
Note: See TracChangeset for help on using the changeset viewer.