Matej Habrnal 933436
From f55250179f7ca74ae0a80ec0c4f6cf3bb341b5df Mon Sep 17 00:00:00 2001
Matej Habrnal 933436
From: Jakub Filak <jfilak@redhat.com>
Matej Habrnal 933436
Date: Wed, 25 May 2016 13:35:28 +0200
Matej Habrnal 933436
Subject: [PATCH] koops: do not assume version has 3 levels
Matej Habrnal 933436
Matej Habrnal 933436
Correct commit 9023d77ad5539433146b59e5ac80e3cefcb20cf7
Matej Habrnal 933436
Matej Habrnal 933436
Some ancient kernel versions have 4 levels. This commit allows version
Matej Habrnal 933436
string to have any level equal or greater than 3. The first 3 levels
Matej Habrnal 933436
must be numbers and the rest can be almost anything - it just must
Matej Habrnal 933436
follow the logical structure of levels (i.e. dot something dot
Matej Habrnal 933436
something) - this should allow a git hash in the version string.
Matej Habrnal 933436
Matej Habrnal 933436
In order to eliminate possible false positives introduced by the
Matej Habrnal 933436
flexibility of version levels the commit adds checks for
Matej Habrnal 933436
the prefixes ' ', '(' or 'kernel-' and the suffix ' #' or ') #'.
Matej Habrnal 933436
Matej Habrnal 933436
Signed-off-by: Jakub Filak <jfilak@redhat.com>
Matej Habrnal 933436
---
Matej Habrnal 933436
 src/lib/kernel.c | 15 +++++++++++----
Matej Habrnal 933436
 1 file changed, 11 insertions(+), 4 deletions(-)
Matej Habrnal 933436
Matej Habrnal 933436
diff --git a/src/lib/kernel.c b/src/lib/kernel.c
Matej Habrnal 933436
index dde3d28..720dc7d 100644
Matej Habrnal 933436
--- a/src/lib/kernel.c
Matej Habrnal 933436
+++ b/src/lib/kernel.c
Matej Habrnal 933436
@@ -571,7 +571,10 @@ char *koops_extract_version(const char *linepointer)
Matej Habrnal 933436
      || strstr(linepointer, "REGS")
Matej Habrnal 933436
      || strstr(linepointer, "EFLAGS")
Matej Habrnal 933436
     ) {
Matej Habrnal 933436
-        const char *regexp = "([0-9]+\\.[0-9]+\\.[0-9]+-[^ \\)]+)[ \\)]";
Matej Habrnal 933436
+        /* "(4.7.0-2.x86_64.fc25) #"    */
Matej Habrnal 933436
+        /* " 4.7.0-2.x86_64.fc25 #"     */
Matej Habrnal 933436
+        /* " 2.6.3.4.5-2.x86_64.fc22 #" */
Matej Habrnal 933436
+        const char *regexp = "([ \\(]|kernel-)([0-9]+\\.[0-9]+\\.[0-9]+(\\.[^.-]+)*-[^ \\)]+)\\)? #";
Matej Habrnal 933436
         regex_t re;
Matej Habrnal 933436
         int r = regcomp(&re, regexp, REG_EXTENDED);
Matej Habrnal 933436
         if (r != 0)
Matej Habrnal 933436
@@ -582,8 +585,8 @@ char *koops_extract_version(const char *linepointer)
Matej Habrnal 933436
             return NULL;
Matej Habrnal 933436
         }
Matej Habrnal 933436
 
Matej Habrnal 933436
-        regmatch_t matchptr[2];
Matej Habrnal 933436
-        r = regexec(&re, linepointer, 2, matchptr, 0);
Matej Habrnal 933436
+        regmatch_t matchptr[3];
Matej Habrnal 933436
+        r = regexec(&re, linepointer, sizeof(matchptr)/sizeof(matchptr[0]), matchptr, 0);
Matej Habrnal 933436
         if (r != 0)
Matej Habrnal 933436
         {
Matej Habrnal 933436
             if (r != REG_NOMATCH)
Matej Habrnal 933436
@@ -602,7 +605,11 @@ char *koops_extract_version(const char *linepointer)
Matej Habrnal 933436
             return NULL;
Matej Habrnal 933436
         }
Matej Habrnal 933436
 
Matej Habrnal 933436
-        char *ret = xstrndup(linepointer + matchptr[1].rm_so, matchptr[1].rm_eo - matchptr[1].rm_so);
Matej Habrnal 933436
+        /* 0: entire string */
Matej Habrnal 933436
+        /* 1: version prefix */
Matej Habrnal 933436
+        /* 2: version string */
Matej Habrnal 933436
+        const regmatch_t *const ver = matchptr + 2;
Matej Habrnal 933436
+        char *ret = xstrndup(linepointer + ver->rm_so, ver->rm_eo - ver->rm_so);
Matej Habrnal 933436
 
Matej Habrnal 933436
         regfree(&re);
Matej Habrnal 933436
         return ret;
Matej Habrnal 933436
-- 
Matej Habrnal 933436
2.7.4
Matej Habrnal 933436