]> Cypherpunks repositories - gostls13.git/commitdiff
os: fix aliasing bug in RemoveAllTestHook restoration
authorBryan C. Mills <bcmills@google.com>
Thu, 11 Apr 2019 19:42:21 +0000 (15:42 -0400)
committerBryan C. Mills <bcmills@google.com>
Thu, 11 Apr 2019 20:03:44 +0000 (20:03 +0000)
The code to swap RemoveAllTestHook in and out in
TestRemoveAllWithMoreErrorThanReqSize was making a copy of the
RemoveAllTestHook pointer, then attempting to restore by loading from
the copy of that pointer. Since the two copies of the pointer aliased
the same address, the restore operation had no effect, and any
RemoveAll tests that happened to run after
TestRemoveAllWithMoreErrorThanReqSize would fail.

Fixes #31421

Change-Id: I7028475f5ceb3b0a2fa69d22af8d3379508c4531
Reviewed-on: https://go-review.googlesource.com/c/go/+/171777
Run-TryBot: Bryan C. Mills <bcmills@google.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/os/removeall_test.go

index eb9459445cb98ab2ed69d35a9d413edc11ef4409..96e0fc5a55e3661d383bf1938ef898b4bdd147bf 100644 (file)
@@ -412,13 +412,14 @@ func TestRemoveAllWithMoreErrorThanReqSize(t *testing.T) {
        if testing.Short() {
                t.Skip("skipping in short mode")
        }
-       oldRemoveAllTestHook := RemoveAllTestHook
+
+       defer func(oldHook func(error) error) {
+               *RemoveAllTestHook = oldHook
+       }(*RemoveAllTestHook)
+
        *RemoveAllTestHook = func(err error) error {
                return errors.New("error from RemoveAllTestHook")
        }
-       defer func() {
-               *RemoveAllTestHook = *oldRemoveAllTestHook
-       }()
 
        tmpDir, err := ioutil.TempDir("", "TestRemoveAll-")
        if err != nil {