Blame 0259-koops-do-not-assume-version-has-3-levels.patch

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