diff --git a/examples/output_xml.c b/examples/output_xml.c index fae8b2ec..500d1038 100644 --- a/examples/output_xml.c +++ b/examples/output_xml.c @@ -500,6 +500,7 @@ dctool_xml_output_write (dctool_output_t *abstract, dc_parser_t *parser, const u break; fprintf (output->ostream, "\n", str.desc, str.value); + free ((void *) str.value); } // Parse the GPS location. diff --git a/include/libdivecomputer/parser.h b/include/libdivecomputer/parser.h index d3608e1d..81519277 100644 --- a/include/libdivecomputer/parser.h +++ b/include/libdivecomputer/parser.h @@ -362,6 +362,7 @@ dc_parser_set_density (dc_parser_t *parser, double density); dc_status_t dc_parser_get_datetime (dc_parser_t *parser, dc_datetime_t *datetime); +/* DC_FIELD_STRING values are caller-owned and must be freed after use. */ dc_status_t dc_parser_get_field (dc_parser_t *parser, dc_field_type_t type, unsigned int flags, void *value); diff --git a/src/field-cache.c b/src/field-cache.c index c7b0fbd8..c003c7d6 100644 --- a/src/field-cache.c +++ b/src/field-cache.c @@ -58,13 +58,27 @@ dc_status_t dc_field_get_string(dc_field_cache_t *cache, unsigned idx, dc_field_ if (idx < MAXSTRINGS) { dc_field_string_t *res = cache->strings+idx; if (res->desc && res->value) { - *value = *res; + value->desc = res->desc; + value->value = strdup(res->value); + if (!value->value) + return DC_STATUS_NOMEMORY; return DC_STATUS_SUCCESS; } } return DC_STATUS_UNSUPPORTED; } +void +dc_field_cache_free (dc_field_cache_t *cache) +{ + for (unsigned int i = 0; i < MAXSTRINGS; i++) { + free ((char *) cache->strings[i].value); + cache->strings[i].value = NULL; + cache->strings[i].desc = NULL; + } + cache->initialized &= ~(1u << DC_FIELD_STRING); +} + /* * Use this generic "pick fields from the field cache" helper @@ -120,14 +134,3 @@ dc_field_get(dc_field_cache_t *cache, dc_field_type_t type, unsigned int flags, return DC_STATUS_UNSUPPORTED; } - -void -dc_field_cache_free (dc_field_cache_t *cache) -{ - for (unsigned int i = 0; i < MAXSTRINGS; i++) { - free ((char *) cache->strings[i].value); - cache->strings[i].value = NULL; - cache->strings[i].desc = NULL; - } - cache->initialized &= ~(1u << DC_FIELD_STRING); -}