Merge pull request #211 from PatrickvL/master

Log sanitization for issue #14
This commit is contained in:
Luke Usher 2017-03-04 15:44:59 +00:00 committed by GitHub
commit bb6f2aae68
3 changed files with 182 additions and 39 deletions

View File

@ -81,9 +81,9 @@ inline Hex1Struct hex1(uint8_t _v)
return Hex1Struct(_v);
}
inline std::ostream& operator<<(std::ostream& os, const Hex1Struct& hs)
inline std::ostream& operator<<(std::ostream& os, const Hex1Struct& container)
{
return os << "0x" << std::hex << std::uppercase << (int)hs.v;
return os << "0x" << std::hex << std::uppercase << (int)container.v;
}
struct Hex2Struct
@ -97,9 +97,9 @@ inline Hex2Struct hex2(uint16_t _v)
return Hex2Struct(_v);
}
inline std::ostream& operator<<(std::ostream& os, const Hex2Struct& hs)
inline std::ostream& operator<<(std::ostream& os, const Hex2Struct& container)
{
return os << "0x" << std::hex << std::uppercase << (int)hs.v;
return os << "0x" << std::hex << std::uppercase << (int)container.v;
}
struct Hex4Struct
@ -113,9 +113,134 @@ inline Hex4Struct hex4(uint32_t _v)
return Hex4Struct(_v);
}
inline std::ostream& operator<<(std::ostream& os, const Hex4Struct& hs)
inline std::ostream& operator<<(std::ostream& os, const Hex4Struct& container)
{
return os << "0x" << std::hex << std::uppercase << (int)hs.v;
return os << "0x" << std::hex << std::uppercase << (int)container.v;
}
struct SanitizedCharStruct
{
char v;
SanitizedCharStruct(char _v) : v(_v) { }
};
inline SanitizedCharStruct sanitized_char(char _v)
{
return SanitizedCharStruct(_v);
}
inline std::ostream& operator<<(std::ostream& os, const SanitizedCharStruct& container)
{
char v = container.v;
if (isprint(v))
os << "'" << v << "'";
else
os << "\\x" << std::hex << std::uppercase << (int)v;
return os;
}
struct SanitizedCharPointerStruct
{
char *v;
SanitizedCharPointerStruct(char *_v) : v(_v) { }
};
inline SanitizedCharPointerStruct sanitized_char_pointer(char *_v)
{
return SanitizedCharPointerStruct(_v);
}
inline std::ostream& operator<<(std::ostream& os, const SanitizedCharPointerStruct& container)
{
char *v = container.v;
os << "(char *)";
if (v == nullptr)
return os << "nullptr";
bool needsConversion = false;
while (*v)
if (!isprint(*v++))
{
needsConversion = true;
break;
}
v = container.v;
os << "0x" << (void *)v << " = \"";
if (needsConversion)
{
while (*v)
{
if (*v == '"')
os << "\\";
if (isprint(*v))
os << *v;
else
os << "\\x" << std::hex << std::uppercase << (int)(*v);
v++;
}
}
else
os << v;
return os << "\"";
}
struct SanitizedWideCharPointerStruct
{
wchar_t *v;
SanitizedWideCharPointerStruct(wchar_t *_v) : v(_v) { }
};
inline SanitizedWideCharPointerStruct sanitized_wchar_pointer(wchar_t *_v)
{
return SanitizedWideCharPointerStruct(_v);
}
inline std::ostream& operator<<(std::ostream& os, const SanitizedWideCharPointerStruct& container)
{
wchar_t *v = container.v;
os << "(wchar *)";
if (v == nullptr)
return os << "nullptr";
bool needsConversion = false;
while (*v)
if (!isprint(*v++))
{
needsConversion = true;
break;
}
v = container.v;
os << "0x" << (void *)v << " = \"";
if (needsConversion)
{
while (*v)
{
if (*v == '"')
os << "\\";
if (isprint(*v))
os << *v;
else
os << "\\x" << std::hex << std::uppercase << (int)(*v);
v++;
}
}
else
os << v;
return os << "\"";
}
//
@ -127,8 +252,10 @@ template<class T>
inline T _log_sanitize(T arg) { return arg; }
// Sanitize C-style strings by converting NULL to "<nullptr>" to prevent null dereference
inline const char * _log_sanitize(char *arg) { return (NULL == arg) ? "<nullptr>" : arg; }
inline const wchar_t * _log_sanitize(wchar_t *arg) { return (NULL == arg) ? L"<nullptr>" : arg; }
inline SanitizedCharStruct _log_sanitize(char arg) { return sanitized_char(arg); }
inline SanitizedCharPointerStruct _log_sanitize(char *arg) { return sanitized_char_pointer(arg); }
inline SanitizedWideCharPointerStruct _log_sanitize(wchar_t *arg) { return sanitized_wchar_pointer(arg); }
// Convert booleans to strings properly
inline const char * _log_sanitize(BOOL value) { return value ? "TRUE" : "FALSE"; }

