Commit be225ca1 authored by Christophe Fergeau's avatar Christophe Fergeau Committed by Martin Szulecki

Fix Dictionary copy constructor

While iterating over all the keys stored in the source Dictionary
to copy them to create the copied Dictonary, the name of the key
being copied was only set to a non-NULL value for the first key
we copy. This was then leading to an assertion when trying to
create a std::string from a NULL pointer. Simple test-case:

int main()
{
	PList::Dictionary a;
	PList::String b("Hello");
	PList::String c("Hi!");
	PList::Dictionary d;

	a.Insert("Key", &b);
	a.Insert("Another Key", &c);
	std::cout << a.ToXml() << std::endl;

	d.Insert("dictionary", &a); //CRAAAAAAAAASH!
	std::cout << d.ToXml() << std::endl;
	return 0;
}
/* Output:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Key</key>
	<string>Hello</string>
	<key>Another Key</key>
	<string>Hi!</string>
</dict>
</plist>

terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_S_construct NULL not valid
*/
Signed-off-by: 's avatarMartin Szulecki <opensuse@sukimashita.com>
parent 0866710e
......@@ -72,7 +72,7 @@ Dictionary::Dictionary(PList::Dictionary& d) : Structure()
subnode = NULL;
free(key);
key = NULL;
plist_dict_next_item(_node, it, NULL, &subnode);
plist_dict_next_item(_node, it, &key, &subnode);
}
free(it);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment