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