1/* 2 +----------------------------------------------------------------------+ 3 | phar php single-file executable PHP extension | 4 +----------------------------------------------------------------------+ 5 | Copyright (c) 2007-2013 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"; 45ILL = [\x01-\x19\x80-\xFF]; 46EOS = "/" | END; 47ANY = .; 48"//" { 49 *error = "double slash"; 50 return pcr_err_double_slash; 51 } 52"/.." EOS { 53 *error = "upper directory reference"; 54 return pcr_err_up_dir; 55 } 56"/." EOS { 57 *error = "current directory reference"; 58 return pcr_err_curr_dir; 59 } 60"\\" { 61 *error = "back-slash"; 62 return pcr_err_back_slash; 63 } 64"*" { 65 *error = "star"; 66 return pcr_err_star; 67 } 68"?" { 69 if (**s == '/') { 70 (*s)++; 71 } 72 *len = (p - (const unsigned char*)*s) -1; 73 *error = NULL; 74 return pcr_use_query; 75 } 76ILL { 77 *error ="illegal character"; 78 return pcr_err_illegal_char; 79 } 80END { 81 if (**s == '/') { 82 (*s)++; 83 (*len)--; 84 } 85 if ((p - (const unsigned char*)*s) - 1 != *len) 86 { 87 *error ="illegal character"; 88 return pcr_err_illegal_char; 89 } 90 *error = NULL; 91 return pcr_is_ok; 92 } 93ANY { 94 goto loop; 95 } 96*/ 97} 98