From 63cd681d4e3cdb9d79b5eacd8aebf20d09500419 Mon Sep 17 00:00:00 2001 From: Colomban Wendling Date: Sat, 6 Jul 2024 13:52:11 +0200 Subject: [PATCH] geanygendoc: Fix crash if trying to document an unknown type Fix crash if the tag to generate documentation for is of an unknown type. Also consolidate some code around this to validate parameters just to be more defensive in case it sill actually happens. Fixes #1362. --- geanygendoc/src/ggd-doc-type.c | 6 +++++- geanygendoc/src/ggd.c | 17 ++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/geanygendoc/src/ggd-doc-type.c b/geanygendoc/src/ggd-doc-type.c index f8f180eaf..edbd8122b 100644 --- a/geanygendoc/src/ggd-doc-type.c +++ b/geanygendoc/src/ggd-doc-type.c @@ -128,9 +128,12 @@ ggd_doc_type_get_setting (const GgdDocType *doctype, { GgdDocSetting *setting = NULL; GList *tmp; - gssize match_len = strlen (match); + gssize match_len; g_return_val_if_fail (doctype != NULL, NULL); + g_return_val_if_fail (match != NULL, NULL); + + match_len = (gssize) strlen (match); for (tmp = doctype->settings; tmp && ! setting; tmp = g_list_next (tmp)) { if (ggd_doc_setting_matches (tmp->data, match, match_len)) { @@ -177,6 +180,7 @@ ggd_doc_type_resolve_setting (const GgdDocType *doctype, gchar *child_match = NULL; g_return_val_if_fail (doctype != NULL, NULL); + g_return_val_if_fail (match != NULL, NULL); /*g_debug ("Resolving match \"%s\"...", child_match);*/ if (nth_child) (*nth_child) = 0; diff --git a/geanygendoc/src/ggd.c b/geanygendoc/src/ggd.c index bc55a300f..cecbacd3f 100644 --- a/geanygendoc/src/ggd.c +++ b/geanygendoc/src/ggd.c @@ -383,22 +383,25 @@ get_setting_from_tag (GgdDocType *doctype, const TMTag *tag, const TMTag **real_tag) { - GgdDocSetting *setting; + GgdDocSetting *setting = NULL; gchar *hierarchy; - gint nth_child; GPtrArray *tag_array = doc->tm_file->tags_array; GeanyFiletypeID geany_ft = FILETYPE_ID (doc->file_type); hierarchy = ggd_tag_resolve_type_hierarchy (tag_array, geany_ft, tag); /*g_debug ("type hierarchy for tag %s is: %s", tag->name, hierarchy);*/ - setting = ggd_doc_type_resolve_setting (doctype, hierarchy, &nth_child); *real_tag = tag; - if (setting) { - for (; nth_child > 0; nth_child--) { - *real_tag = ggd_tag_find_parent (tag_array, geany_ft, *real_tag); + if (hierarchy) { + gint nth_child; + + setting = ggd_doc_type_resolve_setting (doctype, hierarchy, &nth_child); + if (setting) { + for (; nth_child > 0; nth_child--) { + *real_tag = ggd_tag_find_parent (tag_array, geany_ft, *real_tag); + } } + g_free (hierarchy); } - g_free (hierarchy); return setting; }