full_path_array(): Indizierungen gefixt
Indizierungen ueber das Ende des Strings hinaus entfernt.
Change-Id: I18b235798e803174fdd9a420d328300e88cd65e8
diff --git a/secure/master/file_access.c b/secure/master/file_access.c
index 0305b0a..c9ef0a6 100644
--- a/secure/master/file_access.c
+++ b/secure/master/file_access.c
@@ -34,22 +34,32 @@
switch(path[0]) {
case '/':
- if(!path[1]) return ({"",""}); //additional "" to yield "/" later
+ if(sizeof(path)==1)
+ return ({"",""}); //additional "" to yield "/" later
strs=PATH_ARRAY(path);
if (!sizeof(strs))
strs = ({"",""});
break;
case '+':
- if(!path[1]) return ({"","d"});
+ if(sizeof(path)==1)
+ return ({"","d"});
strs=({"","d"})+PATH_ARRAY(path[1..<1]);
break;
case '~':
- if(user && !path[1])
- return ({"","players",user});
- if(user && path[1]=='/')
- strs=({"","players",user})+PATH_ARRAY(path[2..<1]);
+ if (sizeof(path)==1)
+ {
+ if(user)
+ return ({"","players",user});
+ else
+ return ({"","players"});
+ }
else
- strs=({"","players"})+PATH_ARRAY(path[1..<1]);
+ {
+ if(user && path[1]=='/')
+ strs=({"","players",user})+PATH_ARRAY(path[2..<1]);
+ else
+ strs=({"","players"})+PATH_ARRAY(path[1..<1]);
+ }
break;
default:
if(user && TP && getuid(TP) == user
@@ -58,12 +68,14 @@
else
strs=PATH_ARRAY(path);
}
- // /../ behandeln. Einschraenkungen der RegExp:
+
+ // /../ und .. irgendwo im Pfad behandeln, i.e. rausschneiden.
+ // Einschraenkungen der RegExp:
// /a/b/../../d wuerde nur durch Wiederholung aufgeloest.
// /../d wird nicht richtig aufgeloest.
//regreplace("/d/inseln/toeter/room/hoehle/../wald/bla.c","(.*)\/[^/]+/\.\.
// /(.*)", "\\1\/\\2", RE_GLOBAL)
-
+
// dies sieht schlimmer aus als es ist (member ist O(n)), solange das Array
// nicht gross wird.
int p;