Fix a for loop bug introduced in the concurrency refactor
authortb <tb@openbsd.org>
Mon, 6 Nov 2023 14:50:12 +0000 (14:50 +0000)
committertb <tb@openbsd.org>
Mon, 6 Nov 2023 14:50:12 +0000 (14:50 +0000)
Due to Go's idiosyncratic semantics of for loops, tests would only run
some of the test groups in the JSON file because by the time the closure
is called, the array index could be changed. For example, on fast 8 core
machines, the CMAC tests would run the last test group with key size 320
eight times rather than each of the eight test groups once.

Make a copy of the pointer before passing it to the closure to avoid this
issue.

Simpler version of my initial fix from jsing

regress/lib/libcrypto/wycheproof/wycheproof.go

index fa03192..7994e13 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: wycheproof.go,v 1.146 2023/11/06 14:43:02 tb Exp $ */
+/* $OpenBSD: wycheproof.go,v 1.147 2023/11/06 14:50:12 tb Exp $ */
 /*
  * Copyright (c) 2018 Joel Sing <jsing@openbsd.org>
  * Copyright (c) 2018,2019,2022 Theo Buehler <tb@openbsd.org>
@@ -2771,7 +2771,8 @@ func runTestVectors(path string, variant testVariant) bool {
                wtv.Algorithm, wtv.NumberOfTests, filepath.Base(path))
 
        success := true
-       for i := range wtv.TestGroups {
+       for _, tg := range wtv.TestGroups {
+               testGroupJSON := tg
                testc.runTest(func() bool {
                        var wtg interface{}
                        switch wtv.Algorithm {
@@ -2826,7 +2827,7 @@ func runTestVectors(path string, variant testVariant) bool {
                                return false
                        }
 
-                       if err := json.Unmarshal(wtv.TestGroups[i], wtg); err != nil {
+                       if err := json.Unmarshal(testGroupJSON, wtg); err != nil {
                                log.Fatalf("Failed to unmarshal test groups JSON: %v", err)
                        }
                        switch wtv.Algorithm {