X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fvfs%2Fopen.c;h=0013dee14487aa2099b5161d204ce477c19652e4;hb=ba8c9b788dd5b91dd172d2bbf07ae94e660ffd7d;hp=1c00a1feebd32387c99a3a52a093d08f7bf7d702;hpb=4d4fd4c5070735f93183f5a703f8ec488900cd8d;p=tpg%2Facess2.git diff --git a/Kernel/vfs/open.c b/Kernel/vfs/open.c index 1c00a1fe..0013dee1 100644 --- a/Kernel/vfs/open.c +++ b/Kernel/vfs/open.c @@ -31,8 +31,8 @@ char *VFS_GetAbsPath(char *Path) char *ret; int pathLen = strlen(Path); int read, write; - int pos, slashNum=0, baseLen; - Uint slashOffsets[MAX_PATH_SLASHES]; + int pos, slashNum=1, baseLen; + Uint slashOffsets[MAX_PATH_SLASHES] = {1}; char *cwd = CFGPTR(CFG_VFS_CWD); int cwdLen; @@ -66,20 +66,10 @@ char *VFS_GetAbsPath(char *Path) strcpy(ret, cwd); ret[cwdLen] = '/'; strcpy(&ret[cwdLen+1], Path); - - // Pre-fill the slash positions - read = 1; slashNum = 0; - while( (pos = strpos( &ret[read], '/' )) != -1 && slashNum < MAX_PATH_SLASHES ) - { - read += pos+1; - slashOffsets[slashNum++] = pos; - } - - baseLen = cwdLen+1; } // Remove . and .. - read = write = baseLen; // Cwd has already been parsed + read = write = 1; // Cwd has already been parsed for(; read < baseLen+pathLen; read = pos+1) { pos = strpos( &ret[read], '/' ); @@ -87,21 +77,21 @@ char *VFS_GetAbsPath(char *Path) if(pos == -1) pos = baseLen+pathLen; else pos += read; // Else, Adjust to absolute - Log("pos-read = %i", pos-read); + //Log("pos-read = %i", pos-read); // Check Length if(pos - read <= 2) { - Log("&ret[read] = '%s'", &ret[read]); + //Log("&ret[read] = '%s'", &ret[read]); // Current Dir "." if(strncmp(&ret[read], ".", pos-read) == 0) continue; // Parent ".." if(strncmp(&ret[read], "..", pos-read) == 0) { // If there is no higher, silently ignore - if(!slashNum) continue; + if(slashNum < 2) continue; // Reverse write pointer - write = slashOffsets[ slashNum-- ]; + write = slashOffsets[ --slashNum - 1 ]; continue; } } @@ -109,11 +99,13 @@ char *VFS_GetAbsPath(char *Path) // Only copy if the positions differ if(read != write) { + Log("write = %i, read = %i", write, read); memcpy( &ret[write], &ret[read], pos-read+1 ); } - write = pos+1; + write += (pos-read)+1; + if(slashNum < MAX_PATH_SLASHES) - slashOffsets[ slashNum++ ] = pos; + slashOffsets[ slashNum++ ] = write; else { LOG("Path '%s' has too many elements", Path); free(ret);