Changeset 1573 for zzuf


Ignore:
Timestamp:
Jan 6, 2007, 1:08:16 AM (14 years ago)
Author:
Sam Hocevar
Message:
  • Implemented --max-crashes.
  • Renamed --forks to --max-forks.
  • Changed debug messages format.
Location:
zzuf/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • zzuf/trunk/doc/zzuf.1

    r1571 r1573  
    55\fBzzuf\fR [\fB\-cdinqS\fR] [\fB\-r\fR \fIratio\fR] [\fB\-s\fR \fIseed\fR | \fB\-s\fR \fIstart:stop\fR]
    66.br
    7                [\fB\-F\fR \fIchildren\fR] [\fB\-B\fR \fIbytes\fR] [\fB\-T\fR \fIseconds\fR]
     7               [\fB\-F\fR \fIforks\fR] [\fB\-C\fR \fIcrashes\fR] [\fB\-B\fR \fIbytes\fR] [\fB\-T\fR \fIseconds\fR]
    88.br
    99               [\fB\-P\fR \fIlist\fR] [\fB\-R\fR \fIlist\fR]
     
    5151See the \fB\-I\fR flag for more information on restricting fuzzing to
    5252specific files.
     53.TP
     54\fB\-C\fR, \fB\-\-max\-crashes\fR=\fIn\fR
     55Stop forking when at least \fIn\fR children have crashed. The default value
     56is 1, meaning \fBzzuf\fR will stop as soon as one child has crashed. A process
     57is considered to have crashed if any signal (such as, but not limited to,
     58\fBSIGSEGV\fR) caused it to exit.
     59
     60This option is only relevant if the \fB\-s\fR flag is used with an interval
     61argument.
    5362.TP
    5463\fB\-d\fR, \fB\-\-debug\fR
     
    6473of the regular expressions will be ignored.
    6574.TP
    66 \fB\-F\fR, \fB\-\-max-forks\fR=\fIchildren\fR
    67 Specify the number of simultaneous children that can be run. This option is
    68 only useful if the \fB\-s\fR flag is used with an interval argument.
     75\fB\-F\fR, \fB\-\-max-forks\fR=\fIforks\fR
     76Specify the number of simultaneous children that can be run.
     77
     78This option is only relevant if the \fB\-s\fR flag is used with an interval
     79argument.
    6980.TP
    7081\fB\-i\fR, \fB\-\-stdin\fR
     
    212223and disabling its \fBSIGSEGV\fR signal handler (\fB\-S\fR):
    213224.PP
    214 \fB    zzuf -c -q -s 0:10000 -F 3 -T 60 -r 0.02 \\\fR
     225\fB    zzuf -c -r 0.02 -q -s 0:10000 -F 3 -T 60 -S \\\fR
    215226\fB      mplayer -- -benchmark -vo null -fps 1000 movie.avi\fR
    216227.SH RESTRICTIONS
  • zzuf/trunk/src/zzuf.c

    r1572 r1573  
    3232#include <regex.h>
    3333#include <string.h>
    34 #include <signal.h>
    3534#include <errno.h>
    3635#include <sys/time.h>
     
    6968    time_t date;
    7069} *child_list;
    71 static int parallel = 1, child_count = 0;
     70static int maxforks = 1, child_count = 0, maxcrashes = 1, crashes = 0;
    7271
    7372static int seed = 0;
     
    103102        {
    104103            /* Long option, needs arg, flag, short option */
    105             { "max-bytes", 1, NULL, 'B' },
    106             { "cmdline",   0, NULL, 'c' },
    107             { "debug",     0, NULL, 'd' },
    108             { "exclude",   1, NULL, 'E' },
    109             { "max-forks", 1, NULL, 'F' },
    110             { "help",      0, NULL, 'h' },
    111             { "stdin",     0, NULL, 'i' },
    112             { "include",   1, NULL, 'I' },
    113             { "network",   0, NULL, 'n' },
    114             { "protect",   1, NULL, 'P' },
    115             { "quiet",     0, NULL, 'q' },
    116             { "ratio",     1, NULL, 'r' },
    117             { "refuse",    1, NULL, 'R' },
    118             { "seed",      1, NULL, 's' },
    119             { "signal",    0, NULL, 'S' },
    120             { "max-time",  1, NULL, 'T' },
    121             { "version",   0, NULL, 'v' },
     104            { "max-bytes",   1, NULL, 'B' },
     105            { "cmdline",     0, NULL, 'c' },
     106            { "max-crashes", 1, NULL, 'C' },
     107            { "debug",       0, NULL, 'd' },
     108            { "exclude",     1, NULL, 'E' },
     109            { "max-forks",   1, NULL, 'F' },
     110            { "help",        0, NULL, 'h' },
     111            { "stdin",       0, NULL, 'i' },
     112            { "include",     1, NULL, 'I' },
     113            { "network",     0, NULL, 'n' },
     114            { "protect",     1, NULL, 'P' },
     115            { "quiet",       0, NULL, 'q' },
     116            { "ratio",       1, NULL, 'r' },
     117            { "refuse",      1, NULL, 'R' },
     118            { "seed",        1, NULL, 's' },
     119            { "signal",      0, NULL, 'S' },
     120            { "max-time",    1, NULL, 'T' },
     121            { "version",     0, NULL, 'v' },
    122122        };
    123         int c = getopt_long(argc, argv, "B:cdE:F:hiI:nP:qr:R:s:ST:v",
     123        int c = getopt_long(argc, argv, "B:cC:dE:F:hiI:nP:qr:R:s:ST:v",
    124124                            long_options, &option_index);
    125125#   else
    126126#       define MOREINFO "Try `%s -h' for more information.\n"
    127         int c = getopt(argc, argv, "B:cdE:F:hiI:nP:qr:R:s:ST:v");
     127        int c = getopt(argc, argv, "B:cC:dE:F:hiI:nP:qr:R:s:ST:v");
    128128#   endif
    129129        if(c == -1)
     
    166166            break;
    167167        case 'F': /* --max-forks */
    168             parallel = atoi(optarg) > 1 ? atoi(optarg) : 1;
     168            maxforks = atoi(optarg) > 1 ? atoi(optarg) : 1;
    169169            break;
    170170        case 'B': /* --max-bytes */
     
    173173        case 'T': /* --max-time */
    174174            maxtime = atof(optarg);
     175            break;
     176        case 'C': /* --max-crashes */
     177            maxcrashes = atoi(optarg);
     178            if(maxcrashes <= 0)
     179                maxcrashes = 0;
    175180            break;
    176181        case 'P': /* --protect */
     
    234239
    235240    /* Allocate memory for children handling */
    236     child_list = malloc(parallel * sizeof(struct child_list));
    237     for(i = 0; i < parallel; i++)
     241    child_list = malloc(maxforks * sizeof(struct child_list));
     242    for(i = 0; i < maxforks; i++)
    238243        child_list[i].status = STATUS_FREE;
    239244    child_count = 0;
     
    247252    newargv[argc - optind] = (char *)NULL;
    248253
    249     /* Handle children in our way */
    250     signal(SIGCHLD, SIG_DFL);
    251 
    252254    /* Main loop */
    253255    while(child_count || seed < endseed)
    254256    {
    255257        /* Spawn one new child, if necessary */
    256         if(child_count < parallel && seed < endseed)
     258        if(child_count < maxforks && seed < endseed &&
     259                             (maxcrashes && crashes < maxcrashes))
    257260            spawn_child(newargv);
    258261
     
    262265        /* Read data from children */
    263266        read_children();
     267
     268        if(maxcrashes && crashes >= maxcrashes && child_count == 0)
     269            break;
    264270    }
    265271
     
    324330
    325331    /* Find an empty slot */
    326     for(i = 0; i < parallel; i++)
     332    for(i = 0; i < maxforks; i++)
    327333        if(child_list[i].status == STATUS_FREE)
    328334            break;
     
    387393
    388394    /* Terminate children if necessary */
    389     for(i = 0; i < parallel; i++)
     395    for(i = 0; i < maxforks; i++)
    390396    {
    391397        if(child_list[i].status == STATUS_RUNNING
    392398            && maxbytes >= 0 && child_list[i].bytes > maxbytes)
    393399        {
    394             fprintf(stdout, "seed %i: data exceeded, sending SIGTERM\n",
     400            fprintf(stdout, "zzuf[seed=%i]: data exceeded, sending SIGTERM\n",
    395401                    child_list[i].seed);
    396402            kill(child_list[i].pid, SIGTERM);
     
    403409            && difftime(now, child_list[i].date) > maxtime)
    404410        {
    405             fprintf(stdout, "seed %i: time exceeded, sending SIGTERM\n",
     411            fprintf(stdout, "zzuf[seed=%i]: time exceeded, sending SIGTERM\n",
    406412                    child_list[i].seed);
    407413            kill(child_list[i].pid, SIGTERM);
     
    412418
    413419    /* Kill children if necessary */
    414     for(i = 0; i < parallel; i++)
     420    for(i = 0; i < maxforks; i++)
    415421    {
    416422        if(child_list[i].status == STATUS_SIGTERM
    417423            && difftime(now, child_list[i].date) > 2.0)
    418424        {
    419             fprintf(stdout, "seed %i: not responding, sending SIGKILL\n",
     425            fprintf(stdout, "zzuf[seed=%i]: not responding, sending SIGKILL\n",
    420426                    child_list[i].seed);
    421427            kill(child_list[i].pid, SIGKILL);
     
    425431
    426432    /* Collect dead children */
    427     for(i = 0; i < parallel; i++)
     433    for(i = 0; i < maxforks; i++)
    428434    {
    429435        int status;
     
    440446
    441447        if(WIFEXITED(status) && WEXITSTATUS(status))
    442             fprintf(stdout, "seed %i: exit %i\n",
     448        {
     449            fprintf(stdout, "zzuf[seed=%i]: exit %i\n",
    443450                    child_list[i].seed, WEXITSTATUS(status));
     451            crashes++;
     452        }
    444453        else if(WIFSIGNALED(status))
    445             fprintf(stdout, "seed %i: signal %i\n",
     454        {
     455            fprintf(stdout, "zzuf[seed=%i]: signal %i\n",
    446456                    child_list[i].seed, WTERMSIG(status));
     457            crashes++;
     458        }
    447459
    448460        for(j = 0; j < 3; j++)
     
    465477    /* Read data from all sockets */
    466478    FD_ZERO(&fdset);
    467     for(i = 0; i < parallel; i++)
     479    for(i = 0; i < maxforks; i++)
    468480    {
    469481        if(child_list[i].status != STATUS_RUNNING)
     
    483495
    484496    /* XXX: cute (i, j) iterating hack */
    485     for(i = 0, j = 0; i < parallel; i += (j == 2), j = (j + 1) % 3)
     497    for(i = 0, j = 0; i < maxforks; i += (j == 2), j = (j + 1) % 3)
    486498    {
    487499        char buf[BUFSIZ];
     
    555567{
    556568    printf("Usage: zzuf [ -cdinqS ] [ -r ratio ] [ -s seed | -s start:stop ]\n");
    557     printf("                        [ -F children ] [ -B bytes ] [ -T seconds ]\n");
     569    printf("                        [ -F forks ] [ -C crashes ] [ -B bytes ] [ -T seconds ]\n");
    558570    printf("                        [ -P protect ] [ -R refuse ]\n");
    559571    printf("                        [ -I include ] [ -E exclude ] COMMAND [ARGS]...\n");
Note: See TracChangeset for help on using the changeset viewer.