[*] Micro path resolve optimizations

This commit is contained in:
Reece Wilson 2021-07-13 14:07:40 +01:00
parent 42325b08b8
commit 7c44d3a02c
2 changed files with 55 additions and 47 deletions

View File

@ -17,7 +17,7 @@ namespace Aurora::IO::FS
return (c == '.') || (c == '!') || (c == '~') || (c == '?');
}
static void ResolveAbsolutePath(const AuString &path, AuString &result)
static void ResolveAbsolutePath(bool requireMountExpand, bool requireSanitization, const AuString &path, AuString &result)
{
AuString buffer;
bool isResource {};
@ -27,7 +27,7 @@ namespace Aurora::IO::FS
/**
Resolve special character prefixes
*/
if (path.size() > 2)
if ((path.size() > 2) && (requireMountExpand))
{
if (path[1] == kPathSplitter)
{
@ -69,6 +69,8 @@ namespace Aurora::IO::FS
buffer += path;
}
if (requireSanitization)
{
/**
Quickly handle the edge case in some modern UNIX derived systems, and in
Windows UNC paths, where paths may start with '//' or '\\' respectively
@ -90,7 +92,7 @@ namespace Aurora::IO::FS
say a kernel, and we we're trying to avoid string exploits by potential
attackers. I'm sure that would never happen to poor anticheat devs.
*/
const auto parts = SplitString(buffer, AuString(1, kPathSplitter)); /// zzzz im going to FUCKING SLEEP
const auto parts = SplitString(buffer, AuString(1, kPathSplitter), true /*ignore empty tokens*/); /// zzzz im going to SLEEP
for (const auto &ch : parts) // can you tell why FIO shouldn't be in hot paths yet?
{
if (ch == "..")
@ -122,6 +124,11 @@ namespace Aurora::IO::FS
{
result.resize(i);
}
}
else // !requireSanitization
{
result = buffer;
}
if (isResource)
{
@ -140,6 +147,7 @@ namespace Aurora::IO::FS
void /* internal, local export */ _NormalizePath(AuString &str)
{
bool requiresExpanding = false;
bool requiresMountUpdate = false;
requiresExpanding = str.size() && IsMagicCharacter(str[0]);
@ -179,16 +187,16 @@ namespace Aurora::IO::FS
auto c = str[0];
if ((c == '.') || (c == '~') || (c == '!') || (c == '?'))
{
requiresExpanding = true;
requiresMountUpdate = true;
}
}
}
// worst case -> yea have fun
if (requiresExpanding)
if (requiresExpanding || requiresMountUpdate)
{
AuString temp;
ResolveAbsolutePath(str, temp);
ResolveAbsolutePath(requiresMountUpdate, requiresExpanding, str, temp);
str = temp;
}
}

View File

@ -176,7 +176,7 @@ namespace Aurora::RNG
AUKN_SYM void ReadFastRNG(void *in, AuUInt length)
{
// TODO: implement me
return ReadSecureRNG(in, length);
ReadSecureRNG(in, length);
}
void Init()