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);