-rw-r--r-- | lib/util.cc | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/lib/util.cc b/lib/util.cc index 74039c6..069590b 100644 --- a/lib/util.cc +++ b/lib/util.cc | |||
@@ -1,34 +1,35 @@ | |||
1 | #include <sys/types.h> | 1 | #include <sys/types.h> |
2 | #include <sys/stat.h> | 2 | #include <sys/stat.h> |
3 | #include <cassert> | ||
3 | #include <konforka/util.h> | 4 | #include <konforka/util.h> |
4 | 5 | ||
5 | namespace konforka { | 6 | namespace konforka { |
6 | 7 | ||
7 | /* | 8 | /* |
8 | * XXX: this code is borrowed from sitecing as is, although it should be optimized. | 9 | * XXX: this code is borrowed from sitecing as is, although it should be optimized. |
9 | */ | 10 | */ |
10 | 11 | ||
11 | string normalize_path(const string& p,int o) { | 12 | string normalize_path(const string& p,int o) { |
12 | const char *s = p.c_str(); | 13 | const char *s = p.c_str(); |
13 | if( s[0]=='.' && s[1]=='/' ) | 14 | if( s[0]=='.' && s[1]=='/' ) |
14 | s += 2; // skip leading './' | 15 | s += 2; // skip leading './' |
15 | if(o&strip_leading_slash) | 16 | if(o&strip_leading_slash) |
16 | for(;(*s)=='/';s++); | 17 | for(;(*s)=='/';s++); |
17 | string rv; | 18 | string rv; |
18 | string::size_type notslash = 0; | 19 | string::size_type notslash = 0; |
19 | for(;*s;s++) { | 20 | for(;*s;s++) { |
20 | if(s[0]=='/') { | 21 | if(s[0]=='/') { |
21 | if(s[1]=='/') | 22 | if(s[1]=='/') |
22 | continue; // skip duplicate slash | 23 | continue; // skip duplicate slash |
23 | if(s[1]=='.' && s[2]=='/') { | 24 | if(s[1]=='.' && s[2]=='/') { |
24 | // '/./' sequence encountered | 25 | // '/./' sequence encountered |
25 | s += 2; | 26 | s += 2; |
26 | continue; | 27 | continue; |
27 | } | 28 | } |
28 | } | 29 | } |
29 | if( | 30 | if( |
30 | (o&restrict_dotdot) && ( | 31 | (o&restrict_dotdot) && ( |
31 | ( rv.empty() && s[0]=='.' && s[1]=='.' && s[2]=='/' ) // '^../' | 32 | ( rv.empty() && s[0]=='.' && s[1]=='.' && s[2]=='/' ) // '^../' |
32 | || | 33 | || |
33 | ( s[0]=='/' && s[1]=='.' && s[2]=='.' && (s[3]=='/' || s[3]==0) ) // '/../' or '/..$' | 34 | ( s[0]=='/' && s[1]=='.' && s[2]=='.' && (s[3]=='/' || s[3]==0) ) // '/../' or '/..$' |
34 | ) | 35 | ) |