Annotation of embedaddon/curl/tests/unit/unit1604.c, revision 1.1.1.1

1.1       misho       1: /***************************************************************************
                      2:  *                                  _   _ ____  _
                      3:  *  Project                     ___| | | |  _ \| |
                      4:  *                             / __| | | | |_) | |
                      5:  *                            | (__| |_| |  _ <| |___
                      6:  *                             \___|\___/|_| \_\_____|
                      7:  *
                      8:  * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
                      9:  *
                     10:  * This software is licensed as described in the file COPYING, which
                     11:  * you should have received as part of this distribution. The terms
                     12:  * are also available at https://curl.haxx.se/docs/copyright.html.
                     13:  *
                     14:  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
                     15:  * copies of the Software, and permit persons to whom the Software is
                     16:  * furnished to do so, under the terms of the COPYING file.
                     17:  *
                     18:  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
                     19:  * KIND, either express or implied.
                     20:  *
                     21:  ***************************************************************************/
                     22: #include "curlcheck.h"
                     23: 
                     24: #include "tool_cfgable.h"
                     25: #include "tool_doswin.h"
                     26: 
                     27: #include <stdio.h>
                     28: #include <stdlib.h>
                     29: #include <string.h>
                     30: 
                     31: #include "memdebug.h" /* LAST include file */
                     32: 
                     33: static CURLcode unit_setup(void)
                     34: {
                     35:   return CURLE_OK;
                     36: }
                     37: 
                     38: static void unit_stop(void)
                     39: {
                     40: 
                     41: }
                     42: 
                     43: #if defined(MSDOS) || defined(WIN32)
                     44: 
                     45: static char *getflagstr(int flags)
                     46: {
                     47:   char *buf = malloc(256);
                     48:   if(buf) {
                     49:     msnprintf(buf, 256, "%s,%s,%s,%s",
                     50:               ((flags & SANITIZE_ALLOW_COLONS) ?
                     51:                "SANITIZE_ALLOW_COLONS" : ""),
                     52:               ((flags & SANITIZE_ALLOW_PATH) ?
                     53:                "SANITIZE_ALLOW_PATH" : ""),
                     54:               ((flags & SANITIZE_ALLOW_RESERVED) ?
                     55:                "SANITIZE_ALLOW_RESERVED" : ""),
                     56:               ((flags & SANITIZE_ALLOW_TRUNCATE) ?
                     57:                "SANITIZE_ALLOW_TRUNCATE" : ""));
                     58:   }
                     59:   return buf;
                     60: }
                     61: 
                     62: static char *getcurlcodestr(int cc)
                     63: {
                     64:   char *buf = malloc(256);
                     65:   if(buf) {
                     66:     msnprintf(buf, 256, "%s (%d)",
                     67:               (cc == SANITIZE_ERR_OK ? "SANITIZE_ERR_OK" :
                     68:                cc == SANITIZE_ERR_BAD_ARGUMENT ? "SANITIZE_ERR_BAD_ARGUMENT" :
                     69:                cc == SANITIZE_ERR_INVALID_PATH ? "SANITIZE_ERR_INVALID_PATH" :
                     70:                cc == SANITIZE_ERR_OUT_OF_MEMORY ? "SANITIZE_ERR_OUT_OF_MEMORY":
                     71:                "unexpected error code - add name"),
                     72:               cc);
                     73:   }
                     74:   return buf;
                     75: }
                     76: 
                     77: struct data {
                     78:   const char *input;
                     79:   int flags;
                     80:   const char *expected_output;
                     81:   CURLcode expected_result;
                     82: };
                     83: 
                     84: UNITTEST_START
                     85: 
                     86: { /* START sanitize_file_name */
                     87:   struct data data[] = {
                     88:     { "", 0,
                     89:       "", SANITIZE_ERR_OK
                     90:     },
                     91:     { "normal filename", 0,
                     92:       "normal filename", SANITIZE_ERR_OK
                     93:     },
                     94:     { "control\tchar", 0,
                     95:       "control_char", SANITIZE_ERR_OK
                     96:     },
                     97:     { "banned*char", 0,
                     98:       "banned_char", SANITIZE_ERR_OK
                     99:     },
                    100:     { "f:foo", 0,
                    101:       "f_foo", SANITIZE_ERR_OK
                    102:     },
                    103:     { "f:foo", SANITIZE_ALLOW_COLONS,
                    104:       "f:foo", SANITIZE_ERR_OK
                    105:     },
                    106:     { "f:foo", SANITIZE_ALLOW_PATH,
                    107:       "f:foo", SANITIZE_ERR_OK
                    108:     },
                    109:     { "f:\\foo", 0,
                    110:       "f__foo", SANITIZE_ERR_OK
                    111:     },
                    112:     { "f:\\foo", SANITIZE_ALLOW_PATH,
                    113:       "f:\\foo", SANITIZE_ERR_OK
                    114:     },
                    115:     { "f:/foo", 0,
                    116:       "f__foo", SANITIZE_ERR_OK
                    117:     },
                    118:     { "f:/foo", SANITIZE_ALLOW_PATH,
                    119:       "f:/foo", SANITIZE_ERR_OK
                    120:     },
                    121: #ifndef MSDOS
                    122:     { "\\\\?\\C:\\foo", SANITIZE_ALLOW_PATH,
                    123:       "\\\\?\\C:\\foo", SANITIZE_ERR_OK
                    124:     },
                    125:     { "\\\\?\\C:\\foo", 0,
                    126:       "____C__foo", SANITIZE_ERR_OK
                    127:     },
                    128: #endif
                    129:     { "foo:bar", 0,
                    130:       "foo_bar", SANITIZE_ERR_OK
                    131:     },
                    132:     { "foo|<>/bar\\\":?*baz", 0,
                    133:       "foo____bar_____baz", SANITIZE_ERR_OK
                    134:     },
                    135:     { "f:foo::$DATA", 0,
                    136:       "f_foo__$DATA", SANITIZE_ERR_OK
                    137:     },
                    138:     { "con . air", 0,
                    139:       "con _ air", SANITIZE_ERR_OK
                    140:     },
                    141:     { "con.air", 0,
                    142:       "con_air", SANITIZE_ERR_OK
                    143:     },
                    144:     { "con:/x", 0,
                    145:       "con__x", SANITIZE_ERR_OK
                    146:     },
                    147:     { "file . . . .  ..  .", 0,
                    148:       "file", SANITIZE_ERR_OK
                    149:     },
                    150:     { "foo . . ? . . ", 0,
                    151:       "foo . . _", SANITIZE_ERR_OK
                    152:     },
                    153:     { "com1", 0,
                    154:       "_com1", SANITIZE_ERR_OK
                    155:     },
                    156:     { "com1", SANITIZE_ALLOW_RESERVED,
                    157:       "com1", SANITIZE_ERR_OK
                    158:     },
                    159:     { "f:\\com1", 0,
                    160:       "f__com1", SANITIZE_ERR_OK
                    161:     },
                    162:     { "f:\\com1", SANITIZE_ALLOW_PATH,
                    163:       "f:\\_com1", SANITIZE_ERR_OK
                    164:     },
                    165:     { "f:\\com1", SANITIZE_ALLOW_RESERVED,
                    166:       "f__com1", SANITIZE_ERR_OK
                    167:     },
                    168:     { "f:\\com1", SANITIZE_ALLOW_RESERVED | SANITIZE_ALLOW_COLONS,
                    169:       "f:_com1", SANITIZE_ERR_OK
                    170:     },
                    171:     { "f:\\com1", SANITIZE_ALLOW_RESERVED | SANITIZE_ALLOW_PATH,
                    172:       "f:\\com1", SANITIZE_ERR_OK
                    173:     },
                    174:     { "com1:\\com1", SANITIZE_ALLOW_PATH,
                    175:       "_com1:\\_com1", SANITIZE_ERR_OK
                    176:     },
                    177:     { "com1:\\com1", SANITIZE_ALLOW_RESERVED | SANITIZE_ALLOW_PATH,
                    178:       "com1:\\com1", SANITIZE_ERR_OK
                    179:     },
                    180:     { "com1:\\com1", SANITIZE_ALLOW_RESERVED,
                    181:       "com1__com1", SANITIZE_ERR_OK
                    182:     },
                    183: #ifndef MSDOS
                    184:     { "\\com1", SANITIZE_ALLOW_PATH,
                    185:       "\\_com1", SANITIZE_ERR_OK
                    186:     },
                    187:     { "\\\\com1", SANITIZE_ALLOW_PATH,
                    188:       "\\\\com1", SANITIZE_ERR_OK
                    189:     },
                    190:     { "\\\\?\\C:\\com1", SANITIZE_ALLOW_PATH,
                    191:       "\\\\?\\C:\\com1", SANITIZE_ERR_OK
                    192:     },
                    193: #endif
                    194:     { "CoM1", 0,
                    195:       "_CoM1", SANITIZE_ERR_OK
                    196:     },
                    197:     { "CoM1", SANITIZE_ALLOW_RESERVED,
                    198:       "CoM1", SANITIZE_ERR_OK
                    199:     },
                    200:     { "COM56", 0,
                    201:       "COM56", SANITIZE_ERR_OK
                    202:     },
                    203:     /* At the moment we expect a maximum path length of 259. I assume MSDOS
                    204:        has variable max path lengths depending on compiler that are shorter
                    205:        so currently these "good" truncate tests won't run on MSDOS */
                    206: #ifndef MSDOS
                    207:     { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
                    208:       "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
                    209:       "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
                    210:       "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
                    211:       "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
                    212:       "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
                    213:         SANITIZE_ALLOW_TRUNCATE,
                    214:       "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
                    215:       "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
                    216:       "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
                    217:       "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
                    218:       "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
                    219:       "FFFFF", SANITIZE_ERR_OK
                    220:     },
                    221:     { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
                    222:       "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
                    223:       "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
                    224:       "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
                    225:       "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
                    226:       "FFF\\FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
                    227:         SANITIZE_ALLOW_TRUNCATE | SANITIZE_ALLOW_PATH,
                    228:       "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
                    229:       "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
                    230:       "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
                    231:       "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
                    232:       "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
                    233:       "FFF\\FFFFF", SANITIZE_ERR_OK
                    234:     },
                    235:     { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
                    236:       "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
                    237:       "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
                    238:       "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
                    239:       "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
                    240:       "FFF\\FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
                    241:         SANITIZE_ALLOW_TRUNCATE,
                    242:       "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
                    243:       "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
                    244:       "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
                    245:       "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
                    246:       "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
                    247:       "FFF_F", SANITIZE_ERR_OK
                    248:     },
                    249: #endif /* !MSDOS */
                    250:     { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
                    251:       "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
                    252:       "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
                    253:       "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
                    254:       "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
                    255:       "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
                    256:         0,
                    257:       NULL, SANITIZE_ERR_INVALID_PATH
                    258:     },
                    259:     { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
                    260:       "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
                    261:       "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
                    262:       "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
                    263:       "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
                    264:       "FFFF\\FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
                    265:         SANITIZE_ALLOW_TRUNCATE,
                    266:       NULL, SANITIZE_ERR_INVALID_PATH
                    267:     },
                    268:     { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
                    269:       "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
                    270:       "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
                    271:       "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
                    272:       "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
                    273:       "FFFFFFFFFFFFFFFFFFFFFFFFF\\FFFFFFFFFFFFFFFFFFFFFFFF",
                    274:         SANITIZE_ALLOW_TRUNCATE | SANITIZE_ALLOW_PATH,
                    275:       NULL, SANITIZE_ERR_INVALID_PATH
                    276:     },
                    277:     { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
                    278:       "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
                    279:       "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
                    280:       "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
                    281:       "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
                    282:       "FFF\\FFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFFFFFFFFFF",
                    283:         SANITIZE_ALLOW_TRUNCATE | SANITIZE_ALLOW_PATH,
                    284:       NULL, SANITIZE_ERR_INVALID_PATH
                    285:     },
                    286:     { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
                    287:       "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
                    288:       "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
                    289:       "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
                    290:       "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
                    291:       "FF\\F:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
                    292:         SANITIZE_ALLOW_TRUNCATE | SANITIZE_ALLOW_PATH,
                    293:       NULL, SANITIZE_ERR_INVALID_PATH
                    294:     },
                    295:     { NULL, 0,
                    296:       NULL, SANITIZE_ERR_BAD_ARGUMENT
                    297:     },
                    298:   };
                    299: 
                    300:   size_t i;
                    301: 
                    302:   for(i = 0; i < sizeof(data) / sizeof(data[0]); ++i) {
                    303:     char *output = NULL;
                    304:     char *flagstr = NULL;
                    305:     char *received_ccstr = NULL;
                    306:     char *expected_ccstr = NULL;
                    307: 
                    308:     CURLcode res = sanitize_file_name(&output, data[i].input, data[i].flags);
                    309: 
                    310:     if(res == data[i].expected_result &&
                    311:        ((!output && !data[i].expected_output) ||
                    312:         (output && data[i].expected_output &&
                    313:          !strcmp(output, data[i].expected_output)))) { /* OK */
                    314:       free(output);
                    315:       continue;
                    316:     }
                    317: 
                    318:     flagstr = getflagstr(data[i].flags);
                    319:     abort_unless(flagstr, "out of memory");
                    320:     received_ccstr = getcurlcodestr(res);
                    321:     abort_unless(received_ccstr, "out of memory");
                    322:     expected_ccstr = getcurlcodestr(data[i].expected_result);
                    323:     abort_unless(expected_ccstr, "out of memory");
                    324: 
                    325:     unitfail++;
                    326:     fprintf(stderr, "\n"
                    327:             "%s:%d sanitize_file_name failed.\n"
                    328:             "input: %s\n"
                    329:             "flags: %s\n"
                    330:             "output: %s\n"
                    331:             "result: %s\n"
                    332:             "expected output: %s\n"
                    333:             "expected result: %s\n",
                    334:             __FILE__, __LINE__,
                    335:             data[i].input,
                    336:             flagstr,
                    337:             (output ? output : "(null)"),
                    338:             received_ccstr,
                    339:             (data[i].expected_output ? data[i].expected_output : "(null)"),
                    340:             expected_ccstr);
                    341: 
                    342:     free(output);
                    343:     free(flagstr);
                    344:     free(received_ccstr);
                    345:     free(expected_ccstr);
                    346:   }
                    347: } /* END sanitize_file_name */
                    348: 
                    349: #else
                    350: UNITTEST_START
                    351: 
                    352: {
                    353:   fprintf(stderr, "Skipped test not for this platform\n");
                    354: }
                    355: #endif /* MSDOS || WIN32 */
                    356: 
                    357: UNITTEST_STOP

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