1/* 2 +----------------------------------------------------------------------+ 3 | phar php single-file executable PHP extension | 4 +----------------------------------------------------------------------+ 5 | Copyright (c) 2007-2018 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"; 45NEWLINE = "\r"? "\n"; 46UTF8T = [\x80-\xBF] ; 47UTF8_1 = [\x1A-\x7F] ; 48UTF8_2 = [\xC2-\xDF] UTF8T ; 49UTF8_3A = "\xE0" [\xA0-\xBF] UTF8T ; 50UTF8_3B = [\xE1-\xEC] UTF8T{2} ; 51UTF8_3C = "\xED" [\x80-\x9F] UTF8T ; 52UTF8_3D = [\xEE-\xEF] UTF8T{2} ; 53UTF8_3 = UTF8_3A | UTF8_3B | UTF8_3C | UTF8_3D ; 54UTF8_4A = "\xF0"[\x90-\xBF] UTF8T{2} ; 55UTF8_4B = [\xF1-\xF3] UTF8T{3} ; 56UTF8_4C = "\xF4" [\x80-\x8F] UTF8T{2} ; 57UTF8_4 = UTF8_4A | UTF8_4B | UTF8_4C ; 58UTF8 = UTF8_1 | UTF8_2 | UTF8_3 | UTF8_4 ; 59EOS = "/" | END; 60ANY = . | NEWLINE; 61 62"//" { 63 *error = "double slash"; 64 return pcr_err_double_slash; 65 } 66"/.." EOS { 67 *error = "upper directory reference"; 68 return pcr_err_up_dir; 69 } 70"/." EOS { 71 *error = "current directory reference"; 72 return pcr_err_curr_dir; 73 } 74"\\" { 75 *error = "back-slash"; 76 return pcr_err_back_slash; 77 } 78"*" { 79 *error = "star"; 80 return pcr_err_star; 81 } 82"?" { 83 if (**s == '/') { 84 (*s)++; 85 } 86 *len = (p - (const unsigned char*)*s) -1; 87 *error = NULL; 88 return pcr_use_query; 89 } 90UTF8 { 91 goto loop; 92 } 93END { 94 if (**s == '/') { 95 (*s)++; 96 (*len)--; 97 } 98 if ((p - (const unsigned char*)*s) - 1 != *len) 99 { 100 *error ="illegal character"; 101 return pcr_err_illegal_char; 102 } 103 *error = NULL; 104 return pcr_is_ok; 105 } 106ANY { 107 *error ="illegal character"; 108 return pcr_err_illegal_char; 109 } 110*/ 111} 112