fmaptool: Make sure strings are not destroyed on hdestroy()

On Mac OS X hdestroy seems to overwrite node->name. Hence
duplicate the string before stuffing it into the hash search
table.

Change-Id: Ieac2025f5c960cdb8d509dde7e92ba0dd32644b0
Signed-off-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Reviewed-on: https://review.coreboot.org/14443
Tested-by: build bot (Jenkins)
Reviewed-by: Idwer Vollering <vidwer@gmail.com>
Reviewed-by: Patrick Georgi <pgeorgi@google.com>
This commit is contained in:
Stefan Reinauer 2016-04-20 22:11:25 -07:00
parent c6400e974e
commit 477a0d69e5
1 changed files with 14 additions and 1 deletions

View File

@ -48,10 +48,23 @@
* @return Whether the node is valid * @return Whether the node is valid
*/ */
static bool validate_descriptor_node(const struct flashmap_descriptor *node, static bool validate_descriptor_node(const struct flashmap_descriptor *node,
struct unsigned_option start, struct unsigned_option end) { struct unsigned_option start, struct unsigned_option end)
{
assert(node); assert(node);
#if __GLIBC__
/* GLIBC is different than the BSD libc implementations:
* The hdestroy() [function does] not free the buffers pointed
* to by the key and data elements of the hash table entries.
* vs:
* The hdestroy() function calls free(3) for each comparison key in
* the search table but not the data item associated with the key.
*/
ENTRY search_key = {node->name, NULL}; ENTRY search_key = {node->name, NULL};
#else
ENTRY search_key = {strdup(node->name), NULL};
#endif
if (hsearch(search_key, FIND)) { if (hsearch(search_key, FIND)) {
ERROR("Multiple sections with name '%s'\n", node->name); ERROR("Multiple sections with name '%s'\n", node->name);
return false; return false;