Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -228,5 +228,6 @@ summary({'Custom Python': get_option('python_name'),
'Python 3 Support': get_option('with_py3'),
'Skip Introspection': get_option('skip_introspection'),
'Accept overflowed buildorder': get_option('accept_overflowed_buildorder'),
'Recursion limit': get_option('recursion_limit'),
'Test Installed Library': get_option('test_installed_lib'),
}, section: 'Build Configuration')
3 changes: 3 additions & 0 deletions meson_options.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ option('libmagic', type : 'feature', value : 'auto',
option('python_name', type : 'string',
description : 'The name of the Python 3 interpreter to use for generating Python bindings and running tests. If left blank, it defaults to the version of Python 3 being used to run meson.')

option('recursion_limit', type : 'integer', min : 16, value : 64,
description : 'Maximal depth of accepted recusive structures, like mappings in YAML documents.')

option('rpmio', type : 'feature', value : 'enabled',
description : 'Use the rpmio library to automatically decompress gzip, bzip2 and xz YAML streams.')

Expand Down
6 changes: 4 additions & 2 deletions modulemd/include/private/modulemd-yaml.h
Original file line number Diff line number Diff line change
Expand Up @@ -913,6 +913,7 @@ mmd_variant_from_scalar (const gchar *scalar);
/**
* mmd_variant_from_mapping:
* @parser: (inout): A YAML parser positioned just after a `MAPPING_START`
* @depth: Current YAML depth in the XMD document
* @error: (out): A #GError that will return the reason for failing to parse.
*
* Returns: (transfer full): A new, floating #GVariant representing a hash
Expand All @@ -921,12 +922,13 @@ mmd_variant_from_scalar (const gchar *scalar);
* Since: 2.0
*/
GVariant *
mmd_variant_from_mapping (yaml_parser_t *parser, GError **error);
mmd_variant_from_mapping (yaml_parser_t *parser, int depth, GError **error);


/**
* mmd_variant_from_sequence:
* @parser: (inout): A YAML parser positioned just after a `SEQUENCE_START`
* @depth: Current YAML depth in the XMD document
* @error: (out): A #GError that will return the reason for failing to parse.
*
* Returns: (transfer full): A new, floating #GVariant representing a list of
Expand All @@ -935,7 +937,7 @@ mmd_variant_from_mapping (yaml_parser_t *parser, GError **error);
* Since: 2.0
*/
GVariant *
mmd_variant_from_sequence (yaml_parser_t *parser, GError **error);
mmd_variant_from_sequence (yaml_parser_t *parser, int depth, GError **error);


/**
Expand Down
3 changes: 3 additions & 0 deletions modulemd/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ skip_introspection = get_option('skip_introspection')
verbose_tests = get_option('verbose_tests')
accept_overflowed_buildorder = get_option('accept_overflowed_buildorder')
clang_simple_version_script = find_program ('clang_simple_version.sh')
recursion_limit = get_option('recursion_limit')


# -- Library -- #
Expand Down Expand Up @@ -147,6 +148,7 @@ cdata.set('HAVE_EXTEND_AND_STEAL', has_extend_and_steal)
cdata.set('HAVE_G_SPAWN_CHECK_WAIT_STATUS', has_g_spawn_check_wait_status)
cdata.set('HAVE_G_TEST_SUBPROCESS_DEFAULT', has_g_test_subprocess_default)
cdata.set('HAVE_OVERFLOWED_BUILDORDER', accept_overflowed_buildorder)
cdata.set('LIBMODULEMD_RECURSION_LIMIT', recursion_limit)
configure_file(
output : 'config.h',
configuration : cdata
Expand Down Expand Up @@ -355,6 +357,7 @@ c_tests = {
'defaults' : [ 'tests/test-modulemd-defaults.c' ],
'defaultsv1' : [ 'tests/test-modulemd-defaults-v1.c' ],
'dependencies' : [ 'tests/test-modulemd-dependencies.c' ],
'limits' : [ 'tests/test-modulemd-limits.c' ],
'module' : [ 'tests/test-modulemd-module.c' ],
'module_index' : [ 'tests/test-modulemd-moduleindex.c' ],
'module_index_merger' : [ 'tests/test-modulemd-merger.c' ],
Expand Down
72 changes: 64 additions & 8 deletions modulemd/modulemd-yaml-util.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include <errno.h>
#include <glib.h>
#include <inttypes.h>
#include <limits.h>
#include <yaml.h>


Expand Down Expand Up @@ -1085,7 +1086,14 @@
{
return FALSE;
}
depth++;
if (depth == INT_MAX || ++depth > LIBMODULEMD_RECURSION_LIMIT)

Check failure on line 1089 in modulemd/modulemd-yaml-util.c

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Remove any side effects from right hand operands of logical || operator.

See more on https://sonarcloud.io/project/issues?id=fedora-modularity_libmodulemd&issues=AaGh6PY-Wx9ajDfpIAzi&open=AaGh6PY-Wx9ajDfpIAzi&pullRequest=645
{
MMD_YAML_ERROR_EVENT_EXIT_BOOL (
error,
event,
"YAML document depth limit %d exceeded.",
LIBMODULEMD_RECURSION_LIMIT);
}
break;

case YAML_SCALAR_EVENT:
Expand Down Expand Up @@ -1488,7 +1496,7 @@


GVariant *
mmd_variant_from_mapping (yaml_parser_t *parser, GError **error)
mmd_variant_from_mapping (yaml_parser_t *parser, int depth, GError **error)

Check failure on line 1499 in modulemd/modulemd-yaml-util.c

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Refactor this function to reduce its Cognitive Complexity from 28 to the 25 allowed.

See more on https://sonarcloud.io/project/issues?id=fedora-modularity_libmodulemd&issues=AaGh6PY-Wx9ajDfpIAzj&open=AaGh6PY-Wx9ajDfpIAzj&pullRequest=645
{
MODULEMD_INIT_TRACE ();
gboolean done = FALSE;
Expand Down Expand Up @@ -1532,7 +1540,16 @@
break;

case YAML_MAPPING_START_EVENT:
value = mmd_variant_from_mapping (parser, &nested_error);
if (depth == INT_MAX || depth + 1 > LIBMODULEMD_RECURSION_LIMIT)

Check failure on line 1543 in modulemd/modulemd-yaml-util.c

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Refactor this code to not nest more than 3 if|for|do|while|switch statements.

See more on https://sonarcloud.io/project/issues?id=fedora-modularity_libmodulemd&issues=AaGh6PY-Wx9ajDfpIAzk&open=AaGh6PY-Wx9ajDfpIAzk&pullRequest=645
{
MMD_YAML_ERROR_EVENT_EXIT (
error,
event,
"XMD YAML document depth limit %d exceeded.",
LIBMODULEMD_RECURSION_LIMIT);
}
value =
mmd_variant_from_mapping (parser, depth + 1, &nested_error);
if (!value)
{
g_propagate_error (error, g_steal_pointer (&nested_error));
Expand All @@ -1541,7 +1558,16 @@
break;

case YAML_SEQUENCE_START_EVENT:
value = mmd_variant_from_sequence (parser, &nested_error);
if (depth == INT_MAX || depth + 1 > LIBMODULEMD_RECURSION_LIMIT)

Check failure on line 1561 in modulemd/modulemd-yaml-util.c

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Refactor this code to not nest more than 3 if|for|do|while|switch statements.

See more on https://sonarcloud.io/project/issues?id=fedora-modularity_libmodulemd&issues=AaGh6PY-Wx9ajDfpIAzl&open=AaGh6PY-Wx9ajDfpIAzl&pullRequest=645
{
MMD_YAML_ERROR_EVENT_EXIT (
error,
event,
"XMD YAML document depth limit %d exceeded.",
LIBMODULEMD_RECURSION_LIMIT);
}
value =
mmd_variant_from_sequence (parser, depth + 1, &nested_error);
if (!value)
{
g_propagate_error (error, g_steal_pointer (&nested_error));
Expand Down Expand Up @@ -1582,7 +1608,7 @@


GVariant *
mmd_variant_from_sequence (yaml_parser_t *parser, GError **error)
mmd_variant_from_sequence (yaml_parser_t *parser, int depth, GError **error)
{
MODULEMD_INIT_TRACE ();
gboolean done = FALSE;
Expand Down Expand Up @@ -1617,7 +1643,15 @@
break;

case YAML_MAPPING_START_EVENT:
value = mmd_variant_from_mapping (parser, &nested_error);
if (depth == INT_MAX || depth + 1 > LIBMODULEMD_RECURSION_LIMIT)
{
MMD_YAML_ERROR_EVENT_EXIT (
error,
event,
"XMD YAML document depth limit %d exceeded.",
LIBMODULEMD_RECURSION_LIMIT);
}
value = mmd_variant_from_mapping (parser, depth + 1, &nested_error);
if (!value)
{
g_propagate_error (error, g_steal_pointer (&nested_error));
Expand All @@ -1626,7 +1660,15 @@
break;

case YAML_SEQUENCE_START_EVENT:
value = mmd_variant_from_sequence (parser, &nested_error);
if (depth == INT_MAX || depth + 1 > LIBMODULEMD_RECURSION_LIMIT)
{
MMD_YAML_ERROR_EVENT_EXIT (
error,
event,
"XMD YAML document depth limit %d exceeded.",
LIBMODULEMD_RECURSION_LIMIT);
}
value = mmd_variant_from_sequence (parser, depth + 1, &nested_error);
if (!value)
{
g_propagate_error (error, g_steal_pointer (&nested_error));
Expand Down Expand Up @@ -1677,6 +1719,7 @@
MMD_INIT_YAML_EVENT (event);
GVariant *variant = NULL;
g_autoptr (GError) nested_error = NULL;
int depth = 0;

g_return_val_if_fail (error == NULL || *error == NULL, FALSE);

Expand All @@ -1694,7 +1737,20 @@
break;

case YAML_MAPPING_START_EVENT:
variant = mmd_variant_from_mapping (parser, &nested_error);
if (depth == INT_MAX || depth + 1 > LIBMODULEMD_RECURSION_LIMIT)
{
MMD_YAML_ERROR_EVENT_EXIT (
error,
event,
"XMD YAML document depth limit %d exceeded.",
LIBMODULEMD_RECURSION_LIMIT);
}
variant = mmd_variant_from_mapping (parser, depth + 1, &nested_error);
if (!variant)
{
g_propagate_error (error, g_steal_pointer (&nested_error));
return NULL;
}
break;

default:
Expand Down
Loading
Loading