View File

@ -58,7 +58,7 @@ namespace xboxkrnl
std::ostream& operator<<(std::ostream& os, const PULONG& value)
{
os << hex4((uint32_t)value);
if (value)
if (value != nullptr)
os << " (*value: " << hex4(*value) << ")";
return os;
@ -86,33 +86,6 @@ std::ostream& operator<<(std::ostream& os, const PULONG& value)
// Xbox (Enum)Type-ToString conversions :
//
ENUM2STR_START(BUS_DATA_TYPE)
ENUM2STR_CASE(ConfigurationSpaceUndefined)
ENUM2STR_CASE(Cmos)
ENUM2STR_CASE(EisaConfiguration)
ENUM2STR_CASE(Pos)
ENUM2STR_CASE(CbusConfiguration)
ENUM2STR_CASE(PCIConfiguration)
ENUM2STR_CASE(VMEConfiguration)
ENUM2STR_CASE(NuBusConfiguration)
ENUM2STR_CASE(PCMCIAConfiguration)
ENUM2STR_CASE(MPIConfiguration)
ENUM2STR_CASE(MPSAConfiguration)
ENUM2STR_CASE(PNPISAConfiguration)
ENUM2STR_CASE(SgiInternalConfiguration)
ENUM2STR_CASE(MaximumBusDataType)
ENUM2STR_END_and_LOGRENDER(BUS_DATA_TYPE)
ENUM2STR_START(CREATE_DISPOSITION)
ENUM2STR_CASE_DEF(FILE_SUPERSEDE)
ENUM2STR_CASE_DEF(FILE_OPEN)
ENUM2STR_CASE_DEF(FILE_CREATE)
ENUM2STR_CASE_DEF(FILE_OPEN_IF)
ENUM2STR_CASE_DEF(FILE_OVERWRITE)
ENUM2STR_CASE_DEF(FILE_OVERWRITE_IF)
// ENUM2STR_CASE_DEF(FILE_MAXIMUM_DISPOSITION) Skip, identical to FILE_OVERWRITE_IF
ENUM2STR_END_and_LOGRENDER(CREATE_DISPOSITION)
FLAGS2STR_START(ALLOCATION_TYPE)
FLAG2STR(PAGE_NOACCESS)
FLAG2STR(PAGE_READONLY)
@ -147,6 +120,33 @@ FLAGS2STR_START(ALLOCATION_TYPE)
// WRITE_WATCH_FLAG_RESET = $01;
FLAGS2STR_END_and_LOGRENDER(ALLOCATION_TYPE)
ENUM2STR_START(BUS_DATA_TYPE)
ENUM2STR_CASE(ConfigurationSpaceUndefined)
ENUM2STR_CASE(Cmos)
ENUM2STR_CASE(EisaConfiguration)
ENUM2STR_CASE(Pos)
ENUM2STR_CASE(CbusConfiguration)
ENUM2STR_CASE(PCIConfiguration)
ENUM2STR_CASE(VMEConfiguration)
ENUM2STR_CASE(NuBusConfiguration)
ENUM2STR_CASE(PCMCIAConfiguration)
ENUM2STR_CASE(MPIConfiguration)
ENUM2STR_CASE(MPSAConfiguration)
ENUM2STR_CASE(PNPISAConfiguration)
ENUM2STR_CASE(SgiInternalConfiguration)
ENUM2STR_CASE(MaximumBusDataType)
ENUM2STR_END_and_LOGRENDER(BUS_DATA_TYPE)
ENUM2STR_START(CREATE_DISPOSITION)
ENUM2STR_CASE_DEF(FILE_SUPERSEDE)
ENUM2STR_CASE_DEF(FILE_OPEN)
ENUM2STR_CASE_DEF(FILE_CREATE)
ENUM2STR_CASE_DEF(FILE_OPEN_IF)
ENUM2STR_CASE_DEF(FILE_OVERWRITE)
ENUM2STR_CASE_DEF(FILE_OVERWRITE_IF)
// ENUM2STR_CASE_DEF(FILE_MAXIMUM_DISPOSITION) Skip, identical to FILE_OVERWRITE_IF
ENUM2STR_END_and_LOGRENDER(CREATE_DISPOSITION)
FLAGS2STR_START(CREATE_OPTION)
/*
#define FILE_VALID_OPTION_FLAGS 0x00ffffff
@ -186,6 +186,13 @@ ENUM2STR_START(EVENT_TYPE)
ENUM2STR_CASE(SynchronizationEvent)
ENUM2STR_END_and_LOGRENDER(EVENT_TYPE)
ENUM2STR_START(EXCEPTION_DISPOSITION)
ENUM2STR_CASE(ExceptionContinueExecution)
ENUM2STR_CASE(ExceptionContinueSearch)
ENUM2STR_CASE(ExceptionNestedException)
ENUM2STR_CASE(ExceptionCollidedUnwind)
ENUM2STR_END_and_LOGRENDER(EXCEPTION_DISPOSITION)
ENUM2STR_START(FILE_INFORMATION_CLASS)
ENUM2STR_CASE(FileDirectoryInformation)
ENUM2STR_CASE(FileFullDirectoryInformation)
@ -279,6 +286,12 @@ ENUM2STR_START(KWAIT_REASON)
ENUM2STR_END_and_LOGRENDER(KWAIT_REASON)
ENUM2STR_START(KOBJECTS)
ENUM2STR_CASE(MutantObject)
ENUM2STR_CASE(QueueObject)
ENUM2STR_CASE(SemaphoreObject)
ENUM2STR_CASE(TimerNotificationObject)
ENUM2STR_CASE(TimerSynchronizationObject)
ENUM2STR_CASE(ApcObject)
ENUM2STR_CASE(DpcObject)
ENUM2STR_END_and_LOGRENDER(KOBJECTS)
@ -374,6 +387,8 @@ ENUM2STR_END_and_LOGRENDER(XC_VALUE_INDEX)
#define LOGRENDER_MEMBER_NAME(Member) << "\n ."#Member": "
#define LOGRENDER_MEMBER_VALUE(Member) << value.Member
#define LOGRENDER_MEMBER(Member) LOGRENDER_MEMBER_NAME(Member) LOGRENDER_MEMBER_VALUE(Member)
#define LOGRENDER_MEMBER_SANITIZED(Member, Type) LOGRENDER_MEMBER_NAME(Member) << _log_sanitize((Type)value.Member)
LOGRENDER_HEADER(BOOLEAN)
{
@ -415,7 +430,7 @@ LOGRENDER_TYPE(LAUNCH_DATA_HEADER)
return os
LOGRENDER_MEMBER(dwLaunchDataType)
LOGRENDER_MEMBER(dwTitleId)
LOGRENDER_MEMBER(szLaunchPath)
LOGRENDER_MEMBER_SANITIZED(szLaunchPath, char *)
LOGRENDER_MEMBER(dwFlags);
}
@ -455,7 +470,7 @@ LOGRENDER_TYPE(STRING)
return os
LOGRENDER_MEMBER(Length)
LOGRENDER_MEMBER(MaximumLength)
LOGRENDER_MEMBER(Buffer);
LOGRENDER_MEMBER_SANITIZED(Buffer, char *);
}
LOGRENDER_TYPE(UNICODE_STRING)
@ -463,7 +478,7 @@ LOGRENDER_TYPE(UNICODE_STRING)
return os
LOGRENDER_MEMBER(Length)
LOGRENDER_MEMBER(MaximumLength)
LOGRENDER_MEMBER(Buffer);
LOGRENDER_MEMBER_SANITIZED(Buffer, wchar_t *);
}
#undef LOGRENDER_MEMBER

View File

@ -66,6 +66,7 @@ LOGRENDER_HEADER(BUS_DATA_TYPE);
LOGRENDER_HEADER(CREATE_DISPOSITION); // Not really an enum
LOGRENDER_HEADER(CREATE_OPTION); // Not really an enum
LOGRENDER_HEADER(EVENT_TYPE);
LOGRENDER_HEADER(EXCEPTION_DISPOSITION);
LOGRENDER_HEADER(FILE_INFORMATION_CLASS);
LOGRENDER_HEADER(FS_INFORMATION_CLASS);
LOGRENDER_HEADER(KINTERRUPT_MODE);