From 801adb09473ee0723f19a7accf5507d381583761 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Thu, 29 Aug 2019 02:41:56 +0300 Subject: [PATCH] VFS: Escape Control Characters 0-31 Escaping NUL is formal, it's not expected on input. --- rpcs3/Emu/VFS.cpp | 86 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/rpcs3/Emu/VFS.cpp b/rpcs3/Emu/VFS.cpp index b37f19f215..3140984e11 100644 --- a/rpcs3/Emu/VFS.cpp +++ b/rpcs3/Emu/VFS.cpp @@ -246,6 +246,49 @@ std::string vfs::escape(std::string_view path) { switch (char c = path[i]) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + { + result += u8"0"; + result.back() += c; + break; + } + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + case 20: + case 21: + case 22: + case 23: + case 24: + case 25: + case 26: + case 27: + case 28: + case 29: + case 30: + case 31: + { + result += u8"A"; + result.back() += c; + result.back() -= 10; + break; + } case '<': { result += u8"<"; @@ -350,6 +393,49 @@ std::string vfs::unescape(std::string_view path) { switch (path[i + 2]) { + case char{u8"0"[2]}: + case char{u8"1"[2]}: + case char{u8"2"[2]}: + case char{u8"3"[2]}: + case char{u8"4"[2]}: + case char{u8"5"[2]}: + case char{u8"6"[2]}: + case char{u8"7"[2]}: + case char{u8"8"[2]}: + case char{u8"9"[2]}: + { + result += path[i + 2]; + result.back() -= u8"0"[2]; + continue; + } + case char{u8"A"[2]}: + case char{u8"B"[2]}: + case char{u8"C"[2]}: + case char{u8"D"[2]}: + case char{u8"E"[2]}: + case char{u8"F"[2]}: + case char{u8"G"[2]}: + case char{u8"H"[2]}: + case char{u8"I"[2]}: + case char{u8"J"[2]}: + case char{u8"K"[2]}: + case char{u8"L"[2]}: + case char{u8"M"[2]}: + case char{u8"N"[2]}: + case char{u8"O"[2]}: + case char{u8"P"[2]}: + case char{u8"Q"[2]}: + case char{u8"R"[2]}: + case char{u8"S"[2]}: + case char{u8"T"[2]}: + case char{u8"U"[2]}: + case char{u8"V"[2]}: + { + result += path[i + 2]; + result.back() -= u8"A"[2]; + result.back() += 10; + continue; + } case char{u8"!"[2]}: { i += 3;