diff options
Diffstat (limited to 'ext/phar/phar_path_check.re')
-rw-r--r-- | ext/phar/phar_path_check.re | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/ext/phar/phar_path_check.re b/ext/phar/phar_path_check.re new file mode 100644 index 0000000..e43b3f8 --- /dev/null +++ b/ext/phar/phar_path_check.re @@ -0,0 +1,97 @@ +/* + +----------------------------------------------------------------------+ + | phar php single-file executable PHP extension | + +----------------------------------------------------------------------+ + | Copyright (c) 2007-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Marcus Boerger <helly@php.net> | + +----------------------------------------------------------------------+ +*/ + +/* $Id$ */ + +#include "phar_internal.h" + +phar_path_check_result phar_path_check(char **s, int *len, const char **error) +{ + const unsigned char *p = (const unsigned char*)*s; + const unsigned char *m; + + if (*len == 1 && *p == '.') { + *error = "current directory reference"; + return pcr_err_curr_dir; + } else if (*len == 2 && p[0] == '.' && p[1] == '.') { + *error = "upper directory reference"; + return pcr_err_up_dir; + } + +#define YYCTYPE unsigned char +#define YYCURSOR p +#define YYLIMIT p+*len +#define YYMARKER m +#define YYFILL(n) + +loop: +/*!re2c +END = "\x00"; +ILL = [\x01-\x19\x80-\xFF]; +EOS = "/" | END; +ANY = .; +"//" { + *error = "double slash"; + return pcr_err_double_slash; + } +"/.." EOS { + *error = "upper directory reference"; + return pcr_err_up_dir; + } +"/." EOS { + *error = "current directory reference"; + return pcr_err_curr_dir; + } +"\\" { + *error = "back-slash"; + return pcr_err_back_slash; + } +"*" { + *error = "star"; + return pcr_err_star; + } +"?" { + if (**s == '/') { + (*s)++; + } + *len = (p - (const unsigned char*)*s) -1; + *error = NULL; + return pcr_use_query; + } +ILL { + *error ="illegal character"; + return pcr_err_illegal_char; + } +END { + if (**s == '/') { + (*s)++; + (*len)--; + } + if ((p - (const unsigned char*)*s) - 1 != *len) + { + *error ="illegal character"; + return pcr_err_illegal_char; + } + *error = NULL; + return pcr_is_ok; + } +ANY { + goto loop; + } +*/ +} |