From 8aaba79aaf72caa7045ee0252f1375798276527f Mon Sep 17 00:00:00 2001 From: Stephen Gallagher Date: Tue, 4 Sep 2018 17:23:22 -0400 Subject: [PATCH] Don't crash dumping translation events without summary or desc Return a proper GError failure instead. Fixes: https://github.com/fedora-modularity/libmodulemd/issues/80 Signed-off-by: Stephen Gallagher --- .../modulemd-1.0/private/modulemd-yaml.h | 3 ++- .../v1/modulemd-yaml-emitter-translation.c | 16 ++++++++++++ modulemd/v1/tests/test-modulemd-python.py | 15 +++++++++++ modulemd/v1/tests/test-modulemd-translation.c | 26 +++++++++++++++++++ 4 files changed, 59 insertions(+), 1 deletion(-) diff --git a/modulemd/include/modulemd-1.0/private/modulemd-yaml.h b/modulemd/include/modulemd-1.0/private/modulemd-yaml.h index 378eb769b..0046f08dc 100644 --- a/modulemd/include/modulemd-1.0/private/modulemd-yaml.h +++ b/modulemd/include/modulemd-1.0/private/modulemd-yaml.h @@ -30,7 +30,8 @@ enum ModulemdYamlError MODULEMD_YAML_ERROR_PROGRAMMING, MODULEMD_YAML_ERROR_UNPARSEABLE, MODULEMD_YAML_ERROR_PARSE, - MODULEMD_YAML_ERROR_EMIT + MODULEMD_YAML_ERROR_EMIT, + MODULEMD_YAML_ERROR_MISSING_REQUIRED }; const gchar * diff --git a/modulemd/v1/modulemd-yaml-emitter-translation.c b/modulemd/v1/modulemd-yaml-emitter-translation.c index 1099fba10..d5a382717 100644 --- a/modulemd/v1/modulemd-yaml-emitter-translation.c +++ b/modulemd/v1/modulemd-yaml-emitter-translation.c @@ -245,10 +245,26 @@ _emit_translation_entry (yaml_emitter_t *emitter, name = g_strdup ("summary"); value = modulemd_translation_entry_get_summary (entry); + if (!value) + { + g_set_error (error, + MODULEMD_YAML_ERROR, + MODULEMD_YAML_ERROR_MISSING_REQUIRED, + "Translation entry missing summary field."); + return FALSE; + } MMD_EMIT_STR_STR_DICT (&event, name, value, YAML_PLAIN_SCALAR_STYLE); name = g_strdup ("description"); value = modulemd_translation_entry_get_description (entry); + if (!value) + { + g_set_error (error, + MODULEMD_YAML_ERROR, + MODULEMD_YAML_ERROR_MISSING_REQUIRED, + "Translation entry missing description field."); + return FALSE; + } MMD_EMIT_STR_STR_DICT (&event, name, value, YAML_PLAIN_SCALAR_STYLE); /* Profile Descriptions */ diff --git a/modulemd/v1/tests/test-modulemd-python.py b/modulemd/v1/tests/test-modulemd-python.py index 2e5ebd46f..07823213d 100755 --- a/modulemd/v1/tests/test-modulemd-python.py +++ b/modulemd/v1/tests/test-modulemd-python.py @@ -201,6 +201,21 @@ def test_issue77(self): component.set_buildorder(5) assert component.props.buildorder == 5 + def test_issue80(self): + mmd_translation = Modulemd.Translation(module_name="modulename", + module_stream="modulestream", + mdversion=1, + modified=201809041500) + entry = Modulemd.TranslationEntry(locale='en_US') + mmd_translation.add_entry(entry) + + # Would crash attempting to dump to YAML + try: + yaml_output = mmd_translation.dumps() + except GLib.GError as err: + # A proper exception is expected here + pass + class TestIntent(unittest.TestCase): diff --git a/modulemd/v1/tests/test-modulemd-translation.c b/modulemd/v1/tests/test-modulemd-translation.c index b28accfbf..a85ba5131 100644 --- a/modulemd/v1/tests/test-modulemd-translation.c +++ b/modulemd/v1/tests/test-modulemd-translation.c @@ -393,6 +393,25 @@ modulemd_translation_test_index (TranslationFixture *fixture, "プロファイルの例"); } +static void +modulemd_translation_test_missing_summary (TranslationFixture *fixture, + gconstpointer user_data) +{ + g_autoptr (GError) error = NULL; + g_autoptr (ModulemdTranslation) translation = NULL; + g_autoptr (ModulemdTranslationEntry) entry = NULL; + g_autofree gchar *yaml = NULL; + + translation = modulemd_translation_new_full ( + "modulename", "modulestream", 1, 201809041500); + + entry = modulemd_translation_entry_new ("en_US"); + modulemd_translation_add_entry (translation, entry); + + yaml = modulemd_translation_dumps (translation, &error); + g_assert_null (yaml); +} + int main (int argc, char *argv[]) @@ -439,5 +458,12 @@ main (int argc, char *argv[]) modulemd_translation_test_index, NULL); + g_test_add ("/modulemd/translation/test_missing_summary", + TranslationFixture, + NULL, + NULL, + modulemd_translation_test_missing_summary, + NULL); + return g_test_run (); }