1/* 2 +----------------------------------------------------------------------+ 3 | phar php single-file executable PHP extension | 4 +----------------------------------------------------------------------+ 5 | Copyright (c) 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 | https://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#include "phar_internal.h" 20 21phar_path_check_result phar_path_check(char **s, size_t *len, const char **error) 22{ 23 const unsigned char *p = (const unsigned char*)*s; 24 const unsigned char *m; 25 26 if (*len == 1 && *p == '.') { 27 *error = "current directory reference"; 28 return pcr_err_curr_dir; 29 } else if (*len == 2 && p[0] == '.' && p[1] == '.') { 30 *error = "upper directory reference"; 31 return pcr_err_up_dir; 32 } 33 34#define YYCTYPE unsigned char 35#define YYCURSOR p 36#define YYLIMIT p+*len 37#define YYMARKER m 38#define YYFILL(n) do {} while (0) 39 40loop: 41/*!re2c 42END = "\x00"; 43NEWLINE = "\r"? "\n"; 44UTF8T = [\x80-\xBF] ; 45UTF8_1 = [\x1A-\x7F] ; 46UTF8_2 = [\xC2-\xDF] UTF8T ; 47UTF8_3A = "\xE0" [\xA0-\xBF] UTF8T ; 48UTF8_3B = [\xE1-\xEC] UTF8T{2} ; 49UTF8_3C = "\xED" [\x80-\x9F] UTF8T ; 50UTF8_3D = [\xEE-\xEF] UTF8T{2} ; 51UTF8_3 = UTF8_3A | UTF8_3B | UTF8_3C | UTF8_3D ; 52UTF8_4A = "\xF0"[\x90-\xBF] UTF8T{2} ; 53UTF8_4B = [\xF1-\xF3] UTF8T{3} ; 54UTF8_4C = "\xF4" [\x80-\x8F] UTF8T{2} ; 55UTF8_4 = UTF8_4A | UTF8_4B | UTF8_4C ; 56UTF8 = UTF8_1 | UTF8_2 | UTF8_3 | UTF8_4 ; 57EOS = "/" | END; 58ANY = . | NEWLINE; 59 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