Skip to content

Commit c1f8e9f

Browse files
committed
GameDB: Improve error handling in parseHashDatabaseEntry
1 parent c671e57 commit c1f8e9f

File tree

1 file changed

+20
-15
lines changed

1 file changed

+20
-15
lines changed

pcsx2/GameDatabase.cpp

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1098,34 +1098,39 @@ static constexpr char HASHDB_YAML_FILE_NAME[] = "RedumpDatabase.yaml";
10981098
std::unordered_map<GameDatabase::TrackHash, u32, TrackHashHasher> s_track_hash_to_entry_map;
10991099
std::vector<GameDatabase::HashDatabaseEntry> s_hash_database;
11001100

1101-
static bool parseHashDatabaseEntry(const ryml::NodeRef& node)
1101+
static bool parseHashDatabaseEntry(const ryml::ConstNodeRef& entry_node)
11021102
{
1103-
if (!node.has_child("name") || !node.has_child("hashes"))
1103+
const ryml::ConstNodeRef name_node = entry_node.find_child("name");
1104+
const ryml::ConstNodeRef hashes_node = entry_node.find_child("hashes");
1105+
if (!name_node.readable() || !name_node.has_val() || !hashes_node.readable() || !hashes_node.has_children())
11041106
{
11051107
Console.Warning("[HashDatabase] Incomplete entry found.");
11061108
return false;
11071109
}
11081110

11091111
GameDatabase::HashDatabaseEntry entry;
1110-
node["name"] >> entry.name;
1111-
if (node.has_child("version"))
1112-
node["version"] >> entry.version;
1113-
if (node.has_child("serial"))
1114-
node["serial"] >> entry.serial;
1112+
ryml::from_chars(name_node.val(), &entry.name);
1113+
1114+
if (const ryml::ConstNodeRef node = entry_node.find_child("version"); node.readable() && node.has_val())
1115+
ryml::from_chars(node.val(), &entry.version);
1116+
if (const ryml::ConstNodeRef node = entry_node.find_child("serial"); node.readable() && node.has_val())
1117+
ryml::from_chars(node.val(), &entry.serial);
11151118

11161119
const u32 index = static_cast<u32>(s_hash_database.size());
1117-
for (const ryml::ConstNodeRef& n : node["hashes"].children())
1120+
for (const ryml::ConstNodeRef& hash_node : hashes_node.children())
11181121
{
1119-
if (!n.is_map() || !n.has_child("size") || !n.has_child("md5"))
1122+
const ryml::ConstNodeRef size_node = hash_node.find_child("size");
1123+
const ryml::ConstNodeRef md5_node = hash_node.find_child("md5");
1124+
if (!hash_node.is_map() || !size_node.readable() || !size_node.has_val() || !size_node.val().is_integer() || !md5_node.readable())
11201125
{
11211126
Console.ErrorFmt("[HashDatabase] Incomplete hash definition in {}", entry.name);
11221127
return false;
11231128
}
11241129

11251130
GameDatabase::TrackHash th;
11261131
std::string md5;
1127-
n["md5"] >> md5;
1128-
n["size"] >> th.size;
1132+
ryml::from_chars(md5_node.val(), &md5);
1133+
ryml::from_chars(size_node.val(), &th.size);
11291134

11301135
if (!th.parseHash(md5))
11311136
{
@@ -1164,20 +1169,20 @@ bool GameDatabase::loadHashDatabase()
11641169
ryml::csubstr yaml = ryml::to_csubstr(*buffer);
11651170

11661171
Error error;
1167-
std::optional<ryml::Tree> tree = ParseYAMLFromString(yaml, ryml::to_csubstr(name), &error);
1172+
const std::optional<ryml::Tree> tree = ParseYAMLFromString(yaml, ryml::to_csubstr(name), &error);
11681173
if (!tree.has_value())
11691174
{
11701175
Console.ErrorFmt("[HashDatabase] Failed to parse hash database file {}:", path);
11711176
Console.Error(error.GetDescription());
11721177
return false;
11731178
}
11741179

1175-
ryml::NodeRef root = tree->rootref();
1180+
ryml::ConstNodeRef root = tree->crootref();
11761181

11771182
bool okay = true;
1178-
for (const ryml::NodeRef& n : root.children())
1183+
for (const ryml::ConstNodeRef& entry_node : root.children())
11791184
{
1180-
if (!parseHashDatabaseEntry(n))
1185+
if (!parseHashDatabaseEntry(entry_node))
11811186
{
11821187
okay = false;
11831188
break;

0 commit comments

Comments
 (0)