1/* 2 +----------------------------------------------------------------------+ 3 | phar php single-file executable PHP extension | 4 +----------------------------------------------------------------------+ 5 | Copyright (c) 2007-2017 The PHP Group | 6 +----------------------------------------------------------------------+ 7 | This source file is subject to version 3.01 of the PHP license, | 8 | that is bundled with this package in the file LICENSE, and is | 9 | available through the world-wide-web at the following url: | 10 | http://www.php.net/license/3_01.txt. | 11 | If you did not receive a copy of the PHP license and are unable to | 12 | obtain it through the world-wide-web, please send a note to | 13 | license@php.net so we can mail you a copy immediately. | 14 +----------------------------------------------------------------------+ 15 | Authors: Marcus Boerger <helly@php.net> | 16 +----------------------------------------------------------------------+ 17*/ 18 19/* $Id$ */ 20 21#include "phar_internal.h" 22 23phar_path_check_result phar_path_check(char **s, int *len, const char **error) 24{ 25 const unsigned char *p = (const unsigned char*)*s; 26 const unsigned char *m; 27 28 if (*len == 1 && *p == '.') { 29 *error = "current directory reference"; 30 return pcr_err_curr_dir; 31 } else if (*len == 2 && p[0] == '.' && p[1] == '.') { 32 *error = "upper directory reference"; 33 return pcr_err_up_dir; 34 } 35 36#define YYCTYPE unsigned char 37#define YYCURSOR p 38#define YYLIMIT p+*len 39#define YYMARKER m 40#define YYFILL(n) 41 42loop: 43/*!re2c 44END = "\x00"; 45UTF8T = [\x80-\xBF] ; 46UTF8_1 = [\x1A-\x7F] ; 47UTF8_2 = [\xC2-\xDF] UTF8T ; 48UTF8_3A = "\xE0" [\xA0-\xBF] UTF8T ; 49UTF8_3B = [\xE1-\xEC] UTF8T{2} ; 50UTF8_3C = "\xED" [\x80-\x9F] UTF8T ; 51UTF8_3D = [\xEE-\xEF] UTF8T{2} ; 52UTF8_3 = UTF8_3A | UTF8_3B | UTF8_3C | UTF8_3D ; 53UTF8_4A = "\xF0"[\x90-\xBF] UTF8T{2} ; 54UTF8_4B = [\xF1-\xF3] UTF8T{3} ; 55UTF8_4C = "\xF4" [\x80-\x8F] UTF8T{2} ; 56UTF8_4 = UTF8_4A | UTF8_4B | UTF8_4C ; 57UTF8 = UTF8_1 | UTF8_2 | UTF8_3 | UTF8_4 ; 58EOS = "/" | END; 59ANY = .; 60"//" { 61 *error = "double slash"; 62 return pcr_err_double_slash; 63 } 64"/.." EOS { 65 *error = "upper directory reference"; 66 return pcr_err_up_dir; 67 } 68"/." EOS { 69 *error = "current directory reference"; 70 return pcr_err_curr_dir; 71 } 72"\\" { 73 *error = "back-slash"; 74 return pcr_err_back_slash; 75 } 76"*" { 77 *error = "star"; 78 return pcr_err_star; 79 } 80"?" { 81 if (**s == '/') { 82 (*s)++; 83 } 84 *len = (p - (const unsigned char*)*s) -1; 85 *error = NULL; 86 return pcr_use_query; 87 } 88UTF8 { 89 goto loop; 90 } 91END { 92 if (**s == '/') { 93 (*s)++; 94 (*len)--; 95 } 96 if ((p - (const unsigned char*)*s) - 1 != *len) 97 { 98 *error ="illegal character"; 99 return pcr_err_illegal_char; 100 } 101 *error = NULL; 102 return pcr_is_ok; 103 } 104ANY { 105 *error ="illegal character"; 106 return pcr_err_illegal_char; 107 } 108*/ 109} 110