]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: some containers may fail syscall.TestSetuidEtc
authorAndrew G. Morgan <agm@google.com>
Thu, 13 May 2021 03:41:26 +0000 (20:41 -0700)
committerIan Lance Taylor <iant@golang.org>
Mon, 17 May 2021 17:46:08 +0000 (17:46 +0000)
The test previously had the hardcoded assumption that /proc/self/status
files had "Groups:" lines containing numerical IDs in ascending order.
Because of the possibility of non-monotonic ordering of GIDs in user
namespaces, this assumption was not universally true for all
/proc/self/gid_map setups.

To ensure this test can pass in those setups, sanity check failed
"Groups:" line matches with a string sorted version of the expected
values. (For the test cases here, numerical and string sorted order
are guaranteed to match.)

Fixes #46145

Change-Id: Ia060e80b123604bc394a15c02582fc406f944d36
Reviewed-on: https://go-review.googlesource.com/c/go/+/319591
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Trust: Tobias Klauser <tobias.klauser@gmail.com>

misc/cgo/test/issue1435.go
src/syscall/syscall_linux_test.go

index cf34ce8db6ccb0f55fa6919f741f1ba7894d5f55..92c6b998465caf39aeb7aebe1d39f266542de0f1 100644 (file)
@@ -9,6 +9,7 @@ package cgotest
 import (
        "fmt"
        "os"
+       "sort"
        "strings"
        "syscall"
        "testing"
@@ -105,11 +106,23 @@ func compareStatus(filter, expect string) error {
                                // "Pid:\t".
                        }
                        if strings.HasPrefix(line, filter) {
-                               if line != expected {
-                                       return fmt.Errorf("%q got:%q want:%q (bad) [pid=%d file:'%s' %v]\n", tf, line, expected, pid, string(d), expectedProc)
+                               if line == expected {
+                                       foundAThread = true
+                                       break
+                               }
+                               if filter == "Groups:" && strings.HasPrefix(line, "Groups:\t") {
+                                       // https://github.com/golang/go/issues/46145
+                                       // Containers don't reliably output this line in sorted order so manually sort and compare that.
+                                       a := strings.Split(line[8:], " ")
+                                       sort.Strings(a)
+                                       got := strings.Join(a, " ")
+                                       if got == expected[8:] {
+                                               foundAThread = true
+                                               break
+                                       }
+
                                }
-                               foundAThread = true
-                               break
+                               return fmt.Errorf("%q got:%q want:%q (bad) [pid=%d file:'%s' %v]\n", tf, line, expected, pid, string(d), expectedProc)
                        }
                }
        }
index adeb7c9ebbf20d61114a59e74b16c593eb129279..442dc9f10eb87f17b8b1f7d560011c8329fb44cf 100644 (file)
@@ -14,6 +14,7 @@ import (
        "os/signal"
        "path/filepath"
        "runtime"
+       "sort"
        "strconv"
        "strings"
        "syscall"
@@ -583,11 +584,23 @@ func compareStatus(filter, expect string) error {
                                // "Pid:\t".
                        }
                        if strings.HasPrefix(line, filter) {
-                               if line != expected {
-                                       return fmt.Errorf("%q got:%q want:%q (bad) [pid=%d file:'%s' %v]\n", tf, line, expected, pid, string(d), expectedProc)
+                               if line == expected {
+                                       foundAThread = true
+                                       break
                                }
-                               foundAThread = true
-                               break
+                               if filter == "Groups:" && strings.HasPrefix(line, "Groups:\t") {
+                                       // https://github.com/golang/go/issues/46145
+                                       // Containers don't reliably output this line in sorted order so manually sort and compare that.
+                                       a := strings.Split(line[8:], " ")
+                                       sort.Strings(a)
+                                       got := strings.Join(a, " ")
+                                       if got == expected[8:] {
+                                               foundAThread = true
+                                               break
+                                       }
+
+                               }
+                               return fmt.Errorf("%q got:%q want:%q (bad) [pid=%d file:'%s' %v]\n", tf, line, expected, pid, string(d), expectedProc)
                        }
                }
        }