summaryrefslogtreecommitdiff
path: root/ext/phar/phar_path_check.re
diff options
context:
space:
mode:
Diffstat (limited to 'ext/phar/phar_path_check.re')
-rw-r--r--ext/phar/phar_path_check.re97
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;
+ }
+*/
+}