diff --git a/require-ess/src/require.c b/require-ess/src/require.c index e099845a6e904a3e8c7e8aa93a7e2bc5e2dc754c..8ed30e50427bb3555e35ee6a0776e334295e5ec7 100644 --- a/require-ess/src/require.c +++ b/require-ess/src/require.c @@ -648,16 +648,17 @@ static int compareVersions(const char *found, const char *request, return MISMATCH; } - sv_found = (semver_t *)calloc(1, sizeof(semver_t)); - sv_request = (semver_t *)calloc(1, sizeof(semver_t)); + sv_found = parse_semver(found); + sv_request = parse_semver(request); + if (sv_found == NULL || sv_request == NULL) { + debug("require: compareVersion: failed to allocate semver_t\n"); + return MISMATCH; + } // TODO: maybe don't do this. This is only in the case that // we have found an installed version with no revision number. if (already_matched && sv_request->revision == -1) sv_request->revision = 0; - parse_semver(found, sv_found); - parse_semver(request, sv_request); - // test version, look for exact. if (strlen(sv_request->test_str) > 0) { if (strcmp(sv_found->test_str, sv_request->test_str) == 0) { diff --git a/require-ess/src/version.c b/require-ess/src/version.c index c0867a4acdc028a09aac1e68e97fffc863443915..4982e43aea63995abe95ec3efb7c3f4e6fe988b5 100644 --- a/require-ess/src/version.c +++ b/require-ess/src/version.c @@ -12,15 +12,15 @@ void cleanup_semver(semver_t *s) { free(s); } -static void init_semver(const char *version, semver_t *s) { +static semver_t *init_semver(const char *version) { + semver_t *s = (semver_t *)calloc(1, sizeof(semver_t)); + s->version_str = calloc(strlen(version) + 1, sizeof(char)); strcpy(s->version_str, version); s->test_str = ""; - - s->major = 0; - s->minor = 0; - s->patch = 0; s->revision = -1; + + return s; } static void fetch_part(char *version_str, const regmatch_t *groups, @@ -33,7 +33,7 @@ static void fetch_part(char *version_str, const regmatch_t *groups, version_str[groups[ix].rm_eo] = tmp; } -int parse_semver(const char *version, semver_t *s) { +semver_t *parse_semver(const char *version) { static const char *version_regex = "^(([0-9]+)\\.([0-9]+)\\.([0-9]+))?([^+]*)(\\+([0-9]+))?$"; static const unsigned int max_regex_groups = 7 + 1; @@ -42,18 +42,17 @@ int parse_semver(const char *version, semver_t *s) { static const unsigned int patch_ix = 4; static const unsigned int test_label_ix = 5; static const unsigned int revision_ix = 7; + semver_t *s = init_semver(version); regex_t compiled; regmatch_t groups[max_regex_groups]; - init_semver(version, s); - if (s->version_str == NULL || s->version_str[0] == 0) { - return 1; + return NULL; } if (regcomp(&compiled, version_regex, REG_EXTENDED)) { - return 1; + return NULL; } if (regexec(&compiled, s->version_str, max_regex_groups, groups, 0) == 0) { @@ -68,5 +67,5 @@ int parse_semver(const char *version, semver_t *s) { s->version_str[groups[revision_ix].rm_so - 1] = 0; } } - return 0; + return s; } diff --git a/require-ess/src/version.h b/require-ess/src/version.h index e3e39fea4499de391139e7ba865daeb9fc65e3a6..06425c26298902b5d165f366ef07371379867433 100644 --- a/require-ess/src/version.h +++ b/require-ess/src/version.h @@ -14,4 +14,4 @@ typedef struct semver_t { void cleanup_semver(semver_t *s); -int parse_semver(const char *version, semver_t *s); +semver_t *parse_semver(const char *version);