Fix --type-id-style hash for empty internal names.

libabigail's intern_string class treats the empty string specially. It
is not safe to call the raw method without checking for a empty
pointer. It is safe to convert to std::string.

This commit changes the XML writer to convert interned strings to
std::strings before computing their hashes.

	* src/abg-writer.cc (write_context::get_id_for_type): When
	hashing internal type names, convert to std::string rather
	than using the raw method directly as this will avoid a null
	pointer dereference in the case of an empty string; tabify
	code indentation.

Signed-off-by: Giuliano Procida <gprocida@google.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
This commit is contained in:
Giuliano Procida 2020-07-06 10:21:33 +01:00 committed by Dodji Seketeli
parent 96ce0785fd
commit be0effa6fd

View File

@ -450,20 +450,20 @@ public:
switch (m_type_id_style) switch (m_type_id_style)
{ {
case SEQUENCE_TYPE_ID_STYLE: case SEQUENCE_TYPE_ID_STYLE:
{ {
interned_string id = get_id_manager().get_id_with_prefix("type-id-"); interned_string id = get_id_manager().get_id_with_prefix("type-id-");
return m_type_id_map[c] = id; return m_type_id_map[c] = id;
} }
case HASH_TYPE_ID_STYLE: case HASH_TYPE_ID_STYLE:
{ {
interned_string pretty = c->get_cached_pretty_representation(true); interned_string pretty = c->get_cached_pretty_representation(true);
size_t hash = hashing::fnv_hash(*pretty.raw()); size_t hash = hashing::fnv_hash(pretty);
while (!m_used_type_id_hashes.insert(hash).second) while (!m_used_type_id_hashes.insert(hash).second)
++hash; ++hash;
std::ostringstream os; std::ostringstream os;
os << std::hex << std::setfill('0') << std::setw(8) << hash; os << std::hex << std::setfill('0') << std::setw(8) << hash;
return m_type_id_map[c] = c->get_environment()->intern(os.str()); return m_type_id_map[c] = c->get_environment()->intern(os.str());
} }
} }
ABG_ASSERT_NOT_REACHED; ABG_ASSERT_NOT_REACHED;
return interned_string(); return interned_string();