Annotation of embedaddon/sudo/plugins/sudoers/regress/parser/check_fill.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (c) 2011 Todd C. Miller <Todd.Miller@courtesan.com>
        !             3:  *
        !             4:  * Permission to use, copy, modify, and distribute this software for any
        !             5:  * purpose with or without fee is hereby granted, provided that the above
        !             6:  * copyright notice and this permission notice appear in all copies.
        !             7:  *
        !             8:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
        !             9:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
        !            10:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
        !            11:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
        !            12:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
        !            13:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
        !            14:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            15:  */
        !            16: 
        !            17: #include <config.h>
        !            18: 
        !            19: #include <sys/types.h>
        !            20: #include <stdio.h>
        !            21: #ifdef STDC_HEADERS
        !            22: # include <stdlib.h>
        !            23: # include <stddef.h>
        !            24: #else
        !            25: # ifdef HAVE_STDLIB_H
        !            26: #  include <stdlib.h>
        !            27: # endif
        !            28: #endif /* STDC_HEADERS */
        !            29: #ifdef HAVE_STRING_H
        !            30: # include <string.h>
        !            31: #endif /* HAVE_STRING_H */
        !            32: #ifdef HAVE_STRINGS_H
        !            33: # include <strings.h>
        !            34: #endif /* HAVE_STRINGS_H */
        !            35: #include <grp.h>
        !            36: #include <pwd.h>
        !            37: 
        !            38: #include "list.h"
        !            39: #include "parse.h"
        !            40: #include "toke.h"
        !            41: #include "gram.h"
        !            42: 
        !            43: /*
        !            44:  * TODO: test realloc
        !            45:  */
        !            46: 
        !            47: YYSTYPE yylval;
        !            48: 
        !            49: struct fill_test {
        !            50:     const char *input;
        !            51:     const char *output;
        !            52:     int len;
        !            53:     int addspace;
        !            54: };
        !            55: 
        !            56: /*
        !            57:  * In "normal" fill, anything can be escaped and hex chars are expanded.
        !            58:  */
        !            59: static struct fill_test txt_data[] = {
        !            60:     { "Embedded\\x20Space", "Embedded Space", 0 },
        !            61:     { "\\x20Leading", " Leading", 0 },
        !            62:     { "Trailing\\x20", "Trailing ", 0 },
        !            63:     { "Multiple\\x20\\x20Spaces", "Multiple  Spaces", 0 },
        !            64:     { "Hexparse\\x200Check", "Hexparse 0Check", 0 },
        !            65:     { "Escaped\\\\Escape", "Escaped\\Escape", 0 },
        !            66:     { "LongGroupName", "LongGrou", 8 }
        !            67: };
        !            68: 
        !            69: /*
        !            70:  * The only escaped chars in a command should be [,:= \t#]
        !            71:  * The rest are done by glob() or fnmatch().
        !            72:  */
        !            73: static struct fill_test cmd_data[] = {
        !            74:     { "foo\\,bar", "foo,bar", 0 },
        !            75:     { "this\\:that", "this:that", 0 },
        !            76:     { "foo\\=bar", "foo=bar", 0 },
        !            77:     { "tab\\\tstop", "tab\tstop", 0 },
        !            78:     { "not a \\#comment", "not a #comment", 0 }
        !            79: };
        !            80: 
        !            81: /*
        !            82:  * No escaped characters in command line args.
        !            83:  * Arguments get appended.
        !            84:  */
        !            85: static struct fill_test args_data[] = {
        !            86:     { "/", "/", 0, 0 },
        !            87:     { "-type", "/ -type", 0, 1 },
        !            88:     { "f", "/ -type f", 0, 1 },
        !            89:     { "-exec", "/ -type f -exec", 0, 1 },
        !            90:     { "ls", "/ -type f -exec ls", 0, 1 },
        !            91:     { "{}", "/ -type f -exec ls {}", 0, 1 }
        !            92: };
        !            93: 
        !            94: static int
        !            95: check_fill(const char *input, int len, int addspace, const char *expect, char **resultp)
        !            96: {
        !            97:     if (!fill(input, len))
        !            98:        return -1;
        !            99:     *resultp = yylval.string;
        !           100:     return !strcmp(yylval.string, expect);
        !           101: }
        !           102: 
        !           103: static int
        !           104: check_fill_cmnd(const char *input, int len, int addspace, const char *expect, char **resultp)
        !           105: {
        !           106:     if (!fill_cmnd(input, len))
        !           107:        return -1;
        !           108:     *resultp = yylval.command.cmnd;
        !           109:     return !strcmp(yylval.command.cmnd, expect);
        !           110: }
        !           111: 
        !           112: static int
        !           113: check_fill_args(const char *input, int len, int addspace, const char *expect, char **resultp)
        !           114: {
        !           115:     if (!fill_args(input, len, addspace))
        !           116:        return -1;
        !           117:     *resultp = yylval.command.args;
        !           118:     return !strcmp(yylval.command.args, expect);
        !           119: }
        !           120: 
        !           121: static int
        !           122: do_tests(int (*checker)(const char *, int, int, const char *, char **),
        !           123:     struct fill_test *data, size_t ntests)
        !           124: {
        !           125:     int i, len;
        !           126:     int errors = 0;
        !           127:     char *result;
        !           128: 
        !           129:     for (i = 0; i < ntests; i++) {
        !           130:        if (data[i].len == 0)
        !           131:            len = strlen(data[i].input);
        !           132:        else
        !           133:            len = data[i].len;
        !           134: 
        !           135:        switch ((*checker)(data[i].input, len, data[i].addspace, data[i].output, &result)) {
        !           136:        case 0:
        !           137:            /* no match */
        !           138:            fprintf(stderr, "Failed parsing %.*s: expected [%s], got [%s]\n",
        !           139:                (int)data[i].len, data[i].input, data[i].output, result);
        !           140:            errors++;
        !           141:            break;
        !           142:        case 1:
        !           143:            /* match */
        !           144:            break;
        !           145:        default:
        !           146:            /* error */
        !           147:            fprintf(stderr, "Failed parsing %.*s: fill function failure\n",
        !           148:                (int)data[i].len, data[i].input);
        !           149:            errors++;
        !           150:            break;
        !           151:        }
        !           152:     }
        !           153: 
        !           154:     return errors;
        !           155: }
        !           156: 
        !           157: int
        !           158: main(int argc, char *argv[])
        !           159: {
        !           160:     int ntests, errors = 0;
        !           161: 
        !           162:     errors += do_tests(check_fill, txt_data, sizeof(txt_data) / sizeof(txt_data[0]));
        !           163:     errors += do_tests(check_fill_cmnd, cmd_data, sizeof(cmd_data) / sizeof(cmd_data[0]));
        !           164:     errors += do_tests(check_fill_args, args_data, sizeof(args_data) / sizeof(args_data[0]));
        !           165: 
        !           166:     ntests = sizeof(txt_data) / sizeof(txt_data[0]) +
        !           167:        sizeof(cmd_data) / sizeof(cmd_data[0]) +
        !           168:        sizeof(args_data) / sizeof(args_data[0]);
        !           169:     printf("check_fill: %d tests run, %d errors, %d%% success rate\n",
        !           170:        ntests, errors, (ntests - errors) * 100 / ntests);
        !           171: 
        !           172:     exit(errors);
        !           173: }
        !           174: 
        !           175: /* STUB */
        !           176: void
        !           177: cleanup(int gotsig)
        !           178: {
        !           179:     return;
        !           180: }
        !           181: 
        !           182: /* STUB */
        !           183: void
        !           184: yyerror(const char *s)
        !           185: {
        !           186:     return;
        !           187: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>