ReadAsCharの戻り値を必ずNULL終端するように

設定項目数が上限を超えたらエラーにする
不正なDNSアドレスを変換しないように

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@54 385bec56-5757-e545-9c3a-d8741f4650f1
This commit is contained in:
N2614 2011-02-15 01:55:17 +00:00
parent 2e588f3d8c
commit 73512b750f
3 changed files with 97 additions and 81 deletions

View File

@ -1036,55 +1036,62 @@ bool ReadSetting()
{ {
const char* dnsPrimary = configfileLoader.ReadAsChar(L"DNS_PRI"); // プライマリDNS const char* dnsPrimary = configfileLoader.ReadAsChar(L"DNS_PRI"); // プライマリDNS
if(!networkSetting.ip.autoDNSSetting && dnsPrimary == NULL) if(!networkSetting.ip.autoDNSSetting)
{ {
COMMON_LOGGER("DNS_PRI: is missing\n"); if (dnsPrimary == NULL)
retval = false;
}
else
{
u8 dns[4];
nn::socket::InAddr addr;
if (1 == nn::socket::InetAtoN(dnsPrimary, &addr))
{ {
dns[3] = (0xff & (addr.addr >> 24)); COMMON_LOGGER("DNS_PRI: is missing\n");
dns[2] = (0xff & (addr.addr >> 16)); retval = false;
dns[1] = (0xff & (addr.addr >> 8));
dns[0] = (0xff & (addr.addr));
}
std::memcpy(networkSetting.ip.dns[0], dns, 4);
COMMON_LOGGER("DNS_PRI = %03d.%03d.%03d.%03d\n", networkSetting.ip.dns[0][0],
networkSetting.ip.dns[0][1],
networkSetting.ip.dns[0][2],
networkSetting.ip.dns[0][3]);
}
else
{
u8 dns[4];
nn::socket::InAddr addr;
if (1 == nn::socket::InetAtoN(dnsPrimary, &addr))
{
dns[3] = (0xff & (addr.addr >> 24));
dns[2] = (0xff & (addr.addr >> 16));
dns[1] = (0xff & (addr.addr >> 8));
dns[0] = (0xff & (addr.addr));
}
std::memcpy(networkSetting.ip.dns[0], dns, 4);
COMMON_LOGGER("DNS_PRI = %03d.%03d.%03d.%03d\n", networkSetting.ip.dns[0][0],
networkSetting.ip.dns[0][1],
networkSetting.ip.dns[0][2],
networkSetting.ip.dns[0][3]);
}
} }
} }
{ {
const char* dnsSecondary = configfileLoader.ReadAsChar(L"DNS_SEC"); // セカンダリDNS const char* dnsSecondary = configfileLoader.ReadAsChar(L"DNS_SEC"); // セカンダリDNS
if(!networkSetting.ip.autoDNSSetting && dnsSecondary == NULL) if(!networkSetting.ip.autoDNSSetting)
{ {
COMMON_LOGGER("DNS_SEC: is missing\n"); if(dnsSecondary == NULL)
retval = false;
}
else
{
u8 dns[4];
nn::socket::InAddr addr;
if (1 == nn::socket::InetAtoN(dnsSecondary, &addr))
{ {
dns[3] = (0xff & (addr.addr >> 24)); COMMON_LOGGER("DNS_SEC: is missing\n");
dns[2] = (0xff & (addr.addr >> 16)); retval = false;
dns[1] = (0xff & (addr.addr >> 8));
dns[0] = (0xff & (addr.addr));
} }
std::memcpy(networkSetting.ip.dns[1], dns, 4); else
COMMON_LOGGER("DNS_SEC = %03d.%03d.%03d.%03d\n", networkSetting.ip.dns[1][0], {
networkSetting.ip.dns[1][1], u8 dns[4];
networkSetting.ip.dns[1][2], nn::socket::InAddr addr;
networkSetting.ip.dns[1][3]); if (1 == nn::socket::InetAtoN(dnsSecondary, &addr))
{
dns[3] = (0xff & (addr.addr >> 24));
dns[2] = (0xff & (addr.addr >> 16));
dns[1] = (0xff & (addr.addr >> 8));
dns[0] = (0xff & (addr.addr));
}
std::memcpy(networkSetting.ip.dns[1], dns, 4);
COMMON_LOGGER("DNS_SEC = %03d.%03d.%03d.%03d\n", networkSetting.ip.dns[1][0],
networkSetting.ip.dns[1][1],
networkSetting.ip.dns[1][2],
networkSetting.ip.dns[1][3]);
}
} }
} }

View File

@ -65,56 +65,64 @@ Result ConfigFileLoader::ParseData()
{ {
switch (m_Buffer[pos]) switch (m_Buffer[pos])
{ {
case L'"': case L'"':
{
inEscape = !inEscape;
}
break;
case L'#':
{
inComment = true;
}
break;
case L':':
{
if(inEscape || inComment)
{ {
break; inEscape = !inEscape;
}
break;
case L'#':
{
inComment = true;
}
break;
case L':':
{
if (inEscape || inComment)
{
break;
}
if (inSettingKeyValue)
{
break;
}
else
{
inSettingKeyValue = true;
}
m_Buffer[pos] = L'\0';
m_ParamValue[m_ParamNum++] = &(m_Buffer[pos + 1]);
} }
if(inSettingKeyValue) break;
case L'\r':
case L'\n':
{ {
break; if (inComment)
{
inComment = false;
}
if (inSettingKeyValue)
{
inSettingKeyValue = false;
}
m_Buffer[pos] = L'\0';
m_ParamName[m_ParamNum] = &(m_Buffer[pos + 1]);
m_ParamValue[m_ParamNum] = L'\0';
} }
else break;
{
inSettingKeyValue = true;
}
m_Buffer[pos] = L'\0';
m_ParamValue[m_ParamNum++] = &(m_Buffer[pos + 1]);
} }
break; if (PARAM_MAX_NUM <= m_ParamNum)
case L'\r':
case L'\n':
{ {
if(inComment) NN_TLOG_("Too Many Params\n");
{ return Result(nn::Result::LEVEL_FATAL, nn::Result::SUMMARY_OUT_OF_RESOURCE, nn::Result::MODULE_COMMON,
inComment = false; nn::Result::DESCRIPTION_TOO_LARGE);
}
if(inSettingKeyValue)
{
inSettingKeyValue = false;
}
m_Buffer[pos] = L'\0';
m_ParamName[m_ParamNum] = &(m_Buffer[pos + 1]);
m_ParamValue[m_ParamNum] = L'\0';
}
break;
} }
pos++; pos++;
} }
@ -158,7 +166,9 @@ const char *ConfigFileLoader::ReadAsChar(const wchar_t *paramName)
{ {
return NULL; return NULL;
} }
wcstombs(m_ReadCharBuffer, value, wcslen(value)); wcstombs(m_ReadCharBuffer, value, sizeof(m_ReadCharBuffer));
// NULL終端する
m_ReadCharBuffer[sizeof(m_ReadCharBuffer) - 1] = '\0';
return m_ReadCharBuffer; return m_ReadCharBuffer;
} }

View File

@ -11,7 +11,6 @@ namespace common
class ConfigFileLoader class ConfigFileLoader
{ {
private: private:
static const int PARAM_NAME_MAX_STRING_LENGTH = 16;
static const int PARAM_VALUE_MAX_STRING_LENGTH = 128; static const int PARAM_VALUE_MAX_STRING_LENGTH = 128;
static const int PARAM_MAX_NUM = 64; static const int PARAM_MAX_NUM = 64;