/* +----------------------------------------------------------------------+ | phar php single-file executable PHP extension | +----------------------------------------------------------------------+ | Copyright (c) 2007-2009 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 | +----------------------------------------------------------------------+ */ /* $Id: phar_path_check.re 272369 2008-12-31 11:13:54Z sebastian $ */ #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; } */ }