From 8ab78a66a4d238e81b68c92814f699ff77f18f3e Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Fri, 11 Apr 2025 22:05:42 +0100 Subject: [PATCH] girepository: Fix -Wsign-conversion warnings with string arithmetic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There are a few `g_strndup()` calls which use a length calculated from the return value of `strchr()` minus the original string. That’s fine, as long as `strchr()` doesn’t return `NULL`. Add some asserts to ensure that. Signed-off-by: Philip Withnall Helps: #3405 --- girepository/girepository.c | 13 ++++++++++--- girepository/girparser.c | 2 +- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/girepository/girepository.c b/girepository/girepository.c index ad1cec18d..113e4edb4 100644 --- a/girepository/girepository.c +++ b/girepository/girepository.c @@ -607,7 +607,8 @@ load_dependencies_recurse (GIRepository *repository, const char *dependency_version; last_dash = strrchr (dependency, '-'); - dependency_namespace = g_strndup (dependency, last_dash - dependency); + g_assert (last_dash != NULL); /* get_typelib_dependencies() guarantees this */ + dependency_namespace = g_strndup (dependency, (size_t) (last_dash - dependency)); dependency_version = last_dash+1; if (!gi_repository_require (repository, dependency_namespace, dependency_version, @@ -785,7 +786,8 @@ get_typelib_dependencies_transitive (GIRepository *repository, /* Recurse for this namespace. */ last_dash = strrchr (dependency, '-'); - dependency_namespace = g_strndup (dependency, last_dash - dependency); + g_assert (last_dash != NULL); /* get_typelib_dependencies() guarantees this */ + dependency_namespace = g_strndup (dependency, (size_t) (last_dash - dependency)); typelib = get_registered (repository, dependency_namespace, NULL); g_return_if_fail (typelib != NULL); @@ -1742,7 +1744,12 @@ enumerate_namespace_versions (const char *namespace, name_end = strrchr (entry, '.'); last_dash = strrchr (entry, '-'); - version = g_strndup (last_dash+1, name_end-(last_dash+1)); + + /* These are guaranteed by the suffix and prefix checks above: */ + g_assert (name_end != NULL); + g_assert (last_dash != NULL); + + version = g_strndup (last_dash + 1, (size_t) (name_end - (last_dash + 1u))); if (!parse_version (version, &major, &minor)) { g_free (version); diff --git a/girepository/girparser.c b/girepository/girparser.c index ab8d46bcc..f164a01c3 100644 --- a/girepository/girparser.c +++ b/girepository/girparser.c @@ -707,7 +707,7 @@ parse_type_internal (GIIrModule *module, *str == ':') (str)++; - type->giinterface = g_strndup (start, str - start); + type->giinterface = g_strndup (start, (size_t) (str - start)); } if (next)