From c44d7070a4152cbb8279e10fa6206557dd7d6772 Mon Sep 17 00:00:00 2001 From: Juan RP Date: Sun, 17 Nov 2013 11:34:14 +0100 Subject: [PATCH] util.c: add stricter checks for pkgver conformance. Make xbps_pkg_{name,version} return NULL if next character after the last '-' character is not a digit, and if there's a digit make sure that there exists a '_' character too. Added more tests to the testsuite to catch this. With these changes 'python-e_dbus' is properly detected and validated. --- lib/util.c | 14 ++++++++++++-- tests/xbps/libxbps/util/main.c | 10 +++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/lib/util.c b/lib/util.c index 37cae809..c2593c39 100644 --- a/lib/util.c +++ b/lib/util.c @@ -38,6 +38,7 @@ #include #include #include +#include #include #include "xbps_api_impl.h" @@ -96,7 +97,10 @@ xbps_pkg_version(const char *pkg) if ((p = strrchr(pkg, '-')) == NULL) return NULL; - if (strrchr(p, '_') == NULL) + if (!isdigit((unsigned char)p[1])) + return NULL; + + if (strchr(p, '_') == NULL) return NULL; return p + 1; /* skip first '_' */ @@ -113,6 +117,9 @@ xbps_pkg_revision(const char *pkg) if ((p = strrchr(pkg, '_')) == NULL) return NULL; + if (!isdigit((unsigned char)p[1])) + return NULL; + return p + 1; /* skip first '_' */ } @@ -126,7 +133,10 @@ xbps_pkg_name(const char *pkg) if ((p = strrchr(pkg, '-')) == NULL) return NULL; - if (strrchr(p, '_') == NULL) + if (!isdigit((unsigned char)p[1])) + return NULL; + + if (strchr(p, '_') == NULL) return NULL; len = strlen(pkg) - strlen(p) + 1; diff --git a/tests/xbps/libxbps/util/main.c b/tests/xbps/libxbps/util/main.c index 7fa85efc..cc1cb655 100644 --- a/tests/xbps/libxbps/util/main.c +++ b/tests/xbps/libxbps/util/main.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2012 Juan Romero Pardines. + * Copyright (c) 2012-2013 Juan Romero Pardines. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -36,14 +36,22 @@ ATF_TC_HEAD(util_test, tc) ATF_TC_BODY(util_test, tc) { + ATF_CHECK_EQ(xbps_pkg_name("font-adobe-a"), NULL); + ATF_CHECK_EQ(xbps_pkg_name("font-adobe-1"), NULL); + ATF_CHECK_EQ(xbps_pkg_name("font-adobe-100dpi"), NULL); ATF_CHECK_EQ(xbps_pkg_name("font-adobe-100dpi-7.8"), NULL); + ATF_CHECK_EQ(xbps_pkg_name("python-e_dbus"), NULL); ATF_CHECK_EQ(xbps_pkg_version("font-adobe-100dpi"), NULL); ATF_CHECK_EQ(xbps_pkg_version("font-adobe-100dpi-7.8"), NULL); + ATF_CHECK_EQ(xbps_pkg_version("python-e_dbus"), NULL); + ATF_CHECK_EQ(xbps_pkg_version("python-e_dbus-1"), NULL); ATF_REQUIRE_STREQ(xbps_pkg_name("font-adobe-100dpi-7.8_2"), "font-adobe-100dpi"); ATF_REQUIRE_STREQ(xbps_pkg_name("systemd-43_1"), "systemd"); ATF_REQUIRE_STREQ(xbps_pkg_name("font-adobe-100dpi-1.8_blah"), "font-adobe-100dpi"); + ATF_REQUIRE_STREQ(xbps_pkg_name("python-e_dbus-1.0_1"), "python-e_dbus"); ATF_REQUIRE_STREQ(xbps_pkg_version("font-adobe-100dpi-7.8_2"), "7.8_2"); ATF_REQUIRE_STREQ(xbps_pkg_version("font-adobe-100dpi-1.8_blah"), "1.8_blah"); + ATF_REQUIRE_STREQ(xbps_pkg_version("python-e_dbus-1_1"), "1_1"); ATF_REQUIRE_STREQ(xbps_pkg_revision("systemd-43_1_0"), "0"); ATF_REQUIRE_STREQ(xbps_pkg_revision("systemd_21-43_0"), "0"); ATF_REQUIRE_STREQ(xbps_pkgpattern_name("systemd>=43"), "systemd");