Changeset 1791


Ignore:
Timestamp:
Jul 6, 2007, 3:40:55 PM (13 years ago)
Author:
Sam Hocevar
Message:
  • Added -p flag to cherry pick file descriptors that get fuzzed.
Location:
zzuf/trunk/src
Files:
11 edited

Legend:

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

    r1730 r1791  
    3535#include "libzzuf.h"
    3636#include "fd.h"
     37#include "fuzz.h"
    3738
    3839/* Regex stuff */
     
    4142static int has_include = 0, has_exclude = 0;
    4243#endif
     44
     45/* File descriptor cherry picking */
     46static int *ranges = NULL;
     47static int ranges_static[512];
    4348
    4449/* File descriptor stuff. When program is launched, we use the static array of
     
    5055static struct files
    5156{
    52     int managed, locked;
     57    int managed, locked, active;
    5358    int64_t pos;
    5459    /* Public stuff */
     
    8893    (void)regex;
    8994#endif
     95}
     96
     97/* This function is the same as _zz_bytes() */
     98void _zz_pick(char const *list)
     99{   
     100    char const *parser;
     101    unsigned int i, chunks;
     102
     103    /* Count commas */
     104    for(parser = list, chunks = 1; *parser; parser++)
     105        if(*parser == ',')
     106            chunks++;
     107
     108    /* TODO: free(ranges) if ranges != ranges_static */
     109    if(chunks >= 256)
     110        ranges = malloc((chunks + 1) * 2 * sizeof(unsigned int));
     111    else
     112        ranges = ranges_static;
     113
     114    /* Fill ranges list */
     115    for(parser = list, i = 0; i < chunks; i++)
     116    {
     117        char const *comma = strchr(parser, ',');
     118        char const *dash = strchr(parser, '-');
     119
     120        ranges[i * 2] = (dash == parser) ? 0 : atoi(parser);
     121        if(dash && (dash + 1 == comma || dash[1] == '\0'))
     122            ranges[i * 2 + 1] = ranges[i * 2]; /* special case */
     123        else if(dash && (!comma || dash < comma))
     124            ranges[i * 2 + 1] = atoi(dash + 1) + 1;
     125        else
     126            ranges[i * 2 + 1] = ranges[i * 2] + 1;
     127        parser = comma + 1;
     128    }
     129
     130    ranges[i * 2] = ranges[i * 2 + 1] = 0;
    90131}
    91132
     
    259300    files[i].fuzz.uflag = 0;
    260301
     302    /* Check whether we should ignore the fd */
     303    if(ranges)
     304    {
     305        static int idx = 0;
     306        int *r;
     307
     308        idx++;
     309
     310        for(r = ranges; r[1]; r += 2)
     311            if(idx >= r[0] && (r[0] == r[1] || idx < r[1]))
     312                goto range_ok;
     313
     314        files[i].active = 0;
     315    }
     316    else
     317    {
     318    range_ok:
     319        files[i].active = 1;
     320    }
     321
    261322    if(autoinc)
    262323        seed++;
     
    312373}
    313374
     375int _zz_isactive(int fd)
     376{
     377    if(fd < 0 || fd >= maxfd || fds[fd] == -1)
     378        return 1;
     379
     380    return files[fds[fd]].active;
     381}
     382
    314383int64_t _zz_getpos(int fd)
    315384{
  • zzuf/trunk/src/fd.h

    r1730 r1791  
    3333extern void _zz_unlock(int);
    3434extern int _zz_islocked(int);
     35extern int _zz_isactive(int);
    3536extern int64_t _zz_getpos(int);
    3637extern void _zz_setpos(int, int64_t);
  • zzuf/trunk/src/fuzz.c

    r1736 r1791  
    6565}
    6666
     67/* This function is the same as _zz_pick() */
    6768void _zz_bytes(char const *list)
    6869{
  • zzuf/trunk/src/fuzz.h

    r1732 r1791  
    1919extern void _zz_fuzzing(char const *);
    2020extern void _zz_bytes(char const *);
     21extern void _zz_pick(char const *);
    2122extern void _zz_protect(char const *);
    2223extern void _zz_refuse(char const *);
  • zzuf/trunk/src/lib-fd.c

    r1763 r1791  
    208208    LOADSYM(recv);
    209209    ret = ORIG(recv)(s, buf, len, flags);
    210     if(!_zz_ready || !_zz_iswatched(s) || _zz_islocked(s))
     210    if(!_zz_ready || !_zz_iswatched(s) || _zz_islocked(s) || !_zz_isactive(s))
    211211        return ret;
    212212
     
    241241    LOADSYM(recvfrom);
    242242    ret = ORIG(recvfrom)(s, buf, len, flags, from, fromlen);
    243     if(!_zz_ready || !_zz_iswatched(s) || _zz_islocked(s))
     243    if(!_zz_ready || !_zz_iswatched(s) || _zz_islocked(s) || !_zz_isactive(s))
    244244        return ret;
    245245
     
    274274    LOADSYM(recvmsg);
    275275    ret = ORIG(recvmsg)(s, hdr, flags);
    276     if(!_zz_ready || !_zz_iswatched(s) || _zz_islocked(s))
     276    if(!_zz_ready || !_zz_iswatched(s) || _zz_islocked(s) || !_zz_isactive(s))
    277277        return ret;
    278278
     
    294294    LOADSYM(read);
    295295    ret = ORIG(read)(fd, buf, count);
    296     if(!_zz_ready || !_zz_iswatched(fd) || _zz_islocked(fd))
     296    if(!_zz_ready || !_zz_iswatched(fd) || _zz_islocked(fd)
     297         || !_zz_isactive(fd))
    297298        return ret;
    298299
     
    325326    LOADSYM(readv);
    326327    ret = ORIG(readv)(fd, iov, count);
    327     if(!_zz_ready || !_zz_iswatched(fd) || _zz_islocked(fd))
     328    if(!_zz_ready || !_zz_iswatched(fd) || _zz_islocked(fd)
     329         || !_zz_isactive(fd))
    328330        return ret;
    329331
     
    343345    LOADSYM(pread);
    344346    ret = ORIG(pread)(fd, buf, count, offset);
    345     if(!_zz_ready || !_zz_iswatched(fd) || _zz_islocked(fd))
     347    if(!_zz_ready || !_zz_iswatched(fd) || _zz_islocked(fd)
     348         || !_zz_isactive(fd))
    346349        return ret;
    347350
     
    376379        LOADSYM(fn); \
    377380        ret = ORIG(fn)(fd, offset, whence); \
    378         if(!_zz_ready || !_zz_iswatched(fd) || _zz_islocked(fd)) \
     381        if(!_zz_ready || !_zz_iswatched(fd) || _zz_islocked(fd) \
     382             || !_zz_isactive(fd)) \
    379383            return ret; \
    380384        debug("%s(%i, %lli, %i) = %lli", __func__, fd, \
     
    407411
    408412    LOADSYM(aio_read);
    409     if(!_zz_ready || !_zz_iswatched(fd))
     413    if(!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd))
    410414        return ORIG(aio_read)(aiocbp);
    411415
     
    426430
    427431    LOADSYM(aio_return);
    428     if(!_zz_ready || !_zz_iswatched(fd))
     432    if(!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd))
    429433        return ORIG(aio_return)(aiocbp);
    430434
  • zzuf/trunk/src/lib-mem.c

    r1751 r1791  
    224224        char *b = MAP_FAILED; \
    225225        LOADSYM(fn); \
    226         if(!_zz_ready || !_zz_iswatched(fd) || _zz_islocked(fd)) \
     226        if(!_zz_ready || !_zz_iswatched(fd) || _zz_islocked(fd) \
     227             || !_zz_isactive(fd)) \
    227228            return ORIG(fn)(start, length, prot, flags, fd, offset); \
    228229        ret = ORIG(fn)(NULL, length, prot, flags, fd, offset); \
     
    318319    LOADSYM(map_fd);
    319320    ret = ORIG(map_fd)(fd, offset, addr, find_space, numbytes);
    320     if(!_zz_ready || !_zz_iswatched(fd) || _zz_islocked(fd))
     321    if(!_zz_ready || !_zz_iswatched(fd) || _zz_islocked(fd)
     322         || !_zz_isactive(fd))
    321323        return ret;
    322324
  • zzuf/trunk/src/lib-stream.c

    r1730 r1791  
    176176        LOADSYM(fn); \
    177177        fd = fileno(stream); \
    178         if(!_zz_ready || !_zz_iswatched(fd)) \
     178        if(!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd)) \
    179179            return ORIG(fn)(stream, offset, whence); \
    180180        _zz_lock(fd); \
     
    204204    LOADSYM(rewind);
    205205    fd = fileno(stream);
    206     if(!_zz_ready || !_zz_iswatched(fd))
     206    if(!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd))
    207207    {
    208208        ORIG(rewind)(stream);
     
    234234    LOADSYM(fread);
    235235    fd = fileno(stream);
    236     if(!_zz_ready || !_zz_iswatched(fd))
     236    if(!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd))
    237237        return ORIG(fread)(ptr, size, nmemb, stream);
    238238
     
    295295        LOADSYM(fn); \
    296296        fd = fileno(stream); \
    297         if(!_zz_ready || !_zz_iswatched(fd)) \
     297        if(!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd)) \
    298298            return ORIG(fn)(stream); \
    299299        _zz_lock(fd); \
     
    333333    LOADSYM(fgetc);
    334334    fd = fileno(stream);
    335     if(!_zz_ready || !_zz_iswatched(fd))
     335    if(!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd))
    336336        return ORIG(fgets)(s, size, stream);
    337337
     
    386386    LOADSYM(ungetc);
    387387    fd = fileno(stream);
    388     if(!_zz_ready || !_zz_iswatched(fd))
     388    if(!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd))
    389389        return ORIG(ungetc)(c, stream);
    390390
     
    440440        LOADSYM(fgetc); \
    441441        fd = fileno(stream); \
    442         if(!_zz_ready || !_zz_iswatched(fd)) \
     442        if(!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd)) \
    443443            return ORIG(getdelim)(lineptr, n, delim, stream); \
    444444        line = *lineptr; \
     
    522522    LOADSYM(fgetc);
    523523    fd = fileno(stream);
    524     if(!_zz_ready || !_zz_iswatched(fd))
     524    if(!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd))
    525525        return ORIG(fgetln)(stream, len);
    526526
     
    571571    LOADSYM(__srefill);
    572572    fd = fileno(fp);
    573     if(!_zz_ready || !_zz_iswatched(fd))
     573    if(!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd))
    574574        return ORIG(__srefill)(fp);
    575575
  • zzuf/trunk/src/libzzuf.c

    r1730 r1791  
    9191        _zz_bytes(tmp);
    9292
     93    tmp = getenv("ZZUF_PICK");
     94    if(tmp && *tmp)
     95        _zz_pick(tmp);
     96
    9397    tmp = getenv("ZZUF_PROTECT");
    9498    if(tmp && *tmp)
  • zzuf/trunk/src/opts.c

    r1720 r1791  
    3434void _zz_opts_init(struct opts *opts)
    3535{
    36     opts->fuzzing = opts->bytes = opts->protect = opts->refuse = NULL;
     36    opts->fuzzing = opts->bytes = opts->pick = NULL;
     37    opts->protect = opts->refuse = NULL;
    3738    opts->seed = DEFAULT_SEED;
    3839    opts->endseed = DEFAULT_SEED + 1;
  • zzuf/trunk/src/opts.h

    r1720 r1791  
    2121    char **oldargv;
    2222    char **newargv;
    23     char *fuzzing, *bytes, *protect, *refuse;
     23    char *fuzzing, *bytes, *pick, *protect, *refuse;
    2424    uint32_t seed;
    2525    uint32_t endseed;
  • zzuf/trunk/src/zzuf.c

    r1762 r1791  
    158158#endif
    159159#define OPTSTR OPTSTR_REGEX OPTSTR_RLIMIT \
    160             "Ab:B:C:dD:f:F:imnP:qr:R:s:ST:vxhV"
     160            "Ab:B:C:dD:f:F:imnp:P:qr:R:s:ST:vxhV"
    161161#define MOREINFO "Try `%s --help' for more information.\n"
    162162        int option_index = 0;
     
    185185            { "max-memory",  1, NULL, 'M' },
    186186            { "network",     0, NULL, 'n' },
     187            { "pick",        1, NULL, 'p' },
    187188            { "protect",     1, NULL, 'P' },
    188189            { "quiet",       0, NULL, 'q' },
     
    275276            setenv("ZZUF_NETWORK", "1", 1);
    276277            break;
     278        case 'p': /* --pick */
     279            opts->pick = myoptarg;
     280            break;
    277281        case 'P': /* --protect */
    278282            opts->protect = myoptarg;
     
    376380    if(opts->bytes)
    377381        setenv("ZZUF_BYTES", opts->bytes, 1);
     382    if(opts->pick)
     383        setenv("ZZUF_PICK", opts->pick, 1);
    378384    if(opts->protect)
    379385        setenv("ZZUF_PROTECT", opts->protect, 1);
     
    428434    if(opts->bytes)
    429435        _zz_bytes(opts->bytes);
     436    if(opts->pick)
     437        _zz_pick(opts->pick);
    430438    if(opts->protect)
    431439        _zz_protect(opts->protect);
     
    10861094#endif
    10871095#if defined HAVE_REGEX_H
     1096    printf("              [-p descriptors] [-I include] [-E exclude]\n");
     1097    printf("              [PROGRAM [--] [ARGS]...]\n");
     1098#else
    10881099    printf("              [-I include] [-E exclude] [PROGRAM [--] [ARGS]...]\n");
    1089 #else
    1090     printf("              [PROGRAM [--] [ARGS]...]\n");
    10911100#endif
    10921101    printf("       zzuf -h | --help\n");
     
    11181127#endif
    11191128    printf("  -n, --network             fuzz network input\n");
     1129    printf("  -p, --pick <list>         only fuzz Nth descriptor with N in <list>\n");
    11201130    printf("  -P, --protect <list>      protect bytes and characters in <list>\n");
    11211131    printf("  -q, --quiet               do not print children's messages\n");
Note: See TracChangeset for help on using the changeset viewer.