Browse code

Adjust kernel version parsing to be more lenient of strange things like "3.12-1-amd64"

Docker-DCO-1.1-Signed-off-by: Andrew Page <admwiggin@gmail.com> (github: tianon)

Tianon Gravi authored on 2014/02/25 05:38:58
Showing 2 changed files
... ...
@@ -606,16 +606,22 @@ func GetKernelVersion() (*KernelVersionInfo, error) {
606 606
 func ParseRelease(release string) (*KernelVersionInfo, error) {
607 607
 	var (
608 608
 		kernel, major, minor, parsed int
609
-		flavor                       string
609
+		flavor, partial              string
610 610
 	)
611 611
 
612 612
 	// Ignore error from Sscanf to allow an empty flavor.  Instead, just
613 613
 	// make sure we got all the version numbers.
614
-	parsed, _ = fmt.Sscanf(release, "%d.%d.%d%s", &kernel, &major, &minor, &flavor)
615
-	if parsed < 3 {
614
+	parsed, _ = fmt.Sscanf(release, "%d.%d%s", &kernel, &major, &partial)
615
+	if parsed < 2 {
616 616
 		return nil, errors.New("Can't parse kernel version " + release)
617 617
 	}
618 618
 
619
+	// sometimes we have 3.12.25-gentoo, but sometimes we just have 3.12-1-amd64
620
+	parsed, _ = fmt.Sscanf(partial, ".%d%s", &minor, &flavor)
621
+	if parsed < 1 {
622
+		flavor = partial
623
+	}
624
+
619 625
 	return &KernelVersionInfo{
620 626
 		Kernel: kernel,
621 627
 		Major:  major,
... ...
@@ -420,6 +420,7 @@ func TestParseRelease(t *testing.T) {
420 420
 	assertParseRelease(t, "3.4.54.longterm-1", &KernelVersionInfo{Kernel: 3, Major: 4, Minor: 54, Flavor: ".longterm-1"}, 0)
421 421
 	assertParseRelease(t, "3.8.0-19-generic", &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0, Flavor: "-19-generic"}, 0)
422 422
 	assertParseRelease(t, "3.12.8tag", &KernelVersionInfo{Kernel: 3, Major: 12, Minor: 8, Flavor: "tag"}, 0)
423
+	assertParseRelease(t, "3.12-1-amd64", &KernelVersionInfo{Kernel: 3, Major: 12, Minor: 0, Flavor: "-1-amd64"}, 0)
423 424
 }
424 425
 
425 426
 func TestParsePortMapping(t *testing.T) {